lunes, 11 de agosto de 2014

New module for KDE-Edu/Analitza: AnalitzaJIT (powered by LLVM)

Working on algorithms to plot algebraic curves and surfaces (based on equations) I discovered that no matter how good the algorithm was, the main problem always will be the speed of compute/evaluate the algebraic expression.

To evaluate math expressions, Analitza does an excellent job: the API is stable, has a lots of  features, is fast for evaluations, its semantics are based on a good enough standard (MathML), etc.

Although Analitza is amazing in many ways, I always felt that with the use of JIT compilation, then it would rocks harder, better and stronger: The idea would be translate the algebraic expression into machine code and evaluate the machine code instead of the Analitza version. This, indeed, would be a little hard, but for such obvious benefits: it worth the effort!

So, I used LLVM to implement the JIT compilation from Analitza expression into LLVM IR and then into machine code. Later I could use the machine code version to perform the evaluations, the results were very good and promising. I did a benchmark of 3 lambda expressions and compared their evaluations over 3 different domains ... 3 images worth more than a million of words ;)



The AnalitzaJIT module is still on heavy development, the basic bits and the foundations are there to grow up until have feature parity with the Analitza core module ... we will succeed on this goal!

miércoles, 22 de agosto de 2012

KDE Randa Meetings

Por favor donen para las reuniones en Randa, KDE te necesita ahora!

Realicen sus donaciones aquí, es fácil y rápido:

http://pledgie.com/campaigns/18045

Me he ahorrado toda la explicación de porque estas reuniones son importantes: es evidente que lo son, por favor ayuden donando, promoviendo o difundiendo esta campaña.



miércoles, 25 de abril de 2012

GSoC 2012





Otro año, en el cual participo de Google Summer of Code \o/

Este año mi proyecto le prestará atención a un aspecto importante de los productos software: el mantenimiento.

En efecto, en KDEEdu tenemos un buen producto para dibujar funciones matemáticas: KmPlot ; sin embargo, ya casi no recibe el mantenimiento necesario y esto hace que nos veamos con la necesidad de buscar soluciones a este problema.

Una posible solución, puede ser el envolverlo de nuevo y darle el mantenimiento debido, sin embargo, hacer esto no siendo parte de los desarrolladores iniciales es complicado porque toma tiempo aprender la base del código fuente. Pese a lo anterior, es posible darle una salida dedicándole el tiempo necesario, sin embargo, tenemos que enfrentar otro problema: las tecnologías que usa son aisladas y en general la arquitectura de KmPlot hace que sea difícil extender y agregar más funcionalidades (a nivel de dibujo de funciones; no a nivel del "canvas" como ejes por ejemplo)

Frente a esto, la idea del proyecto será presentar a KDEEdu una alternativa casi completa de KmPlot, pero con más características, es decir: Generar un reemplazo viable a KmPlot, que esté mejor relacionado con las tecnologías de KDE y que cuente con un modelo para ser extendido fácilmente (para cubrir y superar lo ofrecido por KmPlot)

El producto que presentaré ya ha sido desarrollado de manera rápida por mi y otros colaboradores como parte de un trabajo universitario, dicho producto nació gracias a KAlgebra (usando los componentes para dibujar y con una versión congelada y modificada del parser analitza) así que aprovecharé el espacio de GSoC para que dicho producto esté acorde a los estándares exigidos a una aplicación de KDE.

Los meses que se vienen serán divertidos y gratificantes, una vez concluido GSoC me haré responsable de mantener el proyecto claro.

Dejo el link del código en crudo, que será la base de trabajo para este GSoC (está en mi repo scratch)

martes, 17 de agosto de 2010

¿KmPlot dentro de KAlgebra?

Aunque no literalmente, está fue una de las metas del proyecto. Si bien KmPlot es un KPart la idea aquí no fue hacer que KAlgebra cargue el KPart de KmPlot, sino aprovechar el concepto de la interfaz de usuario que presenta KmPlot.

Lo que se hizo fue tomar la cara de KmPlot, así es: la cara, es decir, tomar algunos diálogos y la UI. Luego de esto, esta UI se puso dentro de KAlgebra. Finalmente, se hizo que esta nueva UI use las tecnologías y componentes de KAlgebra para dibujar funciones.

¿Cuales son las ventajas de hacer esto?
Esto trae enormes ventajas, veamos una lista de ella:

  • Se aprovecha lo que ya está desarrollado en KmPlot y así se mejora KAlgebra, es decir se hace una reutilización de código.
  • Los diálogos de KmPlot para crear y editar funciones son bastante intuitivos y mas completos que el que se tiene en KAlgebra.
  • Cada gráfico de KmPlot puede tener diferente espesor de linea (o grosor del pincel) este espesor se mide en milímetros. Gracias a este trabajo KAlgebra ahora tendría esta misma funcionalidad.

En las siguientes imágenes veremos capturas de pantalla que explican mejor el concepto:

El menú para crear funciones de KmPlot ya está dentro de KAlgebra:


A continuación vemos el dialogo para crear funciones explícitas. Notar que tenemos una opción de cambiar el tamaño del pincel (espesor de linea) al crear una función:


