Skip to content

gcomneno/oeis-probe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OEIS-probe

Tool CLI Python per riconoscere sequenze di interi archiviate su OEIS, con ricerca offline su stripped/names e cache SQLite. Ideale come “oracolo esterno” da laboratorio per validare le sequenze generate da algoritmi, regressioni, e riconoscimento rapido di pattern noti.

Sequence fingerprinting contro OEIS:

  • online via &fmt=json (JSON API)
  • offline via file stripped(.gz) + opzionale names(.gz)
  • cache SQLite per non martellare OEIS (e per non far bannare la scimmia 🐒)

Install

python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Quick start

probe online

oeis-probe "1,2,3,6,11,23,47,106"

salva JSON

oeis-probe "1,2,3,6,11,23,47,106" --json-out oeis_hits.json

fetch completo per A-number

oeis-probe fetch A000045

Offline mode (stripped / names)

Questo repo NON include i dump OEIS. Se vuoi usare la modalità offline, scarica i dataset in ./artifacts/oeis/ (ignorata da git) con:

make oeis-data

Poi puoi fare una probe offline “classica” via scan del dump:

oeis-probe "1,2,3,6,11,23,47,106" \
  --offline-stripped ./artifacts/oeis/stripped.gz \
  --offline-names    ./artifacts/oeis/names.gz \
  --no-online

Nota: se distribuisci i dump OEIS devi rispettare CC BY-SA 4.0 + termini/EULA OEIS (attribution e condizioni).

Offline index (SQLite) — molto più veloce del dump scan

Se fai tante probe (o vuoi velocità), conviene creare un indice SQLite locale che genera candidati velocemente e poi applica il match vero sui termini.

1) Crea l’indice (una tantum)

make index

Output di default:

  • ./artifacts/oeis/oeis_index.sqlite

2) Probe offline usando l’indice

oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233" \
  --offline-index ./artifacts/oeis/oeis_index.sqlite \
  --offline-names ./artifacts/oeis/names.gz \
  --no-online

Suggerimento: puoi regolare la “larghezza” dei candidati con:

  • --index-max-candidates (default: 400)
  • --index-grams (default: 3)

Performance (offline): scan vs index

Indicazione pratica: lo scan su stripped.gz è semplice ma tende ad essere più lento; l’indice SQLite accelera parecchio sulle probe ripetute perché evita di “macinare” tutto il dump ogni volta.

Misura rapida (usa /usr/bin/time):

/usr/bin/time -f "scan: %E" oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233" \
  --offline-stripped ./artifacts/oeis/stripped.gz \
  --offline-names    ./artifacts/oeis/names.gz \
  --no-online > /dev/null

/usr/bin/time -f "index: %E" oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233" \
  --offline-index ./artifacts/oeis/oeis_index.sqlite \
  --offline-names ./artifacts/oeis/names.gz \
  --no-online > /dev/null

Nota onesta: l’indice è un candidate generator. Può proporre candidati “in più”, che poi il match consecutivo scarta. È voluto: si paga un po’ di rumore per guadagnare velocità.


🧪 Esempi d’uso (laboratorio)

oeis-probe cerca corrispondenze tra una sequenza di interi e le sequenze OEIS, usando:

  • online: OEIS JSON API (default)
  • offline (opzionale): file stripped(.gz) e names(.gz) scaricabili da OEIS

Nota: il tool valuta la qualità del match cercando la miglior corrispondenza consecutiva (match_len) dentro i termini OEIS e calcola uno score in [0..1].

1) Fibonacci “pulita” (match perfetto)

oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144" --max-hits 5

Output atteso: A000045 in cima.

2) Ranking: strict vs prefer-early

Quando tanti risultati hanno score=1.00, puoi preferire quelli che matchano subito dall’inizio (at più piccolo):

oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144" --max-hits 5 --rank prefer-early
  • --rank strict (default): ordina per score e match_len
  • --rank prefer-early: a parità di score/match_len preferisce at più piccolo

3) Disambiguazione vera: “aggiungi un termine oltre la divergenza”

A volte una sequenza “cugina” coincide su un prefisso lungo (es. alcune varianti di “dying rabbits” possono imitare Fibonacci per molti termini).

La soluzione più semplice è allungare la query finché la cugina diverge:

oeis-probe "0,1,1,2,3,5,8,13,21,34,55,89,144,233,377" --max-hits 5 --rank prefer-early

Se una variante diverge prima, sparirà (o scenderà) appena includi il termine “killer”.

4) Recamán “rotta” (un termine sbagliato): quasi-hit + spiegazione

oeis-probe "0,1,3,6,2,7,13,20,12,21,11,99,10,23,9,24,8,25" \
  --max-hits 5 --rank prefer-early \
  --relax-online --min-match-len 10 \
  --explain-top

Esempio: corruzione “in mezzo” + spiegazione del mismatch:

oeis-probe "0,1,3,6,2,7,13,20,12,21,11,99,10,23,9,24,8,25" \
  --max-hits 5 --rank prefer-early \
  --relax-online --min-match-len 10 \
  --explain-top

Output extra atteso (indicativo):

  • first mismatch at query[11] (#12) -> got 99; expected 22 ...

6) Van Eck (esempio “non banale”)

oeis-probe "0,0,1,0,2,0,2,2,1,6,0,5,0,2,6,5" --max-hits 5 --rank prefer-early

7) Look-and-say (termini “grossi”)

oeis-probe "1,11,21,1211,111221,312211,13112221" --max-hits 5 --rank prefer-early

8) Fetch di una sequenza per A-number (JSON)

oeis-probe fetch A000045

Utile per:

  • ispezionare data
  • confrontare varianti
  • trovare il punto di divergenza tra due sequenze

9) Salva risultati in JSON (per pipeline/script)

oeis-probe "2,3,5,7,11,13,17,19,23,29,31,37" --max-hits 5 --json-out /tmp/hits.json

10) Modalità offline (stripped / names)

Se hai scaricato stripped(.gz) e opzionalmente names(.gz):

oeis-probe "1,4,9,16,25,36,49,64,81,100" \
  --offline-stripped /path/to/stripped.gz \
  --offline-names /path/to/names.gz \
  --no-online \
  --max-hits 5

Oppure online+offline insieme (merge dei risultati):

oeis-probe "1,4,9,16,25,36,49,64,81,100" \
  --offline-stripped /path/to/stripped.gz \
  --offline-names /path/to/names.gz \
  --max-hits 5

Suggerimenti pratici

  • Se ti escono troppi 1.00, usa --rank prefer-early.
  • Se ottieni “No hits” su sequenze mutate/rumorose, usa --relax-online e alza --min-match-len.
  • --explain-top è il “martello”: ti dice dove hai rotto la sequenza rispetto al miglior candidato.

Respectful usage

  • usa pochi hit e cache (default ok)
  • non fare spam di query automatiche senza backoff
  • offline consigliato per batch/ricerche pesanti

License

Codice: MIT (vedi LICENSE). Dati OEIS: licenze e termini sul sito OEIS.

About

Tool CLI Python per riconoscere sequenze di interi archiviate su OEIS, con ricerca offline su stripped/names e cache SQLite

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors