03.07.2013 Views

Voorbeeld - caagt

Voorbeeld - caagt

Voorbeeld - caagt

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Gerichte acyclische<br />

grafen<br />

toepassing: toerist in Manhattan<br />

topologisch sorteren van DAG<br />

toepassing: DNA sequence alignment<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.1/71


Manhattan tourist problem<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.2/71


Toerist in Manhattan<br />

Gegeven<br />

stadsplan van Manhattan<br />

locaties van toeristische attracties<br />

toerist begint wandeling in NW hoek en gaat<br />

naar ZO hoek<br />

beweegt enkel op W→O en N→Z straten<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.3/71


Toerist in Manhattan<br />

Gegeven<br />

stadsplan van Manhattan<br />

locaties van toeristische attracties<br />

toerist begint wandeling in NW hoek en gaat<br />

naar ZO hoek<br />

beweegt enkel op W→O en N→Z straten<br />

Probleem<br />

vind een route die het meeste toeristische<br />

attracties aandoet<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.3/71


Voorstellen als graaf<br />

Gewogen gerichte acyclische graaf (DAG)<br />

toppen: kruispunten van straten<br />

bogen: straten tussen kruispunten<br />

kan getekend worden als n × m rooster<br />

booggewichten: aantal attracties op straat<br />

pijlen op bogen: enkel → en ↓<br />

acyclisch: niet mogelijk om in cirkels te<br />

wandelen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.4/71


<strong>Voorbeeld</strong><br />

3 2 4 0<br />

1 0 2 4 3<br />

3 2 4 2<br />

4 6 5 2 1<br />

0 7 3 4<br />

4 4 5 2 1<br />

3 3 0 2<br />

5 6 8 5 3<br />

1 3 2 2<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.5/71


Wandeling in Manhattan<br />

correspondeert met pad in gewogen DAG<br />

lengte van pad is som van gewichten van<br />

bogen op pad<br />

Bron en bestemming<br />

gegeven starttop en eindtop<br />

hier: NW-hoek (0, 0) en ZO-hoek (n,m)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.6/71


<strong>Voorbeeld</strong><br />

3 2 4 0<br />

0 3 5 9<br />

1 0 2 4 3<br />

3 2 4 2<br />

13<br />

4 6 5 2 1<br />

0 7 3 4<br />

15 19<br />

4 4 5 2 1<br />

3 3 0 2<br />

5 6 8 5 3<br />

1 3 2 2<br />

20<br />

23<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.7/71


Oplossen van probleem<br />

Probleem vertaalt naar<br />

bepalen van langste pad van bron (0, 0) naar<br />

bestemming (n,m) in gewogen DAG<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.8/71


Oplossen van probleem<br />

Probleem vertaalt naar<br />

bepalen van langste pad van bron (0, 0) naar<br />

bestemming (n,m) in gewogen DAG<br />

Oplossen van probleem voor n × m rooster<br />

algemener probleem oplossen<br />

bepaal langste pad van (0, 0) naar alle (i,j)<br />

met 0 ≤ i ≤ n en 0 ≤ j ≤ m<br />

notatie: si,j is lengte van pad<br />

merk op: sn,m is gewenste resultaat<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.8/71


Bepalen s0,j en sj,0<br />

3 2 4 0<br />

0 3 5 9 9<br />

1<br />

5<br />

9<br />

14<br />

1 0 2 4 3<br />

3 2 4 2<br />

4 6 5 2 1<br />

0 7 3 4<br />

4 4 5 2 1<br />

3 3 0 2<br />

5 6 8 5 3<br />

1 3 2 2<br />

geen keuze in pad<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.9/71


Bepalen s1,1<br />

3 2 4 0<br />

0 3 5 9 9<br />

1<br />

5<br />

9<br />

14<br />

1 0 2 4 3<br />

3 2 4 2<br />

4<br />

4 6 5 2 1<br />

0 7 3 4<br />

4 4 5 2 1<br />

3 3 0 2<br />

5 6 8 5 3<br />

1 3 2 2<br />

s1,1 = max( s0,1 + w (0,1),(1,1) ; s1,0 + w (1,0),(1,1) )<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.10/71


Bepalen s1,j<br />

3 2 4 0<br />

0 3 5 9 9<br />

1<br />

5<br />

9<br />

14<br />

1 0 2 4 3<br />

3 2 4 2<br />

4<br />

4 6 5 2 1<br />

0 7 3 4<br />

10<br />

4 4 5 2 1<br />

3 3 0 2<br />

14<br />

5 6 8 5 3<br />

1 3 2 2<br />

20<br />

s1,j = max( s0,j + w (0,j),(1,j) ; s1,j−1 + w (1,j−1),(1,j))<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.11/71


Bepalen s2,j<br />

3 2 4 0<br />

0 3 5 9 9<br />

1<br />

5<br />

9<br />

14<br />

1 0 2 4 3<br />

