Zastosowanie CP-grafów do generacji siatek

Transkrypt

Zastosowanie CP-grafów do generacji siatek
Zastosowanie CP-grafów do generacji siatek
1 Cel zajęć
Celem zajęć jest praktyczne zaznajomienie się z pojęciem CP-grafu i gramatyk grafowych,
przy pomocy których można je tworzyć i nimi manipulować. Jako przykład wykorzystamy
zaprezentowane na wykładzie generowanie siatek 2D dla metody elementów skończonych.
2 CP-grafy – przypomnienie
Precyzyjne definicje CP-grafu oraz jego gramatyki grafowej (CP-graph grammar) znaleźć
można w wykładzie. CP-graf składa się, jak każdy graf, z wierzchołków i krawędzi
pomiędzy nimi. Wierzchołki i krawędzie mają swoje etykiety. Etykiety nie muszą być
unikalne, różne wierzchołki/krawędzie mogą mieć takie same etykiety.
Istotną różnicą jest szczególna rola „wiązań” (bonds). Krawędź wchodząca/wychodząca
z danego wierzchołka v jest skojarzona z pewnym wiązaniem. Z każdym wiązaniem może
być skojarzona co najwyżej jedna krawędź (ale nie musi – wiązanie może być wolne).
Wiązania mają swoje identyfikatory, które pełnią istotną rolę w gramatykach.
Gramatyka CP-grafowa składa się z grafu początkowego oraz zbioru produkcji. Produkcja to (w przybliżeniu) reguła postaci L → R, gdzie L i R to pewne CP-grafy. Aplikacja
takiej reguły do CP-grafu G polega intuicyjnie na zamienieniu wystąpienia L w G (jako
podgrafu) na R. Dodatkowo wymagamy, by obie strony produkcji gramatyki posiadały
taką samą liczbę wiązań wolnych. Dzięki temu aplikacja produkcji zachowuje „interfejs”
CP-grafu (ilość jego wiązań wolnych).
Aplikacja reguły zazwyczaj nie jest wyznaczona unikalnie, mamy dwa podstawowe
problemy (niejasności):
• („globalna”) L może występować w G w wielu egzemplarzach
• („lokalna”) wystąpienie L jest zazwyczaj połączone krawędziami z resztą G (połączenia te występują jako wiązania wolne w L), trzeba jakoś je „przepiąć” do R,
każda permutacja wolnych wiązań jest a priori możliwa
Pierwszy rodzaj niejasności nie jest w praktyce szczególnym problemem, drugi rozwiązujemy wprowadzając do produkcji dodatkową informację – odwzorowanie bijektywne
pomiędzy wiązaniami wolnymi obu stron produkcji. W praktyce nadajemy wiązaniom
wolnym dodatkowe etykiety (niezależne od tych, które mają same z siebie w grafie).
1
3 GraphTool
Aplikacja GraphTool ma problem z wyciekiem obiektów WinGDI. Co jakiś czas
konieczne jest jej zrestartowanie. Pomocne w wyznaczeniu tych momentów może
być uruchomienie taskmanagera, dodanie w nim kolumny z ilością obiektów GDI i
monitorowanie jej (limit to 10000).
Do tworzenia gramatyk dla CP-grafów wykorzystamy narzędzie GraphTool. Na początku konieczne jest stworzenie nowego projektu (GraphTool Project). Jako rodzaj grafu
wybieramy CP-graf z nieskierowanymi krawędziami (rys. 1).
Rysunek 1: Opcje projektu
Rozpoczniemy od stworzenia produkcji P1
Rysunek 2: P1
Aby dodać nową produkcję, należy wybrać z menu kontekstowego folderu productions
opcję New -> Production.
2
Rysunek 3: Dodawanie produkcji
W wyniku tej akcji znajdziemy się w widoku edytora produkcji. Jego dwa obszary reprezentują obie strony produkcji. Aby dodać wierzchołek należy przeciągnąć z menu (rys. 4)
CP Non-terminal node do wybranego obszaru. Przy tworzeniu wierzchołka podać trzeba
jego nazwę i ilość wiązań, ale obie te rzeczy można potem zmienić. Wierzchołki można
przemieszczać przeciągając je kursorem, można także manipulować ich rozmiarem. Przytrzymanie klawisza Shift gwarantuje skalowanie proporcjonalne w obu wymiarach. Zaznaczywszy kilka wierzchołków można skalować je jednocześnie (przyda się później, bo
domyślnie wierzchołki są dość małe i nie będzie widać etykiet).
Po lewej stronie potrzebujemy jednego wierzchołka o nazwie S bez żadnych wiązań,
po prawej zaś dwa wierzchołki o nazwach Iel1 oraz y1, oba z jednym wiązaniem. Aby
połączyć Iel1 z y1 należy użyć narzędzia zaznaczonego na rys. 4.
Rysunek 4: Menu edytora produkcji (zaznaczone narzędzie do tworzenia krawędzi)
Domyślnie pierwsze wiązanie jest zawsze wizualnie po prawej stronie wierzchołka.
Można to zmienić obracając wierzchołek – opcja Rotate w menu kontekstowym, obrót o
180◦ spowoduje, że wiązania obu wierzchołków będą skierowane ku sobie.
3.1 Uruchamianie produkcji
Stworzyliśmy pierwszą produkcję, dobrze byłoby zobaczyć jej działanie „w akcji”. GraphTool
wymaga od nas uprzedniego zdefiniowania kolejności (ścieżki), w jakiej można aplikować
3
produkcje. Edytując plik grammar.diagram możemy zdefiniować graf określający możliwą
kolejnośc wykonywania produkcji. Domyślnie znajdują się w nim dwa wierzchołki, reprezentujące początek i koniec przetwarzania. Dodajmy pomiędzy nimi produkcję P1 (rys. 5).
Rysunek 5: Graf wykonania produkcji
Aby móc uruchomić produkcje, musimy zdefiniować jeszcze graf początkowy. W tym
celu stworzyć należy nowy graf (graphs -> New -> Graph editor), identyczny z lewą
stroną naszej produkcji (zgadzać musi się nazwa wierzchołka).
W przeciwieństwie do edytora produkcji, narzędzia do tworzenia wierzchołków są w
osobnym widoku – Palette. Uaktywnić można go poprzez Window -> Show view -> Other
-> Palette.
Aby uruchomić produkcje, wybrać należy Run configurations i stworzyć nową konfigurację opartą o Graph derivation, podając odpowiedni projekt i stworzony przed
momentem graf początkowy. Po lewej stronie mamy graf wykonania z zaszarzonym
wierzchołkiem odpowiadającym miejscu, w którym wykonanie się znajduje, po prawej
zaś graf przekształcany gramatyką (obecnie graf początkowy). Pod spodem znajdują
się przyciski pozwalające wybrać produkcję do wykonania. Po wykonaniu produkcji P1
naszym oczom ukazać winien się mniej więcej taki widok:
4
Rysunek 6: Graf po P1
3.2 Kolejne produkcje
Kontynuujemy dodając nowe produkcje, zaczynając od P2 (rys. 7). W tej produkcji mamy
wolne wiązania – należy nadać im specjalne etykiety (GraphTool nazywa je free name).
Ustawić można je w tym samym miejscu, co nazwę – w panelu atrybutów wierzchołka
(zakładka „Bonds”). Konkretna nazwa jest nieważna, natomiast musi być identycnza dla
wiązań po obu stronach. Bez tego (bez nadania tych etykiet lub po nadaniu różnych)
GraphTool sygnalizuje błąd.
Rysunek 7: P2
Dodanie P2 po P1 oraz wykonanie obu produkcji daje efekt jak na rys. 8.
Rysunek 8: Graf po P2
3.3 Produkcja PII
Kolejna produkcja to PII, przedstawiona na rys. 9. Tworzy ona strukturę siatki dla
pojedynczego elementu siatki.
Nie zawiera ona bardziej złożonych mechanizmów, niż poprzednie produkcje, natomiast
jest znacznie od nich bardziej obszerna. Ponadto, w następnym kroku wykorzystywać
będziemy część struktury, którą tworzy. Z tych względów dobrym pomysłem wydaje się
podejście do jej tworzenia w sposób nieco bardziej zorganizowany.
5
Rysunek 9: PII
W szczególności warto rozważyć nadanie nazw wiązaniom występujących w niej wierzchołków (domyślnie są to kolejne liczby naturalne). Można np. nazwać wiązania w iel
analogicznie do krawędzi – kierunkami geograficznymi (rys. 10).
Rysunek 10: Implementacja produkcji PII
Ponadto, należy nadać nazwy krawędziom od iel do 8 skrajnych wierzchołkow (jak na
schemacie 9). Efekt końcowy powinien wyglądać mniej więcej jak na rys. 14.
6
Rysunek 11: Implementacja produkcji PII
Po pojedynczym zastosowaniu produkcji PII dostajemy graf przedstawiony na rys. 12.
Kolejne zastosowanie PII zamienia drugie wystąpienie Iel1 na graf reprezentujący element
siatki.
Uwaga:
• Może się zdarzyć, że graf dla drugiego wystąpienia Iel1 nałoży się całkiem na ten
pierwszy
• Z niewyjaśnionych powodów czasem GraphTool zdaje się mieć problem ze znalezieniem drugiego wystąpienia Iel1. Warto wtedy spróbować uruchamiać generację
grafu kilkukrotnie, jest spora szansa że za którymś razem zastosowanie produkcji
się powiedzie.
7
Rysunek 12: Graf po zastosowaniu produkcji PII
3.4 Produkcja PIC
Do zaimplementowania pozostaje ostatnia produkcja – PIC (rys. 13).
Rysunek 13: PIC
Po lewej stronie należy odtworzyć fragment grafu dwóch sąsiednich elementów. Pamiętać
należy o odpowiedniej ilości i zgodnych nazwach wiązań wolnych w iel oraz F, jak
również o zgodności struktury (nazw wierzchołków, wiązań, krawędzi) z tą zdefiniowaną
w produkcji PII.
8
Rysunek 14: Implementacja produkcji PIC
9