• No se han encontrado resultados

Resolver el Caso General de CRSs

9. El Sistema C OSTA

13.3. Resolver el Caso General de CRSs

ponde a h( ¯x) es la misma pues la altura no depende de b. La VC para w ( ¯x) se

hace tal y como se describe al final de la sección anterior.

3 Resolver el Caso General de CRSs

En esta sección se muestra cómo resolver cualquier CR aislada. El caso ge- neral para resolver un CRS se hace como se describe en la Sección 9.5.

Los métodos de suma-árbol y suma por niveles se formulan para resolver una CR atómica, en la que el coste es nulo en todas las ecuaciones excepto en una, en la que es una expresión básica; en cambio, en una CR aislada puede haber varias ecuaciones en las que el coste no sea nulo y además sea cualquier expresión de coste. A continuación vemos cómo manejar tales CRs. La idea bá- sica es romper la CR de entrada en varias CRs atómicas, resolver éstas a UBFs usando los métodos de suma por árbol o por niveles, y combinar estas UBFs en una UBF de la CR original. Nuestro enfoque se presenta en dos pasos: 1) se extienden las CRs atómicas para permitir productos de expresiones básicas, y 2) se trata el caso general en que varias ecuaciones tienen un coste no nulo. Por simplicidad, suponemos que la CR no usa el operador m´ax. Si no, éste se reemplaza por una suma de los argumentos, como en la Sección 10.2, o bien se duplica la ecuación de coste una vez por cada argumento del operados m´ax. También suponemos que las expresiones de coste están en forma normal, esto es, como sumas de productos de expresiones básicas.

Productos. Supongamos una CR C en la que el coste es nulo en todas las

ecuaciones excepto en una, en la que el coste es un producto e = b1∗ · · · ∗ bn

de expresiones básicas bi. La CR C se resuelve del siguiente modo:

1. Se escoge una bi, con 1 ≤ i ≤ n, y se reemplaza e por bi, obteniéndose una

CR E atómica; ésta se resuelve en una UBF E+( ¯x) usando los métodos de

las secciones previas;

2. para cada bj con j 6= i se calcula su maximización ˆbj (véase Sección 9.5), y

se construye C+( ¯x) = E+( ¯x) ∗Q

j 6=ibˆj como UBF de C .

El método es correcto ya que, siendo ˆbj mayor que cualquier instancia de bj y

constante en el árbol (solo depende de los parámetros de la llamada inicial), se puede factorizar fuera de la CR. Nótese que si en el primer paso se escoge una

i distinta, se puede obtener otra UBF.

Ejemplo 13.7. Considere la CR C definida con estas ecuaciones:

C (m, p) = 0 , {m = 0}

168 CAPÍTULO 13. RESOLUCIÓN LÓGICA DE CRS El coste de esta segunda ecuación es un producto de expresiones básicas. Si éste se reemplaza pornat(n), se obtiene esta CR atómica:

E (m, p) = 0 , {m = 0}

E (m, p) =nat(n) + E(m − n, p0) , {m ≥ n ≥ 1, p ≥ q, p ≥ p0≥ 0}

E se puede resolver en la UBF E+(m, p) =nat(m). El otro factornat(q) se maxi-

miza anat(p), siendo p el parámetro de la CR original, y por último se define

C+(m, p) =nat(p) ∗nat(m) como UBF de la CR C . 

El caso general. Supongamos una CR C con k ecuaciones, donde la ecua-

ción i tiene una expresión de coste ei= Pi1+· · ·+Pini, y cada sumando Pijes un

producto de expresiones básicas. C se resuelve en una UBF del siguiente modo: 1. Para cada producto Pij, se define la CR Eij que se obtiene al quitar todos

los otros productos de C , y cada Eijse resuelve en una UBF Eij+( ¯x).

2. Se construye la UBF C+( ¯x) de C ( ¯x) as C+( ¯x) =Pk

i=1

Pni

j=1Eij+( ¯x).

Este método es correcto en tanto que cada CR Eijmodela la contribución del

sumando Pijal coste total de C .

Ejemplo 13.8. Considere la CR C definida con éstas ecuaciones:

