> ## Documentation Index
> Fetch the complete documentation index at: https://proto.evodesign.org/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Constraints

> Scoring functions that encode design requirements as values the optimizer minimizes

<div class="card-strip-wrapper">
  <div class="card-strip" data-duration="486">
    <a href="/docs/language/constraints/promoter-strength" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/promoter-strength/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-basepair-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-basepair-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-beta-strand" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-beta-strand/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/operator-site" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/operator-site/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-interface-contact" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-interface-contact/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/alphagenome-interval-track" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-interval-track/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-nearest-neighbor-gap-gini" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-nearest-neighbor-gap-gini/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/esm2-perplexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/esm2-perplexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/ablang-perplexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/ablang-perplexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/metal3d-probability" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/metal3d-probability/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-iplddt" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-iplddt/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mirna-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mirna-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/crispr-tracr-rna" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/crispr-tracr-rna/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-ipae" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ipae/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/parade-utr-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/alphagenome-splice-junction" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-splice-junction/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-rmsd" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-rmsd/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-length" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-length/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-iptm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-iptm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-dna-ipsae" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-dna-ipsae/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-termini-distance" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-termini-distance/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-repetitiveness" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-repetitiveness/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/max-homopolymer" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/max-homopolymer/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/kmer-frequency" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/kmer-frequency/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-distogram-cce" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-distogram-cce/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/alphagenome-splice-site-usage" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-splice-site-usage/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/af3-offtarget-iptm-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/af3-offtarget-iptm-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mpnn-sequence-probability" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mpnn-sequence-probability/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-tmscore" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-tmscore/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-property-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-property-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-profile-hmm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-profile-hmm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dna-motif-contact-count" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-motif-contact-count/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-motif-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-motif-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-complexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-complexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dna-base-contact-quality" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-base-contact-quality/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/deeppbs-motif-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/deeppbs-motif-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/crispr-array" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/crispr-array/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-radius-gyration" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-radius-gyration/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/longest-orf-length" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/longest-orf-length/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dna-phosphate-contact" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-phosphate-contact/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mpnn-perplexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mpnn-perplexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/parade-utr-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-domain" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-domain/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/af3-chain-pair-prot-dna-iptm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/af3-chain-pair-prot-dna-iptm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dinucleotide-composition" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dinucleotide-composition/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/gyration-radius" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gyration-radius/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-helix" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-helix/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/seq-motif" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/seq-motif/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-ptm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ptm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/overall-protein-quality" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/overall-protein-quality/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/na-mpnn-motif-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/na-mpnn-motif-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-contact" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-contact/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/boltz2-binding-strength" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/boltz2-binding-strength/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/gc-content" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gc-content/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/balanced-aa" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/balanced-aa/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/pyrosetta-interface" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/pyrosetta-interface/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-ensemble-rmsd" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ensemble-rmsd/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-feature-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-feature-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-symmetry-ring" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-symmetry-ring/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-pae" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-pae/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mmseqs-gene-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mmseqs-gene-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/splice-transformer-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/splice-transformer-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/sequence-length" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/sequence-length/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-composite" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-composite/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-max-identity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-max-identity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-diversity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-diversity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/malinois-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/malinois-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dbp-design-metrics" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dbp-design-metrics/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/sigma70-promoter" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/sigma70-promoter/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/borzoi-chromatin-accessibility-morse" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/borzoi-chromatin-accessibility-morse/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/splice-transformer-intron-boundary" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/splice-transformer-intron-boundary/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/consensus-operator-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/consensus-operator-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/borzoi-track-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/borzoi-track-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/parade-utr-stability" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-stability/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/gap-gini" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gap-gini/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-globularity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-globularity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/specific-kmer-frequency" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/specific-kmer-frequency/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/puffin-promoter-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/puffin-promoter-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/targetscan-site" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/targetscan-site/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/enformer-chromatin-accessibility-morse" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/enformer-chromatin-accessibility-morse/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-plddt" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-plddt/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/promoter-strength" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/promoter-strength/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-basepair-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-basepair-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-beta-strand" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-beta-strand/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/operator-site" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/operator-site/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-interface-contact" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-interface-contact/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/alphagenome-interval-track" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-interval-track/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-nearest-neighbor-gap-gini" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-nearest-neighbor-gap-gini/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/esm2-perplexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/esm2-perplexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/ablang-perplexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/ablang-perplexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/metal3d-probability" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/metal3d-probability/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-iplddt" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-iplddt/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mirna-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mirna-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/crispr-tracr-rna" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/crispr-tracr-rna/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-ipae" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ipae/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/parade-utr-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/alphagenome-splice-junction" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-splice-junction/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-rmsd" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-rmsd/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-length" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-length/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-iptm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-iptm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-dna-ipsae" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-dna-ipsae/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-termini-distance" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-termini-distance/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-repetitiveness" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-repetitiveness/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/max-homopolymer" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/max-homopolymer/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/kmer-frequency" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/kmer-frequency/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-distogram-cce" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-distogram-cce/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/alphagenome-splice-site-usage" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-splice-site-usage/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/af3-offtarget-iptm-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/af3-offtarget-iptm-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mpnn-sequence-probability" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mpnn-sequence-probability/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-tmscore" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-tmscore/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-property-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-property-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-profile-hmm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-profile-hmm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dna-motif-contact-count" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-motif-contact-count/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-motif-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-motif-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-complexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-complexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dna-base-contact-quality" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-base-contact-quality/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/deeppbs-motif-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/deeppbs-motif-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/crispr-array" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/crispr-array/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-radius-gyration" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-radius-gyration/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/longest-orf-length" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/longest-orf-length/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dna-phosphate-contact" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-phosphate-contact/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mpnn-perplexity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mpnn-perplexity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/parade-utr-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-domain" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-domain/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/af3-chain-pair-prot-dna-iptm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/af3-chain-pair-prot-dna-iptm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dinucleotide-composition" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dinucleotide-composition/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/gyration-radius" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gyration-radius/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-helix" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-helix/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/seq-motif" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/seq-motif/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-ptm" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ptm/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/overall-protein-quality" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/overall-protein-quality/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/na-mpnn-motif-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/na-mpnn-motif-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-contact" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-contact/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/boltz2-binding-strength" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/boltz2-binding-strength/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/gc-content" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gc-content/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/balanced-aa" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/balanced-aa/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/pyrosetta-interface" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/pyrosetta-interface/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-ensemble-rmsd" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ensemble-rmsd/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/rna-feature-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-feature-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-symmetry-ring" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-symmetry-ring/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-pae" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-pae/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/mmseqs-gene-similarity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mmseqs-gene-similarity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/splice-transformer-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/splice-transformer-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/sequence-length" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/sequence-length/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-composite" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-composite/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-max-identity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-max-identity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-diversity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-diversity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/malinois-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/malinois-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/dbp-design-metrics" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dbp-design-metrics/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/sigma70-promoter" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/sigma70-promoter/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/borzoi-chromatin-accessibility-morse" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/borzoi-chromatin-accessibility-morse/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/splice-transformer-intron-boundary" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/splice-transformer-intron-boundary/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/consensus-operator-specificity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/consensus-operator-specificity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/borzoi-track-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/borzoi-track-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/parade-utr-stability" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-stability/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/gap-gini" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gap-gini/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/protein-globularity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-globularity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/specific-kmer-frequency" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/specific-kmer-frequency/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/puffin-promoter-activity" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/puffin-promoter-activity/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/targetscan-site" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/targetscan-site/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/enformer-chromatin-accessibility-morse" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/enformer-chromatin-accessibility-morse/carousel.png" alt="" loading="lazy" />
    </a>

    <a href="/docs/language/constraints/structure-plddt" class="card-strip-item">
      <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-plddt/carousel.png" alt="" loading="lazy" />
    </a>
  </div>