3 2 4 2<br />

4 7<br />

4 6 5 2 1<br />

0 7 3 4<br />

10 17<br />

4 4 5 2 1<br />

3 3 0 2<br />

14 22<br />

5 6 8 5 3<br />

1 3 2 2<br />

20 30<br />

s2,j = max( s1,j + w (1,j),(2,j) ; s2,j−1 + w (2,j−1),(2,j) )<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.12/71


Bepalen si,j<br />

3 2 4 0<br />

0 3 5 9 9<br />

1<br />

5<br />

9<br />

14<br />

1 0 2 4 3<br />

3 2 4 2<br />

4 7 13 15<br />

4 6 5 2 1<br />

0 7 3 4<br />

10 17 20<br />

4 4 5 2 1<br />

3 3 0 2<br />

14 22 22<br />

5 6 8 5 3<br />

1 3 2 2<br />

20 30 32<br />

si,j = max( si−1,j +w (i−1,j),(i,j) ; si,j−1+w (i,j−1),(i,j) )<br />

24<br />

25<br />

34<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.13/71


Algoritme in pseudocode<br />

Input: gewogen n × m-rooster met → en ↓ pijlen<br />

Output: lengte van langste pad (0, 0) (n,m)<br />

1: s0,0 ← 0<br />

2: for i from 1 to n do<br />

3: si,0 ← si−1,0 + w(i−1,0),(i,0)<br />

4: for j from 1 to m do<br />

5: s0,j ← s0,j−1 + w (0,j−1),(0,j)<br />

6: for i from 1 to n do<br />

7: for j from 1<br />

<br />

to m do<br />

8: si,j = max<br />

si−1,j + w (i−1,j),(i,j)<br />

si,j−1 + w (i,j−1),(i,j)<br />

9: return sn,m Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.14/71


Bepalen van langste pad<br />

3 2 4 0<br />

0 3 5 9 9<br />

1<br />

5<br />

9<br />

14<br />

1 2 4<br />

3 2<br />

4 7 13 15<br />

4 6<br />

10<br />

7 3 4<br />

17 20<br />

4 4 5 2 1<br />

14<br />

5 6 8<br />

20<br />

22<br />

30<br />

0<br />

22<br />

2 2<br />

32<br />

24<br />

25<br />

34<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.15/71


Voor algemene DAGs<br />

Algemeen<br />

graaf is geen regelmatig rooster<br />

elke top heeft pijlen naar andere toppen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.16/71


Voor algemene DAGs<br />

Algemeen<br />

graaf is geen regelmatig rooster<br />

elke top heeft pijlen naar andere toppen<br />

Definities (onderstel u → v)<br />

v is opvolger van u<br />

S(u) is verzameling van opvolgers van u<br />

uitgraad van u = |S(u)|<br />

u is voorganger van v<br />

P(v) is verzameling van voorgangers van v<br />

ingraad van v = |P(v)|<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.16/71


Bron en bestemming<br />

kunnen willekeurige toppen zijn<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.17/71


Bron en bestemming<br />

kunnen willekeurige toppen zijn<br />

Algemene formule<br />

sv = max<br />

u∈P(v) (su + wu,v)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.17/71


Bron en bestemming<br />

kunnen willekeurige toppen zijn<br />

Algemene formule<br />

sv = max<br />

u∈P(v) (su + wu,v)<br />

Belangrijk aspect<br />

volgorde waarin toppen bezocht worden<br />

wanneer v bezocht wordt, moeten al zijn<br />

voorgangers reeds berekend zijn<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.17/71


Topologische sortering van DAG<br />

Topologische sortering van DAG<br />

lineaire ordening van toppen zo dat alle pijlen<br />

voorwaarts wijzen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.18/71


Topologische sortering van DAG<br />

Topologische sortering van DAG<br />

lineaire ordening van toppen zo dat alle pijlen<br />

voorwaarts wijzen<br />

Mogelijkheden op rooster (evt. met<br />

diagonalen)<br />

rij per rij<br />

kolom per kolom<br />

diagonaal per diagonaal<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.18/71


Topologische sortering van DAG<br />

Topologische sortering van DAG<br />

lineaire ordening van toppen zo dat alle pijlen<br />

voorwaarts wijzen<br />

Mogelijkheden op rooster (evt. met<br />

diagonalen)<br />

rij per rij<br />

kolom per kolom<br />

diagonaal per diagonaal<br />

Voor een algemene DAG?<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.18/71


Ordening van rooster<br />

1 6 11 16 21<br />

2 7 12 17 22<br />

3 8 13 18 23<br />

4 9 14 19 24<br />

5 10 15 20 25<br />

1 2 3 4 5<br />

6 7 8 9 10<br />

11 12 13 14 15<br />

16 17 18 19 20<br />

21 22 23 24 25<br />

1 2 4 7 11<br />

3 5 8 12 16<br />

6 9 13 17 20<br />