Eq,1 C (m, n) = 0 ,ϕ1 Eq,2 C (m, n) =nat(n) P21 + C (m, n1) ,ϕ2 Eq,3 C (m, n) =nat(m0) P31 +nat(n) P32 + C (m1, n1) +C (m2, n2) ,ϕ3 siendoϕ1≡ {m0= 0, n = 0}, ϕ2≡ {n ≥ 1, n = 1+n1}, yϕ3≡ {m ≥ m0+m1+m2, n ≥

1 + n1+ n2}. En esta CR hay tres productos (de un solo factor): P21 =nat(n),

P31=nat(m0), and P32 =nat(n). Para resolver C , ésta se descompone en las

CRs E21, E31, y E32en la Figura 13.3; éstas se resuelven en las UBFs E21+(m, n) = nat(n)2, E31+(m, n) =nat(m), y E32+(m, n) =nat(n)2. Entonces se construye la su- ma C+(m, n) =nat(n)2+nat(m) +nat(n)2como la UBF de C (m, n). 

4 Evaluación Experimental

Hemos implementado nuestras técnicas como una extensión de PUBS. La implementación ocupa menos de 750 líneas de código PROLOG.

13.4. EVALUACIÓN EXPERIMENTAL 169 E21(m, n) = 0 ,ϕ1 E21(m, n) = nat(n)+ E21(m, n1) ,ϕ2 E21(m, n) = 0+ E21(m1, n1) + E21(m2, n2) ,ϕ3 E31(m, n) = 0 ,ϕ1 E31(m, n) = 0+ E31(m, n1) ,ϕ2 E31(m, n) = nat(m0)+ E31(m1, n1) + E31(m2, n2) ,ϕ3 E32(m, n) = 0 ,ϕ1 E32(m, n) = 0+ E32(m, n1) ,ϕ2 E32(m, n) = nat(n)+ E32(m1, n1) + E32(m2, n2) ,ϕ3

Figura 13.3: Descomposición de una CR en tres CRs menores.

Precisión. Para evaluar la precisión asintótica de nuestras técnicas, hemos es-

crito varios programas con ejemplos de la literatura. Aunque estos programas eran cortos, su análisis de coste planteaba algunos retos que se resuelven por nuestros métodos. En concreto, para el método de suma por árbol se usan algu- nos programas que se suelen describir en términos de coste amortizado, como el procedimiento para añadir varios elementos en una lista implementada con un array expandible [45, §17], las operaciones para añadir y quitar elementos de una cola construida con dos pilas [103]. Para el método de suma por niveles se usan algunos algoritmos de divide y vencerás, como QuickSort. En el artículo se muestra para cada ejemplo la AUBF que COSTAobtiene, usando el método pa- ra resolver CRs de [5]; y la AUBF and se obtiene usando nuestros métodos. Para todos los ejemplos, los métodos de [5] obtienen una AUBF imprecisa, mientras que nuestros métodos obtienen una AUBF precisa para el programa. Aunque PUBSya tiene una técnica para resolver CRs del estilo divide-y-vencerás [5], és- ta era de aplicabilidad restringida, y por ejemplo no podía usarse para resolver la CR de QuickSort.

Escalabilidad Siguiendo la técnica de [5, §10], hemos mezclado los progra-

mas de los experimentos anteriores para construir un conjunto de programas de tamaño creciente como suite de benchmarks. Para cada uno, se mide el tiem- po que se tarda en resolver el CRS con los métodos de PUBSy con los nuestros. En los experimentos, vimos que los tiempos de nuestro método son razonables, y en una proporción constante respecto a los de los tardan los métodos de [5].

También hemos comparado nuestro enfoque con el prototipoACRPde [18].

ACRP no pudo obtener una UBF en menos de un minuto para ningún bench- marks; lo cual era de esperar ya que ACRP usa un procedimiento de QE para

aritmética real no lineal que no es escalable. En cambio, nuestros métodos re- suelven todos los programas en unos segundos. Ello se debe al uso de un mé-

170 CAPÍTULO 13. RESOLUCIÓN LÓGICA DE CRS todo de QE para aritmética lineal real, basado en programación lineal.

En síntesis, en nuestros experimentos se ve que nuestro método es más pre- ciso que [10], y que su escalabilidad es similar a la de los métodos existentes de PUBS.

5 Trabajo Relacionado

Resolución de Relaciones de Recurrencia. Los primeros métodos automá-

ticos para resolver relaciones de recurrencia a forma cerrada se desarrollaron para los sistemas de álgebra por computador como MACSYMA [78] y MATH-

LAB [42]. PURRS [27] es un sistema reciente, que también intenta resolver re- laciones de recurrencia, e intenta aproximar la solución cuando no puede en- contrar una exacta. Estos sistemas asumen recurrencias deterministas, que no pueden modelar el coste de programas abstractos indeterministas.

PUBS. Los trabajos más cercanos al nuestro son los que describen PUBS. La

sintaxis y semántica de los CRSs, y su diferencia con las relaciones de recu- rrencia, se describen en [5]. Este artículo también describe los métodos para resolver CRSs: uno es del node-count, descrito en la Sección 9.5; el otro es el del

level-count, para resolver CRSs que surgen de algoritmos de divide-y-vencerás,

como nuestro método de suma por niveles aunque de una aplicabilidad más restringida. PUBStambién usa las técnicas de [14], que resuelven CRSs trans-

formándolos primero a una relación de recurrencia que aproxima el caso peor, y luego resuelve ésta con un sistema de álgebra por computador. Este método obtiene UBFs más precisas que las de [5], y también se puede usar para inferir LBFs. Sin embargo, su aplicabilidad es más restringida, y para algunos ejemplos también infieren una UBF asintóticamente imprecisa.

Las expresiones de coste se introducen en [5], como una forma de expre- siones monótonas construidas a partir de expresiones lineales. La clave de las expresiones de coste es que, al ser monótonas en las componentes nat, una expresión de coste se maximiza maximizando las expresiones lineales en las expresionesnat. Así, las expresiones de coste son una palanca, para razonar so- bre expresiones complejas usando técnicas de programación lineal. Del mismo modo, nuestra descomposición de una CR en CRs atómicas es un palanca para resolver una CRs compleja usando los métodos de QE para aritmética lineal.

Razonamiento lógico y Eliminación de Cuantificadores. Las VCs para los mé-

todos de suma por árbol y por niveles se basan en el método de aserciones in- ductivas para probar corrección de programas [34]. El uso de QE para aritmé- tica lineal se ha usado en varios trabajos relacionados, para inferir funciones

13.6. CONTENIDO ADICIONAL 171 de rango lineales [26], y lexicográficas [15]. En [124] se usan aserciones induc- tivas con plantillas para la verificación y síntesis de programas. Su herramienta maneja una clase amplia de predicados plantilla, que incluyen disyunciones y conjunciones de restricciones lineales.

Cotas de Alcanzabilidad. La cota en la altura de los árboles de evalación, que

se usa en el método de suma por niveles, se puede ver como el número de vi- sitas secuenciales a una ecuación, lo que se conoce como una cota de alcanza- bilidad (reachability bound [66]). Ésta se puede calcular sobre una función de rango lineal [26] o lexicográfica [15]. En [66], se define este problema y, para cal- cular esas cotas, se presentan técnicas basadas en SMT que permiten calcular UBFs que son productos de máximos de expresionesnat. En [140] se combina ese enfoque con la abstracción de cambio de tamaño (size-change). En otros trabajos se propone inferir funciones de rango polinómicas. En [38], proponen usar métodos de QE métodos para aritmética real no lineal. Cousot [47] usa relajación lagrangiana para reducir el problema de la QE como expresiones po- linómicas a uno de programación lineal. Otras técnicas se proponen en [97].

6 Contenido Adicional

En este capítulo se describe las contribuciones de [17]. Se ha explicado có- mo se resuelve una CR aislada descomponiéndola a varias CRs atómicas, cómo éstas se resuelven a sus UBFs, y cómo estas UBFs se combinan en una UBF pa- ra la CR original. Para resolver CRs atómicas, se han explicado los métodos de suma por árbol y de suma por niveles, basados en el uso de fórmulas FOL cuan- tificadas como en la Sección 12.2, pero que se resuelven eficientemente usando QE para aritmética lineal.

El artículo extiende y formaliza el contenido de este capítulo. Contiene una definición formal de la clase sintáctica de CRs atómicas. También formaliza el método de suma por árbol y el método de suma por niveles, y proporciona le- mas de su corrección junto con sus demostraciones. El artículo describe el pro- cedimiento de QE que se usa para resolver las VCs, el cual se basa en el uso del Lema de Farkas, y cómo se adapta para manejas las expresionesnaten las VCs. El artículo también contiene las tablas con los resultados de nuestros experi- mentos.