</div>

# Constraints

A constraint encodes a biological requirement, such as a GC-content range, protein folding confidence, structural similarity, or motif presence, as a scoring function that the [optimizer](/docs/language/concepts/optimizers) minimizes.

Every constraint answers one question about a proposal sequence: **how far is it from the requirement?** The answer is a score between `0.0` (perfect) and `1.0` (worst). The optimizer combines all constraint scores into a single **energy** value and searches for sequences that minimize it.

## The Scoring Model

Proto uses a unified scoring model where all constraints return values on the same `[0.0, 1.0]` scale:

```
    Perfect                                    Worst
    |------------------------------------------|
    0.0              0.5                      1.0
    GC content      GC 5% outside           GC 20% outside
    in range         target range             target range
```

The optimizer combines scores into a single energy:

```
Energy = Sigma(weight_i x score_i)
```

**Lower energy is better.** A sequence with energy `0.0` satisfies all constraints perfectly.

```python python icon="python" theme={null}
# Example: Three constraints with different weights
# If a proposal scores 0.1 on GC, 0.3 on structure, 0.0 on homopolymer:
#
# Energy = (1.0 x 0.1) + (2.0 x 0.3) + (1.0 x 0.0) = 0.7
```

## Two Modes: Scoring vs Filtering

Constraints operate in one of two mutually exclusive modes:

<Columns>
  <Column>
    ### Scoring Mode (Soft)

    Uses `weight` to control relative importance. Returns a float score that contributes to the total energy.

    * Guides optimization toward better solutions
    * Allows trade-offs between constraints
    * Default mode (`weight=1.0`)

    ```python python icon="python" theme={null}
    # Target: GC content near 50-60%
    Constraint(
        inputs=[segment],
        function=gc_content_constraint,
        function_config={"min_gc": 50, "max_gc": 60},
        weight=2.0,  # 2x importance
    )
    ```
  </Column>

  <Column>
    ### Filter Mode (Hard)

    Uses `threshold` to create a binary pass/fail gate: a proposal passes when `score <= threshold`, otherwise it is rejected.

    * Proposals that fail are immediately rejected
    * Rejected proposals skip all scoring constraints
    * Saves compute on expensive evaluations

    ```python python icon="python" theme={null}
    # "Homopolymers MUST be <= 4bp"
    Constraint(
        inputs=[segment],
        function=max_homopolymer_constraint,
        function_config={"max_length": 4},
        threshold=0.0,  # score must be <= 0.0
    )
    ```
  </Column>
</Columns>

<Warning>
  `weight` and `threshold` are mutually exclusive. A constraint is either a weighted scorer OR a binary filter, never both. Setting both raises a `ValueError`.
</Warning>

## The Evaluation Pipeline

When the optimizer calls `score_energy()`, constraints are evaluated in a specific order designed to reject bad proposals early and save expensive computation:

<div className="block dark:hidden">
  <svg viewBox="0 0 700 792" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Constraint evaluation pipeline: filters reject early, then weighted scores sum to an energy" style={{width:"100%",height:"auto",display:"block"}}><defs><pattern id="gridconstraints1L" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="2" cy="2" r="1.2" fill="#344649" fillOpacity="0.10" /></pattern><marker id="arrconstraints1L" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="6.5" markerHeight="6.5" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 L3,5 z" fill="#768b8e" /></marker></defs><rect x="12" y="12" width="676" height="768" rx="16" fill="#f9fcfc" stroke="#dee9e8" strokeWidth="1.2" /><rect x="12" y="12" width="676" height="768" rx="16" fill="url(#gridconstraints1L)" /><path d="M200,120 L200,164" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><path d="M200,246 L200,290" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><path d="M200,372 L200,416" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><path d="M200,498 L200,542" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><path d="M200,624 L200,668" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><path d="M320,206 L440,206" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><path d="M320,332 L440,332" fill="none" stroke="#9eb4b2" strokeWidth="1.6" markerEnd="url(#arrconstraints1L)" /><rect x="80" y="40" width="240" height="80" rx="10" fill="#f4f9f9" stroke="#dbe6e4" strokeWidth="1.2" /><rect x="186" y="52" width="28" height="3.5" rx="2" fill="#768b8e" /><text x="200" y="86" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#1d2c2f" textAnchor="middle">All Proposals</text><rect x="80" y="166" width="240" height="80" rx="10" fill="#eef2f4" stroke="#dbe3e6" strokeWidth="1.2" /><rect x="186" y="178" width="28" height="3.5" rx="2" fill="#C77D2E" /><text x="200" y="204" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#344649" textAnchor="middle">Filter 1:</text><text x="200" y="222" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">Homopolymer \<= 4bp</text><rect x="80" y="292" width="240" height="80" rx="10" fill="#eef2f4" stroke="#dbe3e6" strokeWidth="1.2" /><rect x="186" y="304" width="28" height="3.5" rx="2" fill="#C77D2E" /><text x="200" y="322" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#344649" textAnchor="middle">Filter 2:</text><text x="200" y="340" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">Forbid GATC</text><text x="200" y="355" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">(specific k-mer)</text><rect x="80" y="418" width="240" height="80" rx="10" fill="#eef2f4" stroke="#dbe3e6" strokeWidth="1.2" /><rect x="186" y="430" width="28" height="3.5" rx="2" fill="#768b8e" /><text x="200" y="448" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#344649" textAnchor="middle">Score 1:</text><text x="200" y="466" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">GC Content</text><text x="200" y="481" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">(weight=1.0)</text><rect x="80" y="544" width="240" height="80" rx="10" fill="#eef2f4" stroke="#dbe3e6" strokeWidth="1.2" /><rect x="186" y="556" width="28" height="3.5" rx="2" fill="#768b8e" /><text x="200" y="574" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#344649" textAnchor="middle">Score 2:</text><text x="200" y="592" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">Structure pLDDT</text><text x="200" y="607" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">(weight=2.0)</text><rect x="80" y="670" width="240" height="80" rx="10" fill="#046e7a" /><rect x="186" y="682" width="28" height="3.5" rx="2" fill="#bfe2e7" /><text x="200" y="708" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#ffffff" textAnchor="middle">Energy =</text><text x="200" y="726" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#bfe2e7" textAnchor="middle">Sigma(weight x score)</text><rect x="442" y="174" width="176" height="64" rx="10" fill="#eef2f4" stroke="#dbe3e6" strokeWidth="1.2" /><rect x="516" y="186" width="28" height="3.5" rx="2" fill="#B4453F" /><text x="530" y="204" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#344649" textAnchor="middle">Rejected</text><text x="530" y="222" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">(energy = inf)</text><rect x="442" y="300" width="176" height="64" rx="10" fill="#eef2f4" stroke="#dbe3e6" strokeWidth="1.2" /><rect x="516" y="312" width="28" height="3.5" rx="2" fill="#B4453F" /><text x="530" y="330" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#344649" textAnchor="middle">Rejected</text><text x="530" y="348" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#768b8e" textAnchor="middle">(energy = inf)</text><g fill="#ffffff" stroke="#9eb4b2" strokeWidth="1.4"><circle cx="200" cy="120" r="3.2" /><circle cx="200" cy="166" r="3.2" /><circle cx="200" cy="246" r="3.2" /><circle cx="200" cy="292" r="3.2" /><circle cx="200" cy="372" r="3.2" /><circle cx="200" cy="418" r="3.2" /><circle cx="200" cy="498" r="3.2" /><circle cx="200" cy="544" r="3.2" /><circle cx="200" cy="624" r="3.2" /><circle cx="200" cy="670" r="3.2" /><circle cx="320" cy="206" r="3.2" /><circle cx="442" cy="206" r="3.2" /><circle cx="320" cy="332" r="3.2" /><circle cx="442" cy="332" r="3.2" /></g><rect x="178" y="258.25" width="44" height="21.5" rx="6" fill="#f9fcfc" stroke="#e2e9ea" strokeWidth="1" /><text x="200" y="273" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#506467" textAnchor="middle">Pass</text><rect x="178" y="384.25" width="44" height="21.5" rx="6" fill="#f9fcfc" stroke="#e2e9ea" strokeWidth="1" /><text x="200" y="399" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#506467" textAnchor="middle">Pass</text><rect x="359" y="195.25" width="44" height="21.5" rx="6" fill="#f9fcfc" stroke="#e2e9ea" strokeWidth="1" /><text x="381" y="210" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#506467" textAnchor="middle">Fail</text><rect x="359" y="321.25" width="44" height="21.5" rx="6" fill="#f9fcfc" stroke="#e2e9ea" strokeWidth="1" /><text x="381" y="336" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#506467" textAnchor="middle">Fail</text></svg>