10 14 18 21 23<br />

15 19 22 24 25<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.19/71


Ordening rooster met diagonalen<br />

1 6 11 16 21<br />

2 7 12 17 22<br />

3 8 13 18 23<br />

4 9 14 19 24<br />

5 10 15 20 25<br />

1 2 3 4 5<br />

6 7 8 9 10<br />

11 12 13 14 15<br />

16 17 18 19 20<br />

21 22 23 24 25<br />

1 2 4 7 11<br />

3 5 8 12 16<br />

6 9 13 17 20<br />

10 14 18 21 23<br />

15 19 22 24 25<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.20/71


Ordening van algemene DAG<br />

Bv. Batman kleedt zich ’s ochtends aan<br />

leotard<br />

boots<br />

tights<br />

shorts<br />

cape<br />

belt<br />

gloves<br />

hood<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.21/71


Ordening van algemene DAG<br />

Bv. Batman kleedt zich ’s ochtends aan<br />

leotard<br />

boots<br />

tights<br />

shorts<br />

cape<br />

belt<br />

gloves<br />

hood<br />

Topologisch sorteren: algemeen idee<br />

kies een top zonder voorgangers<br />

“verwijder” uit DAG<br />

herhaal tot alle toppen verwerkt<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.21/71


Aligneren van<br />

DNA-sequenties en<br />

editeerafstand<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.22/71


Aligneren van DNA-sequenties<br />

Bedoeling<br />

meten van “similariteit” tussen<br />

DNA-sequenties<br />

concept van “afstand” tussen DNA-seq.<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.23/71


Aligneren van DNA-sequenties<br />

Bedoeling<br />

meten van “similariteit” tussen<br />

DNA-sequenties<br />

concept van “afstand” tussen DNA-seq.<br />

Afstand tussen 2 strings in CS<br />

Maar<br />

Hamming-afstand<br />

# posities waarin ze verschillen<br />

Hamming-afstand is geen goede maat voor<br />

similariteit van DNA-sequenties<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.23/71


Similariteit van DNA-sequenties<br />

<strong>Voorbeeld</strong>: ATATAT en TATATA<br />

Hamming-afstand is 6<br />

maar zeer gelijkend wanneer gealigneerd als<br />

ATATAT-<br />

-TATATA<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.24/71


Similariteit van DNA-sequenties<br />

<strong>Voorbeeld</strong>: ATATAT en TATATA<br />

Hamming-afstand is 6<br />

maar zeer gelijkend wanneer gealigneerd als<br />

ATATAT-<br />

-TATATA<br />

<strong>Voorbeeld</strong>: ATATATAT en TATAAT<br />

gelijkenis beter getoond door alignering<br />

ATATATAT<br />

-TATA-AT<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.24/71


Editeerafstand<br />

Editeerafstand tussen 2 strings<br />

minimum # editeerbewerkingen die een string<br />

in de andere omzetten<br />

Editeerbewerkingen<br />

een symbool tussenvoegen (insertion)<br />

een symbool verwijderen (deletion)<br />

een symbool door een ander vervangen<br />

(substitution)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.25/71


<strong>Voorbeeld</strong><br />

TGCATAT en ATCCGAT<br />

kunnen gealigneerd worden als<br />

(editeerafstand ≤ 5)<br />

-TGC-ATAT<br />

ATCCGAT--<br />

+.|.+..--<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.26/71


<strong>Voorbeeld</strong><br />

TGCATAT en ATCCGAT<br />

kunnen gealigneerd worden als<br />

(editeerafstand ≤ 5)<br />

-TGC-ATAT<br />

ATCCGAT--<br />

+.|.+..--<br />

of beter gealigneerd als (editeerafstand ≤ 4)<br />

-TGCATAT<br />

ATCCG-AT<br />

+.|.|-..<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.26/71


<strong>Voorbeeld</strong><br />

TGCATAT en ATCCGAT<br />

kunnen gealigneerd worden als<br />

(editeerafstand ≤ 5)<br />

-TGC-ATAT<br />

ATCCGAT--<br />

+.|.+..--<br />

of beter gealigneerd als (editeerafstand ≤ 4)<br />

-TGCATAT<br />

ATCCG-AT<br />

+.|.|-..<br />

minimum?<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.26/71


Voorstellen van aligneringen<br />

Alignering van twee strings<br />

string v (lengte n) en string w (lengte m)<br />

tabel van 2 rijen met karakters<br />

eerste rij bevat karakters van v in volgorde<br />

tweede rij bevat karakters van w in volgorde<br />

op verscheidende plaatsen zijn spaties<br />

tussengevoegd<br />

geen enkele kolom heeft spaties in beide rijen<br />

# kolommen ≤ n + m<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.27/71


<strong>Voorbeeld</strong>: ATGTTAT en ATCGTAC<br />

A T - G T T A T -<br />

A T C G T - A - C<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.28/71


