las-read-rs 0.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- las_read_rs-0.1.6/.github/workflows/ci.yml +47 -0
- las_read_rs-0.1.6/.github/workflows/flujodetrabajo.yml +75 -0
- las_read_rs-0.1.6/.gitignore +17 -0
- las_read_rs-0.1.6/Agents.md +68 -0
- las_read_rs-0.1.6/Cargo.lock +507 -0
- las_read_rs-0.1.6/Cargo.toml +23 -0
- las_read_rs-0.1.6/PKG-INFO +167 -0
- las_read_rs-0.1.6/README.md +156 -0
- las_read_rs-0.1.6/benchmark_09.py +48 -0
- las_read_rs-0.1.6/benchmark_performance.py +91 -0
- las_read_rs-0.1.6/demo.py +59 -0
- las_read_rs-0.1.6/pyproject.toml +24 -0
- las_read_rs-0.1.6/python/lasio_rs/__init__.py +1 -0
- las_read_rs-0.1.6/python/lasio_rs/las.py +235 -0
- las_read_rs-0.1.6/sample.las +17 -0
- las_read_rs-0.1.6/src/bin/lasio_json.rs +23 -0
- las_read_rs-0.1.6/src/las_items.rs +42 -0
- las_read_rs-0.1.6/src/lib.rs +67 -0
- las_read_rs-0.1.6/src/pybindings.rs +58 -0
- las_read_rs-0.1.6/src/reader.rs +195 -0
- las_read_rs-0.1.6/tests/benchmark.py +63 -0
- las_read_rs-0.1.6/tests/compare.py +72 -0
- las_read_rs-0.1.6/tests/integration.rs +39 -0
- las_read_rs-0.1.6/tests/test_basic.py +88 -0
- las_read_rs-0.1.6/tests/verify_api_alignment.py +39 -0
- las_read_rs-0.1.6/tests/verify_python_binding.py +24 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["master", "main"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["master", "main"]
|
|
8
|
+
|
|
9
|
+
env:
|
|
10
|
+
CARGO_TERM_COLOR: always
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
name: Test Suite
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- name: Set up Rust
|
|
19
|
+
uses: dtolnay/rust-toolchain@stable
|
|
20
|
+
- name: Build
|
|
21
|
+
run: cargo build --verbose
|
|
22
|
+
- name: Run tests
|
|
23
|
+
run: cargo test --verbose
|
|
24
|
+
|
|
25
|
+
python-test:
|
|
26
|
+
name: Python Test Matrix
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
strategy:
|
|
29
|
+
matrix:
|
|
30
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
- uses: actions/setup-python@v5
|
|
34
|
+
with:
|
|
35
|
+
python-version: ${{ matrix.python-version }}
|
|
36
|
+
- name: Install Rust toolchain
|
|
37
|
+
uses: dtolnay/rust-toolchain@stable
|
|
38
|
+
- name: Install dependencies
|
|
39
|
+
run: |
|
|
40
|
+
pip install maturin
|
|
41
|
+
pip install pandas polars openpyxl
|
|
42
|
+
- name: Build and Install Wheel
|
|
43
|
+
run: |
|
|
44
|
+
maturin build --release --out dist
|
|
45
|
+
pip install dist/*.whl --force-reinstall
|
|
46
|
+
- name: Run Python Tests
|
|
47
|
+
run: python tests/test_basic.py
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
# --- JOB 1: Compilar Wheels para múltiples SO ---
|
|
15
|
+
build_wheels:
|
|
16
|
+
name: Build wheels on ${{ matrix.os }}
|
|
17
|
+
runs-on: ${{ matrix.os }}
|
|
18
|
+
strategy:
|
|
19
|
+
matrix:
|
|
20
|
+
# Esto generará binarios para Linux, Windows y macOS
|
|
21
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: '3.10' # Versión base para maturin
|
|
27
|
+
|
|
28
|
+
- name: Build wheels
|
|
29
|
+
uses: PyO3/maturin-action@v1
|
|
30
|
+
with:
|
|
31
|
+
command: build
|
|
32
|
+
args: --release --out dist --interpreter python3
|
|
33
|
+
manylinux: auto
|
|
34
|
+
|
|
35
|
+
- name: Upload wheels
|
|
36
|
+
uses: actions/upload-artifact@v4
|
|
37
|
+
with:
|
|
38
|
+
name: wheels-${{ matrix.os }}
|
|
39
|
+
path: dist
|
|
40
|
+
|
|
41
|
+
# --- JOB 2: Crear el código fuente (sdist) ---
|
|
42
|
+
build_sdist:
|
|
43
|
+
name: Build source distribution
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
- name: Build sdist
|
|
48
|
+
uses: PyO3/maturin-action@v1
|
|
49
|
+
with:
|
|
50
|
+
command: sdist
|
|
51
|
+
args: --out dist
|
|
52
|
+
- name: Upload sdist
|
|
53
|
+
uses: actions/upload-artifact@v4
|
|
54
|
+
with:
|
|
55
|
+
name: wheels-sdist
|
|
56
|
+
path: dist
|
|
57
|
+
|
|
58
|
+
# --- JOB 3: Publicar todo en PyPI ---
|
|
59
|
+
publish:
|
|
60
|
+
name: Publish to PyPI
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
environment: pypi
|
|
63
|
+
needs: [build_wheels, build_sdist] # Espera a que los otros terminen
|
|
64
|
+
steps:
|
|
65
|
+
- name: Download all artifacts
|
|
66
|
+
uses: actions/download-artifact@v4
|
|
67
|
+
with:
|
|
68
|
+
path: dist
|
|
69
|
+
pattern: wheels-*
|
|
70
|
+
merge-multiple: true
|
|
71
|
+
|
|
72
|
+
- name: Publish to PyPI
|
|
73
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
74
|
+
with:
|
|
75
|
+
packages-dir: dist/
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
🤖 Agents.md: Migración lasio -> lasio-rs
|
|
2
|
+
Este documento define el equipo de agentes inteligentes encargados de la transpilación, optimización y validación del motor LAS en Rust.
|
|
3
|
+
|
|
4
|
+
🏗️ 1. El Analista de Código (Source_Analyst)
|
|
5
|
+
Objetivo: Extraer la lógica de negocio pura del repositorio Python clonado.
|
|
6
|
+
|
|
7
|
+
Rol: Arqueólogo de Software.
|
|
8
|
+
|
|
9
|
+
Contexto de entrada: Archivos lasio/reader.py, lasio/las.py y lasio/las_items.py.
|
|
10
|
+
|
|
11
|
+
Prompt Maestro:
|
|
12
|
+
|
|
13
|
+
"Actúa como un experto en Python y el estándar LAS. Tu tarea es analizar el código fuente en {local_repo_path}. No traduzcas a Rust aún; extrae las reglas de validación, cómo se manejan los encodings (latin-1 vs utf-8), y cómo se parsean las secciones ~V, ~W, ~C, ~P y ~A. Genera un esquema técnico de metadatos que el siguiente agente pueda usar."
|
|
14
|
+
|
|
15
|
+
📐 2. El Arquitecto de Tipos (Rust_Architect)
|
|
16
|
+
Objetivo: Diseñar el sistema de tipos y la gestión de memoria en Rust.
|
|
17
|
+
|
|
18
|
+
Rol: Diseñador de Sistemas de Bajo Nivel.
|
|
19
|
+
|
|
20
|
+
Contexto de entrada: Salida del Source_Analyst.
|
|
21
|
+
|
|
22
|
+
Prompt Maestro:
|
|
23
|
+
|
|
24
|
+
"Basado en las reglas de lasio, diseña las estructuras de datos en Rust. Usa IndexMap para preservar el orden de los headers. Define un struct LASFile que contenga secciones genéricas. Implementa Serde para que los headers sean serializables. Restricción: Evita el uso excesivo de String si puedes usar Cow<'a, str> para maximizar la eficiencia de memoria al leer archivos grandes."
|
|
25
|
+
|
|
26
|
+
⚙️ 3. El Ingeniero de Parsing (Nom_Parser)
|
|
27
|
+
Objetivo: Sustituir las Regex de Python por un parser combinatorio de alto rendimiento.
|
|
28
|
+
|
|
29
|
+
Rol: Especialista en Gramática de Datos.
|
|
30
|
+
|
|
31
|
+
Contexto de entrada: lasio/reader.py y los modelos de Rust_Architect.
|
|
32
|
+
|
|
33
|
+
Prompt Maestro:
|
|
34
|
+
|
|
35
|
+
"Tu misión es construir el motor de lectura usando la crate nom. Debes ignorar la lógica de Pandas de Python y crear un flujo que procese el archivo línea por línea con un BufReader. Enfócate en la sección ~ASCII (datos numéricos): debe ser capaz de procesar millones de filas sin picos de memoria, convirtiendo el texto directamente a ndarray::Array2<f64>."
|
|
36
|
+
|
|
37
|
+
⚡ 4. El Optimizador de Rendimiento (Performance_Specialist)
|
|
38
|
+
Objetivo: Asegurar que la versión de Rust sea órdenes de magnitud más rápida que la de Python.
|
|
39
|
+
|
|
40
|
+
Rol: Ingeniero de Concurrencia.
|
|
41
|
+
|
|
42
|
+
Contexto de entrada: Código generado por Nom_Parser.
|
|
43
|
+
|
|
44
|
+
Prompt Maestro:
|
|
45
|
+
|
|
46
|
+
"Revisa el código Rust generado. Implementa paralelismo con Rayon para el parseo de columnas de datos una vez que el header ha sido leído. Asegúrate de que el manejo de errores no detenga el proceso (implementa un log de errores similar al LASDataError de lasio). Optimiza las asignaciones de memoria pre-calculando el tamaño de los vectores basados en el conteo de líneas."
|
|
47
|
+
|
|
48
|
+
✅ 5. El Validador de Paridad (Parity_Tester)
|
|
49
|
+
Objetivo: Garantizar que lasio-rs produzca los mismos resultados que lasio (Python).
|
|
50
|
+
|
|
51
|
+
Rol: QA Engineer.
|
|
52
|
+
|
|
53
|
+
Contexto de entrada: Salida de ambos sistemas (Python y Rust).
|
|
54
|
+
|
|
55
|
+
Prompt Maestro:
|
|
56
|
+
|
|
57
|
+
"Genera una suite de pruebas que compare la salida JSON de lasio (Python) contra la salida de nuestro nuevo motor en Rust. Si hay discrepancias en el manejo de nulos (NULL) o en la precisión de los flotantes, documenta la causa raíz y sugiere ajustes al Nom_Parser."
|
|
58
|
+
|
|
59
|
+
🔄 Lógica de Evolución de Prompts (Antigravity Flow)
|
|
60
|
+
Para que el sistema sea dinámico, sigue esta jerarquía de actualización de prompts:
|
|
61
|
+
|
|
62
|
+
Fase 1 (Estructura): Solo están activos Source_Analyst y Rust_Architect. El prompt se enfoca en "Definir el esqueleto".
|
|
63
|
+
|
|
64
|
+
Fase 2 (Funcionalidad): Se activa Nom_Parser. El prompt de Rust_Architect cambia a "Refactorizar para soportar streaming".
|
|
65
|
+
|
|
66
|
+
Fase 3 (Optimización): Se activa Performance_Specialist. Los prompts anteriores se actualizan con la instrucción: "Priorizar zero-copy sobre legibilidad si el performance mejora > 20%".
|
|
67
|
+
|
|
68
|
+
Fase 4 (Interoperabilidad): (Opcional) Agregar un agente para PyO3 que cree los bindings para que Python pueda usar el motor de Rust.
|