</div>

<div className="hidden dark:block">
  <svg viewBox="0 0 700 792" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Constraint evaluation pipeline: filters reject early, then weighted scores sum to an energy" style={{width:"100%",height:"auto",display:"block"}}><defs><pattern id="gridconstraints1D" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="2" cy="2" r="1.2" fill="#9eb4b2" fillOpacity="0.10" /></pattern><marker id="arrconstraints1D" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="6.5" markerHeight="6.5" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 L3,5 z" fill="#7e9498" /></marker></defs><rect x="12" y="12" width="676" height="768" rx="16" fill="#0e1718" stroke="#2b3c3e" strokeWidth="1.2" /><rect x="12" y="12" width="676" height="768" rx="16" fill="url(#gridconstraints1D)" /><path d="M200,120 L200,164" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><path d="M200,246 L200,290" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><path d="M200,372 L200,416" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><path d="M200,498 L200,542" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><path d="M200,624 L200,668" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><path d="M320,206 L440,206" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><path d="M320,332 L440,332" fill="none" stroke="#566b6e" strokeWidth="1.6" markerEnd="url(#arrconstraints1D)" /><rect x="80" y="40" width="240" height="80" rx="10" fill="#1a2a2b" stroke="#33474a" strokeWidth="1.2" /><rect x="186" y="52" width="28" height="3.5" rx="2" fill="#7e9498" /><text x="200" y="86" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#eef5f4" textAnchor="middle">All Proposals</text><rect x="80" y="166" width="240" height="80" rx="10" fill="#1b2829" stroke="#33474a" strokeWidth="1.2" /><rect x="186" y="178" width="28" height="3.5" rx="2" fill="#C77D2E" /><text x="200" y="204" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#d6e1df" textAnchor="middle">Filter 1:</text><text x="200" y="222" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Homopolymer \<= 4bp</text><rect x="80" y="292" width="240" height="80" rx="10" fill="#1b2829" stroke="#33474a" strokeWidth="1.2" /><rect x="186" y="304" width="28" height="3.5" rx="2" fill="#C77D2E" /><text x="200" y="322" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#d6e1df" textAnchor="middle">Filter 2:</text><text x="200" y="340" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Forbid GATC</text><text x="200" y="355" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">(specific k-mer)</text><rect x="80" y="418" width="240" height="80" rx="10" fill="#1b2829" stroke="#33474a" strokeWidth="1.2" /><rect x="186" y="430" width="28" height="3.5" rx="2" fill="#7e9498" /><text x="200" y="448" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#d6e1df" textAnchor="middle">Score 1:</text><text x="200" y="466" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">GC Content</text><text x="200" y="481" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">(weight=1.0)</text><rect x="80" y="544" width="240" height="80" rx="10" fill="#1b2829" stroke="#33474a" strokeWidth="1.2" /><rect x="186" y="556" width="28" height="3.5" rx="2" fill="#7e9498" /><text x="200" y="574" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#d6e1df" textAnchor="middle">Score 2:</text><text x="200" y="592" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Structure pLDDT</text><text x="200" y="607" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">(weight=2.0)</text><rect x="80" y="670" width="240" height="80" rx="10" fill="#0a7e8c" /><rect x="186" y="682" width="28" height="3.5" rx="2" fill="#c0e6ea" /><text x="200" y="708" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#ffffff" textAnchor="middle">Energy =</text><text x="200" y="726" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#c0e6ea" textAnchor="middle">Sigma(weight x score)</text><rect x="442" y="174" width="176" height="64" rx="10" fill="#1b2829" stroke="#33474a" strokeWidth="1.2" /><rect x="516" y="186" width="28" height="3.5" rx="2" fill="#B4453F" /><text x="530" y="204" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#d6e1df" textAnchor="middle">Rejected</text><text x="530" y="222" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">(energy = inf)</text><rect x="442" y="300" width="176" height="64" rx="10" fill="#1b2829" stroke="#33474a" strokeWidth="1.2" /><rect x="516" y="312" width="28" height="3.5" rx="2" fill="#B4453F" /><text x="530" y="330" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="14" fontWeight="600" fill="#d6e1df" textAnchor="middle">Rejected</text><text x="530" y="348" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11.5" fontWeight="400" fill="#9eb4b2" textAnchor="middle">(energy = inf)</text><g fill="#13201f" stroke="#566b6e" strokeWidth="1.4"><circle cx="200" cy="120" r="3.2" /><circle cx="200" cy="166" r="3.2" /><circle cx="200" cy="246" r="3.2" /><circle cx="200" cy="292" r="3.2" /><circle cx="200" cy="372" r="3.2" /><circle cx="200" cy="418" r="3.2" /><circle cx="200" cy="498" r="3.2" /><circle cx="200" cy="544" r="3.2" /><circle cx="200" cy="624" r="3.2" /><circle cx="200" cy="670" r="3.2" /><circle cx="320" cy="206" r="3.2" /><circle cx="442" cy="206" r="3.2" /><circle cx="320" cy="332" r="3.2" /><circle cx="442" cy="332" r="3.2" /></g><rect x="178" y="258.25" width="44" height="21.5" rx="6" fill="#13201f" stroke="#33474a" strokeWidth="1" /><text x="200" y="273" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Pass</text><rect x="178" y="384.25" width="44" height="21.5" rx="6" fill="#13201f" stroke="#33474a" strokeWidth="1" /><text x="200" y="399" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Pass</text><rect x="359" y="195.25" width="44" height="21.5" rx="6" fill="#13201f" stroke="#33474a" strokeWidth="1" /><text x="381" y="210" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Fail</text><rect x="359" y="321.25" width="44" height="21.5" rx="6" fill="#13201f" stroke="#33474a" strokeWidth="1" /><text x="381" y="336" fontFamily="Geist, ui-sans-serif, system-ui, -apple-system, sans-serif" fontSize="11" fontWeight="400" fill="#9eb4b2" textAnchor="middle">Fail</text></svg>
