# Guía de Desarrollo - Calculadora MAV CAS Híbrido ## Visión General Este documento describe el estado actual y los objetivos de desarrollo para la **Calculadora MAV**, un **Sistema de Álgebra Computacional (CAS) híbrido**. El proyecto busca combinar la potencia de SymPy como motor algebraico central con capacidades especializadas (IP4, Hex, etc.) integradas de forma nativa. ## Objetivos Principales ### 1. **SymPy como Motor Central** - ✅ Integrar todas las funciones de SymPy directamente - ✅ SymPy maneja toda la evaluación algebraica y ecuaciones - ✅ Cada línea de ingreso corresponde a una sola línea de resultados - ✅ **CONTEXTO LIMPIO POR EVALUACIÓN**: Cada vez que se hace una evaluación se comienza con el contexto completamente limpio y se evalúa desde arriba hacia abajo, línea por línea. Esto garantiza comportamiento predecible sin "memoria" de evaluaciones anteriores. - ✅ La interfaz de usuario se divide en 2 columnas, a la izquierda el área de ingreso de datos y ecuaciones a ser evaluadas, a la derecha el área de resultados que se colorean según cada tipo de respuesta. ### 2. **Sistema de Tokenización Automática** ⭐ **ACTUALIZADO** - ❌ ~~Usar **exclusivamente** `Class[args]` en lugar de `Class("args")`~~ **ELIMINADO** - ✅ **Tokenización automática de patrones específicos**: - `16#FF` → `IntBase('FF', 16)` automáticamente - `192.168.1.1` → `FourBytes('192.168.1.1')` automáticamente - ✅ **Sistema distribuido**: Cada clase define sus propios patrones de tokenización - ✅ **Precedencia automática**: Patrones más específicos tienen mayor prioridad - ✅ **Parser genérico**: No hardcodea lógica específica de tipos ### 3. **Detección Automática y Manejo de Ecuaciones** - ✅ Ecuaciones ingresadas directamente (ej. `3+b=5+c`) se detectan y añaden al sistema interno de SymPy. - ✅ Soporte para comparaciones SymPy (ej. `x > 5`, `a == b`, `x <= 10`) como expresiones evaluables. - ✅ Sintaxis de atajo para solve: `variable=?` equivale a `solve(variable)` ### 4. **Evaluación Híbrida con Variables SymPy Puras** - ✅ Resultado simbólico (siempre disponible) - ✅ Evaluación numérica con `.evalf()` (cuando sea aplicable y las variables estén definidas). Esta evaluación se muestra a la derecha del resultado simbólico. - ✅ Las asignaciones son siempre simbólicas, solo los resultados se muestra la evaluación numérica. - ✅ **Todas las variables son símbolos SymPy**: Sin variables Python tradicionales - 🔄 **Conversión perezosa a SymPy**: Objetos nativos hasta que se necesite álgebra compleja ### 5. **Resultados Interactivos** - ✅ **Tags clickeables** en el widget Text para resultados complejos que necesitan más de una línea de resultado como Plot, Matrices y Listas. - ✅ **Detección automática** de tipos que requieren visualización especial: - ✅ Plots de SymPy → "📊 Ver Plot" (abre ventana matplotlib). - ✅ Matrices → "📋 Ver Matriz" (muestra matriz formateada). - ✅ Listas largas → "📋 Ver Lista" (muestra contenido expandido). - ✅ Objetos complejos → "🔍 Ver Detalles" (representación completa). - ✅ **Implementación con tags**: Usar `text.tag_bind()` en widget existente - ✅ **Ventanas popup** para contenido que no cabe en línea. ### 6. **Sistema de Tipos Auto-Descubrible** ⭐ **NUEVO** - ✅ **Directorio unificado**: Todos los tipos en `custom_types/` - ✅ **Auto-registro**: Sistema automático de descubrimiento de clases - ✅ **Función de registro**: Cada módulo tiene `register_classes_in_module()` - ✅ **Metadatos**: Categorías, opciones y descripciones por tipo - ✅ **Helpers dinámicos**: Sistema de ayuda contextual distribuido ### 7. **Clases Base Universales** ⭐ **NUEVO** - ✅ **IntBase**: Representación universal de números en cualquier base - ✅ **FourBytes**: Representación universal de patrones x.x.x.x - ✅ **Manejo interno de símbolos**: Sin conversión prematura a SymPy - ✅ **Aritmética nativa**: Operaciones que mantienen el tipo original - ✅ **Conversión explícita**: `.to_sympy()` cuando se necesite álgebra compleja ## Arquitectura Actual ⭐ **ACTUALIZADA** ### Estructura de archivos ``` / ├── logs/ # Subcarpeta de logs ├── docs/ # Documentación técnica ├── custom_types/ # ⭐ NUEVO: Sistema de tipos unificado │ ├── intbase_type.py # IntBase + tokenización + registro │ ├── fourbytes_type.py # FourBytes + tokenización + registro │ ├── hex_type.py # Hex (usa IntBase) │ ├── bin_type.py # Bin (usa IntBase) │ ├── dec_type.py # Dec │ ├── chr_type.py # Chr │ ├── ip4_type.py # IP4 + IP4Mask (usa FourBytes) │ └── latex_type.py # LaTeX ├── calc.py # Launcher principal ├── main_calc_app.py # Aplicación principal ├── main_evaluation.py # Motor de evaluación híbrido ├── type_registry.py # ⭐ NUEVO: Auto-descubrimiento de tipos ├── tl_popup.py # Motor de ventanas emergentes ├── tl_bracket_parser.py # ⭐ ACTUALIZADO: Tokenizador universal ├── class_base.py # Clases base ├── sympy_Base.py # Base para integración SymPy └── sympy_helper.py # Helpers para SymPy ``` ### Flujo de Procesamiento ⭐ **ACTUALIZADO** ``` Entrada Usuario → [Universal Tokenizer] → [Evaluación Híbrida] → { 1. Resultado Nativo (FourBytes, IntBase, etc.) 2. Conversión a SymPy (solo si es necesario) 3. Evaluación numérica (evalf si aplica) 4. Métodos especializados disponibles } ``` ### Transformación de Sintaxis ⭐ **ACTUALIZADA** ```python # Tokenización automática (NUEVO): 16#FF + 2#1010 → IntBase("FF", 16) + IntBase("1010", 2) 192.168.1.1 + 5 → FourBytes("192.168.1.1") + 5 IP4(10.1.1.1, 255.255.0.0) → IP4(FourBytes("10.1.1.1"), FourBytes("255.255.0.0")) # Detección contextual de ecuaciones (EXISTENTE): 3+b=5+c → Se detecta como ecuación standalone (agregar al sistema SymPy) "x > 5" → Se procesa como desigualdad SymPy x**2 + 2*x == 0 → Se detecta como igualdad lógica standalone # Sintaxis de atajo para solve (EXISTENTE): x=? → solve(x) ``` ## Componentes Técnicos ⭐ **ACTUALIZADOS** ### 1. **Sistema de Auto-Descubrimiento de Tipos** ```python # type_registry.py class TypeRegistry: def discover_and_register_all(self): """Descubre y registra todas las clases en custom_types/""" for type_file in self.types_directory.glob("*_type.py"): self._process_type_file(type_file) def _register_classes_from_info(self, class_info_list): """Registra clases basándose en metadatos""" for name, class_obj, category, options in class_info_list: self._register_single_class(name, class_obj, category, options) ``` ### 2. **Tokenizador Universal Distribuido** ```python # tl_bracket_parser.py class UniversalTokenizer: def _discover_tokenization_rules(self): """Auto-descubre reglas desde todas las clases registradas""" for class_name, class_obj in registered_classes.items(): if hasattr(class_obj, 'get_tokenization_patterns'): patterns = class_obj.get_tokenization_patterns() for pattern_info in patterns: self.tokenization_rules.append({ 'class_name': class_name, 'class_obj': class_obj, **pattern_info }) ``` ### 3. **Clases con Tokenización Propia** ```python # custom_types/intbase_type.py class IntBase(ClassBase): @staticmethod def get_tokenization_patterns(): return [ { 'pattern': r'(\d+)#([0-9A-Fa-fx]+)', 'replacement': lambda match: f'IntBase("{match.group(2)}", {match.group(1)})', 'priority': 5, 'description': 'Números con base: 16#FF, 2#1010' } ] ``` ### 4. **Conversión Perezosa a SymPy** ⭐ **NUEVO CONCEPTO** ```python class FourBytes(ClassBase): # No SympyClassBase def substitute(self, **kwargs): """Sustitución interna sin involucrar SymPy""" # Lógica nativa def to_sympy(self): """Conversión EXPLÍCITA cuando se necesite álgebra""" # Solo convertir cuando se requiera ``` ### 5. **Sistema de Evaluación Integrado** ```python # main_evaluation.py class HybridEvaluationEngine: def __init__(self, auto_discover_types=True): # Auto-descubrir tipos dinámicamente self.registered_types_info = discover_and_register_types() # Configurar parser con tokenización distribuida self.parser = BracketParser(enable_tokenization=True) # Configurar contexto con tipos descubiertos self._setup_base_context() ``` ## Capacidades Expandidas ⭐ **ACTUALIZADAS** ### 1. **Funciones SymPy Completas con Objetos Nativos** ```python # Objetos nativos en álgebra (conversión automática cuando es necesario): diff(IP4(192.168.x.1) + offset, x) # FourBytes → SymPy automático integrate(Hex(16#x0) * sin(x), x) # IntBase → SymPy automático solve([IP4(192.168.x.y) == IP4(192.168.1.10)], [x, y]) # Aritmética nativa (mantiene tipos): base_ip = 192.168.1.1 # → FourBytes automático next_ip = base_ip + 5 # → FourBytes('192.168.1.6') hex_val = 16#FF + 16#10 # → IntBase('10F', 16) ``` ### 2. **Conversiones Automáticas Bidireccionales** ```python # Conversiones fluidas entre tipos: ip = 192.168.1.1 # → FourBytes automático ip_hex = ip.ToHex() # → "16#C0.16#A8.16#1.16#1" mask = 255.255.255.0 # → FourBytes automático mask_cidr = IP4Mask(mask) # → /24 automático # Constructores inteligentes: IP4(192.168.1.1, 16#ffffff00) # FourBytes + IntBase → IP4 Hex(192.168.1.1) # FourBytes → Hex automático ``` ### 3. **Sistema de Ayuda Dinámico** ```python # Helpers auto-descubiertos: help_functions = get_registered_helper_functions() # De todas las clases help_context = obtener_ayuda("16#FF") # Helper de IntBase autocompletado = obj.PopupFunctionList() # Métodos disponibles ``` ## Ejemplos de Uso Objetivo ⭐ **ACTUALIZADOS** ```python # Tokenización automática de patrones: 16#FF + 2#1010 # → IntBase('FF', 16) + IntBase('1010', 2) 192.168.1.1 + 5 # → FourBytes('192.168.1.6') 10.x.1.y # → FourBytes('10.x.1.y') simbólico # Constructores inteligentes: IP4(192.168.1.1, 24) # → IP4(FourBytes('192.168.1.1'), 24) IP4(10.1.1.1, 255.255.0.0) # → Ambos FourBytes automáticamente Hex(192.168.1.1) # → Conversión FourBytes → Hex # Conversiones fluidas: mask = 255.255.255.0 # → FourBytes automático mask.ToHex() # → "16#FF.16#FF.16#FF.16#0" mask.ToBase(2) # → "2#11111111.2#11111111.2#11111111.2#0" # Álgebra con objetos nativos: network = 10.x.0.0 # → FourBytes simbólico solve(network + 256 == 10.5.0.0, x) # → x = 5 # Aritmética que preserva tipos: base = 192.168.0.0 # → FourBytes for i in range(4): subnet = base + (i * 256) # → Cada resultado es FourBytes print(f"Red {i}: {subnet}") # Evaluación directa con SymPy: solve(x + 10 - 15, x) # → [5] diff(16#x0, x) # → 16*log(16) (conversión automática) # Variables puras SymPy: x = 5 # → x es Symbol('x') con valor 5 y = x + 2 # → y es expresión simbólica: Symbol('x') + 2 # Funciones avanzadas con resultados interactivos: plot(sin(2*pi*16#x/256), (x, 0, 255)) # → "📊 Ver Plot" Matrix([[1, 2, 3], [4, 5, 6]]) # → "📋 Ver Matriz" ``` ## Beneficios Logrados ⭐ **ACTUALIZADOS** ### 1. **Usabilidad Mejorada** - ✅ Sintaxis natural sin artificios (no más `Class[args]`) - ✅ Tokenización invisible al usuario - ✅ Acceso completo a capacidades de CAS - ✅ Evaluación automática simbólica + numérica ### 2. **Potencia Matemática Expandida** - ✅ Todas las funciones de SymPy disponibles - ✅ Objetos especializados participan en álgebra cuando es necesario - ✅ Aritmética nativa que preserva tipos - ✅ Conversiones automáticas bidireccionales ### 3. **Extensibilidad Real** - ✅ Sistema verdaderamente modular sin hardcoding - ✅ Fácil agregar nuevos tipos sin modificar código core - ✅ Tokenización distribuida y auto-descubrible - ✅ Compatible con ecosystem SymPy completo ### 4. **Arquitectura Limpia** - ✅ Responsabilidad única: cada clase maneja su tokenización - ✅ Parser genérico sin conocimiento específico de tipos - ✅ Auto-descubrimiento completo del sistema de tipos - ✅ Manejo unificado de errores ## Sistema de Autocompletado y Ayuda Contextual ⭐ **IMPLEMENTADO** ### 1. **Helpers Dinámicos** - ✅ **Auto-descubrimiento**: Sistema obtiene helpers de todas las clases registradas - ✅ **Ayuda contextual**: Cada tipo define su propio `Helper(input_str)` - ✅ **Integración con SymPy**: Helper especializado para funciones SymPy - ✅ **Manejo centralizado**: Lista dinámica de helpers disponibles ### 2. **Autocompletado Inteligente** - ✅ **Popup tras punto**: Evaluación automática del objeto para métodos disponibles - ✅ **PopupFunctionList()**: Cada clase define sus métodos sugeridos - ✅ **Filtrado inteligente**: Solo métodos útiles y públicos - ✅ **No invasivo**: Solo aparece cuando el usuario lo solicita ### 3. **Ejemplos de Integración** ```python # Sistema distribuido: HELPERS = get_registered_helper_functions() # Auto-descubierto # Ayuda contextual: 16#FF. # → Popup con métodos de IntBase 192.168.1.1. # → Popup con métodos de FourBytes IP4(10.1.1.1). # → Popup con métodos de IP4 # Helpers específicos: ayuda = obtener_ayuda("16#FF") # → "Números con base: 16#FF, 2#1010..." ``` ## Estado de Implementación ⭐ **ACTUALIZADO** ### ✅ **Completamente Implementado** - **Sistema de auto-descubrimiento**: `type_registry.py` - **Tokenizador universal**: `tl_bracket_parser.py` refactorizado - **Clases base universales**: `intbase_type.py`, `fourbytes_type.py` - **Motor híbrido integrado**: `main_evaluation.py` con auto-descubrimiento - **Tipos en custom_types/**: Todos los tipos migrados al sistema unificado - **Helpers dinámicos**: Sistema de ayuda contextual distribuido - **Resultados interactivos**: Tags clickeables y ventanas popup - **Contexto limpio**: Evaluación completa desde cero en cada cambio ### 🔄 **En Progreso** - **Conversión perezosa a SymPy**: Algunos objetos aún se convierten prematuramente - **Aritmética que preserva tipos**: Necesita refinamiento para todos los casos - **Optimización de precedencia**: Ajuste fino de prioridades de tokenización ### 📋 **Pendiente** - **Tipos adicionales**: MAC addresses, timestamps, coordenadas - **Performance optimization**: Caching y evaluación lazy - **Documentación de usuario**: Guías y ejemplos actualizados ## Métricas de Éxito ⭐ **ACTUALIZADAS** - ✅ **Sistema de tokenización automática funcional**: - ✅ Patrones `16#FF`, `2#1010` → IntBase automático - ✅ Patrones `192.168.1.1` → FourBytes automático - ✅ Precedencia automática por especificidad - ✅ Parser genérico sin hardcoding - ✅ **Sistema de tipos auto-descubrible**: - ✅ Todas las clases en `custom_types/` - ✅ Función `register_classes_in_module()` en cada módulo - ✅ Auto-registro con metadatos y opciones - ✅ Helpers dinámicos desde todas las clases - ✅ **Clases base universales funcionales**: - ✅ IntBase con aritmética nativa y tokenización propia - ✅ FourBytes con aritmética nativa y tokenización propia - ✅ Conversión explícita `.to_sympy()` cuando sea necesario - ✅ Operadores que mantienen tipos nativos - ✅ **Motor híbrido integrado**: - ✅ Auto-descubrimiento de tipos al inicializar - ✅ Tokenización distribuida automática - ✅ Contexto limpio por evaluación - ✅ Evaluación simbólica + numérica - 🔄 **Conversión perezosa optimizada**: - ✅ Objetos nativos por defecto - 🔄 Conversión solo cuando se necesite álgebra compleja - 🔄 Aritmética preservando tipos en todos los casos - ✅ **Detección contextual de ecuaciones**: - ✅ Ecuaciones standalone detectadas y agregadas al sistema - ✅ Sintaxis de atajo `variable=?` → `solve(variable)` - ✅ Protección contra detección en argumentos de función - ✅ **Resultados interactivos**: - ✅ Tags clickeables para plots, matrices, listas - ✅ Ventanas popup con posicionamiento inteligente - ✅ Detección automática de tipos complejos - ✅ **Sistema de ayuda avanzado**: - ✅ Helpers auto-descubiertos desde todas las clases - ✅ Autocompletado tras punto con métodos disponibles - ✅ Ayuda contextual no invasiva - ✅ **Performance aceptable**: Debounce y evaluación optimizada - ✅ **Manejo robusto de errores**: Logging centralizado y presentación clara - ✅ **Documentación actualizada**: Guías técnicas y de desarrollo ## Consideraciones Futuras ### **Tipos Adicionales Planeados** ```python custom_types/ ├── mac_type.py # Direcciones MAC: AA:BB:CC:DD:EE:FF ├── time_type.py # Timestamps: HH:MM:SS, ISO format ├── coordinate_type.py # Coordenadas: lat,lon ├── ipv6_type.py # IPv6: 2001:db8::1 └── range_type.py # Rangos: 1..100, a..z ``` ### **Optimizaciones de Performance** - Caching de patrones de tokenización frecuentes - Evaluación lazy de `evalf()` solo cuando se muestre - Memoización de conversiones SymPy costosas ### **Extensiones del Parser** - Soporte para sintaxis de múltiples líneas - Macros y templates definidos por usuario - Validación contextual más sofisticada ## Conclusión La calculadora MAV ha evolucionado hacia un **sistema verdaderamente híbrido y extensible** que combina: 1. **Potencia algebraica completa** de SymPy 2. **Objetos nativos especializados** con aritmética propia 3. **Tokenización automática invisible** al usuario 4. **Arquitectura modular** sin hardcoding 5. **Auto-descubrimiento completo** del sistema de tipos El resultado es una herramienta que es **más simple para el usuario** (sintaxis natural) pero **más poderosa internamente** (álgebra simbólica + tipos especializados), con una **arquitectura limpia y extensible** que facilita agregar nuevas capacidades sin modificar código existente.