La lista de funciones que usaremos ahora, no será la de KmPlot, sino el componente que tiene KAlgebra para visualizar funciones:


Del mismo modo, la creación de funciones implícitas también está en la nueva UI:


Ahora vemos 2 funciones en la lista, asimismo notamos que las 2 curvas están siendo dibujadas con distinto tamaño de pincel:


Finalmente, vemos una captura en donde se está editando un gráfico de una función paramétrica que ya se creó. En este caso en particular, crear/editar las curvas paramétricas con 2 cajas de texto que representen los 2 componentes del vector es mucho mejor para el usuario. En la versión actual de KAlgebra, para crear una de función paramétrica se tiene que escribir en la siguiente sintaxis: t->vector{componente 1, componente 2}


Poco a poco KDE-Edu tendría un único programa para dibujar funciones: KAlgebra, sin embargo esto se haría sin dejar de lado el esfuerzo y desarrollo que ya se tiene en KmPlot, reuso de código :)

Mejoras en KAlgebra

Durante la selección de proyectos para el GSoC de este año, tuve el agrado de reunirme con el equipo de KDE-Edu en el KDEEdu Sprint 2010. En el transcurso de este evento, avancé algunas cosas del proyecto de GSoC.

Dado que el sprint fue antes del congelamiento de versiones de KDE 4.5 supongo que algunos de estos bits deberían estar saliendo con la nueva versión de KDE. En todo caso, el comparativo de las mejoras que veremos a continuación, será respecto a la última versión actual de KAlgebra -que está en la mayoría de las distribuciones- esta es: KAlgebra 0.9 usando KDE 4.4.5

Lo que se realizó en el sprint fue trabajar en resolver uno que otro bug y -principalmente- en mejorar los gráficos de las lineas tangentes para las funciones. Veamos todo esto en detalle.

Bug para dibujar curvas f(y)

En la versión actual de KAlgebra no podemos dibujar inmediatamente una función que contenga la variable y, en vez de esto se debe ingresar así: y->f(y) ; esto se debe al funcionamiento interno del parser que usa KAlgebra.



Si bien no es un error serio, sí es algo que frutaría a muchos usuarios nuevos ... Ahora podemos hacer un gráfico de este tipo de funciones sin problema, con lo cual el tema estaría cerrado :)



Lineas tangentes a una curva

Aunque las tangentes son triviales en concepto, su valor didáctico es enorme. Es por eso que se ha trabajado en hacer que KAlgebra genere lineas tangentes para las funciones polares, paramétricas e implícitas (actualmente sólo se pueden ver las tangentes en las curvas explícitas)

En KAlgebra la linea tangente a una función es de color azul y es sólo un segmento de recta, este segmento se dibuja respondiendo al movimiento del mouse sobre el gráfico de la curva.

Aquí vemos que la tangente se dibuja para una función polar:


Aquí vemos dibujada la tangente para el caso de la una función paramétrica:


Finalmente, y no por eso lo que fue menos complejo de programar :P, tenemos la tangente para curvas implícitas:


Con todo esto tenemos nuevas características que ya deben estar dentro de KAlgebra para KDE 4.5, aun queda hacer mas trabajo pero creo que vamos por buen camino :)

jueves, 22 de julio de 2010

Curvas implícitas en KAlgebra

Las curvas implícitas son necesarias para representar ciertas funciones que contienen 2 variables, en este caso x e y. De esta manera podemos dibujar varias curvas que no son posibles expresarlas de forma explícita. Con el trabajo de GSoC para KAlgebra y KmPlot ahora KAlgebra podrá dibujar curvas implícitas, veamos algunos ejemplos:



  • Dibujemos una curva que se corta a sí misma varias veces:

Algunas de estas curvas no son bien dibujadas por KmPlot (en algunos casos ni siquiera son dibujadas) Como nota de la implementación de esta nueva característica, comento lo siguiente: el método desarrollado para que KAlgebra logre dibujar curvas implícitas, conociste en almacenar la curva en un quadtree y de esta manera dibujar solo los nodos en los cuales la curva existe.

En la siguiente nota del blog comentaré los trabajos hechos para KAlgebra en base al reuso de la UI de KmPlot.

lunes, 5 de julio de 2010

KAlgebra: FunctionsView con MathML

El proyecto de GSoC para KAlgebra y KmPlot de este año, tiene como meta: mejorar el sistema para dibujar funciones matemáticas. Y además, la buena noticia es que también queda tiempo para algunas mejoras en la UI, sobre todo de KAlgebra.

Al dibujar curvas 2D, KAlgebra mantiene una lista de funciones en donde se guarda los datos de cada función: como su color, su ecuación, entre otros. Sin embargo, las ecuaciones de cada función son visualizadas sin respectar la notación matemática, pues solo muestran un arreglo de caracteres como "^", "/" junto a las variables y constantes:


Gracias a que KAlgebra soporta MathML, ahora la lista de funciones luce mucho más profesional . Ya es posible visualizar la ecuación de una función respetando la notación matemática de acuerdo a los símbolo en la expresión:




Con esto, cierro el informe sobre el estado del proyecto. Con seguridad las siguientes semanas colocaré más detalles sobre el progreso actual :)