Análisis amortizado de consumo de recursos

Anuncio
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
Descargar