<strong>Voorbeeld</strong>: ATGTTAT en ATCGTAC<br />

A T - G T T A T -<br />

A T C G T - A - C<br />

Definities<br />

match: kolom met = karakter in beide rijen<br />

mismatch: = karakter in beide rijen<br />

indel: kolom met spaties in een rij<br />

insertion: spatie in bovenste rij<br />

deletion: spatie in onderste rij<br />

e.g. 5 matches, 0 mismatches, Cursus Grafentheorie 4 indels<br />

en Combinatorische Optimalisatie (2008–2009) – p.28/71


Stringvoorstelling van rijen<br />

als string v aangevuld met spaties<br />

e.g. AT-GTTAT- en ATCGT-A-C<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.29/71


Stringvoorstelling van rijen<br />

als string v aangevuld met spaties<br />

e.g. AT-GTTAT- en ATCGT-A-C<br />

Integervoorstelling van rijen<br />

lijst van ints die # karakters tot positie geven<br />

e.g. 122345677 en 123455667<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.29/71


Stringvoorstelling van rijen<br />

als string v aangevuld met spaties<br />

e.g. AT-GTTAT- en ATCGT-A-C<br />

Integervoorstelling van rijen<br />

lijst van ints die # karakters tot positie geven<br />

e.g. 122345677 en 123455667<br />

Tabelvoorstelling van alignering<br />

combineer integervoorstelling van rijen<br />

e.g. <br />

1 2 2 3 4 5 6 7 7<br />

1 2 3 4 5 5 6 6 7<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.29/71


Interpretatie van tabelvoorstelling<br />

elke kolom is coördinaat in n × m rooster<br />

alignering is pad van (0, 0) naar (n,m)<br />

e.g. (0, 0) → (1, 1) → (2, 2) → (2, 3) → (3, 4)<br />

→ (4, 5) → (5, 5) → (6, 7) → (7, 6) → (7, 7)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.30/71


Interpretatie van tabelvoorstelling<br />

elke kolom is coördinaat in n × m rooster<br />

alignering is pad van (0, 0) naar (n,m)<br />

e.g. (0, 0) → (1, 1) → (2, 2) → (2, 3) → (3, 4)<br />

→ (4, 5) → (5, 5) → (6, 7) → (7, 6) → (7, 7)<br />

Merk op<br />

rooster cfr. toerist in Manhattan<br />

maar kunnen ook langs diagonaal bewegen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.30/71


<strong>Voorbeeld</strong> van alignering<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

0 1 2 3 4 5 6 7<br />

(0, 0) → (1, 1) → (2, 2) → (2, 3) → (3, 4) →<br />

(4, 5) → (5, 5) → (6, 7) → (7, 6) → (7, 7)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.31/71


Editeergraaf<br />

Editeergraaf<br />

n × m rooster met →, ↓, ց pijlen<br />

Pad in editeergraaf<br />

correspondeert met alignering<br />

boog kolom in tabelvoorstelling van<br />

alignering<br />

ց correspondeert met vi<br />

wj<br />

→ correspondeert met −<br />

wj<br />

↓ correspondeert met vi<br />

−<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.32/71


<strong>Voorbeeld</strong> van alignering<br />

0 1 2 2 3 4 5 6 7 7<br />

v = A T - G T T A T -<br />

| | | | |<br />

w = A T C G T - A - C<br />

0 1 2 3 4 5 5 6 6 7<br />

ց ց → ց ց ↓ ց ↓ →<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.33/71


Hoe de editeergraaf gebruiken<br />

Scorefunctie<br />

gebruikt voor inschatten waarde alignering<br />

gewenst: hoge waarden voor aligneringen<br />

met meer matchings<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.34/71


Hoe de editeergraaf gebruiken<br />

Scorefunctie<br />

gebruikt voor inschatten waarde alignering<br />

gewenst: hoge waarden voor aligneringen<br />

met meer matchings<br />

<strong>Voorbeeld</strong><br />

score voor kolom in alignering:<br />

positief getal voor = karakters<br />

negatief getal voor = karakters<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.34/71


Hoe de editeergraaf gebruiken<br />

Scorefunctie<br />

gebruikt voor inschatten waarde alignering<br />

gewenst: hoge waarden voor aligneringen<br />

met meer matchings<br />

<strong>Voorbeeld</strong><br />

score voor kolom in alignering:<br />

positief getal voor = karakters<br />

negatief getal voor = karakters<br />

score voor alignering:<br />

som van scores van kolommen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.34/71


Opstellen van scoreschema<br />

gewichten aan bogen in graaf geven<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.35/71


Opstellen van scoreschema<br />

gewichten aan bogen in graaf geven<br />

Verschillende scorefuncties<br />

gebruikt voor verschillende<br />

aligneringsproblemen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.35/71


Opstellen van scoreschema<br />

gewichten aan bogen in graaf geven<br />

Verschillende scorefuncties<br />

