Teknillinen Korkeakoulu T-76.115 Tietojenkäsittelyopin ohjelmatyö Lineaaristen rajoitteiden tyydyttämistehtävän ratkaisija L models Tekninen määrittely Ryhmä Rajoitteiset Versio Päivämäärä Tekijä Muutokset 0.1 17.10.2003 Tuomas Luttinen Ensimmäinen alustava versio. 0.2 22.10.2003 Tuomas Luttinen Enemmän sisältöä rungon päälle. Tätä iteraatiota koskemattomat otsikot on poistettu. 0.3 23.10.2003 Tuomas Luttinen Lisäys translaattorin toiminnan kuvaukseen: semanttinen analyysi, hylätyt ratkaisut mukaan. 0.4 24.10.2003 Tuomas Luttinen Palautteiden perusteella uuteen pohjaan muokattu versio. 1.0 26.10.2003 Jouni Karppinen & Mitro Kuha Dokumentti tarkastettu ja korjattu palautusta varten.
Sisällysluettelo 1 Johdanto... 1 1.1 Dokumentin tarkoitus ja kattavuus... 1 1.2 Tuote ja ympäristö... 1 1.3 Termit ja määritelmät... 1 2 Järjestelmän yleiskuvaus... 2 2.1 Sovellusalueen kuvaus... 2 2.2 Järjestelmän liittyminen ympäristöönsä... 2 2.3 Laitteistoympäristö... 2 2.4 Ohjelmistoympäristö... 2 2.5 Toteutuksen keskeiset reunaehdot... 3 3 Arkkitehtuurin kuvaus... 3 3.1 Suunnitteluperiaatteet... 3 3.2 Ohjelmistoarkkitehtuuri... 3 4 Moduulikuvaukset... 4 4.1 Translaattori... 4 4.2 Linearisaattori... 5 4.3 Ratkaisija... 5 5 Hylätyt ratkaisut... 5 5.1 Kääntäjän tuottamistyökalut... 5 5.2 Lineaarinen ratkaisija... 5
1 Johdanto 1.1 Dokumentin tarkoitus ja kattavuus Tämä dokumentti on Teknillisen Korkeakoulun kurssille T-76.115 Tietojenkäsittelyopin ohjelmatyö harjoitustyönä tehtävän lineaaristen rajoitteiden tyydyttämistehtävän ratkaisijan tekninen määrittely. Dokumentin ensisijainen tarkoitus on määrittää ja kuvata vaatimusmäärittelyssä esitettyjen toiminnallisuuksien tekninen toteutustapa ja toisekseen täydentää toiminnallista määrittelyä teknisestä näkökulmasta. Näin ollen dokumentti on suunnattu järjestelmän toteuttajille. Toisaalta se on tarkoitettu myös asiakkaan ja kurssin henkilökunnan arvioitavaksi. 1.2 Tuote ja ympäristö Tuotteen nimi on Lmodels, joka on lineaaristen rajoitteiden tyydyttämistehtävän ratkaisija. Tuote tulee toimimaan verkkoyhteyden tarjoavassa tietokoneessa, jossa on Javavirtuaalikone. 1.3 Termit ja määritelmät Seuraavassa taulukossa on selitetty lyhyesti erikoistermistö, jota käytetään tämän asiakirjan eri kohdissa. Vaatimusmäärittelyssä esitettyjen termien ja määritelmien oletetaan olevan tuttuja lukijalle. Termi GLPK Java-virtuaalikone Jäsennyspuu Jäsentäjä lp_solve LP-kieli Määrittely (GNU Linear Programming Kit) GNU-lisenssin alla jaettava lineaaristen ongelmien ratkaisija. Käännettyä Java-koodia sisällään ajava prosessi, joka tarjoaa Java-sovellukselle kielen vaatimat palvelut, kuten roskankeruun. Eri alustoille tehdyt virtuaalikoneet mahdollistavat Javasovellusten ajamisen eri ympäristöissä. Kielen terminaaleista ja nonterminaaleista muodostuva tietorakenne, jossa nonterminaalit sisältävät toisia nonterminaaleja ja puun lehdiksi jääviä terminaaleja. Muodostaa terminaaleista kielen kieliopin perusteella nonterminaaleja, jotka sisältävät nonterminaalin määrittelevän operaattorin ja operandit. Javalla toteutettu lineaaristen ongelmien ratkaisija. Lineaaristen mallien määrittelyyn käytettävä kieli, jota esim. GLPK ja lp_solve hyväksyvät syötteenään. Open Source Ohjelmistoja, joiden lähdekoodi on vapaasti saatavilla ja muokattavissa ja jotka ovat muokattuinekin lähdekoodeineen vapaasti käytettävissä ja eteenpäin levitettävissä. 1
Termi RMI-rajapinta Määrittely (Remote Method Invocation) Tämän rajapinnan avulla yhdessä Java-virtuaalikoneessa sijaitseva olio voi kutsua toisessa virtuaalikoneessa sijaitsevan olion metodia. Virtuaalikoneet voivat sijaita vaikka fyysisesti eri koneissa. Selain Muodostaa tekstipohjaisesta syötteestä säännöllisten lausekkeiden avulla kielen syntaksin mukaisia terminaaleja. Servlet Tekniikka, jolla voidaan tehdä Java-sovellutuksia, jotka vastaavat HTTP-pyyntöihin interaktiivisesti muodostaen WWW-sivuja pyynnön mukana välitettyjen parametrien mukaan. Tomcat Palvelinohjelmisto, joka tarjoaa servleteille sopivan ajoympäristön. UML Taulukko 1: Termit ja niiden määritelmät. 2 Järjestelmän yleiskuvaus 2.1 Sovellusalueen kuvaus (Unified Modelling Language) Ohjelmistojen mallintamiseen käytettäviä kaaviotyyppejä määrittelevä kieli. Lineaaristen rajoitteiden tyydyttämistehtävän ratkaisijana Lmodels pyrkii löytämään ratkaisun malliin annettujen rajoitteiden vallitessa. Mikäli ratkaisu on olemassa, niin käyttäjälle annetaan mahdollisimman tiukat rajat, joiden sisältä kaikki mahdolliset ratkaisut löytyvät, sekä yksi yksiselitteinen ratkaisu. 2.2 Järjestelmän liittyminen ympäristöönsä Lmodels-järjestelmä koostuu palvelinohjelmasta ja asiakasohjelmasta, jotka voivat toimia itsenäisenä kokonaisuutena. Palvelinohjelma toteutetaan kuitenkin itsenäisenä Javaohjelmana, joka ei ole sidottu tässä toteutuksessa tehtävään käyttöliittymään, vaan se tarjoaa RMI-rajapinnan ulkopuolisille ohjelmistoille, jotka näin voivat käyttää sen tarjoamaa palvelua. 2.3 Laitteistoympäristö Lmodelsin laitteistovaatimukset ovat lähes olemattomat. Tämän hetken standardeilla suorituskykyinen henkilökohtainen tietokone pystyy pyörittämään kehitettävää järjestelmää riittävällä teholla useamman yhtäaikaisen käyttäjän ympäristössä. Vasta todellinen tuotantokäyttö, jonka kohdalla puhutaan kymmenistä yhtäaikaisista käyttäjistä, vaatii järeän palvelinkoneen. 2.4 Ohjelmistoympäristö Järjestelmää varten tarvitaan Java-virtuaalikone ja GLPK-ratkaisija. Haluttaessa käyttää mukana tulevaa käyttöliittymää täytyy asentaa myös Tomcat-palvelinohjelmisto, koska käyttöliittymä toteutetaan Java-servletteinä. Java-kielestä käytetään versiota 1.4. Ohjelmisto ei aseta rajoituksia käyttöjärjestelmän suhteen, mutta projektiryhmän tarjoama 2
tuki toimii parhaiten Linux-alustalle, sillä kehitystyö tullaan tekemään pääasiallisesti sillä. 2.5 Toteutuksen keskeiset reunaehdot Ohjelmiston toteutuksessa käytetään vain ilmaisia, jos mahdollista Open Source, ohjelmistoja. Projektin dokumentit ovat suomenkielisiä, mutta itse ohjelmakoodi ja koodin kommentit ovat englanninkielisiä. Käyttöohje kirjoitetaan englanniksi. 3 Arkkitehtuurin kuvaus 3.1 Suunnitteluperiaatteet Järjestelmän toteutuskieli on Java useammastakin syystä, joista ensimmäinen on asiakkaan vaatimus. Lisäksi ryhmän jäsenet ovat tottuneet työskentelemään tällä kielellä, sitä tuetaan useassa ympäristössä, sille löytyy laajat valmiskirjastot sekä tämän projektin vaatimia kääntäjiin liittyviä työkaluja jäsentäjän automatisoituun tekemiseen. Järjestelmään liittyvä käyttöliittymä toteutetaan Java-servletteinä ja standardia HTMLkieltä käyttäen. Vaikka järjestelmässä on mukana käyttöliittymä, niin tällä kertaa suunnittelun painopiste ja sitä eteenpäin ajava voima on teknisellä puolella, sillä käyttöliittymä on tarkoitettu lähinnä testaamiseen. Pääkäyttö järjestelmälle tulee olemaan osana integroitua suurempaa järjestelmää, jolloin Lmodelsin käyttäjiä lienevät toiset ohjelmistojärjestelmät. Järjestelmä toteutetaan käyttäen oliopohjaista mallinnusta ja erilaisia UML-kaavioita eri osien mallintamiseen. 3.2 Ohjelmistoarkkitehtuuri Järjestelmä siis sisältää palvelimen ja asiakasohjelman. Kuvassa 1 on esitettynä arkkitehtuuri pääpiirteissään. Kuva 1: Arkkitehtuuri pääpiirteissään. 3
Asiakkaan aloittaessa istunnon ensiksi valitaan malli, jota halutaan käsitellä, sekä käsittelyssä käytettävä ratkaisija. Projektiryhmän toteutuksessa tullaan käyttämään ratkaisijana GLPK:ta, mutta arkkitehtuuriin jätetään mahdollisuus vaihtaa ratkaisija helposti, jolloin muitakin vaihtoehtoja voidaan tuoda esille käyttäjän valittavaksi. Palvelin käynnistää uuden linearisaattorin, joka kommunikoi tästä eteenpäin suoraan asiakasohjelman kanssa. 4 Moduulikuvaukset 4.1 Translaattori Translaattori toteuttaa määrittelemämme kielen jäsentäjän, joka osaa tehdä annetulla syötteellä määritetystä mallista jäsennyspuun ja supistaa tämän puun haluttaessa joko CNF- tai DNF-muotoon. JLex:n käyttämät säännölliset lausekkeet ja Cup:n käyttämä kielioppi on esitetty vaatimusmäärittelyn liitteessä A. Translator on yleinen apuluokka, sillä sitä käytetään mallin sieventämiseen ennen sen tallentamista sekä mallin ja annettujen rajojen supistamiseen CNF tai DNF -muotoon lähdettäessä etsimään ratkaisua tämänhetkiseen ongelmaan. Näin se on myös ensimmäisenä toteutettava osa järjestelmää. Translaattorille muodostettua lohkomallia voidaan verrata kääntäjään, kuten kuvasta 2 voidaan nähdä. Kuva 2: Translaattorin lohkokaavio. Sisään otettu kielen syöte jäsennetään ensiksi yllä mainituin työkaluin automaattisesti jäsentäjällä jäsennyspuuksi, minkä aikana syötteen syntaksi tarkastetaan. Puumuodossa olevalle mallille tehdään semanttinen analyysi, jonka aikana tarkastetaan, että muuttujiin sijoitetaan oikean muotoisia arvoja, lineaarisia ja loogisia operaattoreita, ja että muuttujia ei käytetä ristiin jne. Tämän jälkeen mallille suoritetaan normalisointi. Normaalimuotoinen uusi malli tallennetaan palvelimelle alkuperäisellä kielellä esitettynä. Lähdettäessä käsittelemään mallia se taas jäsennetään puumuotoon, jotta sitä voidaan muokata ratkaisua etsittäessä helpommin. Malli tulostetaan GLPK:n käyttämälle LP-kielelle ratkaisua varten. 4
4.2 Linearisaattori Linearisaattori käy vuoropuhelua asiakasohjelman kanssa saaden uusia arvoja muuttujille ja laskien ratkaisua mallille näiden annettujen rajojen vallitessa. Linearisaattori käyttää translaattoria saadakseen mallin puumuotoon. Linearisaattori käyttää ahkerasti ratkaisijaa, johon tulee muuttujien lukumäärästä riippuva määrä kutsuja jokaista ratkaisukierrosta kohden. Ensimmäiseksi selvitetään vapaille muuttujille kelvolliset rajat, tämän jälkeen kiinnitetyille muuttujille rajat, ja viimeiseksi tarkastetaan koko ratkaisun käypyys. 4.3 Ratkaisija Ratkaisija on suurimmaksi osaksi ulkoa tuleva komponentti, ja tämän projektin rajoissa ratkaisijan toteutus on Java-rajapinta tämän ulkopuolisen komponentin käyttöön. Ulkopuolisena komponenttina käytetään GLPK-nimistä lineaaristen rajoitteiden ratkaisijaa, joka on C-kielellä toteutettu kirjasto. 5 Hylätyt ratkaisut Tässä vaiheessa projektia on tehty vasta muutama tekniseen toteutukseen liittyvä päätös. Koko projektin kannalta on kahteen merkittävään asiaan otettu kantaa. 5.1 Kääntäjän tuottamistyökalut Ensimmäisenä asiana on translaattorin luomisessa apuna käytettävät kääntäjän tuottamistyökalut, joiksi päätettiin ottaa Cup ja JLex. Näiden vaihtoehtona oli kehittyneempi, myös Sunin tukema, Open Source -työkalu JavaCC, joka on sekä jäsentäjän että selaimen generoiva työkalu. Emme kuitenkaan valinneet tätä mentorimmekin suosittelemaa työkalua, vaan käytämme jäsentäjän generointiin Cup:ia ja selaimen generointiin JLex:iä, koska asiakkaamme oli vanhempien työkalujen puolella ja ryhmällä itsellään on kokemusta niiden käytöstä päinvastoin kuin JavaCC:n kohdalla. 5.2 Lineaarinen ratkaisija Toinen hylkäävä ratkaisu on tehty lineaarisen ratkaisijan kohdalla, sillä ratkaisijaksi oli GLPK:n lisäksi tarjolla Javalla toteutettu lp_solve. Vaikka tätä ratkaisua olisi voinut puolustaa toteutuskielen yhtenäisyydellä, niin hylkäämiseen johtaneet seikat veivät voiton. Vaikka lp_solve on toteutettu Javalla, niin se vaikutti tehdyn automaattisesti aikaisemmasta C-toteutuksesta. Myöskään sen ylläpidosta ei ollut minkäänlaisia takeita; sen toteuttamiseen käytetty Java-versiokin oli jo aika vanha. 5