14

|

Conclusiones y Trabajo Futuro

En este capítulo se exponen las conclusiones de esta tesis. En la Sección 14.1 se describen los logros, el impacto, así como la aplicabilidad, de nuestras contri- buciones. En la Sección 14.2 se comenta, aparte, nuestras conclusiones sobre la relación entre los enfoques clásico y amortizado al análisis de coste. Por último, en la Sección 14.3 dibujamos algunas líneas para posible trabajo futuro.

1 Objetivos y Logros

El primer objetivo de esta tesis era adaptar los resolutores existentes de CRSs para que calculen UBFs asintóticas, al ser éstas más adecuadas para es- pecificar el coste durante el desarrollo de un programa. En particular, las asin- tóticas son: (I) menos sensibles a pequeños cambios en el programa, y (II) más concisas y legibles. Esto se logra en el Capítulo 10, en dos pasos siguientes:

1. Siguiendo un enfoque transformacional, se ha definido un método para transformar UBFs a forma asintótica. Ello tiene la ventaja de poder apli- carse directamente a las UBFs que obtiene cualquier analizador, no solo COSTA, pero la desventaja de que para calcular una UBF asintótica antes hay que calcular una no asintótica.

2. Se construye un resolutor de CRSs que directamente calcula una UBF asin- tóticas. Para ello, se intercala el método anterior con las fases de PUBS. Tal resolutor puede usarse en cualquier análisis de coste que genere CRSs, y es más escalable que el primer método.

A diferencia de otros métodos anteriores [126], en nuestro método se usa la información de contexto para obtener una cota asintótica más concisa.

El segundo objetivo era explorar la diferencia de precisión entre los distin- tos enfoques de análisis de coste. Para ello había que (I) entender por qué ra- zón en COSTA, y en general en el enfoque clásico de Wegbreit, se infieren UBFs imprecisas para algunos programas; e (II) inventar técnicas para resolver esta

imprecisión. En este sentido, se han identificado varias causas de esa impreci- sión, asociadas a varias fases de COSTA, y se ha propuesto cómo remediarlas:

En el Capítulo 11 se resuelve la imprecisión que causa el uso de operacio- nes aritméticas no lineales, que no se pueden modelar en COSTApues en éste se usan restricciones lineales. Se ve cómo, usando la información del contexto de la operación, una operación no lineal se puede modelar usan- do restricciones lineales, las cuales pueden codificarse directamente en el programa ACR para así no tener que cambiar el analizador. Con este mé-

14.1. OBJETIVOS Y LOGROS 173 todo, se logra que COSTAmaneje programas que antes no podía.

En el Capítulo 12 se ve que hay programas en los que emerge una relación entre la salida y el coste de un procedimiento, y cómo esta relación causa que al analizar estos programas aparezcan problemas de imprecisión. En concreto, se ve que éstos surgen en la fase que transforma el programa ACR en un CRS, al quitar los parámetros de salida. Para resolverlos, se desarro- llan nuevas técnicas de análisis, basadas en especificar el coste como una fórmula FOL sobre algunos UBF plantilla, y usar métodos de QE y SMT. Es- tas técnicas se extienden para modelos de coste que representan recursos que se liberan, en los que aparece la noción de coste pico. Estos resultados tienen una importancia teórica para el análisis de coste, si bien la mayoría de procedimientos de QE son computacionalmente caros, lo que hace que este método no escale para grandes programas.

Para lograr la escalabilidad deseada, esas técnicas se combinan en el Ca- pítulo 13 con las de PUBS. Para ello, la CR de entrada se descompone en

varias CRs atómicas; cada una de éstas se resuelve en una UBF, para lo cual se deriva una fórmula FOL que se resuelve usando un procedimiento de QE eficiente, basado en programación lineal. Con esta técnica se auna la mejora en precisión que se logra en el Capítulo 12 con la escalabilidad que se logra en PUBS.