gebruikt voor verschillende<br />

aligneringsproblemen<br />

<strong>Voorbeeld</strong><br />

+1 voor match, 0 anders<br />

probleem is bepalen van langste<br />

gemeenschappelijk deelsequentie<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.35/71


Langste<br />

gemeenschappelijke<br />

deelsequenties (LCS)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.36/71


Deelsequenties<br />

Deelsequentie van string v<br />

(geordende) sequentie van karakters (niet<br />

noodzakelijke opeenvolgend) uit v<br />

<strong>Voorbeeld</strong>: v = ATTGCTA<br />

AGCA en ATTA zijn deelsequenties van v<br />

TGTT en TCG zijn dat niet<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.37/71


Deelsequenties<br />

Deelsequentie van string v<br />

(geordende) sequentie van karakters (niet<br />

noodzakelijke opeenvolgend) uit v<br />

<strong>Voorbeeld</strong>: v = ATTGCTA<br />

AGCA en ATTA zijn deelsequenties van v<br />

TGTT en TCG zijn dat niet<br />

Merk op<br />

deelsequenties = deelstring<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.37/71


Gemeenschappelijke deelsequenties<br />

Gemeenschappelijke deelseq. van v en w<br />

deelsequentie van zowel v als w<br />

<strong>Voorbeeld</strong>: v = ATCTGAT en w = TGCATA<br />

TCTA is gemeenschappelijk aan v en w<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.38/71


Gemeenschappelijke deelsequenties<br />

Gemeenschappelijke deelseq. van v en w<br />

deelsequentie van zowel v als w<br />

<strong>Voorbeeld</strong>: v = ATCTGAT en w = TGCATA<br />

TCTA is gemeenschappelijk aan v en w<br />

Formele definitie<br />

posities 1 ≤ i1 ≤ · · · ≤ ik ≤ n in v = v1 ...vn<br />

pos. 1 ≤ j1 ≤ · · · ≤ jk ≤ m in w = w1 ...wm<br />

zo dat vit<br />

= wjt voor alle 1 ≤ t ≤ k<br />

i.e. symbolen op corresponderende posities<br />

zijn gelijk Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.38/71


Langste gemeenschapp. deelseq.<br />

Probleem: gegeven twee strings v en w<br />

van alle gemeenschappelijke deelsequenties<br />

van v en w, bepaal langste<br />

gemeenschappelijke deelsequentie (LCS)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.39/71


Langste gemeenschapp. deelseq.<br />

Probleem: gegeven twee strings v en w<br />

van alle gemeenschappelijke deelsequenties<br />

van v en w, bepaal langste<br />

gemeenschappelijke deelsequentie (LCS)<br />

Eigenschap<br />

zij s(v,w) lengte van LCS<br />

zij d(v,w) editeerafstand tussen v en w<br />

ond. enkel insertions en deletions<br />

toegelaten<br />

i.e. # indels nodig om v in w om te zetten<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.39/71<br />

dan d(v,w) = n + m − 2s(v,w)


<strong>Voorbeeld</strong><br />

ATCTGAT en TGCATA<br />

kan gealigneerd worden als<br />

AT-C-TGAT<br />

-TGCAT-A-<br />

editeerafstand is (hoogstens) 5<br />

lenge van LCS is (7 + 6 − 5)/2 = 4<br />

LCS van lengte 4 is TCTA<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.40/71


LCS als aligneringsprobleem<br />

Dus<br />

LCS is te beschouwen als<br />

aligneringsprobleem van sequenties<br />

enkel insertions en deletions toegelaten<br />

substitution is niet toegelaten<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.41/71


LCS als aligneringsprobleem<br />

Dus<br />

LCS is te beschouwen als<br />

aligneringsprobleem van sequenties<br />

enkel insertions en deletions toegelaten<br />

substitution is niet toegelaten<br />

Corresponderende editeergraaf<br />

heeft → en ↓ bogen<br />

heeft ց bogen voor symbolen die matchen<br />

i.e. ց bogen voor niet-matchende symbolen<br />

zijn verwijderd<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.41/71


<strong>Voorbeeld</strong><br />

Bepaal LCS van TGCATA en ATCTGAT<br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

T G C A T A<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.42/71


LCS als aligneringsprobleem<br />

Booggewichten in editeergraaf<br />

→ en ↓ bogen krijgen gewicht 0<br />

ց bogen krijgen gewicht +1<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.43/71


LCS als aligneringsprobleem<br />

Booggewichten in editeergraaf<br />

Dan<br />

→ en ↓ bogen krijgen gewicht 0<br />

ց bogen krijgen gewicht +1<br />

LCS-probleem is bepalen van langste pad in<br />

editeergraaf<br />

gebruiken techniek van dynamisch<br />

programmeren<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.43/71


LCS als DP-probleem<br />

Notatie<br />

si,j = lengte van LCS tussen prefixen v1 · · ·vi<br />

