Análisis amortizado de consumo de recursos M. Hofmann S. Jost J. Hoffmann K. Aehlig Análisis y Transformación de Programas Máster en Investigación en Informática, 2012 Hofmann et al. Análisis amortizado de consumo de recursos 1/ 54 1/54 ESOP'06 M. Hofmann et al. ESOP'09 POPL'03 B. Campbell M. Hofmann S. Jost ESOP'10 APLAS'10 POPL'11 J. Hoffmann M. Hofmann J. Hoffmann M. Hofmann J. Hoffmann K. Aehlig M. Hofmann FM'09 POPL'10 S. Jost et al. S. Jost et al. ESOP'06 M. Hofmann et al. ESOP'09 POPL'03 B. Campbell M. Hofmann S. Jost ESOP'10 APLAS'10 POPL'11 J. Hoffmann M. Hofmann J. Hoffmann M. Hofmann J. Hoffmann K. Aehlig M. Hofmann FM'09 POPL'10 S. Jost et al. S. Jost et al. Introducción • Objetivo: Dado un programa escrito en un lenguaje funcional, determinar una cota superior de la cantidad de recursos necesarios (celdas de memoria) para su ejecución. • Esta cota vendrá dada en forma de función sobre los argumentos. ◦ POPL’03: Funcion lineal. ◦ ESOP’10: Función polinómica sobre una variable. ◦ POPL’11: Función polinómica sobre varias variables. • Se utilizan técnicas de análisis amortizado. Hofmann et al. Análisis amortizado de consumo de recursos 3/ 54 3/54 Análisis amortizado • Técnica introducida formalmente por Robert Tarjan (1985): Amortized Computational Complexity. • Es un método de analisis de algoritmos que considera el coste global (en el caso peor) una secuencia de operaciones. ◦ Más preciso que considerar la suma de los costes individuales en el caso peor. ◦ El hecho de que algunas operaciones sean demasiado costosas viene compensado por tener operaciones menos costosas, pero más frecuentes. Hofmann et al. Análisis amortizado de consumo de recursos 4/ 54 4/54 Análisis amortizado Método del potencial • Existe una función potencial φ(s) asociada a cada estado posible s del programa. s C s0 • Operaciones menos costosas acumulan potencial en el estado. • El potencial se usa para pagar operaciones costosas. Camortizado = C + φ(s 0 ) − φ(s) Hofmann et al. Análisis amortizado de consumo de recursos 5/ 54 5/54 Lenguaje RAML Resource-Aware ML Sintaxis e ::= | | | | | Hofmann et al. () | True | False | n | x | x1 ⊕ x2 nil | (x1 :: x2 ) | (x1 , x2 ) f (x1 , . . . , xn ) | let x1 = e1 in e2 if x then et else ef match x with (x1 , x2 ) → e match x with nil → e1 (x :: xx ) → e2 Análisis amortizado de consumo de recursos 6/ 54 6/54 Lenguaje RAML Resource-Aware ML Sintaxis e ::= | | | | | () | True | False | n | x | x1 ⊕ x2 nil | (x1 :: x2 ) | (x1 , x2 ) f (x1 , . . . , xn ) | let x1 = e1 in e2 if x then et else ef match x with (x1 , x2 ) → e match x with nil → e1 (x :: xx ) → e2 Sistema de tipos básico A ::= unit | bool | int | L(A) | (A, A) F ::= (A, A, . . . , A) → A Hofmann et al. Análisis amortizado de consumo de recursos 6/ 54 6/54 Lenguaje RAML Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → let x1 = append(xx , ys) in (x :: x1 ) append : (L(A), L(A)) → L(A) Hofmann et al. Análisis amortizado de consumo de recursos 7/ 54 7/54 Lenguaje RAML Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → let x1 = append(xx , ys) in (x :: x1 ) append : (L(A), L(A)) → L(A) 1 Hofmann et al. 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 7/ 54 7/54 Lenguaje RAML Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → let x1 = append(xx , ys) in (x :: x1 ) append : (L(A), L(A)) → L(A) Hofmann et al. 1 2 3 4 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 7/ 54 7/54 Sistema de tipos Análisis amortizado • Asociar un potencial a cada elemento de la estructura de datos. • El potencial total de la estructura de datos es lineal con respecto su tamaño. Hofmann et al. a a a …......... a x1 x2 x3 ... xn Análisis amortizado de consumo de recursos 8/ 54 8/54 Sistema de tipos Análisis amortizado • Asociar un potencial a cada elemento de la estructura de datos. • El potencial total de la estructura de datos es lineal con respecto su tamaño. a a a …......... a x1 x2 x3 ... xn • El potencial se refleja en el tipo de la estructura de datos. xs : L(a) (int) Hofmann et al. =⇒ φ(xs) = a ∗ |xs| Análisis amortizado de consumo de recursos 8/ 54 8/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) Hofmann et al. 1 1 1 1 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) Hofmann et al. 1 1 1 1 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 1 1 1 1 1 2 3 4 Coste construcción 5 6 7 8 9 1 4 Hofmann et al. Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) Hofmann et al. 1 1 1 1 1 2 3 4 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 1 1 1 1 1 2 3 4 1 2 3 4 5 6 7 8 9 append : (L(1) (A), L(0) (A)) → L(0) (A) Hofmann et al. Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) Hofmann et al. 3 3 3 3 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 3 3 3 3 1 2 3 4 Coste construcción 6 7 8 9 1 4 Hofmann et al. 5 2 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) Hofmann et al. 3 3 3 3 1 2 3 4 2 2 2 2 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 3 3 3 3 2 2 2 2 2 1 2 3 4 5 6 7 8 9 2 2 2 2 1 2 3 4 append : (L(3) (A), L(2) (A)) → L(2) (A) Hofmann et al. Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) Hofmann et al. 3 3 3 3 1 2 3 4 5 6 7 8 9 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 3 3 3 3 1 2 3 4 Coste construcción 5 6 7 8 9 1 2 4 Hofmann et al. Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 3 3 3 3 1 2 3 4 1 2 3 4 5 6 7 8 9 append : (L(3) (A), L(0) (A)) → L(0) (A) Hofmann et al. Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: concatenar listas Ejemplo append(xs, ys) = match xs with nil → ys (x :: xx ) → x :: append(xx , ys) 3 3 3 3 1 2 3 4 1 2 3 4 5 6 7 append : (L(q) (A), L(p) (A)) → L(p) (A) Hofmann et al. 8 9 q ≥ p +1 Análisis amortizado de consumo de recursos 9/ 54 9/54 Sistema de tipos Ejemplo: función attach Ejemplo attach(y , xs) = match xs with nil → nil (x :: xx ) → (y , x ) :: attach(y , xx ) Hofmann et al. 2 2 2 2 1 2 3 4 Análisis amortizado de consumo de recursos 10 / 54 10/54 Sistema de tipos Ejemplo: función attach Ejemplo attach(y , xs) = match xs with nil → nil (x :: xx ) → (y , x ) :: attach(y , xx ) 2 2 2 2 1 2 3 4 1 Construcción tupla 1 Construcción celda de lista (7,4) Hofmann et al. Análisis amortizado de consumo de recursos 10 / 54 10/54 Sistema de tipos Ejemplo: función attach Ejemplo attach(y , xs) = match xs with nil → nil (x :: xx ) → (y , x ) :: attach(y , xx ) 2 2 2 2 1 2 3 4 (7,1) (7,2) (7,3) (7,4) Hofmann et al. Análisis amortizado de consumo de recursos 10 / 54 10/54 Sistema de tipos Ejemplo: función attach Ejemplo attach(y , xs) = match xs with nil → nil (x :: xx ) → (y , x ) :: attach(y , xx ) 2 2 2 2 1 2 3 4 (7,1) (7,2) (7,3) (7,4) attach : (int, L(2) (int)) −→ L(0) (int, int) Hofmann et al. Análisis amortizado de consumo de recursos 10 / 54 10/54 Sistema de tipos Ejemplo: función attach Ejemplo attach(y , xs) = match xs with nil → nil (x :: xx ) → (y , x ) :: attach(y , xx ) 2 2 2 2 1 2 3 4 (7,1) (7,2) (7,3) (7,4) attach : (int, L(q) (int)) −→ L(p) (int, int) Hofmann et al. q ≥ p +2 Análisis amortizado de consumo de recursos 10 / 54 10/54 Sistema de tipos Ejemplo: Inserción ordenada Ejemplo insert : (int, L(int)) → L(int) 5 Hofmann et al. 1 1 1 1 1 2 3 4 1 Análisis amortizado de consumo de recursos 11 / 54 11/54 Sistema de tipos Ejemplo: Inserción ordenada Ejemplo insert : (int, L(int)) → L(int) 5 Hofmann et al. 1 1 1 1 1 2 3 4 1 2 3 4 1 5 Análisis amortizado de consumo de recursos 11 / 54 11/54 Sistema de tipos Ejemplo: Inserción ordenada Ejemplo insert : (int, L(int)) → L(int) 5 1 1 1 1 1 2 3 4 1 2 3 4 1 5 1/0 insert : (int, L(1) (int)) −→ L(0) (int) Hofmann et al. Análisis amortizado de consumo de recursos 11 / 54 11/54 Sistema de tipos Ejemplo: Inserción ordenada Ejemplo insert : (int, L(int)) → L(int) 5 1 1 1 1 1 2 3 4 1 2 3 4 p/p 0 0 insert : (int, L(q) (int)) −→ L(q ) (int) Hofmann et al. 1 5 q ≥ q 0 + 1, p ≥ p 0 + 1 Análisis amortizado de consumo de recursos 11 / 54 11/54 Sistema de tipos ¿Para qué sirve el potencial? • Supongamos una función f de tipo: q/q 0 f : (L(a) (int), L(b) (int)) −→ L(c) (int) • Para evaluar una llamada f (xs, ys), es suficiente disponer en memoria de a ∗ |xs| + b ∗ |ys| + q celdas. • Al final de la evaluación, dispondremos de c ∗ |zs| + q 0 celdas libres, donde zs denota el resultado de evaluar f (xs, ys). Hofmann et al. Análisis amortizado de consumo de recursos 12 / 54 12/54 Sistema de tipos Reglas de tipo • Sintaxis de tipos: A ::= unit | bool | int | L(n) (A) | (A, A) F q/q’ ::= (A, A, . . . , A) −→ A • Juicios de la forma: Σ; Γ ` e : A (q/q 0 ) ◦ ◦ ◦ ◦ ◦ Σ asocia nombres de función f con signaturas de tipo F . Γ asocia variables en ámbito con tipos. e es la expresión que se quiere tipar, con tipo A. q es el potencial constante suficiente para la evaluación de e. q 0 es el potencial constante remanente tras la evaluación de e. Hofmann et al. Análisis amortizado de consumo de recursos 13 / 54 13/54 Sistema de tipos Reglas de tipo Regla T:Cons Σ; Γ, x : A, xs : L(p) (A) ` (x :: xs) : L(p) (A) (1 + p/0) Regla T:Let Σ; Γ1 ` e1 : A1 (q, p) Σ; Γ2 , x1 : A1 ` e2 : A (p, q 0 ) Σ; Γ1 , Γ2 ` let x1 = e1 in e2 : A Hofmann et al. (q/q 0 ) Análisis amortizado de consumo de recursos 14 / 54 14/54 Sistema de tipos Reglas de tipo Regla T:Cons Σ; Γ, x : A, xs : L(p) (A) ` (x :: xs) : L(p) (A) (1 + p/0) Regla T:Let Σ; Γ1 ` e1 : A1 (q, p) Σ; Γ2 , x1 : A1 ` e2 : A (p, q 0 ) Σ; Γ1 , Γ2 ` let x1 = e1 in e2 : A (q/q 0 ) Regla T:Share Σ; Γ, z1 : A1 , z2 : A2 ` e : B (q/q 0 ) Σ; Γ, z : A ` e[z/z1 , z/z2 ] : B A = A1 + A2 (q/q 0 ) Por ejemplo: L(5) (int) = L(2) (int) + L(3) (int). Hofmann et al. Análisis amortizado de consumo de recursos 14 / 54 14/54 Sistema de tipos Reglas de tipo Regla T:Match Σ; Γ ` e1 : B (q/q 0 ) Σ; Γ, x : A, xx : L(p) (A) ` e2 : B (q + p/q 0 ) Σ; Γ, z : L(p) (A) ` match z with nil → e1 | (x :: xx ) → e2 : B Hofmann et al. Análisis amortizado de consumo de recursos (q/q 0 ) 15 / 54 15/54 Inferencia de tipos 1. Partimos de una derivación sin anotaciones de potencial. 2. Añadimos variables frescas como anotaciones de potencial, obteniendo una derivacion “indeterminada”. 3. Las reglas de tipo impondrán restricciones sobre las anotaciones. 4. Simplificar las anotaciones utilizando técnicas de programación lineal. Σ; Γ ` nil : L(int) Σ; z : int, x1 : L(int) ` (z :: x1 ) : L(int) Σ; Γ, z : int ` let x1 = nil in (z :: x1 ) : L(int) Hofmann et al. Análisis amortizado de consumo de recursos 16 / 54 16/54 Inferencia de tipos 1. Partimos de una derivación sin anotaciones de potencial. 2. Añadimos variables frescas como anotaciones de potencial, obteniendo una derivacion “indeterminada”. 3. Las reglas de tipo impondrán restricciones sobre las anotaciones. 4. Simplificar las anotaciones utilizando técnicas de programación lineal. Σ; Γ ` nil : L(q9 ) (int) (q7 /q8 ) Σ; z : int, x1 : L(q6 ) (int) ` (z :: x1 ) : L(q5 ) (int) (q3 /q4 ) Σ; Γ, z : int ` let x1 = nil in (z :: x1 ) : L(q2 ) (int) Hofmann et al. Análisis amortizado de consumo de recursos (q0 /q1 ) 16 / 54 16/54 Inferencia de tipos 1. Partimos de una derivación sin anotaciones de potencial. 2. Añadimos variables frescas como anotaciones de potencial, obteniendo una derivacion “indeterminada”. 3. Las reglas de tipo impondrán restricciones sobre las anotaciones. 4. Simplificar las anotaciones utilizando técnicas de programación lineal. Σ; Γ ` nil : L(q9 ) (int) (q7 /q8 ) Σ; z : int, x1 : L(q6 ) (int) ` (z :: x1 ) : L(q5 ) (int) (q3 /q4 ) Σ; Γ, z : int ` let x1 = nil in (z :: x1 ) : L(q2 ) (int) q7 ≥ q8 q6 = q9 = q5 = q2 q0 = q3 = q8 = q7 Hofmann et al. (q0 /q1 ) q3 ≥ 1 + q6 + q4 q1 = q4 qi ≥ 0 Análisis amortizado de consumo de recursos 16 / 54 16/54 Inferencia de tipos 1. Partimos de una derivación sin anotaciones de potencial. 2. Añadimos variables frescas como anotaciones de potencial, obteniendo una derivacion “indeterminada”. 3. Las reglas de tipo impondrán restricciones sobre las anotaciones. 4. Simplificar las anotaciones utilizando técnicas de programación lineal. Σ; Γ ` nil : L(q2 ) (int) (q0 /q8 ) Σ; z : int, x1 : L(q2 ) (int) ` (z :: x1 ) : L(q2 ) (int) (q8 /q1 ) Σ; Γ, z : int ` let x1 = nil in (z :: x1 ) : L(q2 ) (int) q0 ≥ q1 + q2 + 1 Hofmann et al. (q0 /q1 ) ∀i.qi ≥ 0 Análisis amortizado de consumo de recursos 16 / 54 16/54 Conclusiones (hasta 2003) Contribuciones • Completamente automático. • Eficiente (sólo requiere programación lineal). • No requiere de un análisis de tamaños previo. Hofmann et al. Análisis amortizado de consumo de recursos 17 / 54 17/54 Conclusiones (hasta 2003) Contribuciones • Completamente automático. • Eficiente (sólo requiere programación lineal). • No requiere de un análisis de tamaños previo. Desventajas • Limitado a cotas de memoria lineales. • No aborda análisis de otro tipo de recursos (tiempo). • Lenguaje de primer orden. • No recursión polimórfica. Hofmann et al. Análisis amortizado de consumo de recursos 17 / 54 17/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 1 Hofmann et al. 2 3 4 Análisis amortizado de consumo de recursos 18 / 54 18/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 2 1 Hofmann et al. 2 3 4 (3,4) Análisis amortizado de consumo de recursos 18 / 54 18/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 1 4 2 2 3 4 (3,4) (2,3) (2,4) Hofmann et al. Análisis amortizado de consumo de recursos 18 / 54 18/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 6 4 2 1 2 3 4 (1,2) (1,3) (1,4) (3,4) (2,3) (2,4) Hofmann et al. Análisis amortizado de consumo de recursos 18 / 54 18/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 9 6 3 1 2 3 1 4 1 1 1 (1,2) (1,3) (1,4) (3,4) 1 1 (2,3) (2,4) (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) Hofmann et al. Análisis amortizado de consumo de recursos 18 / 54 18/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 9 9 9 9 1 2 3 4 1 1 1 1 (1,2) (1,3) (1,4) (3,4) 1 1 (2,3) (2,4) (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) Hofmann et al. Análisis amortizado de consumo de recursos 18 / 54 18/54 Consumo de memoria no lineal Ejemplo: pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 3n 3n 3n 0 Hofmann et al. 1 2 3n ... n Análisis amortizado de consumo de recursos 18 / 54 18/54 ESOP'06 M. Hofmann et al. ESOP'09 POPL'03 B. Campbell M. Hofmann S. Jost ESOP'10 APLAS'10 POPL'11 J. Hoffmann M. Hofmann J. Hoffmann M. Hofmann J. Hoffmann K. Aehlig M. Hofmann FM'09 POPL'10 S. Jost et al. S. Jost et al. Potencial de segundo orden Vuelta al ejemplo pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 4 1 Hofmann et al. 4 4 4 4 4 2 3 4 Análisis amortizado de consumo de recursos 20 / 54 20/54 Potencial de segundo orden Vuelta al ejemplo pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 1 Hofmann et al. 4 2 4 4 (3,4) 4 4 4 2 3 4 Análisis amortizado de consumo de recursos 20 / 54 20/54 Potencial de segundo orden Vuelta al ejemplo pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 1 Hofmann et al. 4 2 4 4 (3,4) 4 4 4 2 3 4 2 2 (2,3) (2,4) Análisis amortizado de consumo de recursos 20 / 54 20/54 Potencial de segundo orden Vuelta al ejemplo pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 4 1 Hofmann et al. 4 4 4 4 4 2 3 4 2 2 2 2 (1,2) (1,3) (1,4) (3,4) 2 2 (2,3) (2,4) Análisis amortizado de consumo de recursos 20 / 54 20/54 Potencial de segundo orden Vuelta al ejemplo pairs pairs l = match l with nil → nil (x :: xs) → append(attach(x , xs), pairs(xs)) 4 1 4 4 4 4 4 2 3 4 1 2 2 2 2 (1,2) (1,3) (1,4) (3,4) 2 2 (2,3) (2,4) 1 1 1 1 1 (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) Hofmann et al. Análisis amortizado de consumo de recursos 20 / 54 20/54 Potencial de segundo orden x1 x2 x3 ... xn a a …......... a a …......... a .. a Hofmann et al. Análisis amortizado de consumo de recursos 21 / 54 21/54 Potencial de segundo orden x1 x2 x3 ... xn a a …......... a a …......... a .. a n φ([x1 , . . . , xn ]) = a ∗ 2 Hofmann et al. ! Análisis amortizado de consumo de recursos 21 / 54 21/54 Potencial de segundo orden b b b …......... b x1 x2 x3 ... xn a a …......... a a …......... a .. a Hofmann et al. Análisis amortizado de consumo de recursos 21 / 54 21/54 Potencial de segundo orden b b b …......... b x1 x2 x3 ... xn a a …......... a a …......... a .. a n φ([x1 , . . . , xn ]) = b ∗ n + a ∗ 2 Hofmann et al. ! Análisis amortizado de consumo de recursos 21 / 54 21/54 Potencial de segundo orden b b b …......... b x1 x2 x3 ... xn a a …......... a a …......... a .. a ! (b,a) xs : L Hofmann et al. (int) |xs| φ(xs) = b ∗ |xs| + a ∗ 2 Análisis amortizado de consumo de recursos 21 / 54 21/54 Potencial de segundo orden Vuelta al ejemplo pairs 4 1 4 4 4 4 4 2 3 4 1 2 2 2 2 (1,2) (1,3) (1,4) (3,4) 2 2 (2,3) (2,4) 1 1 1 1 1 (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) 0/0 pairs : L(0,4) (int) −→ L(1) (int) Hofmann et al. Análisis amortizado de consumo de recursos 22 / 54 22/54 Potencial de segundo orden ¿Por qué a partir del segundo elemento de la lista? b b b …......... b x1 x2 x3 ... xn a a a …......... a a a …......... a a …......... a .. a Hofmann et al. Análisis amortizado de consumo de recursos 23 / 54 23/54 Potencial de segundo orden ¿Por qué a partir del segundo elemento de la lista? b b b …......... b x1 x2 x3 ... xn a a a …......... a a a …......... a a …......... a .. a Hofmann et al. Análisis amortizado de consumo de recursos 23 / 54 23/54 Potencial de segundo orden ¿Por qué a partir del segundo elemento de la lista? a+b a+b b a+b b …......... a+b b x1 x2 x3 ... xn a a …......... a a …......... a .. a Hofmann et al. Análisis amortizado de consumo de recursos 23 / 54 23/54 Potencial de tercer orden 1 2 3 4 5 6 c c c c cc cc cc ccc ccc cccc Hofmann et al. Análisis amortizado de consumo de recursos 24 / 54 24/54 Potencial de tercer orden 1 2 3 4 5 6 c c c c cc cc cc ccc ccc cccc ! n φ([x1 , . . . , xn ]) = c ∗ ∈ O(n3 ) 3 Hofmann et al. Análisis amortizado de consumo de recursos 24 / 54 24/54 Potencial de tercer orden a a a a a a 1 2 3 4 5 6 c c c c cc cc cc ccc ccc cccc Hofmann et al. 1 2 3 4 5 6 b b b b b b b b b b b b b b Análisis amortizado de consumo de recursos b 24 / 54 24/54 Potencial de tercer orden a a a a a a 1 2 3 4 5 6 c c c c cc cc cc ccc ccc 1 2 3 4 5 6 b b b b b b b b b b b b b b cccc b ! n n φ([x1 , . . . , xn ]) = a ∗ n + b ∗ +c ∗ 2 3 Hofmann et al. ! Análisis amortizado de consumo de recursos 24 / 54 24/54 Potencial de tercer orden a a a a a a 1 2 3 4 5 6 c c c c cc cc cc ccc ccc 1 2 3 4 5 6 b b b b b b b b b b b b b b cccc b ! xs : L Hofmann et al. (a,b,c) (int) ! ! |xs| |xs| |xs| φ(xs) = a ∗ +b ∗ +c ∗ 1 2 3 Análisis amortizado de consumo de recursos 24 / 54 24/54 Potencial de tercer orden ¿Por qué comienza a partir del tercer elemento? a a a a a a 1 2 3 4 5 6 c c c c c cc cc cc cc ccc ccc ccc cccc cccc 1 2 3 4 5 6 b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b cccc c Hofmann et al. Análisis amortizado de consumo de recursos b+c b 25 / 54 25/54 Potencial de tercer orden ¿Por qué comienza a partir del tercer elemento? a a a a a a 1 2 3 4 5 6 c c c c c cc cc cc cc ccc ccc ccc cccc cccc 1 2 3 4 5 6 b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b b+c b cccc c Hofmann et al. Análisis amortizado de consumo de recursos b+c b 25 / 54 25/54 Potencial de tercer orden ¿Por qué comienza a partir del tercer elemento? a a a a a a 1 2 3 4 5 6 c c c c cc cc cc ccc ccc 1 2 3 4 5 6 b+c b+c b+c b+c b+c b+c b+c b+c b+c b+c b+c b+c b+c b+c b+c cccc Hofmann et al. Análisis amortizado de consumo de recursos 25 / 54 25/54 Sistema de tipos Reglas de tipo • Sintaxis de tipos: A ::= unit | bool | int | L~q (A) | (A, A) F q/q’ ::= (A, A, . . . , A) −→ A • Si xs tiene tipo L~q (int), y ~q = (q1 , . . . , qn ): n X ! |xs| φ(xs) = qi ∗ ∈ O(|xs|n ) i i=1 • Juicios de la forma: Σ; Γ ` e : A (q/q 0 ) Hofmann et al. Análisis amortizado de consumo de recursos 26 / 54 26/54 Sistema de tipos Reglas de tipo • Paramétricas con respecto al tipo de recurso: tiempo, consumo de memoria, número de operaciones aritméticas, etc. K int K op K pair K cons etc. = = = = Regla T:Const-I q = K int Σ; ∅ ` n : int (q/0) Hofmann et al. coste coste coste coste de de de de crear un número entero una operación aritmética crear un par crear una celda Regla T:BinOp-I q = K op Σ; x : int, y : int ` x1 ⊕ x2 : int (q/0) Análisis amortizado de consumo de recursos 27 / 54 27/54 Sistema de tipos Reglas de tipo • Operador desplazamiento aditivo: C b xs : L(b,a) (A) ... xn tail xs : L(b+a,a) (A) a …......... a C(q1 , q2 ) = (q1 + q2 , q2 ) a …......... a .. b b b x1 x2 x3 a a • En general: C(q1 , q2 , . . . , qn ) = (q1 + q2 , q2 + q3 , . . . , qn ) Hofmann et al. Análisis amortizado de consumo de recursos 28 / 54 28/54 Sistema de tipos Reglas de tipo: construcción y ajuste de patrones Regla T:Match ~p = (p1 , . . . , pn ) Σ; Γ ` e1 : B (q − K1matchN /q 0 + K2matchN ) Σ; Γ, x : A, xx : LC(~p ) (A) ` e2 : B (q + p1 − K1matchC /q 0 + K2matchC ) Σ; Γ, z : L~p (A) ` match z with nil → e1 | (x : : xx ) → e2 : B (q/q 0 ) Regla T:Cons ~p = (p1 , . . . , pn ) Σ; Γ, x : A, xx : LC(~p ) (A) ` (x :: xx ) : L~p (A) Hofmann et al. (p1 + K cons /0) Análisis amortizado de consumo de recursos 29 / 54 29/54 Sistema de tipos Reglas de tipo: compartición Regla T:Share Σ; Γ, z1 : A1 , z2 : A2 ` e : B (q/q 0 ) Σ; Γ, z : A ` e[z/z1 , z/z2 ] : B A = A1 + A2 (q/q 0 ) • Reparto de potencial: C = C +C (A, B) = (A1 , B1 ) + (A2 , B2 ) L~p (A) = L~q (A1 ) + L~r (A2 ) Hofmann et al. C ∈ {unit, bool, int} A = A1 + A2 ∧ B = B1 + B2 A = A1 + A2 ∧~p = ~q +~r Análisis amortizado de consumo de recursos 30 / 54 30/54 Sistema de tipos Reglas de tipo: subtipos A <: B ⇔ A puede utilizarse en un contexto en el que se espera B. C <: C (A1 , A2 ) <: (B1 , B2 ) L~p (A) <: L~q (B) Hofmann et al. C ∈ {unit, bool, int} A1 <: A2 ∧ B1 <: B2 A <: B ∧~p ≥ ~q Análisis amortizado de consumo de recursos 31 / 54 31/54 Sistema de tipos Reglas de tipo: subtipos A <: B ⇔ A puede utilizarse en un contexto en el que se espera B. C <: C (A1 , A2 ) <: (B1 , B2 ) L~p (A) <: L~q (B) C ∈ {unit, bool, int} A1 <: A2 ∧ B1 <: B2 A <: B ∧~p ≥ ~q Regla T:Super y T:Sub Σ; Γ, x : A ` e : B (q/q 0 ) A0 <: A Σ; Γ, x : A0 ` e : B (q/q 0 ) Σ; Γ ` e : B (q/q 0 ) B <: B 0 Σ; Γ ` e : B 0 (q/q 0 ) Hofmann et al. Análisis amortizado de consumo de recursos 31 / 54 31/54 Sistema de tipos Reglas de tipo: debilitamiento Regla T:Relax Σ; Γ, x : A ` e : B (p/p 0 ) q≥p q − p ≥ q0 − p0 0 0 Σ; Γ, x : A ` e : B (q/q ) Regla T:Augment Σ; Γ ` e : B (q/q 0 ) Σ; Γ, x : A ` e : B (q/q 0 ) Hofmann et al. Análisis amortizado de consumo de recursos 32 / 54 32/54 Inferencia de tipos 1. Partimos de una derivación sin anotaciones de potencial. 2. Añadimos variables frescas como anotaciones de potencial, obteniendo una derivacion “indeterminada”. (¡más variables!) 3. Las reglas de tipo impondrán restricciones sobre las anotaciones. 4. Simplificar las anotaciones utilizando técnicas de programación lineal. La única diferencia: • Hay que fijar el tamaño de las tuplas ~q de antemano. Hofmann et al. Análisis amortizado de consumo de recursos 33 / 54 33/54 Corrección del sistema de tipos Σ; Γ ` e : A (q/q 0 ) Sean: • φ(Γ) potencial de las variables que hay en el entorno • φ(A) es el potencial del resultado. Entonces: • Cualquier evaluación de e no requiere más de φ(Γ) + q recursos disponibles • Tras la evaluación quedarán, al menos, φ(A) + q 0 recursos disponibles. Hofmann et al. Análisis amortizado de consumo de recursos 34 / 54 34/54 Corrección del sistema de tipos Σ; Γ ` e : A (q/q 0 ) Sean: • φ(Γ) potencial de las variables que hay en el entorno • φ(A) es el potencial del resultado. Entonces: • Cualquier evaluación de e no requiere más de φ(Γ) + q recursos disponibles • Tras la evaluación quedarán, al menos, φ(A) + q 0 recursos disponibles. • ¿Cuántos recursos requiere la evaluación de una expresión? • ¿Cómo se define el potencial de una variable? Hofmann et al. Análisis amortizado de consumo de recursos 34 / 54 34/54 Corrección del sistema de tipos Semántica con recursos • Semántica estándar de un lenguaje funcional, pero instrumentada con contadores de recursos. • Juicios de la forma V ` e, H, q v , H0 , q 0 ◦ e se evalúa al valor v ::= l | b | n | Null | (v , v ). Hofmann et al. Análisis amortizado de consumo de recursos 35 / 54 35/54 Corrección del sistema de tipos Semántica con recursos • Semántica estándar de un lenguaje funcional, pero instrumentada con contadores de recursos. • Juicios de la forma V ` e, H, q v , H0 , q 0 ◦ e se evalúa al valor v ::= l | b | n | Null | (v , v ). ◦ H y H0 son heaps: asocian punteros con valores. H = [l1 7→ (5, l2 ), l2 7→ (4, l3 ), l3 7→ (3, Null)] Hofmann et al. Análisis amortizado de consumo de recursos 35 / 54 35/54 Corrección del sistema de tipos Semántica con recursos • Semántica estándar de un lenguaje funcional, pero instrumentada con contadores de recursos. • Juicios de la forma V ` e, H, q v , H0 , q 0 ◦ e se evalúa al valor v ::= l | b | n | Null | (v , v ). ◦ H y H0 son heaps: asocian punteros con valores. H = [l1 7→ (5, l2 ), l2 7→ (4, l3 ), l3 7→ (3, Null)] ◦ V asocia variables en ámbito a valores (pila) V = [xs 7→ l1 ] Hofmann et al. (xs = [5, 4, 3]) Análisis amortizado de consumo de recursos 35 / 54 35/54 Corrección del sistema de tipos Semántica con recursos • Semántica estándar de un lenguaje funcional, pero instrumentada con contadores de recursos. • Juicios de la forma V ` e, H, q v , H0 , q 0 ◦ e se evalúa al valor v ::= l | b | n | Null | (v , v ). ◦ H y H0 son heaps: asocian punteros con valores. H = [l1 7→ (5, l2 ), l2 7→ (4, l3 ), l3 7→ (3, Null)] ◦ V asocia variables en ámbito a valores (pila) V = [xs 7→ l1 ] (xs = [5, 4, 3]) ◦ Al comenzar la evaluación disponemos de q recursos, y al finalizar tenemos q 0 recursos. El consumo real es q − q 0 . Hofmann et al. Análisis amortizado de consumo de recursos 35 / 54 35/54 Corrección del sistema de tipos Semántica con recursos Regla E:Var x ∈ dom V V ` x , H, q + K var V(x ), H, q Regla E:Cons x , xs ∈ dom V v = (V(x ), V(xs)) l∈ / dom H cons V ` (x :: xs), H, q + K l, H[l 7→ v ], q Hofmann et al. Análisis amortizado de consumo de recursos 36 / 54 36/54 Corrección del sistema de tipos Potencial de estructuras de datos • El potencial de una estructura de datos depende de su tipo A, y de su tamaño dentro del heap H. Definition (Potencial) φH (v : A) • φH (v : A) = 0, si A ∈ {unit, int, bool} • φH ((v1 , v2 ) : (A1 , A2 )) = φH (v1 : A1 ) + φH (v2 : A2 ) • φH ((v , l) : L~p (A)) = p1 + φH (v : A) + φH (l : LC(~p ) (A)) b b b b x1 x2 x3 ... xn a a …......... a a …......... a .. a Hofmann et al. Análisis amortizado de consumo de recursos 37 / 54 37/54 Corrección del sistema de tipos Potencial de estructuras de datos Lema Sea H un heap en el que l apunta a la lista [v1 , . . . , vn ] y ~p = (p1 , . . . , pk ). Entonces: ~p φH (l : L (A)) = k X n i=1 Hofmann et al. i ! pi + n X φH (vi : A) i=1 Análisis amortizado de consumo de recursos 38 / 54 38/54 Corrección del sistema de tipos Potencial de estructuras de datos Lema Sea H un heap en el que l apunta a la lista [v1 , . . . , vn ] y ~p = (p1 , . . . , pk ). Entonces: ~p φH (l : L (A)) = k X n i=1 ! i pi + n X φH (vi : A) i=1 Notación def φH (V : Γ) = X φH (V(x ) : Γ(x )) x ∈dom Γ Hofmann et al. Análisis amortizado de consumo de recursos 38 / 54 38/54 Corrección del sistema de tipos Teorema de corrección • Sea Σ una signatura correcta, y e una expresión. • Sea H V : Γ. • Supongamos V ` e, H, u v , H0 , u 0 , para algunos u, u 0 ∈ Q+ . Teorema Si Σ; Γ ` e : A (p/p 0 ), y q ≥ φH (V : Γ) + p, entonces: V ` e, H, q v , H0 , q 0 para algún q 0 ≥ φH (v : A) + p 0 . Hofmann et al. Análisis amortizado de consumo de recursos 39 / 54 39/54 Ejemplo Función pairs L(0,4)(int) L(2,0)(int) L(4,4)(int) Hofmann et al. L(4,0)(int) Análisis amortizado de consumo de recursos L(0,4)(int) 40 / 54 40/54 Ejemplo Criba de Eratóstenes filter (p, l) = match l with nil → nil (x :: xs) → let xs 0 = filter (p, xs) in if x mod p = 0 then xs 0 else (x : xs 0 ) eratos(l) = match l with nil → nil (x :: xs) → x :: eratos(filter (x , xs)) filter : L(1) (int) → L(0) (int) eratos : L(1,1) (int) → L(0) (int) Hofmann et al. Análisis amortizado de consumo de recursos 41 / 54 41/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? • Sea Kn [x ] el e.v. de los polinomios sobre x de grado n. B = {1, x , x 2 , . . . , x n } • B es una base de Kn [x ]. P(x ) = an x n + . . . + a2 x 2 + a1 x + a0 · 1 Hofmann et al. Análisis amortizado de consumo de recursos 42 / 54 42/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? • Sea Kn [x ] el e.v. de los polinomios sobre x de grado n. B = {1, x , x 2 , . . . , x n } • B es una base de Kn [x ]. P(x ) = an x n + . . . + a2 x 2 + a1 x + a0 · 1 • Pero las técnicas presentadas aquí infieren polinomios de la forma: ! ! ! ! Q(x ) = bn Hofmann et al. x x x x + . . . + b2 + b1 + b0 n 2 1 0 Análisis amortizado de consumo de recursos ∀i.bi ≥ 0 42 / 54 42/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? Proposición ( B= Hofmann et al. ! ! ! x x x x , , ,..., 0 1 2 n !) es una base de Kn [x ] Análisis amortizado de consumo de recursos 43 / 54 43/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? Proposición ( B= ! ! ! x x x x , , ,..., 0 1 2 n !) es una base de Kn [x ] Método de diferencias finitas x P(x) 0 -7 1 -5 2 0 3 8 Hofmann et al. a0 2 5 8 3 3 a1 a2 0 ! ! n n n P(x ) = 3 +2 −7 2 1 0 Análisis amortizado de consumo de recursos ! 43 / 54 43/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? Proposición ( B= ! ! ! x x x x , , ,..., 0 1 2 n !) es una base de Kn [x ] Método de diferencias finitas x 0 -7 1 -5 2 0 3 8 Hofmann et al. Δ0 P P(x) Δ1 P Δ2 P 2 5 8 3 3 0 ! ! n n n P(x ) = 3 +2 −7 2 1 0 Análisis amortizado de consumo de recursos ! 43 / 54 43/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? • Pero las combinaciones lineales que resultan del algoritmo de inferencia son no negativas. • Las combinaciones no negativas de x x x son 0 , 1 ,..., n equivalentes la clase de polinomios hereditariamente no negativos: aquellos en los que ∆i P ≥ 0 para todo i ≥ 0. • Incluyen las combinaciones lineales no negativas de polinomios en la base estándar: {1, x , x 2 , . . . , x n }. Hofmann et al. Análisis amortizado de consumo de recursos 44 / 54 44/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? • Pero las combinaciones lineales que resultan del algoritmo de inferencia son no negativas. • Las combinaciones no negativas de x x x son 0 , 1 ,..., n equivalentes la clase de polinomios hereditariamente no negativos: aquellos en los que ∆i P ≥ 0 para todo i ≥ 0. • Incluyen las combinaciones lineales no negativas de polinomios en la base estándar: {1, x , x 2 , . . . , x n }. ◦ Y también algunas combinaciones lineales con coeficientes negativos: x 2 = x2 − x 2 Hofmann et al. Análisis amortizado de consumo de recursos 44 / 54 44/54 Conclusiones ¿Qué tipo de cotas polinómicas pueden inferirse? • Pero las combinaciones lineales que resultan del algoritmo de inferencia son no negativas. • Las combinaciones no negativas de x x x son 0 , 1 ,..., n equivalentes la clase de polinomios hereditariamente no negativos: aquellos en los que ∆i P ≥ 0 para todo i ≥ 0. • Incluyen las combinaciones lineales no negativas de polinomios en la base estándar: {1, x , x 2 , . . . , x n }. ◦ Y también algunas combinaciones lineales con coeficientes negativos: x 2 = x2 − x 2 ◦ Pero no otras: 3x 2 − 6x + 7 Hofmann et al. Análisis amortizado de consumo de recursos 44 / 54 44/54 Conclusiones (hasta 2010) Contribuciones • Completamente automático. • Eficiente (sólo requiere programación lineal). • No requiere de un análisis de tamaños previo. • Cotas de memoria polinómicas. • Paramétrico con respecto al tipo de recurso. Hofmann et al. Análisis amortizado de consumo de recursos 45 / 54 45/54 Conclusiones (hasta 2010) Contribuciones • Completamente automático. • Eficiente (sólo requiere programación lineal). • No requiere de un análisis de tamaños previo. • Cotas de memoria polinómicas. • Paramétrico con respecto al tipo de recurso. Desventajas • No está muy definida la clase de polinomios que se infieren. • Es capaz de generar sumas de polinomios en una variable. ◦ No genera términos mixtos: n ∗ m. • Lenguaje de primer orden. • No recursión polimórfica. Hofmann et al. Análisis amortizado de consumo de recursos 45 / 54 45/54 ESOP'06 M. Hofmann et al. ESOP'09 POPL'03 B. Campbell M. Hofmann S. Jost ESOP'10 APLAS'10 POPL'11 J. Hoffmann M. Hofmann J. Hoffmann M. Hofmann J. Hoffmann K. Aehlig M. Hofmann FM'09 POPL'10 S. Jost et al. S. Jost et al. Motivación k/0 f : (L~q (int), L~p (int)) −→ bool • Si ~q = (q1 , . . . , qk ) y ~p = (p1 , . . . , pn ), se necesitan los siguientes recursos para evaluar f (xs, ys): Hofmann et al. Análisis amortizado de consumo de recursos 47 / 54 47/54 Motivación k/0 f : (L~q (int), L~p (int)) −→ bool • Si ~q = (q1 , . . . , qk ) y ~p = (p1 , . . . , pn ), se necesitan los siguientes recursos para evaluar f (xs, ys): k X i=1 Hofmann et al. n X |xs| |ys| + pj +k i j j=1 ! qi ! Análisis amortizado de consumo de recursos 47 / 54 47/54 Motivación k/0 f : (L~q (int), L~p (int)) −→ bool • Si ~q = (q1 , . . . , qk ) y ~p = (p1 , . . . , pn ), se necesitan los siguientes recursos para evaluar f (xs, ys): k X i=1 | n X |xs| |ys| + +k pj i j j=1 ! qi {z Qk [xs] } ! | {z Qn [ys] } Q[xs] + Q[ys] ( Q[xs, ys] Hofmann et al. Análisis amortizado de consumo de recursos 47 / 54 47/54 Motivación Ejemplo: Producto diádico Ejemplo a1 a1 b1 a1 b2 a1 b3 a2 · b1 b2 b3 = a2 b1 a2 b2 a2 b3 a3 a3 b1 a3 b2 a3 b3 mult(x , l) = match x with nil → nil (x :: xs) → x ∗ y :: mult(x , ys) dyade(l, ys) = match l with nil → nil (x :: xs) → mult(x , ys) :: dyade(xs, ys) Hofmann et al. Análisis amortizado de consumo de recursos 48 / 54 48/54 Idea general • El potencial ya no forma parte de los tipos de las estructuras de datos. • Pasa a formar parte de los juicios de tipo y signaturas de funciones. Hofmann et al. Análisis amortizado de consumo de recursos 49 / 54 49/54 Idea general • El potencial ya no forma parte de los tipos de las estructuras de datos. • Pasa a formar parte de los juicios de tipo y signaturas de funciones. • 0 parámetros =⇒ El potencial es un escalar. f : (q0 ) −→ A • Recursos requeridos para la ejecución: q0 • Hofmann et al. Análisis amortizado de consumo de recursos 49 / 54 49/54 Idea general • El potencial ya no forma parte de los tipos de las estructuras de datos. • Pasa a formar parte de los juicios de tipo y signaturas de funciones. • 1 parámetro de tipo lista =⇒ El potencial es un vector. f : L(A) (q0 , q1 , . . . , qn ) −→ A • Recursos requeridos para la ejecución de f (xs): ! ! |xs| |xs| q0 + q1 + . . . + qn 1 n • Hofmann et al. Análisis amortizado de consumo de recursos 49 / 54 49/54 Idea general • El potencial ya no forma parte de los tipos de las estructuras de datos. • Pasa a formar parte de los juicios de tipo y signaturas de funciones. • 2 parámetros de tipo lista =⇒ El potencial es una matriz. q(0,0) q(1,0) q(2,0) f : (L(A), L(B)) q(0,1) q(1,1) −→ A q(0,2) • Recursos requeridos para la ejecución de f (xs, ys): q(0 ,0 ) + |xs| |xs| |ys| |ys| |xs| |ys| q(1 ,0 ) + q(2 ,0 ) + q(0 ,1 ) + q(0 ,2 ) + q(1,1) 1 2 1 2 1 1 • Hofmann et al. Análisis amortizado de consumo de recursos 49 / 54 49/54 Idea general • El potencial ya no forma parte de los tipos de las estructuras de datos. • Pasa a formar parte de los juicios de tipo y signaturas de funciones. • 2 parámetros de tipo lista =⇒ El potencial es una matriz. f : (L(A), L(B)) q(i,j) j≤i −→ A • Recursos requeridos para la ejecución de f (xs, ys): ! X 0≤i+j≤k |xs| i ! |ys| q(i,j) j • Hofmann et al. Análisis amortizado de consumo de recursos 49 / 54 49/54 Idea general • El potencial ya no forma parte de los tipos de las estructuras de datos. • Pasa a formar parte de los juicios de tipo y signaturas de funciones. • n parámetros de tipo lista =⇒ El potencial es un tensor. f : (L(A1 ), . . . , L(An )) (qv ) −→ A • Recursos requeridos para la ejecución de f (xs 1 , . . . , xs n ): ! X |xs 1 | v v1 ! |xs n | ... qv vn • Hofmann et al. Análisis amortizado de consumo de recursos 49 / 54 49/54 Ejemplo Vuelta al producto diádico mult(x , l) = match x with nil → nil (x :: xs) → x ∗ y :: mult(x , ys) dyade(l, ys) = match l with nil → nil (x :: xs) → mult(x , ys) :: dyade(xs, ys) mult : (int, L(int)), (0, 1, 0) → L(int), (0, 0, 0) 0 0 0 dyade : (L(int), L(int)), 1 1 → L(L(int)), 0 0 Hofmann et al. Análisis amortizado de consumo de recursos 50 / 54 50/54 Sistema de tipos Operador de desplazamiento aditivo C • En el caso bivariado, existen dos operadores de desplazamiento aditivo: C1 y C2 . Hofmann et al. Análisis amortizado de consumo de recursos 51 / 54 51/54 Sistema de tipos Operador de desplazamiento aditivo C • En el caso bivariado, existen dos operadores de desplazamiento aditivo: C1 y C2 . • En caso de match sobre el primer parámetro: q (0,0) q (0,1) q(0,2) Hofmann et al. q(1,0) q(1,1) q(2,0) Análisis amortizado de consumo de recursos 51 / 54 51/54 Sistema de tipos Operador de desplazamiento aditivo C • En el caso bivariado, existen dos operadores de desplazamiento aditivo: C1 y C2 . • En caso de match sobre el primer parámetro: + + q ←− q(1,0) ←− q(2,0) (0,0) + + q ←− q ←− (0,1) (1,1) + + q(0,2) ←− ←− Hofmann et al. Análisis amortizado de consumo de recursos 51 / 54 51/54 Sistema de tipos Operador de desplazamiento aditivo C • En el caso bivariado, existen dos operadores de desplazamiento aditivo: C1 y C2 . • En caso de match sobre el primer parámetro: + + q + q(1,0) ←− q(1,0) + q(2,0) ←− q(2,0) (0,0) + + q + q ←− q ←− (0,1) (1,1) (1,1) + + q(0,2) ←− ←− Hofmann et al. Análisis amortizado de consumo de recursos 51 / 54 51/54 Casos de estudio Hofmann et al. Análisis amortizado de consumo de recursos 52 / 54 52/54 Casos de estudio Hofmann et al. Análisis amortizado de consumo de recursos 52 / 54 52/54 Casos de estudio Hofmann et al. Análisis amortizado de consumo de recursos 52 / 54 52/54 Conclusiones (hasta 2011) Contribuciones • Completamente automático. • Eficiente (sólo requiere programación lineal). • No requiere de un análisis de tamaños previo. • Cotas de memoria polinómicas. • Paramétrico con respecto al tipo de recurso. • Análisis multivariado. • Manejo de árboles, listas, y EDs anidadas. Trabajo futuro • Otros órdenes de complejidad (logarítmicos, exponenciales). • Manejo de memoria automático (recolección de basura). • Manejo de enteros. • Aplicación a otros lenguajes (C). Hofmann et al. Análisis amortizado de consumo de recursos 53 / 54 53/54 Bibliografía M. Hofmann and S. Jost Static Prediction of Heap Space Usage for First-Order Functional Programs Proceedings of the 30th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL’03). J. Hoffmann and M. Hofmann. Amortized Resource Analysis with Polynomial Potential Proceedings of the 19th European Symposium on Programming (ESOP’10) J. Hoffmann, K. Aehlig, M. Hofmann. Multivariate Amortized Resource Analysis. Proceedings of the 38th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL’11). Hofmann et al. Análisis amortizado de consumo de recursos 54 / 54 54/54