# Calculadora MAV - CAS Híbrido ## Descripción Sistema de Álgebra Computacional (CAS) que combina SymPy con clases especializadas para networking, programación y análisis numérico. Incluye **sistema de tokenización automática** y **auto-descubrimiento dinámico** de tipos. ## Características Principales - **Motor SymPy completo**: Cálculo simbólico y numérico integrado - **Tokenización automática**: `16#FF`, `192.168.1.1` se convierten en objetos tipados automáticamente - **Sistema de tipos auto-descubrible**: Auto-registro desde `custom_types/` sin modificar código - **Clases base universales**: IntBase (números en cualquier base) y FourBytes (patrones x.x.x.x) - **Conversión perezosa a SymPy**: Objetos nativos hasta que se necesite álgebra compleja - **Detección automática de ecuaciones**: Sin sintaxis especial - **Contexto limpio por evaluación**: Cada modificación evalúa todo desde cero, garantizando comportamiento predecible - **Resultados interactivos**: Elementos clickeables para plots, matrices y listas - **Autocompletado inteligente**: Basado en tipos registrados dinámicamente ## Tokenización Automática ⭐ **NUEVO** El sistema reconoce automáticamente patrones específicos y los convierte en objetos tipados: ### Números en Bases ```python # Entrada del usuario → Conversión automática 16#FF # → IntBase('FF', 16) = 255 2#1010 # → IntBase('1010', 2) = 10 8#777 # → IntBase('777', 8) = 511 16#x0 # → IntBase('x0', 16) = simbólico ``` ### Patrones x.x.x.x ```python # Entrada del usuario → Conversión automática 192.168.1.1 # → FourBytes('192.168.1.1') 255.255.0.0 # → FourBytes('255.255.0.0') 10.x.1.y # → FourBytes('10.x.1.y') = simbólico ``` ### Constructores Inteligentes ```python # Los constructores aceptan objetos tokenizados automáticamente IP4(192.168.1.1, 24) # FourBytes tokenizado automáticamente IP4(10.1.1.1, 255.255.0.0) # Ambos FourBytes automáticamente Hex(16#FF) # IntBase tokenizado automáticamente Hex(192.168.1.1) # Conversión FourBytes → Hex ``` ## Tipos Especializados ### Clases Base Universales ⭐ **NUEVO** #### IntBase - Números Universales ```python # Aritmética que mantiene la base original: a = 16#FF # → IntBase('FF', 16) b = 16#10 # → IntBase('10', 16) result = a + b # → IntBase('10F', 16) [271 en decimal] # Operaciones mixtas: c = 16#A0 + 32 # → IntBase('C0', 16) [192 en decimal] d = 2#1010 * 3 # → IntBase('11110', 2) [30 en decimal] # Conversiones: a.to_base(2) # → IntBase('11111111', 2) a.to_decimal() # → 255 ``` #### FourBytes - Patrones x.x.x.x Universales ```python # Aritmética de direcciones IP: ip1 = 192.168.1.1 # → FourBytes automático ip2 = ip1 + 5 # → FourBytes('192.168.1.6') next_net = 10.0.0.0 + 256 # → FourBytes('10.0.1.0') # Conversiones automáticas: ip = 192.168.1.1 # → FourBytes ip_hex = ip.ToHex() # → "16#C0.16#A8.16#1.16#1" ip_bin = ip.ToBinary() # → "2#11000000.2#10101000.2#1.2#1" # Aritmética simbólica: network = 10.x.0.0 # → FourBytes simbólico network.substitute(x=5) # → FourBytes('10.5.0.0') ``` ### Redes y Direcciones IP ```python # Constructores automáticos con tokenización: IP4(192.168.1.100, 24) # FourBytes + CIDR IP4(10.0.0.1, 255.255.248.0) # FourBytes + máscara FourBytes IP4(172.16.0.5, 16#ffffff00) # FourBytes + máscara IntBase # Métodos de red: ip = IP4(192.168.1.100, 24) ip.NetworkAddress() # → IP4(192.168.1.0, 24) ip.BroadcastAddress() # → IP4(192.168.1.255, 24) ip.Nodes() # → 254 hosts disponibles ip.next_ip() # → IP4(192.168.1.101, 24) # Máscaras inteligentes: IP4Mask(24) # → CIDR IP4Mask(255.255.255.0) # → Dotted decimal (tokenizado) IP4Mask(16#ffffff00) # → Desde hex (tokenizado) ``` ### Sistemas Numéricos Especializados ```python # Conversiones automáticas desde clases base: Hex(16#FF) # IntBase → Hex Bin(2#1010) # IntBase → Bin Dec(255) # → Decimal Chr(65) # → Chr('A') # Conversiones desde FourBytes: Hex(192.168.1.1) # FourBytes → Hex (32-bit) Bin(192.168.1.1) # FourBytes → Bin por elementos ``` ### Métodos Disponibles Los tipos incluyen métodos específicos accesibles con autocompletado: ```python # IntBase universal: val = 16#FF val.to_base(2) # Conversión a otra base val.substitute(x=15) # Sustitución simbólica val.to_sympy() # Conversión explícita a SymPy # FourBytes universal: addr = 192.168.1.1 addr.ToHex() # → "16#C0.16#A8.16#1.16#1" addr.substitute(x=5) # Para casos simbólicos addr.is_valid_ip_range() # Validación de rango IP # IP4 especializado: ip = IP4(192.168.1.100, 24) ip.NetworkAddress() # Dirección de red ip.add_hosts(10) # Suma hosts ip.in_same_network(other_ip) # Comparación de redes ``` ## Sistema de Ecuaciones ### Detección Automática ```python x + 2 = 5 # Detectado automáticamente y**2 - 4 = 0 # Agregado al sistema sin(x) = 1/2 # Ecuaciones trigonométricas # Con objetos tokenizados: 16#x0 + 16#10 = 256 # Ecuación con IntBase 10.x.1.1 + 255 = 10.x.2.0 # Ecuación con FourBytes ``` ### Resolución ```python solve(x**2 + 2*x - 8, x) # Resolver ecuación específica x=? # Atajo para solve(x) # Con objetos especializados: solve(16#x0 + 16#10 - 256, x) # → x = 240 (en decimal) network = 10.x.0.0 solve(network + 256 == 10.5.0.0, x) # → x = 5 ``` ## Funciones Matemáticas ### Cálculo ```python # Con objetos nativos (conversión automática cuando es necesario): diff(16#x0, x) # → 16*log(16) integrate(sin(16#x), x) # Conversión a SymPy automática limit(192.168.x.1 / x, x, 0) # Con FourBytes simbólico ``` ### Álgebra ```python simplify(expr) # Simplificación expand((16#x + 1)**3) # Expansión con IntBase factor(x**2 - 16#100) # Factorización mixta solve([eq1, eq2], [x, y]) # Sistemas ``` ### Matrices ```python Matrix([[16#FF, 2#1010], [192.168.1.1, 255.255.0.0]]) # Con objetos tokenizados det(M) # Determinante inv(M) # Inversa ``` ## Resultados Interactivos Los siguientes resultados son clickeables en la interfaz: - **📊 Ver Plot**: Abre matplotlib para gráficas - **📋 Ver Matriz**: Vista expandida con operaciones - **📋 Ver Lista**: Contenido completo de listas largas - **🔍 Ver Detalles**: Información completa de objetos ## Plotting ```python # Con objetos nativos (conversión automática): plot(sin(16#x), (x, 0, 255)) # IntBase en plot plot(192.168.x.1, (x, 0, 255)) # FourBytes simbólico plot3d(x**2 + y**2, (x, -5, 5), (y, -5, 5)) # Plot 3D tradicional ``` ## Variables y Símbolos Todas las variables son símbolos SymPy automáticamente: ```python x = 5 # x es Symbol('x') con valor 5 y = x + 2 # y es 7 (evaluado) z = x + a # z es Symbol('x') + Symbol('a') (simbólico) # Con objetos tokenizados: ip_base = 192.168.x.0 # FourBytes simbólico hex_val = 16#x0 # IntBase simbólico ``` ### Comportamiento de Contexto Limpio **Principio fundamental**: Cada vez que modifica cualquier línea, la aplicación reevalúa **todo** desde cero. #### Ventajas - **Predecible**: El primer `x` en cualquier secuencia siempre es un símbolo puro - **Sin sorpresas**: No hay variables "fantasma" de evaluaciones anteriores - **Contextual**: Las variables solo existen si están definidas en líneas anteriores - **Determinista**: Misma entrada → mismo resultado, siempre #### Ejemplo ```python # Al escribir esta secuencia línea por línea: x # → Symbol('x') puro (sin valor) x=1 # → Asigna x=1 y+x # → y + 1 (usa x=1 definido arriba) x=x+1 # → Incrementa x a 2 x # → Muestra 2 # Con tokenización automática: ip = 192.168.1.1 # → FourBytes('192.168.1.1') ip + 5 # → FourBytes('192.168.1.6') ``` ## Interfaz de Usuario ### Paneles - **Izquierdo**: Entrada de código - **Derecho**: Resultados con colores y elementos interactivos ### Autocompletado Dinámico - Escribir `.` después de cualquier objeto muestra métodos disponibles - Sistema auto-descubre métodos desde tipos registrados dinámicamente - Funciona con objetos SymPy, IntBase, FourBytes y tipos personalizados - Soporte para objetos tokenizados automáticamente ### Menús - **Archivo**: Nuevo, Cargar, Guardar - **Editar**: Limpiar entrada/salida, Limpiar historial - **Configuración**: Modos simbólicos, Recargar tipos personalizados - **Tipos**: Información de tipos, Sintaxis de tipos ⭐ **NUEVO** - **Ayuda**: Guías y referencia **Nota**: Se han eliminado las opciones relacionadas con limpiar variables/ecuaciones ya que el contexto se limpia automáticamente en cada evaluación. ## Sistema de Tipos Auto-Descubrible ⭐ **ACTUALIZADO** ### Auto-Descubrimiento Completo - **Tipos fundamentales**: IntBase y FourBytes en `custom_types/` - **Tipos especializados**: Todos los tipos en el directorio unificado - **Tokenización distribuida**: Cada clase define sus propios patrones - **Precedencia automática**: Patrones más específicos tienen mayor prioridad - **Parser genérico**: Sin hardcoding de tipos específicos ### Arquitectura Modular ``` custom_types/ ├── 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 ``` ### Información de Tipos Use **Menú Tipos → Información de tipos** para ver: - Clases registradas disponibles - Patrones de tokenización activos - Precedencia de conversión - Métodos de cada tipo ### Recarga Dinámica **Menú Tipos → Recargar tipos** para desarrollo en tiempo real. ## Casos de Uso ⭐ **ACTUALIZADOS** ### Análisis de Redes con Tokenización ```python # Tokenización automática en acción: network = 192.168.0.0 # → FourBytes automático mask = 255.255.255.0 # → FourBytes automático ip = IP4(network, mask) # Constructor inteligente # Aritmética de redes: first_host = network + 1 # → FourBytes('192.168.0.1') last_host = network + 254 # → FourBytes('192.168.0.254') # Análisis con variables: base = 10.x.0.0 # → FourBytes simbólico solve(base + 256 == 10.5.0.0, x) # → x = 5 ``` ### Conversiones Automáticas entre Bases ```python # IntBase universal: hex_val = 16#FF # → IntBase('FF', 16) bin_val = hex_val.to_base(2) # → IntBase('11111111', 2) oct_val = hex_val.to_base(8) # → IntBase('377', 8) # Aritmética preservando base: result = 16#FF + 16#10 # → IntBase('10F', 16) mixed = 16#A0 + 32 # → IntBase('C0', 16) # FourBytes a otras representaciones: ip = 192.168.1.1 # → FourBytes automático ip_hex = ip.ToHex() # → "16#C0.16#A8.16#1.16#1" ip_binary = ip.ToBinary() # → "2#11000000.2#10101000.2#1.2#1" ``` ### Análisis Matemático con Objetos Nativos ```python # Funciones con objetos tokenizados: f = sin(16#x0) * exp(-x**2/2) # IntBase en función df_dx = diff(f, x) # Derivada (conversión automática) critical_points = solve(df_dx, x) # Puntos críticos # Visualización: plot(f, df_dx, (x, -3, 3)) # Plot función y derivada # Con FourBytes simbólico: network_func = 10.x.1.0 + sin(x) plot(network_func, (x, 0, 255)) ``` ### Álgebra Simbólica Avanzada ```python # Sistemas con objetos nativos: ip1 = 192.168.x.1 # FourBytes simbólico ip2 = 10.y.1.1 # FourBytes simbólico # Ecuaciones con conversión automática: solve([ip1 + 255 == 192.168.5.0, ip2 - 10.0.1.1 == 0], [x, y]) # → {x: 4, y: 0} # Análisis de rangos: hex_range = 16#x0 # IntBase simbólico constraints = [hex_range >= 16#A0, hex_range <= 16#FF] solve(constraints, x) # → Rango válido para x ``` ## Extensibilidad ⭐ **ACTUALIZADA** ### Crear Nuevos Tipos con Tokenización 1. Crear archivo en `custom_types/nuevo_type.py` 2. Definir clase heredando de `ClassBase` o `SympyClassBase` 3. Implementar `get_tokenization_patterns()` (opcional) 4. Implementar `register_classes_in_module()` 5. El sistema detecta automáticamente el nuevo tipo ### Ejemplo Completo con Tokenización ```python # custom_types/mac_type.py from class_base import ClassBase import re class MACAddress(ClassBase): def __init__(self, mac_string): # Procesar dirección MAC super().__init__(processed_value, mac_string) @staticmethod def get_tokenization_patterns(): """Define patrones de tokenización automática""" return [ { 'pattern': r'\b([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})\b', 'replacement': lambda match: f'MACAddress("{match.group(1)}")', 'priority': 6, 'description': 'MAC con dos puntos: AA:BB:CC:DD:EE:FF' } ] @staticmethod def Helper(input_str): if re.search(r'([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}', input_str): return "Direcciones MAC: AA:BB:CC:DD:EE:FF" return None @staticmethod def PopupFunctionList(): return [ ("to_vendor", "Busca fabricante por OUI"), ("is_unicast", "Verifica si es unicast"), ("to_binary", "Convierte a representación binaria") ] def register_classes_in_module(): return [ ("MACAddress", MACAddress, "ClassBase", { "add_lowercase": True, "supports_brackets": False, # Usa tokenización "has_tokenization": True, "description": "Direcciones MAC con auto-detección" }) ] ``` ### Uso Automático del Nuevo Tipo ```python # Después de agregar mac_type.py: # AA:BB:CC:DD:EE:FF se convierte automáticamente en MACAddress("AA:BB:CC:DD:EE:FF") mac = AA:BB:CC:DD:EE:FF # Tokenización automática vendor = mac.to_vendor() # Métodos disponibles automáticamente ``` ## Resolución de Problemas ### Errores Comunes - **Dependencias faltantes**: Ejecutar `pip install sympy matplotlib numpy` - **tkinter en Linux**: `sudo apt-get install python3-tk` - **Conversión prematura a SymPy**: Algunos objetos se convierten antes de tiempo (en desarrollo) ### Performance - Tokenización automática es muy eficiente - Expresiones complejas pueden ser lentas en SymPy - Objetos nativos son más rápidos que conversiones SymPy - Plots 3D requieren tiempo de renderizado ### Debugging del Sistema de Tipos - Los logs se guardan en `logs/` - Usar **Menú Tipos → Información** para verificar tipos cargados y patrones activos - Verificar `custom_types/` para tipos personalizados - Debug de tokenización: activar modo debug en el parser ## Arquitectura ⭐ **ACTUALIZADA** ### Componentes Principales - **type_registry.py**: Sistema de auto-descubrimiento completo - **custom_types/**: Directorio unificado de todos los tipos - **tl_bracket_parser.py**: Tokenizador universal distribuido - **main_evaluation.py**: Motor CAS híbrido integrado - **tl_popup.py**: Resultados interactivos - **main_calc_app.py**: Aplicación principal ### Flujo de Ejecución ⭐ **ACTUALIZADO** 1. **Auto-descubrimiento**: Carga tipos desde `custom_types/` 2. **Registro dinámico**: Clases, métodos, helpers y patrones de tokenización 3. **Tokenización distribuida**: Cada clase define sus propios patrones 4. **Conversión automática**: Patrones específicos → objetos tipados 5. **Evaluación híbrida**: Objetos nativos + SymPy cuando es necesario 6. **Resultados interactivos**: Presentación con elementos clickeables ### Precedencia de Tokenización ```python # Orden automático por especificidad: IntBase: priority = 5 # Muy específico: 16#FF MAC: priority = 6 # Específico: AA:BB:CC:DD:EE:FF FourBytes: priority = 10 # General: x.x.x.x ``` --- **Calculadora MAV - CAS Híbrido v2.1** *Sistema extensible con tokenización automática para cálculo matemático y análisis especializado*