en w1 · · · wj<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.44/71


LCS als DP-probleem<br />

Notatie<br />

si,j = lengte van LCS tussen prefixen v1 · · ·vi<br />

en w1 · · · wj<br />

Eerste rij en kolom<br />

s0,j = 0 voor alle 1 ≤ j ≤ m<br />

si,0 = 0 voor alle 1 ≤ i ≤ n<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.44/71


<strong>Voorbeeld</strong><br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.45/71


<strong>Voorbeeld</strong><br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0 0 0 1 1<br />

0<br />

1<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.46/71


<strong>Voorbeeld</strong><br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0 0 0 1 1<br />

1 1 1 1 2 2<br />

0<br />

1<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.47/71


<strong>Voorbeeld</strong><br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0 0 0 1 1<br />

1 1 1 1 2 2<br />

1 1 2 2 2 2<br />

0<br />

1<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.48/71


LCS als DP-probleem<br />

Algemene formule<br />

als vi = wj dan<br />

si,j = max<br />

<br />

als vi = wj dan<br />

⎧<br />

⎪⎨<br />

si,j = max<br />

⎪⎩<br />

si−1,j<br />

si,j−1<br />

si−1,j<br />

si,j−1<br />

si−1,j−1 + 1<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.49/71


LCS als DP-probleem<br />

Merk op<br />

si−1,j<br />

deletion van vi<br />

vi komt niet voor in LCS van i-prefix van v<br />

si,j−1<br />

insertion van wj<br />

wj komt niet voor in LCS van j-prefix van w<br />

si−1,j−1 + 1<br />

match van vi en wj<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.50/71


Algoritme in pseudocode<br />

Input: strings v en w van lengte n en m<br />

Output: s(v,w)<br />

1: for i from 0 to n do<br />

2: si,0 ← 0<br />

3: for j from 0 to m do<br />

4: s0,j ← 0<br />

5: for i from 1 to n do<br />

6: for j from 1 to m do<br />

7: if vi = wj then<br />

8: si,j ← max(si−1,j;si,j−1;si−1,j−1 + 1)<br />

9: else<br />

10: si,j ← max(si−1,j;si,j−1)<br />

11: return sn,m<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.51/71


<strong>Voorbeeld</strong><br />

Volledige DP-tabel: s(v,w) = 4<br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0 0 0 1 1<br />

1 1 1 1 2 2<br />

1 1 2 2 2 2<br />

1<br />

1<br />

1<br />

1<br />

1<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

3<br />

3<br />

3<br />

3<br />

3<br />

4<br />

0<br />

1<br />

3<br />

3<br />

4<br />

4<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.52/71


Bepalen van LCS<br />

Om LCS uit DP-tabel te reconstrueren<br />

opslaan van backtrack pointers bi,j<br />

houden bij welke van si−1,j;si,j−1;si−1,j−1 + 1<br />

tot si,j leidt<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.53/71


Bepalen van LCS<br />

Om LCS uit DP-tabel te reconstrueren<br />

Dus<br />

opslaan van backtrack pointers bi,j<br />

houden bij welke van si−1,j;si,j−1;si−1,j−1 + 1<br />

tot si,j leidt<br />

als si,j = si−1,j dan bi,j =←<br />

als si,j = si,j−1 dan bi,j =↑<br />

als si,j = si−1,j−1 + 1 dan bi,j =տ<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.53/71


<strong>Voorbeeld</strong><br />

Een langste pad: LCS is TCTA<br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0 0 0 1 1<br />

1 1 1 1 2 2<br />

1 1 2 2 2 2<br />

1<br />

1<br />

1<br />

1<br />

1<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

3<br />

3<br />

3<br />

3<br />

3<br />

4<br />

0<br />

1<br />

3<br />

3<br />

4<br />

4<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.54/71


<strong>Voorbeeld</strong><br />

Een ander langste pad: LCS is TGAT<br />

A<br />

T<br />

C<br />

T<br />

G<br />

A<br />

T<br />

0 0 0 0 0 0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

T G C A T A<br />

0 0 0 1 1<br />

1 1 1 1 2 2<br />

1 1 2 2 2 2<br />

1<br />

1<br />

1<br />

1<br />

1<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

3<br />

3<br />

3<br />

3<br />

3<br />

4<br />

0<br />

1<br />

3<br />

3<br />

4<br />

4<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.55/71


Complexiteit<br />

Tijdscomplexiteit<br />

berekenen van s(v,w) kost Θ(nm) tijd<br />

reconstrueren van LCS kost Θ(n + m) tijd<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.56/71


Complexiteit<br />

Tijdscomplexiteit<br />

berekenen van s(v,w) kost Θ(nm) tijd<br />

reconstrueren van LCS kost Θ(n + m) tijd<br />

Geheugencomplexiteit<br />

DP-tabel kost Θ(nm) geheugen<br />

tabel met backtrack pointers kost Θ(nm)<br />

