%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.14%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22marimo%22%2C%0A%23%20%20%20%20%20%22altair%3E%3D5.5.0%22%2C%0A%23%20%20%20%20%20%22cassetter%3E%3D0.1.0%22%2C%0A%23%20%20%20%20%20%22optuna%3E%3D4.0.0%22%2C%0A%23%20%20%20%20%20%22numpy%3E%3D2.4.4%22%2C%0A%23%20%20%20%20%20%22scipy%3E%3D1.17.1%22%2C%0A%23%20%20%20%20%20%22numba%3E%3D0.65.0%22%2C%0A%23%20%20%20%20%20%22serogen%22%2C%0A%23%20%5D%0A%23%0A%23%20%5Btool.uv.sources%5D%0A%23%20serogen%20%3D%20%7B%20path%20%3D%20%22..%22%2C%20editable%20%3D%20true%20%7D%0A%23%20%2F%2F%2F%0A%0A%22%22%22Unified%20in-memory%20training%2C%20Optuna%20tuning%2C%20validation%2C%20and%20Altair%20visualization%20marimo%20notebook%20for%20GeneRoleClassifier.%22%22%22%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.25.1%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22full%22%2C%0A%20%20%20%20app_title%3D%22SeroGen%20%E2%80%94%20GeneRoleClassifier%20Training%2C%20Optuna%20Tuning%20%26%20Validation%22%2C%0A)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20gzip%0A%20%20%20%20import%20os%0A%20%20%20%20import%20re%0A%20%20%20%20import%20threading%0A%20%20%20%20import%20time%0A%20%20%20%20import%20xml.etree.ElementTree%20as%20ET%0A%20%20%20%20from%20concurrent.futures%20import%20ThreadPoolExecutor%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20from%20urllib.error%20import%20HTTPError%0A%20%20%20%20from%20urllib.parse%20import%20quote%0A%20%20%20%20from%20urllib.request%20import%20Request%2C%20urlopen%0A%0A%20%20%20%20import%20altair%20as%20alt%0A%20%20%20%20import%20cassetter%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20optuna%0A%20%20%20%20from%20cassetter._state%20import%20get_current_cassette%0A%20%20%20%20from%20cassetter.cassette%20import%20NoMatchError%2C%20body_to_bytes%0A%20%20%20%20from%20numba%20import%20njit%2C%20prange%0A%20%20%20%20from%20scipy.sparse%20import%20csr_array%0A%0A%20%20%20%20from%20serogen.core.io.fasta%20import%20FastaReader%0A%20%20%20%20from%20serogen.core.seq.alphabet%20import%20Alphabet%0A%20%20%20%20from%20serogen.core.seq.clustering%20import%20Clusterer%0A%20%20%20%20from%20serogen.core.seq.seq%20import%20Sequences%0A%20%20%20%20from%20serogen.genes.cnn%20import%20GeneRoleClassifier%0A%20%20%20%20from%20serogen.genes.roles%20import%20GeneRole%0A%0A%20%20%20%20alt.data_transformers.disable_max_rows()%0A%20%20%20%20optuna.logging.set_verbosity(optuna.logging.WARNING)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Alphabet%2C%0A%20%20%20%20%20%20%20%20Clusterer%2C%0A%20%20%20%20%20%20%20%20ET%2C%0A%20%20%20%20%20%20%20%20FastaReader%2C%0A%20%20%20%20%20%20%20%20GeneRole%2C%0A%20%20%20%20%20%20%20%20GeneRoleClassifier%2C%0A%20%20%20%20%20%20%20%20HTTPError%2C%0A%20%20%20%20%20%20%20%20NoMatchError%2C%0A%20%20%20%20%20%20%20%20Path%2C%0A%20%20%20%20%20%20%20%20Request%2C%0A%20%20%20%20%20%20%20%20Sequences%2C%0A%20%20%20%20%20%20%20%20ThreadPoolExecutor%2C%0A%20%20%20%20%20%20%20%20alt%2C%0A%20%20%20%20%20%20%20%20body_to_bytes%2C%0A%20%20%20%20%20%20%20%20cassetter%2C%0A%20%20%20%20%20%20%20%20csr_array%2C%0A%20%20%20%20%20%20%20%20get_current_cassette%2C%0A%20%20%20%20%20%20%20%20gzip%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20njit%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20optuna%2C%0A%20%20%20%20%20%20%20%20os%2C%0A%20%20%20%20%20%20%20%20prange%2C%0A%20%20%20%20%20%20%20%20quote%2C%0A%20%20%20%20%20%20%20%20re%2C%0A%20%20%20%20%20%20%20%20threading%2C%0A%20%20%20%20%20%20%20%20time%2C%0A%20%20%20%20%20%20%20%20urlopen%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(GeneRole%2C%20re)%3A%0A%20%20%20%20%23%20------------------------------------------------------------------------------------------------------------------%0A%20%20%20%20%23%20Multi-Source%20Query%20Registries%20(UniProtKB%20%2B%20Pfam%2FInterPro%2C%20UniRef50%2C%20NCBI%20IPG%2C%20and%20KEGG%20Orthology)%20for%20Roles%200..28%0A%20%20%20%20%23%20------------------------------------------------------------------------------------------------------------------%0A%20%20%20%20ROLE_QUERIES%3A%20dict%5Bint%2C%20dict%5Bstr%2C%20object%5D%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20int(GeneRole.FLIPPASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'((gene%3Awzx%20OR%20protein_name%3A%22O-antigen%20flippase%22%20OR%20xref%3Apfam-PF01943%20OR%20xref%3Apfam-PF14667)%20NOT%20gene%3Awzy%20NOT%20gene%3AwaaL%20NOT%20gene%3ArfaL%20NOT%20gene%3AmurJ%20NOT%20gene%3AftsW%20NOT%20gene%3AmsbA%20NOT%20protein_name%3Apolymerase%20NOT%20protein_name%3Aligase%20NOT%20protein_name%3Aacetyltransferase%20NOT%20protein_name%3Aacyltransferase%20NOT%20xref%3Apfam-PF01757%20NOT%20xref%3Apfam-PF04932%20NOT%20xref%3Apfam-PF14296%20NOT%20xref%3Apfam-PF13425%20NOT%20xref%3Apfam-PF03023%20NOT%20xref%3Apfam-PF01098)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22O-antigen%20flippase%22%20OR%20name%3A%22polysaccharide%20flippase%22)%20NOT%20name%3Apolymerase%20NOT%20name%3Aligase%20NOT%20name%3Aacetyltransferase%20NOT%20name%3Aacyltransferase%20NOT%20name%3AWzy%20NOT%20name%3AWaaL%20NOT%20name%3AMurJ%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22O-antigen%20flippase%22%5BProduct%5D%20OR%20wzx%5BGene%20Name%5D)%20NOT%20polymerase%5BProduct%5D%20NOT%20ligase%5BProduct%5D%20NOT%20acetyltransferase%5BProduct%5D%20NOT%20acyltransferase%5BProduct%5D%20NOT%20wzy%5BGene%20Name%5D%20NOT%20waaL%5BGene%20Name%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20280%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20550%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.POLYMERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'((gene%3Awzy%20OR%20protein_name%3A%22O-antigen%20polymerase%22%20OR%20protein_name%3A%22capsular%20polysaccharide%20polymerase%22%20OR%20xref%3Apfam-PF14296)%20NOT%20gene%3AwaaL%20NOT%20gene%3ArfaL%20NOT%20gene%3Awzx%20NOT%20protein_name%3Aligase%20NOT%20protein_name%3Aflippase%20NOT%20protein_name%3Aacetyltransferase%20NOT%20protein_name%3Aacyltransferase%20NOT%20xref%3Apfam-PF01757%20NOT%20xref%3Apfam-PF04932%20NOT%20xref%3Apfam-PF01943%20NOT%20xref%3Apfam-PF14667%20NOT%20xref%3Apfam-PF13440)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22O-antigen%20polymerase%22%20OR%20name%3A%22polysaccharide%20polymerase%22%20OR%20name%3AWzy)%20NOT%20name%3Aligase%20NOT%20name%3Aflippase%20NOT%20name%3Aacetyltransferase%20NOT%20name%3Aacyltransferase%20NOT%20name%3AWaaL%20NOT%20name%3ARfaL%20NOT%20name%3AWzx%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22O-antigen%20polymerase%22%5BProduct%5D%20OR%20wzy%5BGene%20Name%5D)%20NOT%20ligase%5BProduct%5D%20NOT%20flippase%5BProduct%5D%20NOT%20acetyltransferase%5BProduct%5D%20NOT%20acyltransferase%5BProduct%5D%20NOT%20waaL%5BGene%20Name%5D%20NOT%20wzx%5BGene%20Name%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20260%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20560%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.COPOLYMERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awzz%20OR%20gene%3AwzzB%20OR%20gene%3AwzzE%20OR%20gene%3AfepE%20OR%20gene_exact%3Acld%20OR%20protein_name%3A%22chain%20length%20determinant%22%20OR%20protein_name%3A%22polysaccharide%20copolymerase%22%20OR%20xref%3Apfam-PF02706)%20NOT%20gene%3Awzc%20NOT%20protein_name%3Akinase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22chain%20length%20determinant%22%20OR%20name%3A%22polysaccharide%20co-polymerase%22%20OR%20name%3AWzz)%20NOT%20name%3Akinase%20NOT%20name%3AWzc%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22chain%20length%20determinant%22%5BProduct%5D%20OR%20wzz%5BGene%20Name%5D%20OR%20fepE%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20180%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20520%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.KINASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awzc%20OR%20gene%3Aptk%20OR%20gene%3Aetk%20OR%20gene%3AcpsD%20OR%20gene%3AcapB%20OR%20protein_name%3A%22tyrosine-protein%20kinase%20Wzc%22%20OR%20xref%3Apfam-PF13614)%20NOT%20gene%3Awza%20NOT%20gene%3Awzb%20NOT%20protein_name%3Aphosphatase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22tyrosine-protein%20kinase%20Wzc%22%20OR%20name%3A%22tyrosine-protein%20kinase%20Etk%22%20OR%20(name%3A%22exopolysaccharide%22%20AND%20name%3Akinase))%20NOT%20name%3Aphosphatase%20NOT%20name%3AWza%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22tyrosine-protein%20kinase%20Wzc%22%5BProduct%5D%20OR%20wzc%5BGene%20Name%5D%20OR%20ptk%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20820%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.PHOSPHATASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awzb%20OR%20gene%3Aptp%20OR%20gene%3Aetp%20OR%20gene%3AcpsB%20OR%20gene%3AcpsACP%20OR%20protein_name%3A%22phosphotyrosine%20protein%20phosphatase%22%20OR%20xref%3Apfam-PF01451%20OR%20xref%3Apfam-PF01569)%20NOT%20protein_name%3Akinase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gt_subqueries%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'(gene%3Awzb%20OR%20gene%3Aptp%20OR%20gene%3Aetp%20OR%20gene%3AcpsB%20OR%20protein_name%3A%22phosphotyrosine%20protein%20phosphatase%22%20OR%20xref%3Apfam-PF01451)%20NOT%20protein_name%3Akinase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22(gene%3AcpsACP%20OR%20(xref%3Apfam-PF01569%20AND%20(protein_name%3Aphosphatase%20OR%20protein_name%3Acapsule%20OR%20gene%3Acps*)))%20NOT%20protein_name%3Akinase%20AND%20taxonomy_id%3A2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22low%20molecular%20weight%20phosphotyrosine%20protein%20phosphatase%22%20OR%20name%3A%22phosphotyrosine-protein%20phosphatase%22%20OR%20name%3AWzb%20OR%20name%3ACpsACP)%20NOT%20name%3Akinase%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22low%20molecular%20weight%20phosphotyrosine%20protein%20phosphatase%22%5BProduct%5D%20OR%20wzb%5BGene%20Name%5D%20OR%20cpsACP%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20110%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20270%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.ABC_PERMEASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awzm%20OR%20gene%3AkpsM%20OR%20protein_name%3A%22capsule%20export%20system%20permease%22%20OR%20protein_name%3A%22polysaccharide%20ABC%20transporter%20permease%22%20OR%20xref%3Apfam-PF01061%20OR%20xref%3Apfam-PF06562)%20NOT%20gene%3Awza%20NOT%20gene%3AkpsD%20NOT%20gene%3AkpsE%20NOT%20gene%3Awzt%20NOT%20gene%3AkpsT%20NOT%20protein_name%3A%22ATP-binding%22%20NOT%20protein_name%3A%22outer%20membrane%22%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'((name%3A%22ABC%20transporter%20permease%22%20AND%20(name%3Apolysaccharide%20OR%20name%3Acapsule%20OR%20name%3A%22O-antigen%22))%20OR%20name%3A%22capsule%20export%20system%20permease%22%20OR%20name%3AWzm%20OR%20name%3AKpsM)%20NOT%20name%3AWza%20NOT%20name%3AKpsD%20NOT%20name%3AKpsE%20NOT%20name%3AWzt%20NOT%20name%3AKpsT%20NOT%20name%3A%22ATP-binding%22%20NOT%20name%3A%22outer%20membrane%22%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22capsule%20export%20system%20permease%22%5BProduct%5D%20OR%20wzm%5BGene%20Name%5D%20OR%20kpsM%5BGene%20Name%5D)%20NOT%20wza%5BGene%20Name%5D%20NOT%20kpsD%5BGene%20Name%5D%20NOT%20wzt%5BGene%20Name%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20210%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20340%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.ABC_ATPASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awzt%20OR%20gene%3AkpsT%20OR%20protein_name%3A%22capsule%20export%20system%20ATP-binding%22%20OR%20protein_name%3A%22teichoic%20acid%20export%20ATP-binding%22)%20NOT%20gene%3Awzm%20NOT%20gene%3AkpsM%20NOT%20protein_name%3Apermease%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22polysaccharide%20export%20ATP-binding%22%20OR%20name%3A%22capsule%20export%20system%20ATP-binding%22%20OR%20name%3AWzt%20OR%20name%3AKpsT)%20NOT%20name%3Apermease%20NOT%20name%3AWzm%20NOT%20name%3AKpsM%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22capsule%20export%20system%20ATP-binding%22%5BProduct%5D%20OR%20wzt%5BGene%20Name%5D%20OR%20kpsT%5BGene%20Name%5D)%20NOT%20wzm%5BGene%20Name%5D%20NOT%20kpsM%5BGene%20Name%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20520%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.LIGASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'((gene%3AwaaL%20OR%20gene%3ArfaL%20OR%20protein_name%3A%22O-antigen%20ligase%22%20OR%20(xref%3Apfam-PF04932%20AND%20protein_name%3Aligase))%20NOT%20gene%3Awzy%20NOT%20gene%3Awzx%20NOT%20protein_name%3Apolymerase%20NOT%20protein_name%3Aflippase%20NOT%20xref%3Apfam-PF01943%20NOT%20xref%3Apfam-PF14667%20NOT%20xref%3Apfam-PF14296)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22O-antigen%20ligase%22%20OR%20name%3A%22lipid%20A-core%3Asurface%20polymer%20ligase%22%20OR%20name%3AWaaL%20OR%20name%3ARfaL)%20NOT%20name%3Apolymerase%20NOT%20name%3Aflippase%20NOT%20name%3AWzy%20NOT%20name%3AWzx%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22O-antigen%20ligase%22%5BProduct%5D%20OR%20waaL%5BGene%20Name%5D%20OR%20rfaL%5BGene%20Name%5D)%20NOT%20polymerase%5BProduct%5D%20NOT%20flippase%5BProduct%5D%20NOT%20wzy%5BGene%20Name%5D%20NOT%20wzx%5BGene%20Name%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20280%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20540%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.TRANSLOCON)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awza%20OR%20gene%3AkpsD%20OR%20protein_name%3A%22polysaccharide%20export%20protein%20Wza%22%20OR%20protein_name%3A%22outer%20membrane%20polysaccharide%20export%22%20OR%20xref%3Apfam-PF02563)%20NOT%20gene%3Awzm%20NOT%20gene%3AkpsM%20NOT%20gene%3AkpsE%20NOT%20gene%3Awzc%20NOT%20protein_name%3Apermease%20NOT%20protein_name%3Akinase%20NOT%20protein_name%3A%22inner%20membrane%22%20NOT%20protein_name%3A%22ATP-binding%22%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22outer%20membrane%20polysaccharide%20export%22%20OR%20name%3A%22polysaccharide%20export%20protein%20Wza%22%20OR%20name%3AWza%20OR%20name%3AKpsD)%20NOT%20name%3AWzm%20NOT%20name%3AKpsM%20NOT%20name%3AKpsE%20NOT%20name%3Apermease%20NOT%20name%3Akinase%20NOT%20name%3A%22ABC%20transporter%22%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22outer%20membrane%20polysaccharide%20export%22%5BProduct%5D%20OR%20wza%5BGene%20Name%5D%20OR%20kpsD%5BGene%20Name%5D)%20NOT%20wzm%5BGene%20Name%5D%20NOT%20kpsM%5BGene%20Name%5D%20NOT%20kpsE%5BGene%20Name%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20290%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20500%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.CAPSULE_ANCHOR)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Awzi%20OR%20gene%3AkpsC%20OR%20gene%3Awzg%20OR%20gene%3AcpsA%20OR%20gene%3Acps2A%20OR%20gene%3AcapA%20OR%20protein_name%3A%22capsule%20attachment%20protein%22%20OR%20protein_name%3A%22capsule%20assembly%20protein%20Wzi%22%20OR%20protein_name%3A%22capsular%20polysaccharide%20assembly%20protein%20Wzi%22%20OR%20protein_name%3A%22LytR-CpsA-Psr%22%20OR%20xref%3Apfam-PF14052%20OR%20(xref%3Apfam-PF03816%20AND%20(gene%3Awzg%20OR%20gene%3Acps*%20OR%20gene%3Acap*%20OR%20protein_name%3Acapsule)))%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gt_subqueries%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'(gene%3Awzi%20OR%20gene%3AkpsC%20OR%20protein_name%3A%22capsule%20assembly%20protein%20Wzi%22%20OR%20protein_name%3A%22capsular%20polysaccharide%20assembly%20protein%20Wzi%22%20OR%20xref%3Apfam-PF14052)%20NOT%20protein_name%3Aglycosyltransferase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'((xref%3Apfam-PF03816%20AND%20(gene%3Awzg%20OR%20gene%3Acps*%20OR%20gene%3Acap*%20OR%20protein_name%3Acapsule))%20OR%20gene%3Awzg%20OR%20gene%3AcpsA%20OR%20gene%3Acps2A%20OR%20protein_name%3A%22LytR-CpsA-Psr%22)%20NOT%20protein_name%3Aglycosyltransferase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22capsule%20assembly%20protein%20Wzi%22%20OR%20name%3AWzi%20OR%20name%3AKpsC%20OR%20name%3AWzg%20OR%20name%3ACpsA%20OR%20(name%3A%22LytR-CpsA-Psr%22%20AND%20name%3Acapsule))%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22capsule%20attachment%20protein%22%5BProduct%5D%20OR%20%22capsule%20assembly%20protein%20Wzi%22%5BProduct%5D%20OR%20wzi%5BGene%20Name%5D%20OR%20kpsC%5BGene%20Name%5D%20OR%20wzg%5BGene%20Name%5D%20OR%20cpsA%5BGene%20Name%5D%20OR%20cps2A%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20320%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20680%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.PYRUVYLTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20%22((gene%3AwcaK%20OR%20protein_name%3Apyruvyltransferase%20OR%20xref%3Apfam-PF04230%20OR%20xref%3Ainterpro-IPR007345)%20NOT%20gene%3AmurB%20NOT%20protein_name%3Areductase%20NOT%20protein_name%3Aglycosyltransferase%20NOT%20xref%3Apfam-PF00534%20NOT%20xref%3Apfam-PF00535%20NOT%20xref%3Apfam-PF13439%20NOT%20xref%3Apfam-PF13579%20NOT%20xref%3Apfam-PF01565)%20AND%20taxonomy_id%3A2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3Apyruvyl*%20OR%20name%3A%22Polysaccharide%20pyruvyl%20transferase%22)%20NOT%20name%3Areductase%20NOT%20name%3Aglycosyltransferase%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(pyruvyltransferase%5BProduct%5D%20OR%20%22polysaccharide%20pyruvyl%20transferase%22%5BProduct%5D%20OR%20wcaK%5BGene%20Name%5D)%20NOT%20glycosyltransferase%5BProduct%5D%20NOT%20reductase%5BProduct%5D%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20220%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20480%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.METHYLTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(protein_name%3A%22polysaccharide%20O-methyltransferase%22%20OR%20protein_name%3A%22sugar%20O-methyltransferase%22%20OR%20protein_name%3A%22capsular%20polysaccharide%20methyltransferase%22)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22polysaccharide%20methyltransferase%22%20OR%20name%3A%22sugar%20O-methyltransferase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22polysaccharide%20O-methyltransferase%22%5BProduct%5D%20OR%20%22sugar%20O-methyltransferase%22%5BProduct%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20160%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20520%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.ACETYLTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AwecD%20OR%20gene%3AoatA%20OR%20gene%3Aatr%20OR%20gene%3AwbbJ%20OR%20protein_name%3A%22O-acetyltransferase%22%20OR%20xref%3Apfam-PF01757)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gt_subqueries%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'((gene%3AwecD%20OR%20gene%3AwbbJ%20OR%20gene%3AneuD%20OR%20xref%3Apfam-PF00132)%20AND%20(protein_name%3A%22O-acetyltransferase%22%20OR%20protein_name%3A%22acetyltransferase%22))%20NOT%20protein_name%3Aglycosyltransferase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'((gene%3AoatA%20OR%20gene%3Aatr*%20OR%20gene%3Aoac*%20OR%20xref%3Apfam-PF01757)%20AND%20(protein_name%3A%22O-acetyltransferase%22%20OR%20protein_name%3A%22acyltransferase%22%20OR%20protein_name%3A%22acetyltransferase%22))%20NOT%20protein_name%3Aflippase%20NOT%20protein_name%3Apolymerase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22O-acetyltransferase%22%20AND%20name%3Apolysaccharide%20OR%20name%3AWecD%20OR%20name%3AOatA%20OR%20name%3A%22Acyl_transf_3%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22O-acetyltransferase%22%5BProduct%5D%20OR%20wecD%5BGene%20Name%5D%20OR%20oatA%5BGene%20Name%5D%20OR%20atr%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20140%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20680%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22quota_multiplier%22%3A%201.8%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.PHOSPHOTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AlicD%20OR%20gene%3Apgt%20OR%20gene%3AwcfF%20OR%20protein_name%3A%22phosphocholine%20transferase%22%20OR%20protein_name%3A%22licD-family%20phosphotransferase%22%20OR%20xref%3Apfam-PF04991)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22phosphocholine%20transferase%22%20OR%20name%3A%22LicD%20family%22%20OR%20name%3ALicD)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22phosphocholine%20transferase%22%5BProduct%5D%20OR%20licD%5BGene%20Name%5D%20OR%20pgt%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20460%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.FORMYLTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AwbqD%20OR%20gene%3AvioF%20OR%20gene%3AwbtB%20OR%20gene%3Afmt%20OR%20protein_name%3A%22N-formyltransferase%22%20OR%20protein_name%3A%22dTDP-4-amino-4%2C6-dideoxyglucose%20formyltransferase%22%20OR%20protein_name%3A%22sugar%20N-formyltransferase%22)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22formyltransferase%22%20OR%20name%3A%22N-formyltransferase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22N-formyltransferase%22%5BProduct%5D%20OR%20%22formyltransferase%22%5BProduct%5D%20OR%20wbqD%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20160%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20450%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.ALANINE_TRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Aalt1%20OR%20gene_exact%3AdltA%20OR%20gene%3AdltB%20OR%20gene%3Aaat%20OR%20protein_name%3A%22alanine--poly(phosphoribitol)%20ligase%22%20OR%20protein_name%3A%22D-alanine%20transferase%22%20OR%20protein_name%3A%22D-alanyl-lipoteichoic%20acid%22)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22D-alanine--poly(phosphoribitol)%20ligase%22%20OR%20name%3A%22D-alanyl-lipoteichoic%20acid%22%20OR%20name%3ADltA)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22alanine--poly(phosphoribitol)%20ligase%22%5BProduct%5D%20OR%20%22D-alanine%20transferase%22%5BProduct%5D%20OR%20%22D-alanyl-lipoteichoic%20acid%20biosynthesis%22%5BProduct%5D%20OR%20alt1%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20160%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20560%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.AMINOTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AwecE%20OR%20gene%3AdegT%20OR%20gene%3ApseC%20OR%20gene%3AperA%20OR%20gene%3Arhnb%20OR%20gene%3Arhnc%20OR%20protein_name%3A%22dTDP-4-amino-4%2C6-dideoxygalactose%20transaminase%22%20OR%20xref%3Apfam-PF01041)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22DegT%2FDnrJ%2FEryC1%2FStrS%20aminotransferase%22%20OR%20name%3A%22dTDP-4-amino-4%2C6-dideoxygalactose%20transaminase%22%20OR%20name%3AWecE)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22dTDP-4-amino-4%2C6-dideoxygalactose%20transaminase%22%5BProduct%5D%20OR%20wecE%5BGene%20Name%5D%20OR%20pseC%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20280%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20480%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.ALDOLASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AneuB%20OR%20gene%3ApseI%20OR%20gene%3AlegI%20OR%20gene%3AkdsA%20OR%20protein_name%3A%22N-acetylneuraminate%20synthase%22%20OR%20protein_name%3A%22pseudaminic%20acid%20synthase%22%20OR%20xref%3Apfam-PF03102)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22N-acetylneuraminate%20synthase%22%20OR%20name%3A%22pseudaminic%20acid%20synthase%22%20OR%20name%3A%222-dehydro-3-deoxyphosphooctonate%20aldolase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22N-acetylneuraminate%20synthase%22%5BProduct%5D%20OR%20%22pseudaminic%20acid%20synthase%22%5BProduct%5D%20OR%20neuB%5BGene%20Name%5D%20OR%20kdsA%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20220%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20450%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.DEACETYLASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3ApgaB%20OR%20gene%3ApdaA%20OR%20gene%3AicaB%20OR%20protein_name%3A%22poly-beta-1%2C6-N-acetyl-D-glucosamine%20N-deacetylase%22%20OR%20protein_name%3A%22polysaccharide%20deacetylase%22%20OR%20xref%3Apfam-PF01522)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22polysaccharide%20deacetylase%22%20OR%20name%3A%22poly-beta-1%2C6-N-acetyl-D-glucosamine%20N-deacetylase%22%20OR%20name%3APgaB)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22poly-beta-1%2C6-N-acetyl-D-glucosamine%20N-deacetylase%22%5BProduct%5D%20OR%20%22polysaccharide%20deacetylase%22%5BProduct%5D%20OR%20pgaB%5BGene%20Name%5D%20OR%20pdaA%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20180%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20750%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.EPIMERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Agne%20OR%20gene%3ArmlC%20OR%20gene%3AgalE%20OR%20gene%3AmnaA%20OR%20protein_name%3A%22UDP-glucose%204-epimerase%22%20OR%20xref%3Apfam-PF00908)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22UDP-glucose%204-epimerase%22%20OR%20name%3A%22dTDP-4-dehydrorhamnose%203%2C5-epimerase%22%20OR%20name%3ARmlC%20OR%20name%3AGalE)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22UDP-glucose%204-epimerase%22%5BProduct%5D%20OR%20galE%5BGene%20Name%5D%20OR%20rmlC%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20150%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20420%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.OXIDOREDUCTASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3ArmlB%20OR%20gene%3ArmlD%20OR%20gene%3Augd%20OR%20gene%3Agmd%20OR%20gene%3Agnd%20OR%20protein_name%3A%22UDP-glucose%206-dehydrogenase%22%20OR%20protein_name%3A%22dTDP-glucose%204%2C6-dehydratase%22%20OR%20protein_name%3A%226-phosphogluconate%20dehydrogenase%22%20OR%20xref%3Apfam-PF03721)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22UDP-glucose%206-dehydrogenase%22%20OR%20name%3A%22dTDP-glucose%204%2C6-dehydratase%22%20OR%20name%3A%22GDP-mannose%204%2C6-dehydratase%22%20OR%20name%3A%226-phosphogluconate%20dehydrogenase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22UDP-glucose%206-dehydrogenase%22%5BProduct%5D%20OR%20%22dTDP-glucose%204%2C6-dehydratase%22%5BProduct%5D%20OR%20%22dTDP-4-dehydrorhamnose%20reductase%22%5BProduct%5D%20OR%20rmlB%5BGene%20Name%5D%20OR%20ugd%5BGene%20Name%5D%20OR%20gnd%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20240%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20500%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.TRANSMEMBRANE_SYNTHASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AhasA%20OR%20gene%3ApgaC%20OR%20gene%3AicaA%20OR%20(gene%3AbcsA%20AND%20protein_name%3A%22catalytic%22)%20OR%20protein_name%3A%22hyaluronan%20synthase%22%20OR%20protein_name%3A%22cellulose%20synthase%20catalytic%20subunit%22%20OR%20protein_name%3A%22poly-beta-1%2C6-N-acetyl-D-glucosamine%20synthase%22%20OR%20xref%3Apfam-PF13641)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22hyaluronan%20synthase%22%20OR%20name%3A%22cellulose%20synthase%20catalytic%20subunit%22%20OR%20name%3A%22poly-beta-1%2C6-N-acetyl-D-glucosamine%20synthase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22hyaluronan%20synthase%22%5BProduct%5D%20OR%20%22cellulose%20synthase%20catalytic%20subunit%22%5BProduct%5D%20OR%20%22cellulose%20synthase%20subunit%20A%22%5BProduct%5D%20OR%20hasA%5BGene%20Name%5D%20OR%20pgaC%5BGene%20Name%5D%20OR%20bcsA%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20340%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%201000%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.NUCLEOTIDYLTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3ArmlA%20OR%20gene%3AgalU%20OR%20gene%3AglmM%20OR%20gene%3AmanC%20OR%20protein_name%3A%22glucose-1-phosphate%20thymidylyltransferase%22%20OR%20xref%3Apfam-PF00483)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22glucose-1-phosphate%20thymidylyltransferase%22%20OR%20name%3A%22UTP--glucose-1-phosphate%20uridylyltransferase%22%20OR%20name%3ARmlA)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22glucose-1-phosphate%20thymidylyltransferase%22%5BProduct%5D%20OR%20rmlA%5BGene%20Name%5D%20OR%20galU%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20210%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20520%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.NUCLEOTIDASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3Agmm%20OR%20gene%3AwcaH%20OR%20gene%3ApsaD%20OR%20gene%3AlgaF%20OR%20protein_name%3A%22GDP-mannose%20mannosyl%20hydrolase%22%20OR%20protein_name%3A%22sugar-nucleotide%20hydrolase%22%20OR%20protein_name%3A%22NUDIX%20hydrolase%22)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22GDP-mannose%20mannosyl%20hydrolase%22%20OR%20name%3A%22GDP-mannose%20hydrolase%22%20OR%20name%3A%22NUDIX%20hydrolase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22GDP-mannose%20mannosyl%20hydrolase%22%5BProduct%5D%20OR%20%22GDP-mannose%20hydrolase%22%5BProduct%5D%20OR%20gmm%5BGene%20Name%5D%20OR%20psaD%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20120%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20290%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.INITIATOR)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(gene%3AwbaP%20OR%20gene%3AwcaJ%20OR%20gene%3AwecA%20OR%20gene%3ApglC%20OR%20protein_name%3A%22undecaprenyl-phosphate%20galactose%20phosphotransferase%22%20OR%20xref%3Apfam-PF02397)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22undecaprenyl-phosphate%20galactose%20phosphotransferase%22%20OR%20name%3A%22bacterial%20sugar%20transferase%22%20OR%20name%3AWbaP%20OR%20name%3AWcaJ)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22undecaprenyl-phosphate%20galactose%20phosphotransferase%22%5BProduct%5D%20OR%20wbaP%5BGene%20Name%5D%20OR%20wcaJ%5BGene%20Name%5D%20OR%20wecA%5BGene%20Name%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20180%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20540%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.GLYCOSYLHYDROLASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(protein_name%3A%22alginate%20lyase%22%20OR%20protein_name%3A%22polysaccharide%20lyase%22%20OR%20protein_name%3A%22depolymerase%22%20OR%20xref%3Apfam-PF05426)%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22polysaccharide%20lyase%22%20OR%20name%3A%22alginate%20lyase%22%20OR%20name%3A%22capsule%20depolymerase%22)%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22polysaccharide%20lyase%22%5BProduct%5D%20OR%20%22alginate%20lyase%22%5BProduct%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20220%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20650%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.GLYCOSYLTRANSFERASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(protein_name%3A%22glycosyltransferase%22%20AND%20(xref%3Apfam-PF00534%20OR%20xref%3Apfam-PF00535%20OR%20xref%3Apfam-PF13439%20OR%20xref%3Apfam-PF13579%20OR%20xref%3Apfam-PF01501))%20NOT%20protein_name%3Asynthase%20NOT%20protein_name%3Acellulose%20NOT%20protein_name%3Ahyaluronan%20NOT%20protein_name%3Apyruvyltransferase%20NOT%20xref%3Apfam-PF04230%20NOT%20gene%3AbcsA%20NOT%20gene%3ApgaC%20NOT%20gene%3AhasA%20NOT%20gene%3AicaA%20NOT%20gene%3AwecA%20NOT%20gene%3AwbaP%20NOT%20gene%3AwcaJ%20NOT%20protein_name%3Atransposase%20NOT%20protein_name%3Aintegrase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22glycosyltransferase%20family%201%22%20OR%20name%3A%22glycosyltransferase%20family%202%22%20OR%20name%3A%22glycosyltransferase%20family%204%22%20OR%20name%3A%22capsular%20polysaccharide%20glycosyltransferase%22)%20NOT%20name%3Asynthase%20NOT%20name%3Acellulose%20NOT%20name%3Ahyaluronan%20NOT%20name%3Apyruvyltransferase%20NOT%20name%3Atransposase%20NOT%20name%3Aintegrase%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gt_subqueries%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22(xref%3Apfam-PF00534%20AND%20protein_name%3Aglycosyltransferase)%20NOT%20protein_name%3Asynthase%20NOT%20protein_name%3Apyruvyltransferase%20NOT%20xref%3Apfam-PF04230%20NOT%20gene%3AwecA%20NOT%20gene%3AwbaP%20NOT%20gene%3AwcaJ%20AND%20taxonomy_id%3A2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22(xref%3Apfam-PF00535%20AND%20protein_name%3Aglycosyltransferase)%20NOT%20protein_name%3Asynthase%20NOT%20protein_name%3Acellulose%20NOT%20protein_name%3Ahyaluronan%20NOT%20protein_name%3Apyruvyltransferase%20NOT%20xref%3Apfam-PF04230%20NOT%20gene%3AbcsA%20NOT%20gene%3ApgaC%20NOT%20gene%3AhasA%20NOT%20gene%3AicaA%20AND%20taxonomy_id%3A2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22((xref%3Apfam-PF13439%20OR%20xref%3Apfam-PF13579)%20AND%20protein_name%3Aglycosyltransferase)%20NOT%20protein_name%3Asynthase%20NOT%20protein_name%3Apyruvyltransferase%20NOT%20xref%3Apfam-PF04230%20AND%20taxonomy_id%3A2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22((xref%3Apfam-PF01501%20OR%20xref%3Apfam-PF01531%20OR%20xref%3Apfam-PF01755%20OR%20xref%3Apfam-PF03808)%20AND%20protein_name%3Aglycosyltransferase)%20NOT%20protein_name%3Asynthase%20NOT%20protein_name%3Apyruvyltransferase%20NOT%20xref%3Apfam-PF04230%20AND%20taxonomy_id%3A2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'((protein_name%3Aglycosyltransferase%20OR%20gene%3Agtr*%20OR%20gene%3Awba*%20OR%20gene%3Awbd*)%20AND%20(protein_name%3Acapsule%20OR%20protein_name%3Acapsular%20OR%20protein_name%3A%22O-antigen%22))%20NOT%20protein_name%3Asynthase%20NOT%20protein_name%3Apyruvyltransferase%20NOT%20gene%3AwbaP%20NOT%20gene%3AwcaJ%20NOT%20gene%3AwecA%20AND%20taxonomy_id%3A543'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(glycosyltransferase%5BProduct%5D%20NOT%20synthase%5BProduct%5D%20NOT%20cellulose%5BProduct%5D%20NOT%20pyruvyltransferase%5BProduct%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20210%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20460%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22quota_multiplier%22%3A%204.5%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.TRANSPOSASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'((xref%3Apfam-PF01609%20OR%20xref%3Apfam-PF01527%20OR%20xref%3Apfam-PF00872%20OR%20xref%3Apfam-PF13359%20OR%20protein_name%3A%22IS3%20family%20transposase%22%20OR%20protein_name%3A%22IS5%20family%20transposase%22%20OR%20protein_name%3A%22IS6%20family%20transposase%22%20OR%20protein_name%3A%22IS256%20family%20transposase%22)%20AND%20protein_name%3Atransposase)%20NOT%20protein_name%3Aintegrase%20NOT%20protein_name%3Arecombinase%20NOT%20protein_name%3Aglycosyltransferase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22IS3%20family%20transposase%22%20OR%20name%3A%22IS5%20family%20transposase%22%20OR%20name%3A%22IS6%20family%20transposase%22%20OR%20name%3A%22IS256%20family%20transposase%22)%20NOT%20name%3Aintegrase%20NOT%20name%3Aglycosyltransferase%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22IS%20family%20transposase%22%5BProduct%5D%20OR%20%22insertion%20sequence%20transposase%22%5BProduct%5D%20OR%20(transposase%5BProduct%5D%20NOT%20integrase%5BProduct%5D))%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20120%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20520%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20int(GeneRole.INTEGRASE)%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniprot%22%3A%20'(protein_name%3Aintegrase%20OR%20protein_name%3A%22site-specific%20recombinase%22%20OR%20xref%3Apfam-PF00589)%20NOT%20protein_name%3Atransposase%20NOT%20protein_name%3Aglycosyltransferase%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22uniref%22%3A%20'(name%3A%22site-specific%20integrase%22%20OR%20name%3A%22tyrosine%20recombinase%22%20OR%20name%3A%22phage%20integrase%22)%20NOT%20name%3Atransposase%20NOT%20name%3Aglycosyltransferase%20AND%20identity%3A0.5%20AND%20taxonomy_id%3A2'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ncbi_ipg%22%3A%20'(%22site-specific%20integrase%22%5BProduct%5D%20OR%20%22phage%20integrase%22%5BProduct%5D%20OR%20%22tyrosine%20recombinase%20XerC%22%5BProduct%5D%20OR%20%22tyrosine%20recombinase%20XerD%22%5BProduct%5D)%20AND%20%22Bacteria%22%5BOrganism%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20240%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20560%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20KEGG_KO_MAP%3A%20dict%5Bstr%2C%20GeneRole%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22K02847%22%3A%20GeneRole.LIGASE%2C%0A%20%20%20%20%20%20%20%20%22K02853%22%3A%20GeneRole.POLYMERASE%2C%0A%20%20%20%20%20%20%20%20%22K13008%22%3A%20GeneRole.POLYMERASE%2C%0A%20%20%20%20%20%20%20%20%22K02854%22%3A%20GeneRole.COPOLYMERASE%2C%0A%20%20%20%20%20%20%20%20%22K04771%22%3A%20GeneRole.COPOLYMERASE%2C%0A%20%20%20%20%20%20%20%20%22K16693%22%3A%20GeneRole.FLIPPASE%2C%0A%20%20%20%20%20%20%20%20%22K16695%22%3A%20GeneRole.FLIPPASE%2C%0A%20%20%20%20%20%20%20%20%22K16692%22%3A%20GeneRole.KINASE%2C%0A%20%20%20%20%20%20%20%20%22K25307%22%3A%20GeneRole.PHOSPHATASE%2C%0A%20%20%20%20%20%20%20%20%22K16690%22%3A%20GeneRole.ABC_PERMEASE%2C%0A%20%20%20%20%20%20%20%20%22K16691%22%3A%20GeneRole.ABC_ATPASE%2C%0A%20%20%20%20%20%20%20%20%22K01991%22%3A%20GeneRole.TRANSLOCON%2C%0A%20%20%20%20%20%20%20%20%22K09695%22%3A%20GeneRole.CAPSULE_ANCHOR%2C%0A%20%20%20%20%20%20%20%20%22K19225%22%3A%20GeneRole.CAPSULE_ANCHOR%2C%0A%20%20%20%20%20%20%20%20%22K02841%22%3A%20GeneRole.INITIATOR%2C%0A%20%20%20%20%20%20%20%20%22K03606%22%3A%20GeneRole.INITIATOR%2C%0A%20%20%20%20%20%20%20%20%22K02843%22%3A%20GeneRole.INITIATOR%2C%0A%20%20%20%20%20%20%20%20%22K00607%22%3A%20GeneRole.FORMYLTRANSFERASE%2C%0A%20%20%20%20%20%20%20%20%22K16560%22%3A%20GeneRole.PYRUVYLTRANSFERASE%2C%0A%20%20%20%20%20%20%20%20%22K00558%22%3A%20GeneRole.METHYLTRANSFERASE%2C%0A%20%20%20%20%20%20%20%20%22K01443%22%3A%20GeneRole.DEACETYLASE%2C%0A%20%20%20%20%20%20%20%20%22K01444%22%3A%20GeneRole.DEACETYLASE%2C%0A%20%20%20%20%20%20%20%20%22K01654%22%3A%20GeneRole.ALDOLASE%2C%0A%20%20%20%20%20%20%20%20%22K05304%22%3A%20GeneRole.ALDOLASE%2C%0A%20%20%20%20%20%20%20%20%22K01627%22%3A%20GeneRole.ALDOLASE%2C%0A%20%20%20%20%20%20%20%20%22K00832%22%3A%20GeneRole.AMINOTRANSFERASE%2C%0A%20%20%20%20%20%20%20%20%22K01791%22%3A%20GeneRole.EPIMERASE%2C%0A%20%20%20%20%20%20%20%20%22K01790%22%3A%20GeneRole.EPIMERASE%2C%0A%20%20%20%20%20%20%20%20%22K02473%22%3A%20GeneRole.EPIMERASE%2C%0A%20%20%20%20%20%20%20%20%22K00012%22%3A%20GeneRole.OXIDOREDUCTASE%2C%0A%20%20%20%20%20%20%20%20%22K00067%22%3A%20GeneRole.OXIDOREDUCTASE%2C%0A%20%20%20%20%20%20%20%20%22K02377%22%3A%20GeneRole.OXIDOREDUCTASE%2C%0A%20%20%20%20%20%20%20%20%22K00697%22%3A%20GeneRole.TRANSMEMBRANE_SYNTHASE%2C%0A%20%20%20%20%20%20%20%20%22K01795%22%3A%20GeneRole.TRANSMEMBRANE_SYNTHASE%2C%0A%20%20%20%20%20%20%20%20%22K00703%22%3A%20GeneRole.GLYCOSYLTRANSFERASE%2C%0A%20%20%20%20%20%20%20%20%22K01186%22%3A%20GeneRole.GLYCOSYLHYDROLASE%2C%0A%20%20%20%20%20%20%20%20%22K07483%22%3A%20GeneRole.TRANSPOSASE%2C%0A%20%20%20%20%20%20%20%20%22K04763%22%3A%20GeneRole.INTEGRASE%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20ROLE_TO_KOS%3A%20dict%5Bint%2C%20list%5Bstr%5D%5D%20%3D%20%7B%7D%0A%20%20%20%20for%20_ko%2C%20_role%20in%20KEGG_KO_MAP.items()%3A%0A%20%20%20%20%20%20%20%20ROLE_TO_KOS.setdefault(int(_role)%2C%20%5B%5D).append(_ko)%0A%0A%20%20%20%20RefSeqAccPattern%20%3D%20re.compile(r%22%5E%5BA-Z%5D%7B2%2C%7D_%22)%0A%20%20%20%20return%20ROLE_QUERIES%2C%20ROLE_TO_KOS%2C%20RefSeqAccPattern%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Alphabet%2C%0A%20%20%20%20Clusterer%2C%0A%20%20%20%20ET%2C%0A%20%20%20%20FastaReader%2C%0A%20%20%20%20GeneRole%2C%0A%20%20%20%20GeneRoleClassifier%2C%0A%20%20%20%20HTTPError%2C%0A%20%20%20%20NoMatchError%2C%0A%20%20%20%20Path%2C%0A%20%20%20%20ROLE_QUERIES%3A%20dict%5Bint%2C%20dict%5Bstr%2C%20object%5D%5D%2C%0A%20%20%20%20ROLE_TO_KOS%3A%20dict%5Bint%2C%20list%5Bstr%5D%5D%2C%0A%20%20%20%20RefSeqAccPattern%2C%0A%20%20%20%20Request%2C%0A%20%20%20%20Sequences%2C%0A%20%20%20%20ThreadPoolExecutor%2C%0A%20%20%20%20body_to_bytes%2C%0A%20%20%20%20cassetter%2C%0A%20%20%20%20csr_array%2C%0A%20%20%20%20get_current_cassette%2C%0A%20%20%20%20gzip%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20njit%2C%0A%20%20%20%20np%2C%0A%20%20%20%20optuna%2C%0A%20%20%20%20os%2C%0A%20%20%20%20prange%2C%0A%20%20%20%20quote%2C%0A%20%20%20%20threading%2C%0A%20%20%20%20time%2C%0A%20%20%20%20urlopen%2C%0A)%3A%0A%20%20%20%20%23%20------------------------------------------------------------------------------------------------------------------%0A%20%20%20%20%23%20Pure%20In-Memory%20Multi-Source%20Sequence%20Fetcher%20(with%20Cassetter%20Caching%20%26%20Post-Clustering%20Top-Up)%2C%20Pre-Encoder%20%26%20Optuna%0A%20%20%20%20%23%20------------------------------------------------------------------------------------------------------------------%0A%20%20%20%20_cassette_lock%20%3D%20threading.Lock()%0A%20%20%20%20_active_cassette%3A%20list%5Bobject%5D%20%3D%20%5BNone%5D%0A%0A%20%20%20%20def%20resolve_ncbi_api_key()%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20%22%22%22Resolve%20NCBI_API_KEY%20from%20environment%20or%20~%2F.env%20without%20writing%20anything%20to%20disk.%22%22%22%0A%20%20%20%20%20%20%20%20api_key%20%3D%20os.environ.get(%22NCBI_API_KEY%22)%0A%20%20%20%20%20%20%20%20if%20api_key%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20api_key%0A%20%20%20%20%20%20%20%20env_path%20%3D%20Path.home()%20%2F%20%22.env%22%0A%20%20%20%20%20%20%20%20if%20env_path.is_file()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20line%20in%20env_path.read_text().splitlines()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%22%3D%22%20in%20line%20and%20not%20line.startswith(%22%23%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k%2C%20v%20%3D%20line.split(%22%3D%22%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20k.strip()%20%3D%3D%20%22NCBI_API_KEY%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20v.strip()%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20def%20http_get_bytes(url%3A%20str%2C%20timeout%3A%20float%20%3D%2025.0%2C%20max_retries%3A%20int%20%3D%203)%20-%3E%20bytes%3A%0A%20%20%20%20%20%20%20%20%22%22%22Perform%20an%20in-memory%20HTTP%20GET%20request%20with%20cassetter%20replay%2Frecording%2C%20gzip%20decompression%2C%20and%20backoff.%22%22%22%0A%20%20%20%20%20%20%20%20cassette%20%3D%20get_current_cassette()%20or%20_active_cassette%5B0%5D%0A%20%20%20%20%20%20%20%20if%20cassette%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20_cassette_lock%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cached%20%3D%20cassette.play(%22GET%22%2C%20url%2C%20%7B%7D%2C%20None)%20%20%23%20type%3A%20ignore%5Battr-defined%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_body%20%3D%20body_to_bytes(cached.body)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20raw_body.startswith(b%22%5Cx1f%5Cx8b%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_body%20%3D%20gzip.decompress(raw_body)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20raw_body%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%20NoMatchError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pass%0A%0A%20%20%20%20%20%20%20%20backoff%20%3D%201.0%0A%20%20%20%20%20%20%20%20headers%20%3D%20%7B%22User-Agent%22%3A%20%22SeroGen%2F0.1%20(In-Memory%20BGC%20Classifier%20Pipeline)%22%7D%0A%20%20%20%20%20%20%20%20for%20attempt%20in%20range(max_retries)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20req%20%3D%20Request(url%2C%20headers%3Dheaders)%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20urlopen(req%2C%20timeout%3Dtimeout)%20as%20resp%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20resp.status%20%3D%3D%20200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20resp.read()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20data.startswith(b%22%5Cx1f%5Cx8b%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20gzip.decompress(data)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20cassette%20is%20not%20None%20and%20data%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20_cassette_lock%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20getattr(cassette.record_mode%2C%20%22name%22%2C%20%22ALL%22).upper()%20!%3D%20%22NONE%22%3A%20%20%23%20type%3A%20ignore%5Battr-defined%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cassette.record(%20%20%23%20type%3A%20ignore%5Battr-defined%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22GET%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22content-type%22%3A%20%5B%22text%2Fplain%3B%20charset%3Dutf-8%22%5D%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20HTTPError%20as%20err%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20err.code%20in%20(429%2C%20500%2C%20502%2C%20503%2C%20504)%20and%20attempt%20%3C%20max_retries%20-%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(backoff)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20backoff%20*%3D%202.0%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20b%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20attempt%20%3C%20max_retries%20-%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(backoff)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20backoff%20*%3D%202.0%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20b%22%22%0A%20%20%20%20%20%20%20%20return%20b%22%22%0A%0A%20%20%20%20def%20fetch_uniprot_sequences(query%3A%20str%2C%20limit%3A%20int%20%3D%20200)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%22%22%22Fetch%20full-length%20bacterial%20protein%20sequences%20from%20UniProtKB%20REST%20API%20into%20%60Sequences%60.%22%22%22%0A%20%20%20%20%20%20%20%20encoded_q%20%3D%20quote(f%22(%7Bquery%7D)%20AND%20fragment%3Afalse%22)%0A%20%20%20%20%20%20%20%20url%20%3D%20f%22https%3A%2F%2Frest.uniprot.org%2Funiprotkb%2Fsearch%3Fquery%3D%7Bencoded_q%7D%26format%3Dfasta%26size%3D%7Bmin(limit%2C%20500)%7D%22%0A%20%20%20%20%20%20%20%20raw_fasta%20%3D%20http_get_bytes(url)%0A%20%20%20%20%20%20%20%20if%20not%20raw_fasta%20or%20not%20raw_fasta.strip()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%20%20%20%20%20%20%20%20return%20FastaReader.from_bytes(raw_fasta).load()%0A%0A%20%20%20%20def%20fetch_uniref50_sequences(query%3A%20str%2C%20limit%3A%20int%20%3D%20180)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%22%22%22Fetch%20pre-clustered%20(%3C50%25%20identity)%20bacterial%20representative%20sequences%20from%20UniRef50.%22%22%22%0A%20%20%20%20%20%20%20%20encoded_q%20%3D%20quote(query)%0A%20%20%20%20%20%20%20%20url%20%3D%20f%22https%3A%2F%2Frest.uniprot.org%2Funiref%2Fsearch%3Fquery%3D%7Bencoded_q%7D%26format%3Dfasta%26size%3D%7Bmin(limit%2C%20500)%7D%22%0A%20%20%20%20%20%20%20%20raw_fasta%20%3D%20http_get_bytes(url)%0A%20%20%20%20%20%20%20%20if%20not%20raw_fasta%20or%20not%20raw_fasta.strip()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%20%20%20%20%20%20%20%20return%20FastaReader.from_bytes(raw_fasta).load()%0A%0A%20%20%20%20def%20fetch_ncbi_ipg_sequences(query%3A%20str%2C%20limit%3A%20int%20%3D%2080%2C%20api_key%3A%20str%20%7C%20None%20%3D%20None)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%22%22%22Query%20NCBI%20Identical%20Protein%20Groups%20(IPG)%20and%20batch-load%20RefSeq%20proteins%20into%20%60Sequences%60.%22%22%22%0A%20%20%20%20%20%20%20%20api_param%20%3D%20f%22%26api_key%3D%7Bapi_key%7D%22%20if%20api_key%20else%20%22%22%0A%20%20%20%20%20%20%20%20encoded_q%20%3D%20quote(query)%0A%20%20%20%20%20%20%20%20esearch_url%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22https%3A%2F%2Feutils.ncbi.nlm.nih.gov%2Fentrez%2Feutils%2Fesearch.fcgi%3F%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22db%3Dipg%26term%3D%7Bencoded_q%7D%26retmax%3D%7Blimit%7D%26retmode%3Dxml%7Bapi_param%7D%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20search_xml%20%3D%20http_get_bytes(esearch_url)%0A%20%20%20%20%20%20%20%20if%20not%20search_xml%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20root%20%3D%20ET.fromstring(search_xml)%0A%20%20%20%20%20%20%20%20%20%20%20%20id_list%20%3D%20%5Be.text%20for%20e%20in%20root.findall(%22.%2F%2FIdList%2FId%22)%20if%20e.text%5D%0A%20%20%20%20%20%20%20%20except%20Exception%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%20%20%20%20%20%20%20%20if%20not%20id_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20wp_accs%3A%20list%5Bstr%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20j%20in%20range(0%2C%20len(id_list)%2C%20200)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20id_chunk%20%3D%20id_list%5Bj%20%3A%20j%20%2B%20200%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20summary_url%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22https%3A%2F%2Feutils.ncbi.nlm.nih.gov%2Fentrez%2Feutils%2Fesummary.fcgi%3F%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22db%3Dipg%26id%3D%7B'%2C'.join(id_chunk)%7D%26retmode%3Dxml%7Bapi_param%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20sum_xml%20%3D%20http_get_bytes(summary_url)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20sum_xml%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sum_root%20%3D%20ET.fromstring(sum_xml)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20doc%20in%20sum_root.findall(%22.%2F%2FDocumentSummary%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20acc%20%3D%20doc.findtext(%22Accession%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20acc%20and%20(acc.startswith(%22WP_%22)%20or%20acc.startswith(%22NP_%22)%20or%20RefSeqAccPattern.match(acc))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wp_accs.append(acc)%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20unique_accs%20%3D%20list(dict.fromkeys(wp_accs))%0A%20%20%20%20%20%20%20%20if%20not%20unique_accs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20batches%3A%20list%5BSequences%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(unique_accs)%2C%2050)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20chunk%20%3D%20unique_accs%5Bi%20%3A%20i%20%2B%2050%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20efetch_url%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22https%3A%2F%2Feutils.ncbi.nlm.nih.gov%2Fentrez%2Feutils%2Fefetch.fcgi%3F%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22db%3Dprotein%26id%3D%7B'%2C'.join(chunk)%7D%26rettype%3Dfasta%26retmode%3Dtext%7Bapi_param%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20fasta_bytes%20%3D%20http_get_bytes(efetch_url)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20fasta_bytes%20and%20fasta_bytes.strip()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batches.append(FastaReader.from_bytes(fasta_bytes).load())%0A%20%20%20%20%20%20%20%20return%20Sequences.concat(batches)%20if%20batches%20else%20Sequences.empty()%0A%0A%20%20%20%20def%20fetch_kegg_ko_sequences(ko_id%3A%20str%2C%20max_seqs%3A%20int%20%3D%2035)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%22%22%22Fetch%20verified%20bacterial%20ortholog%20sequences%20for%20a%20KEGG%20KO%20identifier%20directly%20in%20memory.%22%22%22%0A%20%20%20%20%20%20%20%20clean_ko%20%3D%20ko_id.strip().upper()%0A%20%20%20%20%20%20%20%20link_bytes%20%3D%20http_get_bytes(f%22https%3A%2F%2Frest.kegg.jp%2Flink%2Fgenes%2F%7Bclean_ko%7D%22%2C%20timeout%3D15.0)%0A%20%20%20%20%20%20%20%20if%20not%20link_bytes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20gene_ids%3A%20list%5Bstr%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20line%20in%20link_bytes.decode(%22utf-8%22%2C%20errors%3D%22replace%22).splitlines()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20parts%20%3D%20line.strip().split(%22%5Ct%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(parts)%20%3E%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target_gene%20%3D%20parts%5B1%5D.strip()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20target_gene.startswith((%22hsa%3A%22%2C%20%22mmu%3A%22%2C%20%22rno%3A%22%2C%20%22dme%3A%22%2C%20%22cel%3A%22))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gene_ids.append(target_gene)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(gene_ids)%20%3E%3D%20max_seqs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20if%20not%20gene_ids%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20fasta_chunks%3A%20list%5Bbytes%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(gene_ids)%2C%2010)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_ids%20%3D%20%22%2B%22.join(gene_ids%5Bi%20%3A%20i%20%2B%2010%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20raw%20%3D%20http_get_bytes(f%22https%3A%2F%2Frest.kegg.jp%2Fget%2F%7Bbatch_ids%7D%2Faaseq%22%2C%20timeout%3D15.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20raw%20and%20raw.strip()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fasta_chunks.append(raw)%0A%0A%20%20%20%20%20%20%20%20if%20not%20fasta_chunks%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%20%20%20%20%20%20%20%20return%20FastaReader.from_bytes(b%22%5Cn%22.join(fasta_chunks)).load()%0A%0A%20%20%20%20def%20filter_and_cluster_role_sequences(%0A%20%20%20%20%20%20%20%20raw_seqs%3A%20Sequences%2C%0A%20%20%20%20%20%20%20%20clusterer%3A%20Clusterer%2C%0A%20%20%20%20%20%20%20%20k_std%3A%20float%2C%0A%20%20%20%20%20%20%20%20min_len%3A%20int%20%3D%2030%2C%0A%20%20%20%20%20%20%20%20max_len%3A%20int%20%3D%202500%2C%0A%20%20%20%20)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%22%22%22Vectorized%20QC%20(role-specific%20length%20guardrails%2C%20no%20internal%20stops%2C%20MAD%20bounds)%20%2B%20CD-HIT%20clustering.%22%22%22%0A%20%20%20%20%20%20%20%20if%20len(raw_seqs)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20%23%201.%20Remove%20sequences%20with%20internal%20stop%20codons%20or%20outside%20role-specific%20length%20bounds%0A%20%20%20%20%20%20%20%20valid_mask%20%3D%20(~raw_seqs.internal_stops)%20%26%20(raw_seqs.lengths%20%3E%3D%20min_len)%20%26%20(raw_seqs.lengths%20%3C%3D%20max_len)%0A%20%20%20%20%20%20%20%20seqs%20%3D%20raw_seqs%5Bvalid_mask%5D%0A%20%20%20%20%20%20%20%20if%20len(seqs)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20%23%202.%20Exact%20FNV-1a%20sequence%20deduplication%0A%20%20%20%20%20%20%20%20seqs%20%3D%20seqs.unique()%0A%0A%20%20%20%20%20%20%20%20%23%203.%20Robust%20median%20%2B%2F-%20k_std%20*%20MAD%20length%20outlier%20filtering%0A%20%20%20%20%20%20%20%20if%20len(seqs)%20%3E%3D%2010%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20lens%20%3D%20seqs.lengths.astype(np.float64)%0A%20%20%20%20%20%20%20%20%20%20%20%20med%20%3D%20float(np.median(lens))%0A%20%20%20%20%20%20%20%20%20%20%20%20mad%20%3D%20float(np.median(np.abs(lens%20-%20med)))%0A%20%20%20%20%20%20%20%20%20%20%20%20robust_std%20%3D%20max(1.4826%20*%20mad%2C%200.20%20*%20med%2C%2040.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20lower%20%3D%20max(float(min_len)%2C%20med%20-%20k_std%20*%20robust_std)%0A%20%20%20%20%20%20%20%20%20%20%20%20upper%20%3D%20min(float(max_len)%2C%20med%20%2B%20k_std%20*%20robust_std)%0A%20%20%20%20%20%20%20%20%20%20%20%20len_mask%20%3D%20(seqs.lengths%20%3E%3D%20lower)%20%26%20(seqs.lengths%20%3C%3D%20upper)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20np.any(len_mask)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20seqs%20%3D%20seqs%5Blen_mask%5D%0A%0A%20%20%20%20%20%20%20%20%23%204.%20Homology%20reduction%20via%20SeroGen's%20Numba%2FRandstrobe%20Clusterer%20(main%20thread)%0A%20%20%20%20%20%20%20%20if%20len(seqs)%20%3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20clusters%20%3D%20clusterer.cluster(seqs)%0A%20%20%20%20%20%20%20%20%20%20%20%20seqs%20%3D%20seqs%5Bclusters.representatives%5D%0A%0A%20%20%20%20%20%20%20%20return%20seqs%0A%0A%20%20%20%20def%20fetch_in_memory_dataset(%0A%20%20%20%20%20%20%20%20target_per_role%3A%20int%20%3D%2080%2C%0A%20%20%20%20%20%20%20%20min_identity%3A%20float%20%3D%2080.0%2C%0A%20%20%20%20%20%20%20%20k_std%3A%20float%20%3D%203.5%2C%0A%20%20%20%20%20%20%20%20include_ncbi%3A%20bool%20%3D%20True%2C%0A%20%20%20%20%20%20%20%20include_kegg%3A%20bool%20%3D%20True%2C%0A%20%20%20%20%20%20%20%20seed%3A%20int%20%3D%2042%2C%0A%20%20%20%20)%20-%3E%20tuple%5BSequences%2C%20np.ndarray%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Fetch%20(with%20cassetter%20disk%20caching)%20and%20cluster%20non-redundant%20bacterial%20reference%20sequences%20across%2029%20roles.%22%22%22%0A%20%20%20%20%20%20%20%20api_key%20%3D%20resolve_ncbi_api_key()%0A%20%20%20%20%20%20%20%20clusterer%20%3D%20Clusterer(min_identity%3Dmin_identity%2C%20mode%3D%22cdhit%22)%0A%20%20%20%20%20%20%20%20n_functional%20%3D%2029%0A%0A%20%20%20%20%20%20%20%20cassette_path%20%3D%20Path(__file__).resolve().parent%20%2F%20%22cassettes%22%20%2F%20%22train_gene_classifier.toml%22%0A%20%20%20%20%20%20%20%20cassette_path.parent.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20%20%20%20%20def%20_role_target(role_idx%3A%20int)%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20q_spec%20%3D%20ROLE_QUERIES.get(role_idx%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20mult%20%3D%20float(q_spec.get(%22quota_multiplier%22%2C%201.0))%20%20%23%20type%3A%20ignore%5Barg-type%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20int(round(target_per_role%20*%20mult))%0A%0A%20%20%20%20%20%20%20%20%23%20Phase%201%3A%20Parallel%20HTTP%20I%2FO%20from%20UniProtKB%20(Pfam%2FInterPro%20enriched)%20%2B%20UniRef50%20(pre-clustered%20%3C50%25%20identity)%0A%20%20%20%20%20%20%20%20gt_excl_uniprot%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%20NOT%20xref%3Apfam-PF00534%20NOT%20xref%3Apfam-PF00535%20NOT%20xref%3Apfam-PF13439%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%20NOT%20xref%3Apfam-PF13579%20NOT%20xref%3Apfam-PF01501%20NOT%20protein_name%3Aglycosyltransferase%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gt_excl_uniref%20%3D%20%22%20NOT%20name%3Aglycosyltransferase%22%0A%0A%20%20%20%20%20%20%20%20def%20_fetch_primary_http(role_idx%3A%20int)%20-%3E%20Sequences%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20q_spec%20%3D%20ROLE_QUERIES.get(role_idx%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20r_target%20%3D%20_role_target(role_idx)%0A%20%20%20%20%20%20%20%20%20%20%20%20batches%3A%20list%5BSequences%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20exclude_gt%20%3D%20role_idx%20not%20in%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20int(GeneRole.GLYCOSYLTRANSFERASE)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20int(GeneRole.TRANSMEMBRANE_SYNTHASE)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20gt_subs%20%3D%20q_spec.get(%22gt_subqueries%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(gt_subs%2C%20list)%20and%20gt_subs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sub_limit%20%3D%20max((r_target%20%2F%2F%20len(gt_subs))%20%2B%2060%2C%20120)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20sub_q%20in%20gt_subs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sub_seqs%20%3D%20fetch_uniprot_sequences(str(sub_q)%2C%20limit%3Dsub_limit)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(sub_seqs)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batches.append(sub_seqs)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20up_q%20%3D%20q_spec.get(%22uniprot%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20up_q%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20up_q_str%20%3D%20f%22(%7Bup_q%7D)%7Bgt_excl_uniprot%7D%22%20if%20exclude_gt%20else%20str(up_q)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20up_seqs%20%3D%20fetch_uniprot_sequences(up_q_str%2C%20limit%3Dmax(r_target%20%2B%20100%2C%20180))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(up_seqs)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batches.append(up_seqs)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20ur_q%20%3D%20q_spec.get(%22uniref%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20ur_q%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ur_q_str%20%3D%20f%22(%7Bur_q%7D)%7Bgt_excl_uniref%7D%22%20if%20exclude_gt%20else%20str(ur_q)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ur_seqs%20%3D%20fetch_uniref50_sequences(ur_q_str%2C%20limit%3Dmax(r_target%20%2B%2060%2C%20140))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(ur_seqs)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batches.append(ur_seqs)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.concat(batches)%20if%20batches%20else%20Sequences.empty()%0A%0A%20%20%20%20%20%20%20%20with%20cassetter.use_cassette(%0A%20%20%20%20%20%20%20%20%20%20%20%20str(cassette_path)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20record_mode%3D%22new_episodes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20filter_query_parameters%3D%5B%22api_key%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20intercept%3D%5B%5D%2C%0A%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_active_cassette%5B0%5D%20%3D%20get_current_cassette()%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20ThreadPoolExecutor(max_workers%3D8)%20as%20pool%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20primary_raw_list%20%3D%20list(pool.map(_fetch_primary_http%2C%20range(n_functional)))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Phase%202%3A%20Main-thread%20Numba%20parallel%3DTrue%20clustering%20%26%20POST-CLUSTERING%20deficit%20detection%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20curated_map%3A%20dict%5Bint%2C%20Sequences%5D%20%3D%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20deficit_roles%3A%20list%5Bint%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20r_idx%2C%20raw_seqs%20in%20enumerate(primary_raw_list)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20q_spec%20%3D%20ROLE_QUERIES.get(r_idx%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r_min_len%20%3D%20int(q_spec.get(%22min_len%22%2C%2030))%20%20%23%20type%3A%20ignore%5Bcall-overload%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r_max_len%20%3D%20int(q_spec.get(%22max_len%22%2C%202500))%20%20%23%20type%3A%20ignore%5Bcall-overload%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clustered%20%3D%20filter_and_cluster_role_sequences(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_seqs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clusterer%3Dclusterer%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k_std%3Dk_std%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_len%3Dr_min_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_len%3Dr_max_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20curated_map%5Br_idx%5D%20%3D%20clustered%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(clustered)%20%3C%20_role_target(r_idx)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20deficit_roles.append(r_idx)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Phase%203%3A%20Post-clustering%20enrichment%20from%20NCBI%20IPG%20%26%20KEGG%20Orthology%20for%20any%20role%20%3C%20role_target%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20deficit_roles%20and%20(include_ncbi%20or%20include_kegg)%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20def%20_fetch_secondary_http(role_idx%3A%20int)%20-%3E%20tuple%5Bint%2C%20Sequences%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20q_spec%20%3D%20ROLE_QUERIES.get(role_idx%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r_target%20%3D%20_role_target(role_idx)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sec_batches%3A%20list%5BSequences%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20include_ncbi%20and%20%22ncbi_ipg%22%20in%20q_spec%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ipg_seqs%20%3D%20fetch_ncbi_ipg_sequences(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20str(q_spec%5B%22ncbi_ipg%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20limit%3Dmax(r_target%20*%202%2C%20100)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20api_key%3Dapi_key%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(ipg_seqs)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sec_batches.append(ipg_seqs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20include_kegg%20and%20role_idx%20in%20ROLE_TO_KOS%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20ko_id%20in%20ROLE_TO_KOS%5Brole_idx%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ko_seqs%20%3D%20fetch_kegg_ko_sequences(ko_id%2C%20max_seqs%3D40)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(ko_seqs)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sec_batches.append(ko_seqs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20role_idx%2C%20(Sequences.concat(sec_batches)%20if%20sec_batches%20else%20Sequences.empty())%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20ThreadPoolExecutor(max_workers%3D6)%20as%20pool%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sec_results%20%3D%20list(pool.map(_fetch_secondary_http%2C%20deficit_roles))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20r_idx%2C%20sec_seqs%20in%20sec_results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(sec_seqs)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20q_spec%20%3D%20ROLE_QUERIES.get(r_idx%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r_min_len%20%3D%20int(q_spec.get(%22min_len%22%2C%2030))%20%20%23%20type%3A%20ignore%5Bcall-overload%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r_max_len%20%3D%20int(q_spec.get(%22max_len%22%2C%202500))%20%20%23%20type%3A%20ignore%5Bcall-overload%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20combined%20%3D%20Sequences.concat(%5Bcurated_map%5Br_idx%5D%2C%20sec_seqs%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20curated_map%5Br_idx%5D%20%3D%20filter_and_cluster_role_sequences(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20combined%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clusterer%3Dclusterer%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k_std%3Dk_std%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_len%3Dr_min_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_len%3Dr_max_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20finally%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_active_cassette%5B0%5D%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20%23%20Phase%204%3A%20Cap%20each%20role%20at%20_role_target(r_idx)%20and%20pack%20into%20a%20single%20pre-encoded%20Sequences%20container%0A%20%20%20%20%20%20%20%20ordered_batches%3A%20list%5BSequences%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20label_parts%3A%20list%5Bnp.ndarray%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20r_idx%20in%20range(n_functional)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20curated_map.get(r_idx%2C%20Sequences.empty())%0A%20%20%20%20%20%20%20%20%20%20%20%20r_target%20%3D%20_role_target(r_idx)%0A%20%20%20%20%20%20%20%20%20%20%20%20role_rng%20%3D%20np.random.default_rng(seed%20%2B%20r_idx)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(b)%20%3E%20r_target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chosen%20%3D%20np.sort(role_rng.choice(len(b)%2C%20size%3Dr_target%2C%20replace%3DFalse).astype(np.int32))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20b%5Bchosen%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20len(b)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ordered_batches.append(b)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label_parts.append(np.full(len(b)%2C%20r_idx%2C%20dtype%3Dnp.int8))%0A%0A%20%20%20%20%20%20%20%20if%20not%20ordered_batches%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Sequences.empty()%2C%20np.empty(0%2C%20dtype%3Dnp.int8)%0A%0A%20%20%20%20%20%20%20%20all_seqs%20%3D%20Sequences.concat(ordered_batches)%0A%20%20%20%20%20%20%20%20encoded_tokens%20%3D%20np.minimum(Alphabet.AMINO.encode(all_seqs.seqs)%2C%20np.uint8(22))%0A%20%20%20%20%20%20%20%20encoded_seqs%20%3D%20Sequences(all_seqs.ids%2C%20encoded_tokens%2C%20all_seqs.offsets%2C%20all_seqs.lengths)%0A%20%20%20%20%20%20%20%20all_labels%20%3D%20np.concatenate(label_parts)%0A%20%20%20%20%20%20%20%20return%20encoded_seqs%2C%20all_labels%0A%0A%20%20%20%20%40njit(nogil%3DTrue)%0A%20%20%20%20def%20stratified_split_kernel(%0A%20%20%20%20%20%20%20%20y%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20test_fraction%3A%20float%2C%0A%20%20%20%20%20%20%20%20seed%3A%20int%2C%0A%20%20%20%20%20%20%20%20max_test_per_class%3A%20int%20%3D%200%2C%0A%20%20%20%20)%20-%3E%20tuple%5Bnp.ndarray%2C%20np.ndarray%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Numba-compiled%20stratified%20train%2Ftest%20index%20splitter%20with%20optional%20per-class%20test%20cap.%22%22%22%0A%20%20%20%20%20%20%20%20np.random.seed(seed)%0A%20%20%20%20%20%20%20%20n%20%3D%20len(y)%0A%20%20%20%20%20%20%20%20order%20%3D%20np.argsort(y)%0A%20%20%20%20%20%20%20%20is_test%20%3D%20np.zeros(n%2C%20dtype%3Dnp.uint8)%0A%0A%20%20%20%20%20%20%20%20start%20%3D%200%0A%20%20%20%20%20%20%20%20while%20start%20%3C%20n%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20c%20%3D%20y%5Border%5Bstart%5D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20end%20%3D%20start%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20end%20%3C%20n%20and%20y%5Border%5Bend%5D%5D%20%3D%3D%20c%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20end%20%2B%3D%201%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20count%20%3D%20end%20-%20start%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20count%20%3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_test%20%3D%20max(1%2C%20min(count%20-%201%2C%20int(round(count%20*%20test_fraction))))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_test%20%3D%20min(raw_test%2C%20max_test_per_class)%20if%20max_test_per_class%20%3E%200%20else%20raw_test%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class_indices%20%3D%20order%5Bstart%3Aend%5D.copy()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(count%20-%201%2C%200%2C%20-1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20np.random.randint(0%2C%20i%20%2B%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tmp%20%3D%20class_indices%5Bi%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class_indices%5Bi%5D%20%3D%20class_indices%5Bj%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class_indices%5Bj%5D%20%3D%20tmp%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20k%20in%20range(n_test)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20is_test%5Bclass_indices%5Bk%5D%5D%20%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20start%20%3D%20end%0A%0A%20%20%20%20%20%20%20%20n_test_total%20%3D%20int(np.sum(is_test))%0A%20%20%20%20%20%20%20%20train_idx%20%3D%20np.empty(n%20-%20n_test_total%2C%20dtype%3Dnp.int32)%0A%20%20%20%20%20%20%20%20test_idx%20%3D%20np.empty(n_test_total%2C%20dtype%3Dnp.int32)%0A%20%20%20%20%20%20%20%20tr_pos%20%3D%200%0A%20%20%20%20%20%20%20%20ts_pos%20%3D%200%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(n)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20is_test%5Bi%5D%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20test_idx%5Bts_pos%5D%20%3D%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ts_pos%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20train_idx%5Btr_pos%5D%20%3D%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tr_pos%20%2B%3D%201%0A%20%20%20%20%20%20%20%20return%20train_idx%2C%20test_idx%0A%0A%20%20%20%20def%20evaluate_sparse_metrics(%0A%20%20%20%20%20%20%20%20y_true%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20y_pred%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20classes%3A%20np.ndarray%2C%0A%20%20%20%20)%20-%3E%20dict%5Bstr%2C%20object%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Compute%20confusion%20matrix%20and%20per-class%20Precision%2FRecall%2FF1%20via%20SciPy%20%60csr_array%60.%22%22%22%0A%20%20%20%20%20%20%20%20n_classes%20%3D%20int(max(np.max(classes)%20%2B%201%2C%2029))%20if%20len(classes)%20%3E%200%20else%2029%0A%20%20%20%20%20%20%20%20n_samples%20%3D%20len(y_true)%0A%20%20%20%20%20%20%20%20if%20n_samples%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22accuracy%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22macro_precision%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22macro_recall%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22macro_f1%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22per_role%22%3A%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22confusion_records%22%3A%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20ones%20%3D%20np.ones(n_samples%2C%20dtype%3Dnp.int32)%0A%20%20%20%20%20%20%20%20conf_csr%20%3D%20csr_array(%0A%20%20%20%20%20%20%20%20%20%20%20%20(ones%2C%20(y_true.astype(np.int32)%2C%20y_pred.astype(np.int32)))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20shape%3D(n_classes%2C%20n_classes)%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20tp%20%3D%20conf_csr.diagonal().astype(np.float64)%0A%20%20%20%20%20%20%20%20support%20%3D%20np.asarray(conf_csr.sum(axis%3D1)).ravel().astype(np.float64)%0A%20%20%20%20%20%20%20%20pred_pos%20%3D%20np.asarray(conf_csr.sum(axis%3D0)).ravel().astype(np.float64)%0A%0A%20%20%20%20%20%20%20%20precision%20%3D%20np.divide(tp%2C%20pred_pos%2C%20out%3Dnp.zeros_like(tp)%2C%20where%3Dpred_pos%20%3E%200)%0A%20%20%20%20%20%20%20%20recall%20%3D%20np.divide(tp%2C%20support%2C%20out%3Dnp.zeros_like(tp)%2C%20where%3Dsupport%20%3E%200)%0A%20%20%20%20%20%20%20%20denom%20%3D%20precision%20%2B%20recall%0A%20%20%20%20%20%20%20%20f1%20%3D%20np.divide(2.0%20*%20precision%20*%20recall%2C%20denom%2C%20out%3Dnp.zeros_like(tp)%2C%20where%3Ddenom%20%3E%200)%0A%0A%20%20%20%20%20%20%20%20active%20%3D%20support%20%3E%200%0A%20%20%20%20%20%20%20%20acc%20%3D%20float(np.mean(y_true%20%3D%3D%20y_pred))%0A%20%20%20%20%20%20%20%20macro_p%20%3D%20float(np.mean(precision%5Bactive%5D))%20if%20np.any(active)%20else%200.0%0A%20%20%20%20%20%20%20%20macro_r%20%3D%20float(np.mean(recall%5Bactive%5D))%20if%20np.any(active)%20else%200.0%0A%20%20%20%20%20%20%20%20macro_f1%20%3D%20float(np.mean(f1%5Bactive%5D))%20if%20np.any(active)%20else%200.0%0A%0A%20%20%20%20%20%20%20%20per_role_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20c_idx%20in%20classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20c%20%3D%20int(c_idx)%0A%20%20%20%20%20%20%20%20%20%20%20%20role%20%3D%20GeneRole(c)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20metric_name%2C%20val%20in%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22Precision%22%2C%20float(precision%5Bc%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22Recall%22%2C%20float(recall%5Bc%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%22F1-Score%22%2C%20float(f1%5Bc%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20per_role_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_index%22%3A%20c%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%22%3A%20role.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22abbreviation%22%3A%20role.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20str(role.category.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22support%22%3A%20int(support%5Bc%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22metric%22%3A%20metric_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22score%22%3A%20val%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22f1_sort%22%3A%20float(f1%5Bc%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20conf_dense%20%3D%20conf_csr.toarray()%0A%20%20%20%20%20%20%20%20confusion_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20r_true%20in%20classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20rt%20%3D%20int(r_true)%0A%20%20%20%20%20%20%20%20%20%20%20%20row_sum%20%3D%20float(support%5Brt%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20true_role%20%3D%20GeneRole(rt)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20r_pred%20in%20classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rp%20%3D%20int(r_pred)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cnt%20%3D%20int(conf_dense%5Brt%2C%20rp%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_role%20%3D%20GeneRole(rp)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20confusion_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_index%22%3A%20rt%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_role%22%3A%20true_role.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22true_name%22%3A%20true_role.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22pred_index%22%3A%20rp%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22pred_role%22%3A%20pred_role.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22pred_name%22%3A%20pred_role.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22count%22%3A%20cnt%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22row_pct%22%3A%20(cnt%20%2F%20row_sum%20*%20100.0)%20if%20row_sum%20%3E%200%20else%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22accuracy%22%3A%20acc%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22macro_precision%22%3A%20macro_p%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22macro_recall%22%3A%20macro_r%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22macro_f1%22%3A%20macro_f1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22per_role%22%3A%20per_role_rows%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confusion_records%22%3A%20confusion_records%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%40njit(nogil%3DTrue%2C%20fastmath%3DTrue)%0A%20%20%20%20def%20macro_f1_kernel(%0A%20%20%20%20%20%20%20%20y_true%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20y_pred%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20n_classes%3A%20int%2C%0A%20%20%20%20)%20-%3E%20float%3A%0A%20%20%20%20%20%20%20%20%22%22%22Fast%20Numba%20macro-F1%20evaluator%20without%20Python%20dicts%20or%20SciPy%20sparse%20allocations.%22%22%22%0A%20%20%20%20%20%20%20%20tp%20%3D%20np.zeros(n_classes%2C%20dtype%3Dnp.int64)%0A%20%20%20%20%20%20%20%20sup%20%3D%20np.zeros(n_classes%2C%20dtype%3Dnp.int64)%0A%20%20%20%20%20%20%20%20pred_pos%20%3D%20np.zeros(n_classes%2C%20dtype%3Dnp.int64)%0A%20%20%20%20%20%20%20%20n%20%3D%20len(y_true)%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(n)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20t%20%3D%20int(y_true%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20p%20%3D%20int(y_pred%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%200%20%3C%3D%20t%20%3C%20n_classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sup%5Bt%5D%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20if%200%20%3C%3D%20p%20%3C%20n_classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_pos%5Bp%5D%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20t%20%3D%3D%20p%20and%200%20%3C%3D%20t%20%3C%20n_classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tp%5Bt%5D%20%2B%3D%201%0A%0A%20%20%20%20%20%20%20%20f1_sum%20%3D%200.0%0A%20%20%20%20%20%20%20%20active%20%3D%200%0A%20%20%20%20%20%20%20%20for%20c%20in%20range(n_classes)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20sup%5Bc%5D%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20active%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20denom%20%3D%20pred_pos%5Bc%5D%20%2B%20sup%5Bc%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20denom%20%3E%200%20and%20tp%5Bc%5D%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f1_sum%20%2B%3D%20(2.0%20*%20float(tp%5Bc%5D))%20%2F%20float(denom)%0A%20%20%20%20%20%20%20%20return%20f1_sum%20%2F%20float(active)%20if%20active%20%3E%200%20else%200.0%0A%0A%20%20%20%20%40njit(nogil%3DTrue%2C%20parallel%3DTrue%2C%20fastmath%3DTrue)%0A%20%20%20%20def%20evaluate_layer_sweep_kernel(%0A%20%20%20%20%20%20%20%20H_train%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20y_train%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20H_test%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20y_test%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20n_classes%3A%20int%2C%0A%20%20%20%20)%20-%3E%20tuple%5Bfloat%2C%20float%2C%20float%2C%20float%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Numba-parallel%20representation%20evaluator%20returning%20(top1_recall%2C%20top5_purity%2C%20centroid_f1%2C%20fisher_ratio).%22%22%22%0A%20%20%20%20%20%20%20%20n_tr%2C%20dim%20%3D%20H_train.shape%0A%20%20%20%20%20%20%20%20n_ts%20%3D%20H_test.shape%5B0%5D%0A%20%20%20%20%20%20%20%20if%20n_tr%20%3D%3D%200%20or%20n_ts%20%3D%3D%200%20or%20dim%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%200.0%2C%200.0%2C%200.0%2C%200.0%0A%0A%20%20%20%20%20%20%20%20%23%201.%20Unit%20L2%20row%20normalization%20in%20parallel%0A%20%20%20%20%20%20%20%20H_tr_norm%20%3D%20np.empty((n_tr%2C%20dim)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20for%20i%20in%20prange(n_tr)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20np.float32(0.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20H_train%5Bi%2C%20d%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20v%20*%20v%0A%20%20%20%20%20%20%20%20%20%20%20%20inv_n%20%3D%20np.float32(1.0)%20%2F%20np.sqrt(max(s%2C%20np.float32(1e-12)))%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20H_tr_norm%5Bi%2C%20d%5D%20%3D%20H_train%5Bi%2C%20d%5D%20*%20inv_n%0A%0A%20%20%20%20%20%20%20%20H_ts_norm%20%3D%20np.empty((n_ts%2C%20dim)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20for%20i%20in%20prange(n_ts)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20np.float32(0.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20H_test%5Bi%2C%20d%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20v%20*%20v%0A%20%20%20%20%20%20%20%20%20%20%20%20inv_n%20%3D%20np.float32(1.0)%20%2F%20np.sqrt(max(s%2C%20np.float32(1e-12)))%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20H_ts_norm%5Bi%2C%20d%5D%20%3D%20H_test%5Bi%2C%20d%5D%20*%20inv_n%0A%0A%20%20%20%20%20%20%20%20%23%202.%20Class%20centroids%20%26%20Fisher's%20Discriminant%20Ratio%20tr(S_B)%20%2F%20tr(S_W)%0A%20%20%20%20%20%20%20%20centroids%20%3D%20np.zeros((n_classes%2C%20dim)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20class_counts%20%3D%20np.zeros(n_classes%2C%20dtype%3Dnp.int32)%0A%20%20%20%20%20%20%20%20global_mean%20%3D%20np.zeros(dim%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(n_tr)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20c%20%3D%20int(y_train%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%200%20%3C%3D%20c%20%3C%20n_classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class_counts%5Bc%5D%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20centroids%5Bc%2C%20d%5D%20%2B%3D%20H_tr_norm%5Bi%2C%20d%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20global_mean%5Bd%5D%20%2B%3D%20H_tr_norm%5Bi%2C%20d%5D%0A%0A%20%20%20%20%20%20%20%20inv_ntr%20%3D%20np.float32(1.0%20%2F%20max(n_tr%2C%201))%0A%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20global_mean%5Bd%5D%20*%3D%20inv_ntr%0A%0A%20%20%20%20%20%20%20%20sb_trace%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20c%20in%20range(n_classes)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cnt%20%3D%20class_counts%5Bc%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cnt%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_c%20%3D%20np.float32(1.0%20%2F%20cnt)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20centroids%5Bc%2C%20d%5D%20*%3D%20inv_c%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20diff%20%3D%20float(centroids%5Bc%2C%20d%5D%20-%20global_mean%5Bd%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sb_trace%20%2B%3D%20float(cnt)%20*%20diff%20*%20diff%0A%0A%20%20%20%20%20%20%20%20sw_trace%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(n_tr)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20c%20%3D%20int(y_train%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%200%20%3C%3D%20c%20%3C%20n_classes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20diff%20%3D%20float(H_tr_norm%5Bi%2C%20d%5D%20-%20centroids%5Bc%2C%20d%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sw_trace%20%2B%3D%20diff%20*%20diff%0A%20%20%20%20%20%20%20%20fisher_ratio%20%3D%20sb_trace%20%2F%20max(sw_trace%2C%201e-12)%0A%0A%20%20%20%20%20%20%20%20%23%20Normalize%20centroids%20to%20unit%20L2%20norm%20for%20cosine%20nearest-centroid%20classification%0A%20%20%20%20%20%20%20%20centroids_norm%20%3D%20np.zeros((n_classes%2C%20dim)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20for%20c%20in%20range(n_classes)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20class_counts%5Bc%5D%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20np.float32(0.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20centroids%5Bc%2C%20d%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20v%20*%20v%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n%20%3D%20np.float32(1.0)%20%2F%20np.sqrt(max(s%2C%20np.float32(1e-12)))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20centroids_norm%5Bc%2C%20d%5D%20%3D%20centroids%5Bc%2C%20d%5D%20*%20inv_n%0A%0A%20%20%20%20%20%20%20%20%23%203.%20Parallel%201-NN%20Cosine%20Recall%2C%20Top-5%20Role%20Purity%2C%20and%20Nearest-Centroid%20predictions%0A%20%20%20%20%20%20%20%20top1_hits%20%3D%20np.zeros(n_ts%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20top5_pur%20%3D%20np.zeros(n_ts%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20cent_preds%20%3D%20np.empty(n_ts%2C%20dtype%3Dnp.int32)%0A%20%20%20%20%20%20%20%20k_nn%20%3D%20min(5%2C%20n_tr)%0A%0A%20%20%20%20%20%20%20%20for%20i%20in%20prange(n_ts)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20y_t%20%3D%20int(y_test%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Nearest%20centroid%0A%20%20%20%20%20%20%20%20%20%20%20%20best_c%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20best_c_sim%20%3D%20np.float32(-1e30)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20c%20in%20range(n_classes)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20class_counts%5Bc%5D%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sim_c%20%3D%20np.float32(0.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sim_c%20%2B%3D%20H_ts_norm%5Bi%2C%20d%5D%20*%20centroids_norm%5Bc%2C%20d%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20sim_c%20%3E%20best_c_sim%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_c_sim%20%3D%20sim_c%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_c%20%3D%20c%0A%20%20%20%20%20%20%20%20%20%20%20%20cent_preds%5Bi%5D%20%3D%20best_c%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Top-5%20NN%20cosine%20search%0A%20%20%20%20%20%20%20%20%20%20%20%20top_sims%20%3D%20np.full(k_nn%2C%20np.float32(-1e30)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20%20%20%20%20top_lbls%20%3D%20np.full(k_nn%2C%20-1%2C%20dtype%3Dnp.int32)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(n_tr)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sim%20%3D%20np.float32(0.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20d%20in%20range(dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sim%20%2B%3D%20H_ts_norm%5Bi%2C%20d%5D%20*%20H_tr_norm%5Bj%2C%20d%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20sim%20%3E%20top_sims%5Bk_nn%20-%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pos%20%3D%20k_nn%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20pos%20%3E%200%20and%20sim%20%3E%20top_sims%5Bpos%20-%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top_sims%5Bpos%5D%20%3D%20top_sims%5Bpos%20-%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top_lbls%5Bpos%5D%20%3D%20top_lbls%5Bpos%20-%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pos%20-%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top_sims%5Bpos%5D%20%3D%20sim%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top_lbls%5Bpos%5D%20%3D%20int(y_train%5Bj%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20top_lbls%5B0%5D%20%3D%3D%20y_t%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top1_hits%5Bi%5D%20%3D%20np.float32(1.0)%0A%20%20%20%20%20%20%20%20%20%20%20%20matches%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20m%20in%20range(k_nn)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20top_lbls%5Bm%5D%20%3D%3D%20y_t%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matches%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20top5_pur%5Bi%5D%20%3D%20np.float32(matches)%20%2F%20np.float32(max(k_nn%2C%201))%0A%0A%20%20%20%20%20%20%20%20top1_recall%20%3D%20float(np.mean(top1_hits))%20*%20100.0%0A%20%20%20%20%20%20%20%20top5_purity%20%3D%20float(np.mean(top5_pur))%20*%20100.0%0A%20%20%20%20%20%20%20%20centroid_f1%20%3D%20macro_f1_kernel(y_test%2C%20cent_preds%2C%20n_classes)%20*%20100.0%0A%20%20%20%20%20%20%20%20return%20top1_recall%2C%20top5_purity%2C%20centroid_f1%2C%20fisher_ratio%0A%0A%20%20%20%20def%20run_layer_representation_sweep(%0A%20%20%20%20%20%20%20%20clf%3A%20GeneRoleClassifier%2C%0A%20%20%20%20%20%20%20%20X_train%3A%20Sequences%2C%0A%20%20%20%20%20%20%20%20y_train%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20X_test%3A%20Sequences%2C%0A%20%20%20%20%20%20%20%20y_test%3A%20np.ndarray%2C%0A%20%20%20%20)%20-%3E%20tuple%5Blist%5Bdict%5Bstr%2C%20object%5D%5D%2C%20str%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Sweep%20all%20%60GeneRoleClassifier.transform(layer%3D...)%60%20representations%20using%20%60evaluate_layer_sweep_kernel%60.%22%22%22%0A%20%20%20%20%20%20%20%20candidate_layers%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22penultimate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22task_weighted%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22task_weighted_conv_max%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22conv_max%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22conv_avg%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22embed_mean%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22logits%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22proba%22%2C%0A%20%20%20%20%20%20%20%20%5D%20%2B%20%5Bf%22conv_k%7Bint(k)%7D%22%20for%20k%20in%20clf.unique_ks_%5D%0A%0A%20%20%20%20%20%20%20%20x_tr_soa%20%3D%20(X_train.seqs.astype(np.uint8%2C%20copy%3DFalse)%2C%20X_train.indptr.astype(np.int64%2C%20copy%3DFalse))%0A%20%20%20%20%20%20%20%20x_ts_soa%20%3D%20(X_test.seqs.astype(np.uint8%2C%20copy%3DFalse)%2C%20X_test.indptr.astype(np.int64%2C%20copy%3DFalse))%0A%20%20%20%20%20%20%20%20y_tr_i32%20%3D%20y_train.astype(np.int32%2C%20copy%3DFalse)%0A%20%20%20%20%20%20%20%20y_ts_i32%20%3D%20y_test.astype(np.int32%2C%20copy%3DFalse)%0A%20%20%20%20%20%20%20%20n_classes%20%3D%20int(max(np.max(clf.classes_)%20%2B%201%2C%2029))%20if%20len(clf.classes_)%20%3E%200%20else%2029%0A%0A%20%20%20%20%20%20%20%20records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20layer_name%20in%20candidate_layers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20H_tr%20%3D%20np.ascontiguousarray(clf.transform(x_tr_soa%2C%20layer%3Dlayer_name)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20%20%20%20%20H_ts%20%3D%20np.ascontiguousarray(clf.transform(x_ts_soa%2C%20layer%3Dlayer_name)%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20%20%20%20%20t1_rec%2C%20t5_pur%2C%20cent_f1%2C%20fisher%20%3D%20evaluate_layer_sweep_kernel(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20H_tr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y_tr_i32%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20H_ts%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y_ts_i32%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_classes%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20composite%20%3D%200.45%20*%20t1_rec%20%2B%200.35%20*%20cent_f1%20%2B%200.20%20*%20t5_pur%0A%20%20%20%20%20%20%20%20%20%20%20%20records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22layer%22%3A%20layer_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22dim%22%3A%20int(H_tr.shape%5B1%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top1_recall%22%3A%20round(t1_rec%2C%202)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22top5_purity%22%3A%20round(t5_pur%2C%202)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22centroid_f1%22%3A%20round(cent_f1%2C%202)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22fisher_ratio%22%3A%20round(fisher%2C%203)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22composite_score%22%3A%20round(composite%2C%202)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20records.sort(key%3Dlambda%20r%3A%20float(r%5B%22composite_score%22%5D)%2C%20reverse%3DTrue)%0A%20%20%20%20%20%20%20%20best_layer%20%3D%20str(records%5B0%5D%5B%22layer%22%5D)%20if%20records%20else%20%22task_weighted_conv_max%22%0A%20%20%20%20%20%20%20%20return%20records%2C%20best_layer%0A%0A%20%20%20%20def%20run_optuna_study(%0A%20%20%20%20%20%20%20%20X_train%3A%20Sequences%2C%0A%20%20%20%20%20%20%20%20y_train%3A%20np.ndarray%2C%0A%20%20%20%20%20%20%20%20n_trials%3A%20int%2C%0A%20%20%20%20%20%20%20%20epochs%3A%20int%2C%0A%20%20%20%20%20%20%20%20seed%3A%20int%2C%0A%20%20%20%20)%20-%3E%20tuple%5Boptuna.Study%2C%20list%5Bdict%5Bstr%2C%20object%5D%5D%2C%20list%5Bdict%5Bstr%2C%20object%5D%5D%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22Run%20an%20in-memory%20Optuna%20TPE%20study%20maximizing%20inner-validation%20Macro%20F1%20on%20a%20pre-packed%20SoA%20split.%22%22%22%0A%20%20%20%20%20%20%20%20tr_counts%20%3D%20np.bincount(y_train.astype(np.int32)%2C%20minlength%3D29)%0A%20%20%20%20%20%20%20%20max_val_per_class%20%3D%20max(1%2C%20int(round(float(np.median(tr_counts%5B%3A29%5D))%20*%200.20)))%0A%20%20%20%20%20%20%20%20inner_tr%2C%20inner_val%20%3D%20stratified_split_kernel(y_train%2C%200.20%2C%20seed%20%2B%20101%2C%20max_val_per_class)%0A%20%20%20%20%20%20%20%20x_tr%2C%20y_tr%20%3D%20X_train%5Binner_tr%5D%2C%20y_train%5Binner_tr%5D%0A%20%20%20%20%20%20%20%20x_vl%2C%20y_vl%20%3D%20X_train%5Binner_val%5D%2C%20y_train%5Binner_val%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Pre-pack%20flat%20SoA%20(x_flat%2C%20offsets)%20tuples%20once%20outside%20the%20trial%20loop%0A%20%20%20%20%20%20%20%20x_tr_soa%20%3D%20(x_tr.seqs.astype(np.uint8%2C%20copy%3DFalse)%2C%20x_tr.indptr.astype(np.int64%2C%20copy%3DFalse))%0A%20%20%20%20%20%20%20%20x_vl_soa%20%3D%20(x_vl.seqs.astype(np.uint8%2C%20copy%3DFalse)%2C%20x_vl.indptr.astype(np.int64%2C%20copy%3DFalse))%0A%20%20%20%20%20%20%20%20y_vl_i32%20%3D%20y_vl.astype(np.int32%2C%20copy%3DFalse)%0A%0A%20%20%20%20%20%20%20%20sampler%20%3D%20optuna.samplers.TPESampler(seed%3Dseed)%0A%20%20%20%20%20%20%20%20study%20%3D%20optuna.create_study(direction%3D%22maximize%22%2C%20sampler%3Dsampler)%0A%0A%20%20%20%20%20%20%20%20with%20mo.status.progress_bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20total%3Dn_trials%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Optuna%20TPE%20Hyperparameter%20Search%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20subtitle%3D%22Evaluating%20candidate%201D-CNN%20architectures...%22%2C%0A%20%20%20%20%20%20%20%20)%20as%20bar%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(n_trials)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trial%20%3D%20study.ask()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20embed_dim%20%3D%20trial.suggest_categorical(%22embed_dim%22%2C%20%5B16%2C%2024%2C%2032%2C%2048%2C%2064%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_filters%20%3D%20trial.suggest_categorical(%22num_filters%22%2C%20%5B64%2C%2096%2C%20128%2C%20192%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kernel_combo%20%3D%20trial.suggest_categorical(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22kernel_combo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%223%2C%207%2C%2011%22%2C%20%225%2C%209%2C%2013%22%2C%20%223%2C%205%2C%209%2C%2015%22%2C%20%227%2C%2011%2C%2015%22%2C%20%225%2C%2011%2C%2017%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lr%20%3D%20trial.suggest_float(%22learning_rate%22%2C%201e-3%2C%202.5e-2%2C%20log%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wd%20%3D%20trial.suggest_float(%22weight_decay%22%2C%201e-6%2C%201e-3%2C%20log%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bs%20%3D%20trial.suggest_categorical(%22batch_size%22%2C%20%5B16%2C%2032%2C%2064%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k_tuple%20%3D%20tuple(int(k.strip())%20for%20k%20in%20kernel_combo.split(%22%2C%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cand_clf%20%3D%20GeneRoleClassifier(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D23%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20embed_dim%3Dint(embed_dim)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_filters%3Dint(num_filters)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kernel_size%3Dk_tuple%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20learning_rate%3Dfloat(lr)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20epochs%3Depochs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3Dint(bs)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20weight_decay%3Dfloat(wd)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class_weight%3D%22balanced%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20random_state%3Dseed%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cand_clf.fit(x_tr_soa%2C%20y_tr)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20preds_vl%20%3D%20cand_clf.predict(x_vl_soa).astype(np.int32%2C%20copy%3DFalse)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_f1%20%3D%20macro_f1_kernel(y_vl_i32%2C%20preds_vl%2C%2029)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20study.tell(trial%2C%20val_f1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bar.update(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20subtitle%3Df%22Trial%20%7Btrial.number%20%2B%201%7D%2F%7Bn_trials%7D%20%E2%80%94%20Val%20Macro%20F1%3A%20%7Bval_f1%20*%20100%3A.2f%7D%25%20(Best%3A%20%7Bstudy.best_value%20*%20100%3A.2f%7D%25)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20trial_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20best_so_far%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20t%20in%20study.trials%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20t.value%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20val%20%3D%20float(t.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20val%20%3E%20best_so_far%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_so_far%20%3D%20val%0A%20%20%20%20%20%20%20%20%20%20%20%20trial_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22trial%22%3A%20t.number%20%2B%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22macro_f1%22%3A%20val%20*%20100.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22best_macro_f1%22%3A%20best_so_far%20*%20100.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22embed_dim%22%3A%20int(t.params%5B%22embed_dim%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_filters%22%3A%20int(t.params%5B%22num_filters%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22kernel_combo%22%3A%20str(t.params%5B%22kernel_combo%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22learning_rate%22%3A%20float(t.params%5B%22learning_rate%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22weight_decay%22%3A%20float(t.params%5B%22weight_decay%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22batch_size%22%3A%20int(t.params%5B%22batch_size%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20importance_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%23%20Pure-NumPy%20one-way%20ANOVA%20eta-squared%20hyperparameter%20importance%0A%20%20%20%20%20%20%20%20if%20len(trial_records)%20%3E%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20y_vals%20%3D%20np.array(%5Bfloat(r%5B%22macro_f1%22%5D)%20for%20r%20in%20trial_records%5D%2C%20dtype%3Dnp.float64)%0A%20%20%20%20%20%20%20%20%20%20%20%20grand_mean%20%3D%20float(np.mean(y_vals))%0A%20%20%20%20%20%20%20%20%20%20%20%20ss_total%20%3D%20float(np.sum((y_vals%20-%20grand_mean)%20**%202))%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20ss_total%20%3E%201e-12%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20param_keys%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22kernel_combo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22num_filters%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22embed_dim%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22batch_size%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22learning_rate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22weight_decay%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_imp%3A%20dict%5Bstr%2C%20float%5D%20%3D%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20pk%20in%20param_keys%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20pk%20in%20(%22learning_rate%22%2C%20%22weight_decay%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vals%20%3D%20np.log10(np.array(%5Bfloat(r%5Bpk%5D)%20for%20r%20in%20trial_records%5D%2C%20dtype%3Dnp.float64))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bins%20%3D%20np.digitize(vals%2C%20np.quantile(vals%2C%20%5B0.33%2C%200.66%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20groups%20%3D%20%5Bstr(b)%20for%20b%20in%20bins%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20groups%20%3D%20%5Bstr(r%5Bpk%5D)%20for%20r%20in%20trial_records%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ss_between%20%3D%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20g%20in%20set(groups)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20g_vals%20%3D%20y_vals%5B%5Bi%20for%20i%2C%20gv%20in%20enumerate(groups)%20if%20gv%20%3D%3D%20g%5D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ss_between%20%2B%3D%20len(g_vals)%20*%20((float(np.mean(g_vals))%20-%20grand_mean)%20**%202)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw_imp%5Bpk%5D%20%3D%20ss_between%20%2F%20ss_total%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tot_imp%20%3D%20sum(raw_imp.values())%20or%201.0%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20pk%2C%20val%20in%20sorted(raw_imp.items()%2C%20key%3Dlambda%20kv%3A%20kv%5B1%5D%2C%20reverse%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20importance_records.append(%7B%22parameter%22%3A%20pk%2C%20%22importance%22%3A%20float(val%20%2F%20tot_imp)%7D)%0A%0A%20%20%20%20%20%20%20%20return%20study%2C%20trial_records%2C%20importance_records%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20evaluate_sparse_metrics%2C%0A%20%20%20%20%20%20%20%20fetch_in_memory_dataset%2C%0A%20%20%20%20%20%20%20%20run_layer_representation_sweep%2C%0A%20%20%20%20%20%20%20%20run_optuna_study%2C%0A%20%20%20%20%20%20%20%20stratified_split_kernel%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(fetch_in_memory_dataset%2C%20time)%3A%0A%20%20%20%20_t0%20%3D%20time.perf_counter()%0A%20%20%20%20dataset_seqs%2C%20dataset_labels%20%3D%20fetch_in_memory_dataset(%0A%20%20%20%20%20%20%20%20target_per_role%3D120%2C%0A%20%20%20%20%20%20%20%20min_identity%3D80.0%2C%0A%20%20%20%20%20%20%20%20k_std%3D3.5%2C%0A%20%20%20%20%20%20%20%20include_ncbi%3DTrue%2C%0A%20%20%20%20%20%20%20%20include_kegg%3DTrue%2C%0A%20%20%20%20%20%20%20%20seed%3D42%2C%0A%20%20%20%20)%0A%20%20%20%20fetch_elapsed%20%3D%20time.perf_counter()%20-%20_t0%0A%20%20%20%20return%20dataset_labels%2C%20dataset_seqs%2C%20fetch_elapsed%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20GeneRole%2C%0A%20%20%20%20GeneRoleClassifier%2C%0A%20%20%20%20Path%2C%0A%20%20%20%20Sequences%2C%0A%20%20%20%20dataset_labels%2C%0A%20%20%20%20dataset_seqs%2C%0A%20%20%20%20evaluate_sparse_metrics%2C%0A%20%20%20%20np%2C%0A%20%20%20%20run_layer_representation_sweep%2C%0A%20%20%20%20run_optuna_study%2C%0A%20%20%20%20stratified_split_kernel%2C%0A%20%20%20%20time%2C%0A)%3A%0A%20%20%20%20role_counts%20%3D%20np.bincount(dataset_labels.astype(np.int32)%2C%20minlength%3D29)%0A%20%20%20%20min_role_support%20%3D%20int(np.min(role_counts%5B%3A29%5D))%0A%20%20%20%20min_role_name%20%3D%20GeneRole(int(np.argmin(role_counts%5B%3A29%5D))).name%0A%20%20%20%20quota_passed%20%3D%20bool(np.all(role_counts%5B%3A29%5D%20%3E%3D%2030))%0A%0A%20%20%20%20max_test_per_role%20%3D%20max(1%2C%20int(round(float(np.median(role_counts%5B%3A29%5D))%20*%200.20)))%0A%20%20%20%20train_idx%2C%20test_idx%20%3D%20stratified_split_kernel(%0A%20%20%20%20%20%20%20%20dataset_labels%2C%0A%20%20%20%20%20%20%20%200.20%2C%0A%20%20%20%20%20%20%20%2042%2C%0A%20%20%20%20%20%20%20%20max_test_per_role%2C%0A%20%20%20%20)%0A%0A%20%20%20%20X_train%20%3D%20dataset_seqs%5Btrain_idx%5D%0A%20%20%20%20y_train%20%3D%20dataset_labels%5Btrain_idx%5D%0A%20%20%20%20X_test%20%3D%20dataset_seqs%5Btest_idx%5D%0A%20%20%20%20y_test%20%3D%20dataset_labels%5Btest_idx%5D%0A%0A%20%20%20%20optuna_study%2C%20optuna_trial_records%2C%20optuna_importance_records%20%3D%20run_optuna_study(%0A%20%20%20%20%20%20%20%20X_train%3DX_train%2C%0A%20%20%20%20%20%20%20%20y_train%3Dy_train%2C%0A%20%20%20%20%20%20%20%20n_trials%3D20%2C%0A%20%20%20%20%20%20%20%20epochs%3D30%2C%0A%20%20%20%20%20%20%20%20seed%3D42%2C%0A%20%20%20%20)%0A%20%20%20%20best_p%20%3D%20optuna_study.best_params%0A%20%20%20%20best_trial_num%20%3D%20int(optuna_study.best_trial.number%20%2B%201)%0A%20%20%20%20best_val_f1%20%3D%20float(optuna_study.best_value)%20*%20100.0%0A%20%20%20%20trial_f1s%20%3D%20np.array(%5Bfloat(r%5B%22macro_f1%22%5D)%20for%20r%20in%20optuna_trial_records%5D%2C%20dtype%3Dnp.float64)%0A%20%20%20%20median_val_f1%20%3D%20float(np.median(trial_f1s))%20if%20len(trial_f1s)%20%3E%200%20else%20best_val_f1%0A%20%20%20%20optuna_gain_f1%20%3D%20best_val_f1%20-%20median_val_f1%0A%0A%20%20%20%20active_embed_dim%20%3D%20int(best_p%5B%22embed_dim%22%5D)%0A%20%20%20%20active_num_filters%20%3D%20int(best_p%5B%22num_filters%22%5D)%0A%20%20%20%20parsed_kernels%20%3D%20tuple(int(k.strip())%20for%20k%20in%20str(best_p%5B%22kernel_combo%22%5D).split(%22%2C%22))%0A%20%20%20%20active_lr%20%3D%20float(best_p%5B%22learning_rate%22%5D)%0A%20%20%20%20active_wd%20%3D%20float(best_p%5B%22weight_decay%22%5D)%0A%20%20%20%20active_bs%20%3D%20int(best_p%5B%22batch_size%22%5D)%0A%20%20%20%20config_source%20%3D%20f%22Optuna%20Best%20(Trial%20%23%7Bbest_trial_num%7D%2C%20Val%20F1%3D%7Bbest_val_f1%3A.2f%7D%25)%22%0A%0A%20%20%20%20kernel_arg%3A%20int%20%7C%20tuple%5Bint%2C%20...%5D%20%3D%20parsed_kernels%5B0%5D%20if%20len(parsed_kernels)%20%3D%3D%201%20else%20parsed_kernels%0A%0A%20%20%20%20clf%20%3D%20GeneRoleClassifier(%0A%20%20%20%20%20%20%20%20vocab_size%3D23%2C%0A%20%20%20%20%20%20%20%20embed_dim%3Dactive_embed_dim%2C%0A%20%20%20%20%20%20%20%20num_filters%3Dactive_num_filters%2C%0A%20%20%20%20%20%20%20%20kernel_size%3Dkernel_arg%2C%0A%20%20%20%20%20%20%20%20learning_rate%3Dactive_lr%2C%0A%20%20%20%20%20%20%20%20epochs%3D30%2C%0A%20%20%20%20%20%20%20%20batch_size%3Dactive_bs%2C%0A%20%20%20%20%20%20%20%20weight_decay%3Dactive_wd%2C%0A%20%20%20%20%20%20%20%20class_weight%3D%22balanced%22%2C%0A%20%20%20%20%20%20%20%20random_state%3D42%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_train_t0%20%3D%20time.perf_counter()%0A%20%20%20%20clf.fit(X_train%2C%20y_train)%0A%20%20%20%20train_elapsed%20%3D%20time.perf_counter()%20-%20_train_t0%0A%0A%20%20%20%20y_pred_test%20%3D%20clf.predict(X_test)%0A%20%20%20%20test_probs%20%3D%20clf.predict_proba(X_test)%0A%20%20%20%20test_max_conf%20%3D%20np.max(test_probs%2C%20axis%3D1)%0A%0A%20%20%20%20eval_metrics%20%3D%20evaluate_sparse_metrics(y_test%2C%20y_pred_test%2C%20clf.classes_)%0A%20%20%20%20layer_sweep_records%2C%20best_sweep_layer%20%3D%20run_layer_representation_sweep(%0A%20%20%20%20%20%20%20%20clf%2C%0A%20%20%20%20%20%20%20%20X_train%2C%0A%20%20%20%20%20%20%20%20y_train%2C%0A%20%20%20%20%20%20%20%20X_test%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(42%20%2B%20999)%0A%20%20%20%20_decoy_bytes%20%3D%20%5Bbytes(_rng.permutation(np.frombuffer(X_test%5Bi%5D.seq%2C%20dtype%3Dnp.uint8)))%20for%20i%20in%20range(len(X_test))%5D%0A%20%20%20%20decoy_seqs%20%3D%20Sequences.from_bytes(_decoy_bytes)%0A%20%20%20%20decoy_probs%20%3D%20clf.predict_proba(decoy_seqs)%0A%20%20%20%20decoy_max_conf%20%3D%20np.max(decoy_probs%2C%20axis%3D1)%0A%0A%20%20%20%20%23%20Save%20the%20Optuna-optimised%20production%20model%20fitted%20on%20all%20curated%20non-holdout%20sequences%20to%20src%2Fserogen%2Fdata%2Fmodel.npz%0A%20%20%20%20default_model_path%20%3D%20Path(__file__).resolve().parent.parent%20%2F%20%22src%22%20%2F%20%22serogen%22%20%2F%20%22data%22%20%2F%20%22model.npz%22%0A%20%20%20%20if%20len(clf.classes_)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20prod_clf%20%3D%20GeneRoleClassifier(%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D23%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20embed_dim%3Dactive_embed_dim%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20num_filters%3Dactive_num_filters%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20kernel_size%3Dkernel_arg%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20learning_rate%3Dactive_lr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20epochs%3D30%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3Dactive_bs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20weight_decay%3Dactive_wd%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20class_weight%3D%22balanced%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20random_state%3D42%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20prod_clf.fit(dataset_seqs%2C%20dataset_labels)%0A%20%20%20%20%20%20%20%20default_model_path.parent.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20%20%20%20%20prod_clf.save(default_model_path)%0A%20%20%20%20model_size_kb%20%3D%20default_model_path.stat().st_size%20%2F%201024.0%20if%20default_model_path.exists()%20else%200.0%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20X_test%2C%0A%20%20%20%20%20%20%20%20X_train%2C%0A%20%20%20%20%20%20%20%20active_bs%2C%0A%20%20%20%20%20%20%20%20active_embed_dim%2C%0A%20%20%20%20%20%20%20%20active_lr%2C%0A%20%20%20%20%20%20%20%20active_num_filters%2C%0A%20%20%20%20%20%20%20%20active_wd%2C%0A%20%20%20%20%20%20%20%20best_sweep_layer%2C%0A%20%20%20%20%20%20%20%20best_trial_num%2C%0A%20%20%20%20%20%20%20%20best_val_f1%2C%0A%20%20%20%20%20%20%20%20clf%2C%0A%20%20%20%20%20%20%20%20config_source%2C%0A%20%20%20%20%20%20%20%20decoy_max_conf%2C%0A%20%20%20%20%20%20%20%20eval_metrics%2C%0A%20%20%20%20%20%20%20%20layer_sweep_records%2C%0A%20%20%20%20%20%20%20%20median_val_f1%2C%0A%20%20%20%20%20%20%20%20min_role_name%2C%0A%20%20%20%20%20%20%20%20min_role_support%2C%0A%20%20%20%20%20%20%20%20model_size_kb%2C%0A%20%20%20%20%20%20%20%20optuna_gain_f1%2C%0A%20%20%20%20%20%20%20%20optuna_importance_records%2C%0A%20%20%20%20%20%20%20%20optuna_trial_records%2C%0A%20%20%20%20%20%20%20%20parsed_kernels%2C%0A%20%20%20%20%20%20%20%20quota_passed%2C%0A%20%20%20%20%20%20%20%20role_counts%2C%0A%20%20%20%20%20%20%20%20test_max_conf%2C%0A%20%20%20%20%20%20%20%20train_elapsed%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20%20%20%20%20y_train%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20GeneRole%2C%0A%20%20%20%20alt%2C%0A%20%20%20%20clf%2C%0A%20%20%20%20dataset_labels%2C%0A%20%20%20%20dataset_seqs%2C%0A%20%20%20%20decoy_max_conf%2C%0A%20%20%20%20eval_metrics%2C%0A%20%20%20%20layer_sweep_records%2C%0A%20%20%20%20np%2C%0A%20%20%20%20optuna_importance_records%2C%0A%20%20%20%20optuna_trial_records%2C%0A%20%20%20%20test_max_conf%2C%0A%20%20%20%20y_test%2C%0A%20%20%20%20y_train%2C%0A)%3A%0A%20%20%20%20split_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20length_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_c%20in%20clf.classes_%3A%0A%20%20%20%20%20%20%20%20_role%20%3D%20GeneRole(int(_c))%0A%20%20%20%20%20%20%20%20_tr_cnt%20%3D%20int(np.sum(y_train%20%3D%3D%20_c))%0A%20%20%20%20%20%20%20%20_ts_cnt%20%3D%20int(np.sum(y_test%20%3D%3D%20_c))%0A%20%20%20%20%20%20%20%20split_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role%22%3A%20_role.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%22%3A%20_role.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20str(_role.category.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22split%22%3A%20%22Train%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22count%22%3A%20_tr_cnt%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20split_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role%22%3A%20_role.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%22%3A%20_role.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20str(_role.category.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22split%22%3A%20%22Test%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22count%22%3A%20_ts_cnt%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20_role_lens%20%3D%20dataset_seqs.lengths%5Bdataset_labels%20%3D%3D%20_c%5D%0A%20%20%20%20%20%20%20%20if%20len(_role_lens)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_q25%2C%20_q50%2C%20_q75%20%3D%20np.percentile(_role_lens%2C%20%5B25%2C%2050%2C%2075%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20length_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role%22%3A%20_role.abbreviation%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%22%3A%20_role.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20str(_role.category.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22q25%22%3A%20float(_q25)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22median%22%3A%20float(_q50)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22q75%22%3A%20float(_q75)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22min_len%22%3A%20int(np.min(_role_lens))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22max_len%22%3A%20int(np.max(_role_lens))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20counts_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dsplit_records))%0A%20%20%20%20%20%20%20%20.mark_bar()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22role%3AN%22%2C%20sort%3D%22-x%22%2C%20title%3D%22Gene%20Role%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22count%3AQ%22%2C%20title%3D%22Non-Redundant%20Sequences%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22split%3AN%22%2C%20title%3D%22Split%22%2C%20scale%3Dalt.Scale(scheme%3D%22tableau10%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22role_name%3AN%22%2C%20%22category%3AN%22%2C%20%22split%3AN%22%2C%20%22count%3AQ%22%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3D%22Curated%20Sequence%20Counts%20per%20Role%20(Train%20vs.%20Test)%22%2C%20width%3D380%2C%20height%3D360)%0A%20%20%20%20)%0A%0A%20%20%20%20len_base%20%3D%20alt.Chart(alt.Data(values%3Dlength_records)).encode(%0A%20%20%20%20%20%20%20%20y%3Dalt.Y(%22role%3AN%22%2C%20sort%3Dalt.EncodingSortField(field%3D%22median%22%2C%20order%3D%22descending%22)%2C%20title%3DNone)%0A%20%20%20%20)%0A%20%20%20%20len_rule%20%3D%20len_base.mark_rule(strokeWidth%3D2).encode(%0A%20%20%20%20%20%20%20%20x%3Dalt.X(%22q25%3AQ%22%2C%20title%3D%22Protein%20Length%20(aa%2C%20Median%20%26%20IQR)%22)%2C%0A%20%20%20%20%20%20%20%20x2%3D%22q75%3AQ%22%2C%0A%20%20%20%20%20%20%20%20color%3Dalt.Color(%22category%3AN%22%2C%20title%3D%22Role%20Category%22)%2C%0A%20%20%20%20)%0A%20%20%20%20len_pts%20%3D%20len_base.mark_circle(size%3D65).encode(%0A%20%20%20%20%20%20%20%20x%3D%22median%3AQ%22%2C%0A%20%20%20%20%20%20%20%20color%3Dalt.Color(%22category%3AN%22%2C%20title%3D%22Role%20Category%22)%2C%0A%20%20%20%20%20%20%20%20tooltip%3D%5B%22role_name%3AN%22%2C%20%22category%3AN%22%2C%20%22median%3AQ%22%2C%20%22q25%3AQ%22%2C%20%22q75%3AQ%22%2C%20%22min_len%3AQ%22%2C%20%22max_len%3AQ%22%5D%2C%0A%20%20%20%20)%0A%20%20%20%20length_chart%20%3D%20(len_rule%20%2B%20len_pts).properties(%0A%20%20%20%20%20%20%20%20title%3D%22Protein%20Length%20Distribution%20(Median%20%26%20IQR)%22%2C%20width%3D380%2C%20height%3D360%0A%20%20%20%20)%0A%0A%20%20%20%20loss_records%20%3D%20%5B%7B%22epoch%22%3A%20idx%20%2B%201%2C%20%22loss%22%3A%20float(val)%7D%20for%20idx%2C%20val%20in%20enumerate(clf.loss_history_)%5D%0A%20%20%20%20loss_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dloss_records))%0A%20%20%20%20%20%20%20%20.mark_line(point%3DTrue%2C%20strokeWidth%3D2.5%2C%20color%3D%22%230d9488%22)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22epoch%3AQ%22%2C%20title%3D%22Epoch%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22loss%3AQ%22%2C%20title%3D%22Class-Weighted%20Cross-Entropy%20Loss%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22epoch%3AQ%22%2C%20alt.Tooltip(%22loss%3AQ%22%2C%20format%3D%22.4f%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3D%22AdamW%20Training%20Loss%20Convergence%22%2C%20width%3D380%2C%20height%3D320)%0A%20%20%20%20)%0A%0A%20%20%20%20thresholds%20%3D%20np.linspace(0.10%2C%200.99%2C%2045)%0A%20%20%20%20sweep_records%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_th%20in%20thresholds%3A%0A%20%20%20%20%20%20%20%20_tp_retain%20%3D%20float(np.mean(test_max_conf%20%3E%3D%20_th))%20*%20100.0%0A%20%20%20%20%20%20%20%20_decoy_reject%20%3D%20float(np.mean(decoy_max_conf%20%3C%20_th))%20*%20100.0%0A%20%20%20%20%20%20%20%20sweep_records.append(%7B%22threshold%22%3A%20float(_th)%2C%20%22rate%22%3A%20_tp_retain%2C%20%22curve%22%3A%20%22True%20Test%20Retained%20(%25)%22%7D)%0A%20%20%20%20%20%20%20%20sweep_records.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22threshold%22%3A%20float(_th)%2C%20%22rate%22%3A%20_decoy_reject%2C%20%22curve%22%3A%20%22Shuffled%20Decoys%20Rejected%20as%20UNKNOWN%20(%25)%22%7D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20open_set_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Dsweep_records))%0A%20%20%20%20%20%20%20%20.mark_line(strokeWidth%3D2.5)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22threshold%3AQ%22%2C%20title%3D%22Minimum%20Softmax%20Confidence%20Threshold%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22rate%3AQ%22%2C%20title%3D%22Percentage%20(%25)%22%2C%20scale%3Dalt.Scale(domain%3D%5B0%2C%20100%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22curve%3AN%22%2C%20title%3D%22Open-Set%20Metric%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22threshold%3AQ%22%2C%20format%3D%22.2f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22curve%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22rate%3AQ%22%2C%20format%3D%22.1f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3D%22Open-Set%20UNKNOWN%20(Role%2029)%20Rejection%20vs.%20Test%20Retention%22%2C%20width%3D400%2C%20height%3D320)%0A%20%20%20%20)%0A%0A%20%20%20%20prf_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Deval_metrics%5B%22per_role%22%5D))%0A%20%20%20%20%20%20%20%20.mark_bar()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22abbreviation%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sort%3Dalt.EncodingSortField(field%3D%22f1_sort%22%2C%20order%3D%22descending%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Gene%20Role%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22score%3AQ%22%2C%20title%3D%22Score%22%2C%20scale%3Dalt.Scale(domain%3D%5B0%2C%201.0%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20yOffset%3D%22metric%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22metric%3AN%22%2C%20title%3D%22Metric%22%2C%20scale%3Dalt.Scale(scheme%3D%22set2%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22role_name%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22metric%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22score%3AQ%22%2C%20format%3D%22.3f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22support%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3D%22Held-Out%20Test%20Precision%2C%20Recall%20%26%20F1-Score%20per%20Role%22%2C%20width%3D360%2C%20height%3D380)%0A%20%20%20%20)%0A%0A%20%20%20%20conf_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Deval_metrics%5B%22confusion_records%22%5D))%0A%20%20%20%20%20%20%20%20.mark_rect()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22pred_role%3AN%22%2C%20title%3D%22Predicted%20Role%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22true_role%3AN%22%2C%20title%3D%22True%20Role%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22row_pct%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Row%20Share%20(%25)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20scale%3Dalt.Scale(scheme%3D%22blues%22%2C%20domain%3D%5B0%2C%20100%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22true_name%3AN%22%2C%20title%3D%22True%20Role%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22pred_name%3AN%22%2C%20title%3D%22Predicted%20Role%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22count%3AQ%22%2C%20title%3D%22Count%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22row_pct%3AQ%22%2C%20title%3D%22Row%20%25%22%2C%20format%3D%22.1f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3D%22Held-Out%20Test%20Confusion%20Matrix%20(Row-Normalized%20%25)%22%2C%20width%3D380%2C%20height%3D380)%0A%20%20%20%20)%0A%0A%20%20%20%20_hist_base%20%3D%20alt.Chart(alt.Data(values%3Doptuna_trial_records))%0A%20%20%20%20_trial_pts%20%3D%20_hist_base.mark_circle(size%3D85).encode(%0A%20%20%20%20%20%20%20%20x%3Dalt.X(%22trial%3AQ%22%2C%20title%3D%22Optuna%20TPE%20Trial%20Number%22%2C%20scale%3Dalt.Scale(domainMin%3D1))%2C%0A%20%20%20%20%20%20%20%20y%3Dalt.Y(%22macro_f1%3AQ%22%2C%20title%3D%22Inner%20Validation%20Macro%20F1%20(%25)%22%2C%20scale%3Dalt.Scale(zero%3DFalse))%2C%0A%20%20%20%20%20%20%20%20color%3Dalt.Color(%22kernel_combo%3AN%22%2C%20title%3D%22Kernel%20Sizes%22)%2C%0A%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22trial%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22macro_f1%3AQ%22%2C%20format%3D%22.2f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22best_macro_f1%3AQ%22%2C%20format%3D%22.2f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22embed_dim%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22num_filters%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22kernel_combo%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22learning_rate%3AQ%22%2C%20format%3D%22.4f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22weight_decay%3AQ%22%2C%20format%3D%22.5f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22batch_size%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20)%0A%20%20%20%20_best_line%20%3D%20_hist_base.mark_line(strokeWidth%3D2.5%2C%20interpolate%3D%22step-after%22%2C%20color%3D%22%23d95f02%22).encode(%0A%20%20%20%20%20%20%20%20x%3D%22trial%3AQ%22%2C%0A%20%20%20%20%20%20%20%20y%3D%22best_macro_f1%3AQ%22%2C%0A%20%20%20%20)%0A%20%20%20%20optuna_history_chart%20%3D%20(_trial_pts%20%2B%20_best_line).properties(%0A%20%20%20%20%20%20%20%20title%3D%22Optuna%20TPE%20Optimization%20History%20%26%20Best-So-Far%20Frontier%22%2C%0A%20%20%20%20%20%20%20%20width%3D380%2C%0A%20%20%20%20%20%20%20%20height%3D230%2C%0A%20%20%20%20)%0A%0A%20%20%20%20optuna_imp_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3Doptuna_importance_records))%0A%20%20%20%20%20%20%20%20.mark_bar(color%3D%22%230d9488%22)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22parameter%3AN%22%2C%20sort%3D%22-x%22%2C%20title%3D%22Hyperparameter%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22importance%3AQ%22%2C%20title%3D%22Relative%20Importance%20Share%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22parameter%3AN%22%2C%20alt.Tooltip(%22importance%3AQ%22%2C%20format%3D%22.3f%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3D%22Hyperparameter%20Importance%20Across%20Trials%22%2C%20width%3D360%2C%20height%3D230)%0A%20%20%20%20)%0A%0A%20%20%20%20_layer_order%20%3D%20%5Bstr(r%5B%22layer%22%5D)%20for%20r%20in%20layer_sweep_records%5D%0A%20%20%20%20_layer_bar_rows%3A%20list%5Bdict%5Bstr%2C%20object%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20for%20_r%20in%20layer_sweep_records%3A%0A%20%20%20%20%20%20%20%20for%20_m_label%2C%20_m_key%20in%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20(%221-NN%20Cosine%20Recall%20(%25)%22%2C%20%22top1_recall%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22Top-5%20Role%20Purity%20(%25)%22%2C%20%22top5_purity%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20(%22Nearest-Centroid%20Macro%20F1%20(%25)%22%2C%20%22centroid_f1%22)%2C%0A%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_layer_bar_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22layer%22%3A%20str(_r%5B%22layer%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22dim%22%3A%20int(_r%5B%22dim%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22metric%22%3A%20_m_label%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22score%22%3A%20float(_r%5B_m_key%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22fisher_ratio%22%3A%20float(_r%5B%22fisher_ratio%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22composite_score%22%3A%20float(_r%5B%22composite_score%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20layer_sweep_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(alt.Data(values%3D_layer_bar_rows))%0A%20%20%20%20%20%20%20%20.mark_bar(cornerRadiusTopRight%3D3%2C%20cornerRadiusBottomRight%3D3)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22layer%3AN%22%2C%20sort%3D_layer_order%2C%20title%3D%22Network%20Layer%20Representation%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22score%3AQ%22%2C%20title%3D%22Metric%20Score%20(%25)%22%2C%20scale%3Dalt.Scale(domain%3D%5B0%2C%20100%5D))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20yOffset%3D%22metric%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22metric%3AN%22%2C%20title%3D%22Sweep%20Metric%22%2C%20scale%3Dalt.Scale(scheme%3D%22tealblues%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22layer%3AN%22%2C%20title%3D%22Layer%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22dim%3AQ%22%2C%20title%3D%22Dimension%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22metric%3AN%22%2C%20title%3D%22Metric%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22score%3AQ%22%2C%20title%3D%22Score%20(%25)%22%2C%20format%3D%22.2f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22fisher_ratio%3AQ%22%2C%20title%3D%22Fisher%20Ratio%22%2C%20format%3D%22.3f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22composite_score%3AQ%22%2C%20title%3D%22Composite%20Score%22%2C%20format%3D%22.2f%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Layer%20Representation%20Sweep%20(1-NN%20Recall%2C%20Top-5%20Purity%20%26%20Centroid%20Macro%20F1)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3D760%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3D240%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20conf_chart%2C%0A%20%20%20%20%20%20%20%20counts_chart%2C%0A%20%20%20%20%20%20%20%20layer_sweep_chart%2C%0A%20%20%20%20%20%20%20%20length_chart%2C%0A%20%20%20%20%20%20%20%20loss_chart%2C%0A%20%20%20%20%20%20%20%20open_set_chart%2C%0A%20%20%20%20%20%20%20%20optuna_history_chart%2C%0A%20%20%20%20%20%20%20%20optuna_imp_chart%2C%0A%20%20%20%20%20%20%20%20prf_chart%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20GeneRole%2C%0A%20%20%20%20X_test%2C%0A%20%20%20%20X_train%2C%0A%20%20%20%20active_bs%2C%0A%20%20%20%20active_embed_dim%2C%0A%20%20%20%20active_lr%2C%0A%20%20%20%20active_num_filters%2C%0A%20%20%20%20active_wd%2C%0A%20%20%20%20best_sweep_layer%2C%0A%20%20%20%20clf%2C%0A%20%20%20%20config_source%2C%0A%20%20%20%20dataset_seqs%2C%0A%20%20%20%20eval_metrics%2C%0A%20%20%20%20fetch_elapsed%2C%0A%20%20%20%20min_role_name%2C%0A%20%20%20%20min_role_support%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20model_size_kb%2C%0A%20%20%20%20parsed_kernels%2C%0A%20%20%20%20quota_passed%2C%0A%20%20%20%20train_elapsed%2C%0A)%3A%0A%20%20%20%20%23%20Slide%201%3A%20Hero%20Title%2C%20Executive%20Summary%20%26%20KPI%20Cards%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%60GeneRoleClassifier%60%20%E2%80%94%20Multi-Scale%201D-CNN%20Training%2C%20Optuna%20Tuning%20%26%20Validation%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Curating%20non-redundant%20bacterial%20reference%20proteins%20across%20**UniProtKB%20(Pfam%2FInterPro)**%2C%20**UniRef50**%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**NCBI%20IPG**%2C%20and%20**KEGG%20Orthology**%2C%20deduplicating%20via%20%5B%60Clusterer%60%5D%5Bserogen.core.seq.clustering.Clusterer%5D%20(%6080%25%60%20CD-HIT)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20and%20training%20%5B%60GeneRoleClassifier%60%5D%5Bserogen.genes.cnn.GeneRoleClassifier%5D%20across%20all%20**29%20functional%20%60GeneRole%60s**.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Curated%20Sequences%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Blen(dataset_seqs)%3A%2C%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22Train%3A%20%7Blen(X_train)%3A%2C%7D%20%7C%20Test%3A%20%7Blen(X_test)%3A%2C%7D%20(%7Bfetch_elapsed%3A.1f%7Ds)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%2229-Role%20Quota%20Gate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3D%22PASS%22%20if%20quota_passed%20else%20%22DEFICIT%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22Min%20Role%3A%20%7Bmin_role_name%7D%20(%7Bmin_role_support%7D%20seqs)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Optuna%20Model%20Saved%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bmodel_size_kb%3A.1f%7D%20KB%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22Fit%3A%20%7Btrain_elapsed%3A.2f%7Ds%20%7C%20Loss%3A%20%7Bclf.loss_history_%5B-1%5D%3A.4f%7D%20(%60model.npz%60)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Held-Out%20Test%20Accuracy%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bfloat(eval_metrics%5B'accuracy'%5D)%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Blen(clf.classes_)%7D%20%2F%20%7Blen(GeneRole)%20-%201%7D%20Functional%20Roles%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Held-Out%20Macro%20F1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bfloat(eval_metrics%5B'macro_f1'%5D)%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22Prec%3A%20%7Bfloat(eval_metrics%5B'macro_precision'%5D)%20*%20100%3A.1f%7D%25%20%7C%20Rec%3A%20%7Bfloat(eval_metrics%5B'macro_recall'%5D)%20*%20100%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20widths%3D%22equal%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap%3D1.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22**Saved%20Production%20Architecture%20(%7Bconfig_source%7D%20-%3E%20%60src%2Fserogen%2Fdata%2Fmodel.npz%60)**%3A%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%60embed_dim%3D%7Bactive_embed_dim%7D%60%2C%20%60num_filters%3D%7Bactive_num_filters%7D%60%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%60kernel_size%3D%7Bparsed_kernels%7D%60%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%60lr%3D%7Bactive_lr%3A.5f%7D%60%2C%20%60weight_decay%3D%7Bactive_wd%3A.6f%7D%60%2C%20%60batch_size%3D%7Bactive_bs%7D%60%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22top%20embedding%20layer%3D%60%7Bbest_sweep_layer%7D%60.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D1.2%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20counts_chart%2C%20length_chart%2C%20mo)%3A%0A%20%20%20%20%23%20Slide%202%3A%20Dataset%20Curation%20%26%20Protein%20Length%20Distribution%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%201.%20Non-Redundant%20Reference%20Curation%20%26%20Protein%20Length%20Profiles%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Post-clustering%20deficit%20top-up%20guarantees%20at%20least%2030%20non-redundant%20sequences%20(%60%3C%3D%2080%25%60%20identity)%20per%20functional%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60GeneRole%60%2C%20while%20median-absolute-deviation%20(%603.5%20MAD%60)%20length%20filtering%20removes%20truncated%20fragments%20and%20polyprotein%20fusions.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.hconcat(counts_chart%2C%20length_chart).resolve_scale(color%3D%22independent%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20active_bs%2C%0A%20%20%20%20active_embed_dim%2C%0A%20%20%20%20active_lr%2C%0A%20%20%20%20active_num_filters%2C%0A%20%20%20%20active_wd%2C%0A%20%20%20%20alt%2C%0A%20%20%20%20best_sweep_layer%2C%0A%20%20%20%20best_trial_num%2C%0A%20%20%20%20best_val_f1%2C%0A%20%20%20%20layer_sweep_chart%2C%0A%20%20%20%20median_val_f1%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20optuna_gain_f1%2C%0A%20%20%20%20optuna_history_chart%2C%0A%20%20%20%20optuna_imp_chart%2C%0A%20%20%20%20optuna_trial_records%2C%0A%20%20%20%20parsed_kernels%2C%0A)%3A%0A%20%20%20%20%23%20Slide%203%3A%20Dedicated%20Optuna%20TPE%20Hyperparameter%20Optimization%20%26%20Layer%20Representation%20Sweep%20Slide%0A%20%20%20%20_top_trials%20%3D%20sorted(optuna_trial_records%2C%20key%3Dlambda%20r%3A%20float(r%5B%22macro_f1%22%5D)%2C%20reverse%3DTrue)%5B%3A5%5D%0A%20%20%20%20_top_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20**%23%7Btr%5B'trial'%5D%7D**%20%7C%20**%7Bfloat(tr%5B'macro_f1'%5D)%3A.2f%7D%25**%20%7C%20%7Btr%5B'embed_dim'%5D%7D%20%7C%20%7Btr%5B'num_filters'%5D%7D%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Btr%5B'kernel_combo'%5D%7D%60%20%7C%20%60%7Bfloat(tr%5B'learning_rate'%5D)%3A.5f%7D%60%20%7C%20%60%7Bfloat(tr%5B'weight_decay'%5D)%3A.6f%7D%60%20%7C%20%7Btr%5B'batch_size'%5D%7D%20%7C%22%0A%20%20%20%20%20%20%20%20for%20tr%20in%20_top_trials%0A%20%20%20%20)%0A%20%20%20%20_top_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Top%20Trial%20%7C%20Inner%20Val%20Macro%20F1%20%7C%20Embed%20Dim%20%7C%20Filters%20%7C%20Kernel%20Widths%20%7C%20Learning%20Rate%20%7C%20Weight%20Decay%20%7C%20Batch%20Size%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_top_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%202.%20Optuna%20TPE%20Hyperparameter%20Optimization%20%26%20Layer%20Representation%20Sweep%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Tree-structured%20Parzen%20Estimator%20(TPE)%20search%20over%20multi-scale%20motif%20kernel%20widths%2C%20filter%20capacity%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20embedding%20dimension%2C%20and%20AdamW%20regularization%2C%20followed%20by%20a%20Numba-parallel%20representation%20sweep%20across%20all%20layers%20(%60best%3D%7Bbest_sweep_layer%7D%60).%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Best%20Validation%20Macro%20F1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bbest_val_f1%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22Trial%20%23%7Bbest_trial_num%7D%20(%2B%7Boptuna_gain_f1%3A.2f%7D%25%20vs.%20%7Bmedian_val_f1%3A.1f%7D%25%20median)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Winning%20Motif%20Kernels%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bparsed_kernels%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22%7Blen(parsed_kernels)%7D%20parallel%201D-CNN%20branches%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Winning%20Capacity%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22%7Bactive_num_filters%7D%20filters%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22Embed%20Dim%3A%20%7Bactive_embed_dim%7D%20%7C%20Dual%20Pooling%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.stat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Winning%20AdamW%20Schedule%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3Df%22lr%3D%7Bactive_lr%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20caption%3Df%22wd%3D%7Bactive_wd%3A.5f%7D%20%7C%20batch%3D%7Bactive_bs%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bordered%3DTrue%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20widths%3D%22equal%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap%3D1.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.tabs(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Optuna%20TPE%20History%20%26%20Importance%22%3A%20alt.hconcat(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optuna_history_chart%2C%20optuna_imp_chart%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).resolve_scale(color%3D%22independent%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Layer%20Representation%20Sweep%22%3A%20layer_sweep_chart%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(_top_table_md)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.6%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20loss_chart%2C%20mo%2C%20open_set_chart)%3A%0A%20%20%20%20%23%20Slide%204%3A%20AdamW%20Convergence%20%26%20Open-Set%20Decoy%20Rejection%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%203.%20AdamW%20Training%20Convergence%20%26%20Open-Set%20Decoy%20Rejection%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Cosine-annealed%20AdamW%20optimization%20on%20the%20Optuna-selected%20architecture%20alongside%20open-set%20%60UNKNOWN%60%20(%60Role%2029%60)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rejection%20evaluated%20on%20composition-matched%20shuffled%20test%20decoys.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.hconcat(loss_chart%2C%20open_set_chart).resolve_scale(color%3D%22independent%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20conf_chart%2C%20mo%2C%20prf_chart)%3A%0A%20%20%20%20%23%20Slide%205%3A%20Held-Out%20Test%20Precision%2C%20Recall%2C%20F1%20%26%20Confusion%20Matrix%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%204.%20Held-Out%20Test%20Performance%20%26%20Row-Normalized%20Confusion%20Matrix%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Per-role%20precision%2C%20recall%2C%20and%20F1-score%20alongside%20the%2029%C3%9729%20row-normalized%20confusion%20matrix%20on%20the%20stratified%2020%25%20holdout%20split.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20alt.hconcat(prf_chart%2C%20conf_chart).resolve_scale(color%3D%22independent%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20GeneRole%2C%0A%20%20%20%20eval_metrics%2C%0A%20%20%20%20layer_sweep_records%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20optuna_trial_records%2C%0A%20%20%20%20role_counts%2C%0A)%3A%0A%20%20%20%20%23%20Slide%206%3A%20Reference%20Tables%20(Per-Role%20Performance%2C%20Layer%20Sweep%20%26%20Complete%20Optuna%20Trial%20Leaderboard)%0A%20%20%20%20_role_md_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_c_idx%20in%20range(29)%3A%0A%20%20%20%20%20%20%20%20_r%20%3D%20GeneRole(_c_idx)%0A%20%20%20%20%20%20%20%20_tot_cnt%20%3D%20int(role_counts%5B_c_idx%5D)%0A%20%20%20%20%20%20%20%20_pr_items%20%3D%20%5Brow%20for%20row%20in%20eval_metrics%5B%22per_role%22%5D%20if%20row%5B%22role_name%22%5D%20%3D%3D%20_r.name%5D%0A%20%20%20%20%20%20%20%20_p_val%20%3D%20next((row%5B%22score%22%5D%20for%20row%20in%20_pr_items%20if%20row%5B%22metric%22%5D%20%3D%3D%20%22Precision%22)%2C%200.0)%0A%20%20%20%20%20%20%20%20_r_val%20%3D%20next((row%5B%22score%22%5D%20for%20row%20in%20_pr_items%20if%20row%5B%22metric%22%5D%20%3D%3D%20%22Recall%22)%2C%200.0)%0A%20%20%20%20%20%20%20%20_f_val%20%3D%20next((row%5B%22score%22%5D%20for%20row%20in%20_pr_items%20if%20row%5B%22metric%22%5D%20%3D%3D%20%22F1-Score%22)%2C%200.0)%0A%20%20%20%20%20%20%20%20_sup_val%20%3D%20next((row%5B%22support%22%5D%20for%20row%20in%20_pr_items)%2C%200)%0A%20%20%20%20%20%20%20%20_role_md_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%7C%20%7B_c_idx%7D%20%7C%20%60%7B_r.abbreviation%7D%60%20%7C%20%7B_r.name%7D%20%7C%20%7B_r.category.value%7D%20%7C%20%7B_tot_cnt%7D%20%7C%20%7B_sup_val%7D%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%7C%20%7B_p_val%20*%20100%3A.1f%7D%25%20%7C%20%7B_r_val%20*%20100%3A.1f%7D%25%20%7C%20**%7B_f_val%20*%20100%3A.1f%7D%25**%20%7C%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20_role_md%20%3D%20%22%5Cn%22.join(_role_md_rows)%0A%0A%20%20%20%20_trial_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20%23%7Btr%5B'trial'%5D%7D%20%7C%20**%7Bfloat(tr%5B'macro_f1'%5D)%3A.2f%7D%25**%20%7C%20%7Bfloat(tr%5B'best_macro_f1'%5D)%3A.2f%7D%25%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Btr%5B'embed_dim'%5D%7D%20%7C%20%7Btr%5B'num_filters'%5D%7D%20%7C%20%60%7Btr%5B'kernel_combo'%5D%7D%60%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Bfloat(tr%5B'learning_rate'%5D)%3A.5f%7D%60%20%7C%20%60%7Bfloat(tr%5B'weight_decay'%5D)%3A.6f%7D%60%20%7C%20%7Btr%5B'batch_size'%5D%7D%20%7C%22%0A%20%20%20%20%20%20%20%20for%20tr%20in%20optuna_trial_records%0A%20%20%20%20)%0A%0A%20%20%20%20_layer_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20f%22%7C%20%60%7Blr_row%5B'layer'%5D%7D%60%20%7C%20%7Blr_row%5B'dim'%5D%7D%20%7C%20**%7Bfloat(lr_row%5B'top1_recall'%5D)%3A.2f%7D%25**%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Bfloat(lr_row%5B'top5_purity'%5D)%3A.2f%7D%25%20%7C%20%7Bfloat(lr_row%5B'centroid_f1'%5D)%3A.2f%7D%25%20%22%0A%20%20%20%20%20%20%20%20f%22%7C%20%7Bfloat(lr_row%5B'fisher_ratio'%5D)%3A.3f%7D%20%7C%20**%7Bfloat(lr_row%5B'composite_score'%5D)%3A.2f%7D**%20%7C%22%0A%20%20%20%20%20%20%20%20for%20lr_row%20in%20layer_sweep_records%0A%20%20%20%20)%0A%0A%20%20%20%20_role_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20ID%20%7C%20Abbrev%20%7C%20Gene%20Role%20%7C%20Category%20%7C%20Post-CD-HIT%20Total%20%7C%20Test%20Support%20%7C%20Precision%20%7C%20Recall%20%7C%20F1-Score%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20---%3A%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_role_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_layer_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Layer%20%7C%20Dim%20%7C%201-NN%20Cosine%20Recall%20%7C%20Top-5%20Role%20Purity%20%7C%20Nearest-Centroid%20Macro%20F1%20%7C%20Fisher%20Ratio%20%7C%20Composite%20Score%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_layer_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_trial_table_md%20%3D%20%22%5Cn%22.join(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20Trial%20%7C%20Inner%20Val%20Macro%20F1%20%7C%20Best%20So%20Far%20%7C%20Embed%20Dim%20%7C%20Filters%20%7C%20Kernels%20%7C%20Learning%20Rate%20%7C%20Weight%20Decay%20%7C%20Batch%20Size%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%20%3A---%20%7C%20---%3A%20%7C%20---%3A%20%7C%20---%3A%20%7C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_trial_md%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%205.%20Per-Role%20Holdout%20Metrics%2C%20Layer%20Sweep%20%26%20Complete%20Optuna%20Trial%20Leaderboard%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.tabs(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2229%20Functional%20GeneRoles%20(Holdout%20Test)%22%3A%20mo.md(_role_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Layer%20Representation%20Sweep%20(%7Blen(layer_sweep_records)%7D%20Layers)%22%3A%20mo.md(_layer_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Optuna%20TPE%20Study%20(%7Blen(optuna_trial_records)%7D%20Trials)%22%3A%20mo.md(_trial_table_md)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.8%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
cefd13c4b95c7f87e1f8fa1ce3eac38d