Symbolica 2.0 es la nueva versión mayor de un marco de cálculo simbólico de alto rendimiento para Python y Rust, presentado como una herramienta para manipular expresiones simbólicas y convertirlas en kernels numéricos optimizados, útiles para calcular Jacobianos, optimización numérica, integración y otras tareas. La línea argumental de esta versión es la introducción de «símbolos programables»: buena parte del comportamiento de la biblioteca puede personalizarse, lo que permite al usuario definir objetos matemáticos que simplifican, derivan, expanden, imprimen y evalúan como si fueran funciones integradas.
Desde la versión 1.0, Symbolica ha acumulado mejoras en varias direcciones. La API de Rust se ha simplificado con un nuevo módulo prelude que agrupa los rasgos, macros, dominios y tipos de evaluador más comunes, se han añadido sobrecargas de operadores y conversiones automáticas, y muchas funciones siguen ahora un patrón builder fluido. Los símbolos se registran en un sistema con espacios de nombres, alias, etiquetas, datos de usuario y hooks personalizables. El sistema de salida se ha rediseñado con envoltura automática de líneas, paréntesis coloreados y nuevos formatos HTML, LaTeX, Typst y multilínea, lo que facilita su uso en cuadernos como Jupyter y Marimo. Se han incorporado, además, nuevas funciones matemáticas integradas: gamma, polilogaritmos, funciones de Bessel, zeta de Riemann y los ganchos de series y evaluación asociados.
La gran novedad de la versión 2.0 son precisamente los símbolos programables. Ya en 1.0 los símbolos podían llevar atributos algebraicos; en 2.0 admiten hooks adicionales que se ejecutan en puntos concretos del ciclo de vida algebraico: normalización, impresión en distintos formatos, regla de derivación, comportamiento en series y evaluación numérica. El artículo muestra, por ejemplo, cómo definir una función gamma personalizada que se regularice cerca de su polo en cero para poder expandirla en serie.
El subsistema de evaluadores, que reescribe expresiones simbólicas en programas de instrucciones optimizados y los compila, también se ha renovado. Es posible definir evaluadores para símbolos personalizados en distintos dominios numéricos (punto flotante, complejo o código C++). Symbolica 2.0 añade además compilación JIT mediante el crate symjit de Shahriar Iravanian, convertido en backend por defecto para Python, y una ruta de doble flotante que ofrece unos 106 bits de precisión —31 dígitos decimales frente a los 16 del doble estándar— con un rendimiento más de tres veces superior al de la aritmética de precisión arbitraria.
Symbolica resulta de interés para investigadores y desarrolladores que necesiten cálculo simbólico de alto rendimiento con generación automática de código numérico optimizado, ya sea en prototipado en Python o en bibliotecas de producción en Rust.
