> ## 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.

# Homopolymer Length

> Penalize sequences containing homopolymers longer than specified maximum

<div class="page-hero">
  <img class="page-hero-banner" src="https://proto-bio.github.io/proto-assets/images/constraint/max-homopolymer/hero.png" alt="Homopolymer Length" />
</div>

<p class="entity-disclaimer">This constraint is open source. Any third-party models, product names, or trademarks referenced are the property of their respective owners, and Proto is not affiliated with them.</p>

<hr class="entity-rule" />

<div class="tool-tab-bar entity-source-bar"><span class="tool-tab-wrap"><span class="tool-tab badge-source entity-source-tab"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</span></span></div>

<a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/constraint/sequence_composition/max_homopolymer_constraint.py#L54" target="_blank" class="tab-panel source-panel entity-source-panel">
  <div class="source-info">
    <img noZoom src="https://github.com/evo-design.png?size=40" class="source-avatar" width="36" height="36" />

    <span class="source-path">evo-design/proto-language<span class="source-subpath">/proto\_language/constraint/sequence\_composition/max\_homopolymer\_constraint.py</span></span>
  </div>

  <span class="panel-goto-btn source-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> View source</span></span>
</a>

<div class="entity-contributors"><span class="entity-contributors-label">Constraint contributors</span><span class="entity-contributors-people"><a class="entity-contributor" href="https://github.com/dguo8412" target="_blank" rel="noopener" title="dguo8412: 3 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/46211285?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">dguo8412</span></a></span></div>
Penalize sequences containing homopolymers longer than specified maximum.

This constraint function identifies the longest homopolymer (consecutive run
of identical nucleotides or amino acids) in each sequence and penalizes
sequences where this exceeds a specified maximum length.

The penalty uses logarithmic scaling to provide graduated penalties: sequences
slightly over the limit receive moderate penalties, while sequences far
exceeding the limit receive strong penalties (capped at 1.0). This avoids
extreme penalty values while still strongly discouraging very long homopolymers.

## API Reference

<div class="api-model-section api-model-static api-config-section">
  <div class="api-model-header"><span class="api-model-badge api-config-badge">Config</span><span class="api-model-name">MaxHomopolymerConfig</span><a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/constraint/sequence_composition/max_homopolymer_constraint.py#L17" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a></div>

  Configuration for maximum homopolymer constraint.

  This class defines configuration parameters for limiting homopolymer length
  in DNA, RNA, or protein sequences. Homopolymers are consecutive runs of the
  same nucleotide or amino acid (e.g., "AAAAA", "GGGGGG", "SSSSSS"). This constraint
  uses logarithmic scaling for penalties to avoid extreme values while still penalizing
  very long homopolymers, providing moderate penalties for slightly exceeding the limit
  and strong penalties for greatly exceeding the limit.

  <ParamField path="max_length" type="integer" required>
    Maximum allowed run of consecutive identical nucleotides or amino acids; longer runs are penalized.
  </ParamField>
</div>

<div class="api-model-section api-model-static api-output-section">
  <div class="api-model-header"><span class="api-model-badge api-output-badge">Returns</span><span class="api-model-name">ConstraintOutput</span></div>

  One result per sequence. A score of 0.0 indicates
  no homopolymers exceed the maximum length (pass). Higher scores indicate
  longer homopolymers with logarithmic scaling. `metadata` carries:

  * `max_homopolymer_length`: Integer length of the longest homopolymer
    found in the sequence. For example, "ATCGAAAAAGTC" would have value 5
    (for the "AAAAA" run).
</div>

## Usage

Avoiding long A/T runs for DNA synthesis:

```python python icon="python" theme={null}
>>> from proto_language.core import Sequence, SequenceType
>>> seq = Sequence("ATCGATCGTAGC", "dna")
>>> config = MaxHomopolymerConfig(max_length=4)
>>> results = max_homopolymer_constraint([(seq,)], config)
>>> print(results[0].score)  # 0.0 (no runs >4)
>>> print(results[0].metadata["max_homopolymer_length"])
```

## Metadata

| Property        | Value                        |
| --------------- | ---------------------------- |
| Key             | `max-homopolymer`            |
| Function        | `max_homopolymer_constraint` |
| Category        | `sequence_composition`       |
| Mode            | `discrete`                   |
| Uses GPU        | `False`                      |
| Supported Types | `dna`, `rna`, `protein`      |
