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