</div>

**Key insight:** Filter constraints run *before* scoring constraints. Rejected proposals skip expensive scoring entirely (like GPU-based structure prediction). Use cheap filters to screen out bad proposals before expensive scoring kicks in.

<Tip>
  **GPU memory and constraints:** Constraint functions receive all passing proposals in a single batch call (the full `List[Tuple[Sequence, ...]]`), not one at a time. Unlike generators, constraints have no framework-level `batch_size` parameter; GPU memory management is handled internally by each tool. For example, ESMFold splits by total residue count (`max_batch_residues`), while Boltz2 and AlphaFold3 process complexes sequentially. Memory usage can be controlled via tool-specific config fields (e.g., `max_batch_residues` for ESMFold) rather than a constraint-level batch size.
</Tip>

## Creating Constraints

```python python icon="python" theme={null}
from proto_language.core import Constraint
from proto_language.constraint import gc_content_constraint

constraint = Constraint(
    inputs=[segment],                        # Segments to evaluate
    function=gc_content_constraint,          # The scoring function
    function_config={"min_gc": 50, "max_gc": 60},  # Config (dict or Pydantic model)
    label="gc_content",                      # Optional label for tracking
    weight=1.0,                              # Relative importance (scoring mode)
)
```

### Key Parameters

<ParamField path="inputs" type="List[Segment]" required>
  The segments this constraint evaluates. Single-segment constraints get one sequence per proposal. Multi-segment constraints get a tuple of sequences (one per segment), enabling cross-segment evaluations like protein-protein interactions.
