Post on 11-Apr-2015
BalanceandoÁrboles de Ejecución
David Insa Cabrera
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
Contenido
¿Qué es un Árbol de Ejecución?
Depuración algorítmica [Shapiro 82] Paradigma Lógico
DOS FASES:• Generar el árbol de ejecución• Recorrer el árbol de ejecución haciendo preguntas hasta encontrar el error
Si se detecta el efecto de un errorentonces la DA encontrará el error
main = 4
listSum [] = 1
1+3 = 4
2+1 = 3
listSum [1,2] = 4
listSum [2] = 3
Depuración Algorítmica
Ejemplo:
main = listSum [1,2]
listSum [] = 1listSum (x:xs) = x + (listSum xs)
Recorriendo el árbol de ejecución
• REGLA DE ORO: Cuando un nodo incorrecto no tiene hijos incorrectos, entonces este nodo es erróneo.
Ejemplo:
main = listSum [1,2]
listSum [] = 1listSum (x:xs) = x + (listSum xs)
main = 4
listSum [] = 1
1+3 = 4
2+1 = 3
listSum [1,2] = 4
listSum [2] = 3
Depuración Algorítmica
Recorriendo el árbol de ejecución
• REGLA DE ORO: Cuando un nodo incorrecto no tiene hijos incorrectos, entonces este nodo es erróneo.
Ejemplo:
main = listSum [1,2]
listSum [] = 0listSum (x:xs) = x + (listSum xs) + 1
main = 5
listSum [] = 0
1+3+1 = 5
2+0+1 = 3
listSum [1,2] = 5
listSum [2] = 3
Depuración Algorítmica
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
• Estrategias de la DA• Sesión de depuración
Contenido
Estrategias
Top Down Left to RightTop Down Heaviest FirstTop Down More Rules First
Divide & Query ShapiroDivide & Query HirunkittiDivide by Rules & Query
Single Stepping
Hat Delta More WrongsHat Delta Less RightsHat Delta Best Division
Top Down
Hat Delta
Divide & Query
Single Stepping
Estrategias de la Depuración Algorítmica
Sesión de depuración
main = sqrTest [1,2]
sqrTest x = test (squares (listSum x))
test (x,y,z) = (x==y) && (y==z)
listSum [] = 0listSum (x:xs) = x + (listSum xs)
squares x = ((square1 x),(square2 x),(square3 x))
square1 x = square x square x = x*x square2 x = listSum (list x x) list x y | y==0 = [] | otherwise = x:list x (y-1)
square3 x = listSum (partialSums x)
partialSums x = [(sum1 x),(sum2 x)]
sum1 x = div (x * (incr x)) 2sum2 x = div (x + (decr x)) 2
incr x = x + 1decr x = x - 1
Sesión de depuración
Sesión de depuración con la búsqueda Top-Down Left to Right.
main = False
sqrTest [1,2] = False
test (9,9,8) = False squares 3 = (9,9,8) listSum [1,2] = 3
squares1 3 = 9 squares2 3 = 9 squares3 3 = 8listSum [2] = 2
listSum [] = 0square 3 = 9 listSum [3,3,3] = 9
listSum [3,3] = 6
listSum [3] = 3
listSum [] = 0
list 3 3 = [3,3,3]
list 3 2 = [3,3]
list 3 1 = [3]
list 3 0 = []
listSum [6,2] = 8
listSum [2] = 2
listSum [] = 0
partialSums 3 = [6,2]
sum1 3 = 6 sum2 3 = 2
incr 3 = 4 decr 3 = 2
Empezando la sesión de depuración…
1) main = False? NO
2) sqrTest [1,2] = False? NO
3) test [9,9,8] = False? SI
4) squares 3 = [9,9,8]? NO
5) square1 3 = 9? SI
6) square2 3 = 9? SI
7) square3 3 = 8? NO
8) listSum [6,2] = 8? SI
9) partialSums 3 = [6,2]? NO
10) sum1 3 = 6? SI
11) sum2 3 = 2? NO
12) decr 3 = 2? SI
Error encontrado en la regla:
sum2 x = div (x + (decr x)) 2
Sesión de depuración
Sesión de depuración con la búsqueda Top-Down Heaviest First.
main = False
sqrTest [1,2] = False
test (9,9,8) = False squares 3 = (9,9,8) listSum [1,2] = 3
squares1 3 = 9 squares2 3 = 9 squares3 3 = 8listSum [2] = 2
listSum [] = 0square 3 = 9 listSum [3,3,3] = 9
listSum [3,3] = 6
listSum [3] = 3
listSum [] = 0
list 3 3 = [3,3,3]
list 3 2 = [3,3]
list 3 1 = [3]
list 3 0 = []
listSum [6,2] = 8
listSum [2] = 2
listSum [] = 0
partialSums 3 = [6,2]
sum1 3 = 6 sum2 3 = 2
incr 3 = 4 decr 3 = 2
Empezando la sesión de depuración…
1) main = False? NO
2) sqrTest [1,2] = False? NO
3) squares 3 = [9,9,8]? NO
4) square2 3 = 9? SI
5) square3 3 = 8? NO
6) partialSums 3 = [6,2]? NO
7) sum1 3 = 6? SI
8) sum2 3 = 2? NO
9) decr 3 = 2? SI
Error encontrado en la regla:
sum2 x = div (x + (decr x)) 2
Sesión de depuración
Sesión de depuración con la búsqueda Divide & Query Hirunkitti.
main = False
sqrTest [1,2] = False
test (9,9,8) = False squares 3 = (9,9,8) listSum [1,2] = 3
squares1 3 = 9 squares2 3 = 9 squares3 3 = 8listSum [2] = 2
listSum [] = 0square 3 = 9 listSum [3,3,3] = 9
listSum [3,3] = 6
listSum [3] = 3
listSum [] = 0
list 3 3 = [3,3,3]
list 3 2 = [3,3]
list 3 1 = [3]
list 3 0 = []
listSum [6,2] = 8
listSum [2] = 2
listSum [] = 0
partialSums 3 = [6,2]
sum1 3 = 6 sum2 3 = 2
incr 3 = 4 decr 3 = 2
Empezando la sesión de depuración…
1) square2 3 = 9? SI
2) square3 3 = 8? NO
3) partialSums 3 = [6,2]? NO
4) sum1 3 = 6? SI
5) sum2 3 = 2? NO
6) decr 3 = 2? SI
Error encontrado en la regla:
sum2 x = div (x + (decr x)) 2
Sesión de depuración
• Generación de AE balanceados
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
• AE completamente balanceado
Contenido
4
12
1
12
1
8 4
12
1
12
1
16
AE completamente balanceadoSe dice que un árbol de ejecución está balanceado cuando: si se detecta un nodo incorrecto en el árbol de ejecución, entonces se puede encontrar un nodo que pode la mitad del árbol de ejecución que queda por depurar
1
1234
12
1
1
1 1
1
2
3
5
4
6
2
78 24
2
1
1 1
1
16
Generación de AE balanceados
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
Proyección Colapso
• Compactación
• Cadenas
Contenido
public class Chess{
public static void main(String[] args){
Chess p = new Chess();Position tower = new Position();Position king = new Position();king.locate(5, 1);tower.locate(8, 1);p.castling(tower, king);
}void castling(Position t, Position k){
if (t.x != 8) {for(int i=1; i<=2; i++) {t.left();}for(int i=1; i<=2; i++) {k.right();}
}else {
for(int i=1; i<=3; i++) {t.right();}for(int i=1; i<=2; i++) {k.left();}
}}}
class Position{
int x, y;void locate (int a, int b) {x=a; y=b;}void up() {y=y+1;}void down() {y=y-1;}
void right() {x=x+1;}void left() {x=x-1;}}
Programa de ejemplo
p.castling(tower,king)p.castling(tower,king)
king.x=5king.y=1tower.x=8tower.y=1
king.x=3king.y=1tower.x=11tower.y=1
t.right()t.right()t.x=8t.y=1 t.right()t.right() t.right()t.right()
t.x=11t.y=1 k.left()k.left()
k.x=5k.y=1 k.left()k.left()
k.x=3k.y=1
t.x=9t.y=1
t.x=9t.y=1
t.x=10t.y=1
t.x=10t.y=1
k.x=4k.y=1
k.x=4k.y=1
Cadenas
t.right()t.right() t.right()t.right() t.right()t.right() k.left()k.left() k.left()k.left()
p.castling(tower,king)p.castling(tower,king)
t.right()t.right()t.right()
t.right()t.right()t.right()
k.left()k.left()k.left()k.left()
king.x=5king.y=1tower.x=8tower.y=1
king.x=3king.y=1tower.x=11tower.y=1
t.x=8t.y=1
t.x=9t.y=1
t.x=9t.y=1
t.x=10t.y=1
t.x=10t.y=1
t.x=11t.y=1
k.x=5k.y=1
k.x=4k.y=1
k.x=4k.y=1
k.x=3k.y=1
Proyección
t.x=8t.y=1
t.x=11t.y=1
k.x=5k.y=1
k.x=3k.y=1
p.castling(tower,king)p.castling(tower,king)
king.x=5king.y=1tower.x=8tower.y=1
king.x=3king.y=1tower.x=11tower.y=1
t.right()t.right()t.x=8t.y=1
t.x=9t.y=1 t.right()t.right()
t.x=9t.y=1
t.x=10t.y=1 t.right()t.right()
t.x=10t.y=1
t.x=11t.y=1 k.left()k.left()
k.x=5k.y=1
k.x=4k.y=1 k.left()k.left()
k.x=4k.y=1
k.x=3k.y=1
t.right()t.right()t.right()
t.right()t.right()t.right()
t.x=8t.y=1
t.x=11t.y=1
k.left()k.left()k.left()k.left()
k.x=5k.y=1
k.x=3k.y=1
Colapso
32 16
Proceso de balanceoEstrategia NB
Left to Right 8.021Heaviest First 7.875D&Q Shapiro 7.229D&Q Hirunkitti 6.792
B6.9576.8045.9785.717
Reducción (%)86.73 %86.40 %82.69 %84.18 %
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
Proyección Colapso
• Compactación
• Cadenas
Contenido
33 13
Compactación
Bosque de ejecución
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
Contenido
IntroducciónDepuración Algorítmica
Balanceo de árboles de ejecuciónAE balanceadosTres técnicas para balancear AE
DemostraciónDDJ
Conclusiones y trabajo futuro
Contenido
No colapsar o proyectar cadenas que realicen más de 5 cambios
Preguntas complejas
Posibilidad de volver al AE original
Conclusiones
No colapsar o proyectar cadenas que realicen más de 5 cambios
Preguntas complejas
Evitar preguntas innecesarias
Posibilidad de volver al AE original
Conclusiones
Benchmark
ET nodes Col./Proj.Question
sQuestions
Bal%
argparser 192 0/63 22.78 15.70 68.92 %cglib 1463 0/247 82.41 49.73 60.34 %kxml2 1445 2/277 81.61 50.90 62.37 %javassist 1499 5/148 83.84 61.00 72.76 %
No colapsar o proyectar cadenas que realicen más de 5 cambios
Preguntas complejas
Evitar preguntas innecesarias
Posibilidad de volver al AE original
Compactar subárbol en un nodo
Dividir un nodo en sub-computaciones (inversa)
Conclusiones
Trabajo futuroExperimentar con el tamaño de las cadenas
Implementar balanceado según la estructura usada en otras estrategias