geheugen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.56/71


Globaal aligneren van<br />

sequenties<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.57/71


Opmerking<br />

Merk op<br />

LCS is aligneringsprobleem met beperkte<br />

scorefunctie<br />

score 1 voor matches<br />

score 0 voor indels<br />

Proberen scorefunctie te veralgemenen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.58/71


Globaal aligneren van sequenties<br />

Scorematrix δ<br />

een (k + 1) × (k + 1) matrix<br />

met k grootte van alfabet (bv. 4 voor DNA)<br />

δ(x,y) = score van x<br />

y in alignering<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.59/71


Globaal aligneren van sequenties<br />

Scorematrix δ<br />

een (k + 1) × (k + 1) matrix<br />

met k grootte van alfabet (bv. 4 voor DNA)<br />

δ(x,y) = score van x<br />

y in alignering<br />

<strong>Voorbeeld</strong>: meestal gebruikt<br />

−µ voor mismatch, −σ voor indel, +1 voor<br />

match<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.59/71


Globaal aligneren van sequenties<br />

Scorematrix δ<br />

een (k + 1) × (k + 1) matrix<br />

met k grootte van alfabet (bv. 4 voor DNA)<br />

δ(x,y) = score van x<br />

y in alignering<br />

<strong>Voorbeeld</strong>: meestal gebruikt<br />

−µ voor mismatch, −σ voor indel, +1 voor<br />

match<br />

Score van alignering<br />

som van scores van de kolommen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.59/71


Probleem van globale alignering<br />

Input<br />

twee strings v en w<br />

scorematrix δ<br />

Output<br />

een alignering van v en w zo dat score (zoals<br />

gedefinieerd door δ) maximum is van alle<br />

mogelijke aligneringen van v en w<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.60/71


Recurrente betrekking<br />

Notatie si,j<br />

score van alignering van i-prefix van v met<br />

j-prefix van w<br />

Recurrente betrekking voor si,j<br />

si,j = max<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

si−1,j + δ(vi, −)<br />

si,j−1 + δ(−,wj)<br />

si−1,j−1 + δ(vi,wj)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.61/71


<strong>Voorbeeld</strong><br />

Scores<br />

−µ voor mismatch, −σ voor indel, +1 voor<br />

match<br />

Resulterende score<br />

= #matches−µ×# mismatches−σ ×# indels<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.62/71


<strong>Voorbeeld</strong><br />

Scores<br />

−µ voor mismatch, −σ voor indel, +1 voor<br />

match<br />

Resulterende score<br />

= #matches−µ×# mismatches−σ ×# indels<br />

Recurrente betrekking herschreven<br />

⎧<br />

si−1,j − σ<br />

⎪⎨<br />

si,j−1 − σ<br />

si,j = max<br />

si−1,j−1 − µ if vi = wi<br />

⎪⎩<br />

si−1,j−1 + 1 if vi = wi<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.62/71


Opmerkingen<br />

LCS als probleem van globaal aligneren<br />

µ = ∞,σ = 0<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.63/71


Opmerkingen<br />

LCS als probleem van globaal aligneren<br />

µ = ∞,σ = 0<br />

Scorematrices<br />

voor DNA-sequenties dikwijls gebruikt<br />

µ als kost voor mismatch<br />

σ als kost voor indel<br />

ingewikkelder voor andere<br />

aligneringsproblemen<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.63/71


Lokaal aligneren van<br />

sequenties<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.64/71


Opmerking<br />

Globaal aligneren van sequenties<br />

zoekt gelijkenis tussen volledige strings<br />

nuttig wanneer gelijkenis betrekking heeft op<br />

volledige lengte van strings<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.65/71


Opmerking<br />

Globaal aligneren van sequenties<br />

zoekt gelijkenis tussen volledige strings<br />

nuttig wanneer gelijkenis betrekking heeft op<br />

volledige lengte van strings<br />

Maar in vele toepassingen<br />

score van alignering tussen twee deelstrings<br />

van v en w zou kunnen groter zijn dan score<br />

van alignering tussen volledige v en w<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.65/71


Opmerking<br />

Globaal aligneren van sequenties<br />

zoekt gelijkenis tussen volledige strings<br />

nuttig wanneer gelijkenis betrekking heeft op<br />

volledige lengte van strings<br />

Maar in vele toepassingen<br />

score van alignering tussen twee deelstrings<br />

van v en w zou kunnen groter zijn dan score<br />

van alignering tussen volledige v en w<br />

Probleem<br />

bepalen van dergelijke alignering van<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.65/71<br />

deelstrings


<strong>Voorbeeld</strong><br />

Strings zijn<br />

TCCCAGTTATGTCAGGGGACACGAGCATGCAGAGAC<br />

AATTGCCGCCGTCGTTTTCAGCAGTTATGTCAGATC<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.66/71


<strong>Voorbeeld</strong><br />

Strings zijn<br />