En síntesis: además de justificar, por primera vez, la causa de los problemas de imprecisión que aparecen en el enfoque clásico al análisis de coste, nues- tra mayor contribución es aplicar El Cálculo de la Informática (The Calculus of

Computation [34]) al análisis estático de coste, al ver la inferencia de UBFs y la

resolución de CRSs como la verificación de programas abstractos, y así aprove- char los avances recientes en resolución de SMT [89] y QE [81].

Nuestras contribuciones tienen un impacto fundamental en el análisis de coste, tanto en los aspectos teóricos como en el aspecto prácticos. En éste, el impacto se ve en la funcionalidad que se ha añadido a COSTA, así como en las mejoras en su aplicabilidad, precisión, y escalabilidad.

Nuestra primera contribución extiende la funcionalidad de COSTA, hacien- do posible inferir cotas asintóticas. Como se ve en la Sección 10.5, la reso- lución asintótica de CRSs mejora la escalabilidad de COSTA, y de este mo- deo mejora su aplicabilidad a programas mayores.

Nuestra segunda contribución extiende la aplicabilidad de COSTA a pro-

gramas JBCcuyo coste depende de una instrucción no lineal. Como se ve en la Sección 11.2, esta contribución permite a COSTAinferir relaciones de valor más fuertes, con las que PUBSpuede inferir AUBFs más precisas.

Además, esto se logra sin dañar la escalabilidad de COSTA, no solo porque se usa un dominio abstracto no disyuntivo, sino también porque no se au-

174 CAPÍTULO 14. CONCLUSIONES Y TRABAJO FUTURO menta el tamaño del CRS generado.

Nuestra tercera contribución (Capítulo 12) tiene un impacto que trascien- de sus aspectos prácticos: proyecta una nueva luz sobre la relación entre los varios enfoques de análisis de coste. Por el lado práctico, hemos im- plementado nuestro enfoque en un prototipo llamadoACRP, descrito en la

Sección 12.5. ACRP consigue inferir una AUBF precisa para muchos pro-

grams para los que COSTA falla, entre ellos algunos ejemplos típicos de análisis amortizado, así como algunos bucles anidados. Sin embargo,ACRP

usa los métodos de SMT y QE para la teoría FOL de campos reales (núme- ros reales), los cuales no son escalables. Por ello,ACRPno tiene un impacto directo en COSTA, y por ello no se le ha integrado en éste.

Nuestra cuarta contribución mejora la precisión de PUBS, al desarrollar un

nuevo método para resolver una CR en una UBF. Como se ve en la Sec- ción 13.4, nuestra técnica logra mejor precisión que las que obtienen las técnicas de [5, 14]. Al basarse en un método de QE para aritmética real li- neal, nuestro método mantiene una escalabilidad similar a la de COSTA. Además, nuestro método extiende la aplicabilidad de COSTAy de PUBSa

algunos programas que no admiten una función de rango lineal, incluso a algunos programas no terminantes, ya que nuestro método no necesita calcular una función de rango lineal.

Para terminar la discusión del impacto, además de las evidentes mejoras para COSTA(véase secciones 10.5, 11.2, 12.5, y13.4), creemos que las contribuciones teóricas del capítulo 12 hacen más fácil transferir entre los distintos enfoques de análisis de coste el conocimiento y las técnicas de implementación.

Aplicabilidad de las Contribuciones

Las contribuciones de esta tesis, como se han desarrollado al nivel de la ACR y del CRS, son genéricas e independientes respecto al lenguaje de programa- ción, modelo de coste, y abstracción de tamaño, que solo se tratan en la primera fase. Por ello, también se pueden aplicar con un modelo de coste no acumula- tivo, como el consumo de memoria [13] o de tareas concurrentes [11], así como para cualquier modelo de coste que quiera definir el programador [99, 98]. Asi- mismo, nuestras contribuciones también son aplicables si las variables repre- sentan medidas de tamaño para estructuras de datos dinámicas [123], o medi- das de tamaño que dependan del tipo [73], o cualquier medida de tamaño que defina el usuario [65]. Respecto al lenguaje de programación, la compilación abstracta (Sección 9.3) se puede adaptar para analizar datos almacenados en los campos de estructuras de datos [6]. Nuestras contribuciones son aplicables al analizador COSTABS[138] para el lenguaje concurrente ABS.

14.2. ANÁLISIS AMORTIZADO DE COSTE 175

Documento similar