</ParamField>

<ParamField path="function" type="Callable" required>
  The scoring function from the constraint registry. Must accept `(input_sequences: list[tuple[Sequence, ...]], config)` and return `list[ConstraintOutput]`, one per proposal, each with a `score` in `[0.0, 1.0]`.
</ParamField>

<ParamField path="function_config" type="dict | BaseModel" required>
  Configuration for the scoring function. Can be a dictionary (auto-validated against the function's Pydantic config class) or a Pydantic model instance.
</ParamField>

<ParamField path="label" type="str" default="function.__name__">
  Label used for metadata tracking and result export. Defaults to the function name.
</ParamField>

<ParamField path="weight" type="float" default="1.0">
  Multiplier for the raw score in energy calculation. Only used in scoring mode. Mutually exclusive with `threshold`.
</ParamField>

<ParamField path="threshold" type="float" default="None">
  If set, converts this to a filter constraint. Proposals with `score <= threshold` pass; others are rejected. Mutually exclusive with `weight`.
</ParamField>

## Constraint Categories

Proto provides built-in constraints organized by what they measure:

<CardGroup cols={3}>
  <Card title="Sequence Composition" icon="dna">
    GC content, k-mer frequency, homopolymer runs, and more

    *DNA/RNA sequence properties*
  </Card>

  <Card title="Protein Quality" icon="shield-check">
    Length, complexity, amino acid balance, and more

    *Protein sanity checks*
  </Card>

  <Card title="Protein Structure" icon="boxes">
    Folding confidence, structural similarity, binding strength, and more

    *3D folding and structural similarity*
  </Card>

  <Card title="Sequence Annotation" icon="tag">
    Motif search, promoter strength, sequence similarity, and more

    *Functional element detection*
  </Card>

  <Card title="RNA Secondary Structure" icon="spline">
    Structure similarity, property matching, and more

    *RNA folding patterns*
  </Card>

  <Card title="RNA Splicing" icon="scissors">
    Splicing prediction and tissue specificity

    *Splicing prediction*
  </Card>

  <Card title="Sequence Alignment" icon="arrow-left-right">
    Alignment quality metrics

    *Alignment scoring*
  </Card>
</CardGroup>

See the [Constraint Reference](/docs/language/constraints/gc-content) for the full list of built-in constraints and their configuration options.

## Common Constraint Patterns

<Tabs>
  <Tab title="DNA Construct">
    A typical DNA construct optimization with sequence composition constraints:

    ```python python icon="python" theme={null}
    from proto_language.constraint import (
        gc_content_constraint,
        max_homopolymer_constraint,
        kmer_frequency_constraint,
        specific_kmer_constraint,
    )

    constraints = [
        # Soft: optimize GC content toward 45-55%
        Constraint(
            inputs=[segment],
            function=gc_content_constraint,
            function_config={"min_gc": 45, "max_gc": 55},
            weight=1.0,
        ),
        # Hard filter: no homopolymer runs > 4bp
        Constraint(
            inputs=[segment],
            function=max_homopolymer_constraint,
            function_config={"max_length": 4},
            threshold=0.0,
        ),
        # Soft: keep any single 6-mer below 5% frequency
        Constraint(
            inputs=[segment],
            function=kmer_frequency_constraint,
            function_config={"k": 6, "min_value": 0.0, "max_value": 0.05},
            weight=0.5,
        ),
        # Hard filter: must NOT contain EcoRI site (GAATTC frequency must be 0)
        Constraint(
            inputs=[segment],
            function=specific_kmer_constraint,
            function_config={"kmer": "GAATTC", "min_value": 0.0, "max_value": 0.0},
            threshold=0.0,
        ),
    ]
    ```
  </Tab>

  <Tab title="Protein Design">
    A protein design workflow with structure prediction constraints:

    ```python python icon="python" theme={null}
    from proto_language.constraint import (
        structure_plddt_constraint,
        structure_rmsd_constraint,
        protein_complexity_constraint,
        protein_repetitiveness_constraint,
    )

    constraints = [
        # Hard filter: reject badly folded proteins early.
        # The pLDDT constraint returns 1 - normalized pLDDT (lower is better),
        # so threshold=0.3 keeps only high-confidence folds.
        Constraint(
            inputs=[protein_segment],
            function=structure_plddt_constraint,
            function_config={"structure_tool": "esmfold"},
            threshold=0.3,
        ),
        # Soft: optimize toward target structure (most important)
        Constraint(
            inputs=[protein_segment],
            function=structure_rmsd_constraint,
            function_config={
                "target_structure": "target.pdb",
                "structure_tool": "esmfold",
            },
            weight=3.0,  # 3x importance
        ),
        # Soft: avoid low-complexity sequences
        Constraint(
            inputs=[protein_segment],
            function=protein_complexity_constraint,
            function_config={},
            weight=0.5,
        ),
        # Soft: avoid repetitive regions
        Constraint(
            inputs=[protein_segment],
            function=protein_repetitiveness_constraint,
            function_config={},
            weight=0.5,
        ),
    ]
    ```
  </Tab>

  <Tab title="Multi-Segment">
    Constraints that evaluate multiple segments together (e.g., protein-protein interactions):

    ```python python icon="python" theme={null}
    from proto_language.constraint import (
        boltz_binding_strength_constraint,
        structure_plddt_constraint,
    )

    binder = Segment(length=80, sequence_type="protein", label="binder")
    target = Segment(length=150, sequence_type="protein", label="target")

    constraints = [
        # Evaluate binding between two protein segments
        Constraint(
            inputs=[binder, target],  # Multi-segment input
            function=boltz_binding_strength_constraint,
            function_config={},
            weight=2.0,
        ),
        # Each segment also gets its own folding quality check
        Constraint(
            inputs=[binder],
            function=structure_plddt_constraint,
            function_config={"structure_tool": "esmfold"},
            weight=1.0,
        ),
    ]
    ```
  </Tab>
</Tabs>

## Metadata Propagation

After evaluation, constraints write detailed results back to each sequence's metadata. This shows *why* a sequence got its score:

```python python icon="python" theme={null}
# After running the optimizer...
sequence = segment.result_sequences[0]

# Access constraint metadata
gc_data = sequence.metadata["constraints"]["gc_content_constraint"]

# Standard fields
gc_data["score"]           # 0.12  (raw score before weighting)
gc_data["weight"]          # 1.0
gc_data["weighted_score"]  # 0.12  (score x weight)

# Custom data from the scoring function
gc_data["data"]["gc_content"]  # 52.3  (the actual GC percentage)
```

<Accordion title="Full Metadata Structure">
  The metadata structure varies by constraint mode and number of input segments:

  **Single-segment scoring constraint:**

  ```python python icon="python" theme={null}
  sequence.metadata["constraints"]["gc_content_constraint"] = {
      "score": 0.12,
      "weight": 1.0,
      "weighted_score": 0.12,
      "data": {
          "gc_content": 52.3
      }
  }
  ```

  **Multi-segment constraint** (additional linking info):

  ```python python icon="python" theme={null}
  protein_a.metadata["constraints"]["binding_constraint"] = {
      "score": 0.05,
      "weight": 2.0,
      "weighted_score": 0.10,
      "input_segments": ["construct_0.binder", "construct_0.target"],
      "position_in_inputs": 0,
      "data": {
          "binding_energy": -8.2
      }
  }
  ```

  The `data` field contains constraint-specific metrics that vary by function. It exposes the *actual measured values* (GC percentage, pLDDT score, RMSD in angstroms) rather than just the normalized score.
</Accordion>

## Custom Constraints

A constraint function can be defined without using the registry decorator:

```python python icon="python" theme={null}
def my_custom_constraint(input_sequences, config) -> list[ConstraintOutput]:
    """Score sequences by how close their length is to a target."""
    results = []
    for (seq,) in input_sequences:  # Single-segment: unpack 1-tuple
        actual = len(seq.sequence)
        target = config["target_length"]
        deviation = abs(actual - target) / target
        # Scoring functions return one ConstraintOutput per input: score in
        # [0.0, 1.0] (0 = perfect) plus optional diagnostic metadata.
        results.append(ConstraintOutput(score=min(deviation, 1.0), metadata={"length": actual}))
    return results

constraint = Constraint(
    inputs=[segment],
    function=my_custom_constraint,
    function_config={"target_length": 200},
)
```

<Note>
  Custom constraint functions must return a `list[ConstraintOutput]`, one per input tuple, each with `score` in `[0.0, 1.0]` (0 = perfect) plus optional `metadata`. Add `from proto_language import ConstraintOutput`. Returning bare floats raises a `TypeError` at evaluation, and a non-finite score raises a `ValueError`.
</Note>

## Next Steps

<CardGroup cols={2}>
  <Card title="Optimizers" icon="chart-line" href="/docs/language/concepts/optimizers">
    Learn how optimizers use constraints to search for optimal sequences
  </Card>

  <Card title="Tools" icon="wrench" href="/docs/language/concepts/tools">
    The bioinformatics tools that power constraint evaluation
  </Card>

  <Card title="Constraint Reference" icon="code" href="/docs/language/constraints/gc-content">
    Full API reference for every built-in constraint
  </Card>

  <Card title="Programs" icon="list-tree" href="/docs/language/concepts/programs">
    Compose multi-stage pipelines with progressive constraints
  </Card>
</CardGroup>

## Constraint Catalog

### Protein Quality

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/balanced-aa" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/balanced-aa/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/overall-protein-quality" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/overall-protein-quality/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-complexity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-complexity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-diversity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-diversity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-domain" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-domain/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-length" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-length/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-max-identity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-max-identity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-nearest-neighbor-gap-gini" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-nearest-neighbor-gap-gini/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-profile-hmm" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-profile-hmm/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-repetitiveness" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-repetitiveness/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### Protein Structure

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/af3-chain-pair-prot-dna-iptm" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/af3-chain-pair-prot-dna-iptm/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/af3-offtarget-iptm-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/af3-offtarget-iptm-specificity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/boltz2-binding-strength" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/boltz2-binding-strength/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/consensus-operator-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/consensus-operator-specificity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/dbp-design-metrics" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dbp-design-metrics/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/deeppbs-motif-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/deeppbs-motif-specificity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/dna-base-contact-quality" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-base-contact-quality/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/dna-motif-contact-count" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-motif-contact-count/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/dna-phosphate-contact" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dna-phosphate-contact/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/gyration-radius" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gyration-radius/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/metal3d-probability" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/metal3d-probability/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/na-mpnn-motif-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/na-mpnn-motif-specificity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-dna-ipsae" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-dna-ipsae/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-globularity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-globularity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/protein-symmetry-ring" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/protein-symmetry-ring/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/pyrosetta-interface" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/pyrosetta-interface/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-beta-strand" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-beta-strand/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-composite" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-composite/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-contact" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-contact/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-distogram-cce" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-distogram-cce/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-ensemble-rmsd" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ensemble-rmsd/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-helix" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-helix/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-interface-contact" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-interface-contact/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-ipae" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ipae/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-iplddt" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-iplddt/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-iptm" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-iptm/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-pae" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-pae/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-plddt" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-plddt/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-ptm" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-ptm/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-radius-gyration" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-radius-gyration/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-rmsd" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-rmsd/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-termini-distance" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-termini-distance/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/structure-tmscore" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/structure-tmscore/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### RNA Expression

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/parade-utr-activity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-activity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/parade-utr-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-specificity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/parade-utr-stability" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/parade-utr-stability/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### RNA Secondary Structure

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/rna-basepair-similarity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-basepair-similarity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/rna-feature-similarity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-feature-similarity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/rna-motif-similarity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-motif-similarity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/rna-property-similarity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/rna-property-similarity/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### RNA Splicing

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/alphagenome-splice-junction" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-splice-junction/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/alphagenome-splice-site-usage" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-splice-site-usage/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/splice-transformer-intron-boundary" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/splice-transformer-intron-boundary/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/splice-transformer-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/splice-transformer-specificity/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### Sequence Alignment

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/gap-gini" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gap-gini/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### Sequence Annotation

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/alphagenome-interval-track" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/alphagenome-interval-track/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/borzoi-chromatin-accessibility-morse" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/borzoi-chromatin-accessibility-morse/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/borzoi-track-activity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/borzoi-track-activity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/crispr-array" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/crispr-array/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/crispr-tracr-rna" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/crispr-tracr-rna/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/enformer-chromatin-accessibility-morse" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/enformer-chromatin-accessibility-morse/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/longest-orf-length" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/longest-orf-length/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/malinois-activity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/malinois-activity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/mirna-specificity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mirna-specificity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/mmseqs-gene-similarity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mmseqs-gene-similarity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/operator-site" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/operator-site/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/promoter-strength" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/promoter-strength/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/puffin-promoter-activity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/puffin-promoter-activity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/seq-motif" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/seq-motif/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/sigma70-promoter" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/sigma70-promoter/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/targetscan-site" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/targetscan-site/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### Sequence Composition

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/dinucleotide-composition" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/dinucleotide-composition/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/gc-content" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/gc-content/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/kmer-frequency" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/kmer-frequency/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/max-homopolymer" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/max-homopolymer/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/sequence-length" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/sequence-length/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/specific-kmer-frequency" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/specific-kmer-frequency/carousel.png" alt="" loading="lazy" />
  </a>
</div>

### Sequence Scoring

<div class="tool-catalog-grid">
  <a href="/docs/language/constraints/ablang-perplexity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/ablang-perplexity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/esm2-perplexity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/esm2-perplexity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/mpnn-perplexity" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mpnn-perplexity/carousel.png" alt="" loading="lazy" />
  </a>

  <a href="/docs/language/constraints/mpnn-sequence-probability" class="tool-catalog-card">
    <img noZoom class="card-art" src="https://proto-bio.github.io/proto-assets/images/constraint/mpnn-sequence-probability/carousel.png" alt="" loading="lazy" />
  </a>
</div>