TCCCAGTTATGTCAGGGGACACGAGCATGCAGAGAC<br />

AATTGCCGCCGTCGTTTTCAGCAGTTATGTCAGATC<br />

Globale alignering<br />

--T--CC-C-AGT--TATGT-CAGGGGACACG--A-GCATGCAGA-GAC<br />

..|..||.|..||..|.|.|.|||....||.|..|.|..|.||||...|<br />

AATTGCCGCC-GTCGT-T-TTCAG----CA-GTTATG--T-CAGAT--C<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.66/71


<strong>Voorbeeld</strong><br />

Strings zijn<br />

TCCCAGTTATGTCAGGGGACACGAGCATGCAGAGAC<br />

AATTGCCGCCGTCGTTTTCAGCAGTTATGTCAGATC<br />

Globale alignering<br />

--T--CC-C-AGT--TATGT-CAGGGGACACG--A-GCATGCAGA-GAC<br />

..|..||.|..||..|.|.|.|||....||.|..|.|..|.||||...|<br />

AATTGCCGCC-GTCGT-T-TTCAG----CA-GTTATG--T-CAGAT--C<br />

Lokale alignering<br />

------------------tccCAGTTATGTCAGgggacacgagcatgcagagac<br />

.....................||||||||||||.....................<br />

aattgccgccgtcgttttcagCAGTTATGTCAGatc------------------<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.66/71


Probleem van lokaal aligneren<br />

Input<br />

twee strings v en w<br />

scorematrix δ<br />

Output<br />

deelstrings van v en w zo dat globale<br />

alignering, gedefinieerd door δ, maximum is<br />

van alle globale aligneringen van deelstrings<br />

van v en w<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.67/71


Probleem van lokaal aligneren<br />

Input<br />

twee strings v en w<br />

scorematrix δ<br />

Output<br />

deelstrings van v en w zo dat globale<br />

alignering, gedefinieerd door δ, maximum is<br />

van alle globale aligneringen van deelstrings<br />

van v en w<br />

Opmerking<br />

schijnt veel gecompliceerder dan globale<br />

alignering te zijn<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.67/71


Observatie<br />

Globale alignering correspondeert met<br />

bepalen van langste pad in editeergraaf<br />

tussen (0, 0) en (n,m)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.68/71


Observatie<br />

Globale alignering correspondeert met<br />

bepalen van langste pad in editeergraaf<br />

tussen (0, 0) en (n,m)<br />

Lokale alignering correspondeert met<br />

bepalen van langste pad in editeergraaf<br />

tussen willekeurige toppen (i,j) en (i ′ ,j ′ )<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.68/71


Observatie<br />

Globale alignering correspondeert met<br />

bepalen van langste pad in editeergraaf<br />

tussen (0, 0) en (n,m)<br />

Lokale alignering correspondeert met<br />

Maar<br />

bepalen van langste pad in editeergraaf<br />

tussen willekeurige toppen (i,j) en (i ′ ,j ′ )<br />

DP-oplossing voor globale alignering bepaalt<br />

langste pad tussen (0, 0) en elke (i,j) in<br />

editeergraaf<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.68/71


Oplossen van lokale alignering<br />

Eenvoudige, maar inefficiënte benadering<br />

voor alle paren toppen (i,j) en (i ′ ,j ′ )<br />

bepalen langste pad tussen (i,j) en (i ′ ,j ′ )<br />

bijhouden wat uiteindelijke langste pad is<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.69/71


Oplossen van lokale alignering<br />

Eenvoudige, maar inefficiënte benadering<br />

voor alle paren toppen (i,j) en (i ′ ,j ′ )<br />

bepalen langste pad tussen (i,j) en (i ′ ,j ′ )<br />

bijhouden wat uiteindelijke langste pad is<br />

Efficiënter (Smith-Waterman, 1981)<br />

toevoegen boog met gewicht 0 van (0, 0) naar<br />

elke (i,j)<br />

voor alle toppen (i,j)<br />

bepalen langste pad van (0, 0) naar (i,j)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.69/71


Recurrentie voor lokale alignering<br />

Recurrente betrekking<br />

⎧<br />

0<br />

⎪⎨<br />

si−1,j + δ(vi, −)<br />

si,j = max<br />

si,j−1 + δ(−,wj)<br />

⎪⎩<br />

si−1,j−1 + δ(vi,wj)<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.70/71


Opmerking<br />

Algemenere aligneringsproblemen, e.g.<br />

alignering met gap penalties<br />

meervoudige alignering<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.71/71


Opmerking<br />

Algemenere aligneringsproblemen, e.g.<br />

alignering met gap penalties<br />

meervoudige alignering<br />

Manier van oplossen<br />

opstellen van geschikte recurrente betrekking<br />

gebruiken dynamisch programmeren<br />

Cursus Grafentheorie en Combinatorische Optimalisatie (2008–2009) – p.71/71

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!