Rozhraní predikčního appletu
pro přidání metod


Úvod

Applet byl navržen tak, aby přidání další metody bylo co nejsnazší a zároveň jsem se snažil, aby nebylo v rámci metody možno porušit funkcionalitu appletu. Proto bych byl rád, aby jste neměnily původní zdrojáky, i když jsou samozřejmě k dispozici.

Applet umožňuje získat metodě pole uživatelem definovaných bodů, nechat si tyto body a ostatní nastavení od metody zkontrolovat - je umožněno zobrazení chybové hlášky od metody a též zobrazit metodou definované okno s nastavením libovolných dalších parametrů metody. Po "schválení" nastavení metodou a uložení parametrů je spuštěn výpočet v separátním vlákně, což umožňuje uživateli kontrolu nad průběhem metody. V průběhu výpočtu je možné z metody zobrazovat informace o průběhu výpočtu. A nakonec po skončení výpočtu applet zobrazí výsledky v grafu a v tabulce (zobrazení v grafu je možné i v průběhu výpočtu).

Při výpočtu bodů z uživatelem zadané funkce se používá jednoduchý interpretr, který umožňuje překlad jen základních funkcí (dle mého názoru pro predikci postačující), ale je navržen tak, že případné rozšíření je velmi jednoduché, většina funkcí je dokonce i připravena, jen ne zaktivována, pokud by jste měli zájem o rozšíření funkcí interpreteru, napište mi. Originální interpretr je použit v mém appletu Vědecká kalkulačka, kde je však jeho funkčnost ještě mnohem širší.


Princip volání metod

Práci s metodami v appletu lze rozdělit do třech částí. Částí první je načtení informací o metodách při iniciaci appletu. Pro tuto iniciaci používá applet třídu PredictionData.

Částí druhou je test správnosti uživatelem definovaných dat metodou a zároveň nastavení speciálních parametrů metody. Vlastní metodu lze snadno vytvořit jako podtřídu třídy PredictionMethod, parametry lze nastavit pomocí vlastního okna, které musí být podtřídou ParameterWindow, předání parametrů z okna zpět metodě umožňuje třída MethodParameters, resp. její podtřídy.
Tato část je prováděna poněkud složitě, protože jsem nepřišel na způsob, jak zobrazit dialog modálně k appletu (resp. k oknu prohlížeče). Je totiž prováděna dvousměrně - po stisku tlačítka se applet "vypne" (pro nemožnost práce s appletem při přepnutí zpět do okna prohlížeče před zavřením okna s nastavením), zavolá metodu třídy PredictionMethod, která zobrazí okno, pokud je v metodě definováno, nebo rovnou předá výsledek testu appletu. Po zobrazení okna se běh programu zastaví, je tedy možno měnit nastavení v okně (běží čekací smyčka). Po stisku tlačítka je v okně vytvořen objekt pro předání parametrů a ten je předán zpět metodě, která parametry uloží a odpoví appletu na správnost parametrů, čímž je zahájena fáze třetí - výpočet.
Předchozí odstavec vás možná trošku zaskočil, ale mohu vás uklidnit, všechny tyto operace jsou již zpracovány v základních třídách a na vás je pouze vytvoření (předefinování) metod jednotlivých akcí. Popis jsem uváděl spíše proto, že by mě velmi zajímalo, kdyby někdo věděl o nějakém jednodušším řešení.

Jak již jsem se zmínil, třetí částí je samotná výpočet. Po zahájení výpočtu si metoda vytvoří vlastní vlákno, ve kterém se výpočet spustí, a řízení předá zpět appletu.
Ve vlákně je před samotným zahájením výpočtu pro jistotu znovu otestována připravenost metody k výpočtu, je alokováno pole pro výsledné body a poté je výpočet zahájen. V průběhu výpočtu je možno pomocí připravených metod zobrazovat průběžné výsledky v appletu.

Ale dost už teorie (zvlášť protože vypadá dost složitě), koukněme se, jak se to v praxi dělá.


Vytvoření vlastní metody

Jak už bylo uvedeno výše, pro vytvoření metody je nutno vytvořit vlastní podtřídu třídy PredictionMethod a pokud naše metoda vyžaduje další speciální nastavení, též je nutno rozšířit třídy ParameterWindow a MethodParameters. Nakonec je samozřejmě nutné novou metody zaregistrovat v objektu PredictionData (zde nejde o vytvoření podtřídy, ale je nutno přidat registraci do původního zdrojáku k registraci předdefinovaných metod (ty je samozřejmě možno zrušit).
Zde naleznete stručný popis, podrobný popis funkcí naleznete ve vygenerované dokumentaci. Nejlepší ale asi bude, když se podíváte přímo na ukázku mých metod - obou aproximací (rozhraní mají společné v abstraktním předkovi, tělo výpočtu každá svoje).

PredictionMethod
Pro samotný běh metody je nutno předefinovat metodu _Run. Též je možno předefinovat metody _TestParameters (test parametrů před zobrazením okna), _SaveParameters (uložení parametrů po zavření okna) a _CanStart (test správnosti nastavení před spuštěním výpočtu). Pokud nadefinujeme vlastní okno nastavení metody, je nutno ho při konstrukci objektu metody přiřadit do proměnné _window, vyvolání se poté děje automaticky.
Pro zobrazení výsledků zpět do appletu slouží metody _DoLearnOutput a _DoOutput a proměnné _learnError a _outputPoints (pole výstupních bodů alokované před spuštěním výpočtu, velikost je počet vstupních bodů + počet bodů k predikování). Vstupní data jsou uloženy v proměnných _inputSize (počet "vstupů" - vstupních neuronů), _predictCount (kolik bodů se má predikovat) a _inputPoints (vstupní body metody).
Třída též definuje rozhraní pro applet umožňující práci s vláknem výpočtu.

ParameterWindow
Okno je nutno celé nadefinovat, standardně obsahuje pouze buttony OK a Cancel. Metody jednotlivých akcí jsou _InitialSetting (nastavení okna před zobrazením) a _CreateParameters (vytvoření objektu obsahujícího informace o nastavení).

MethodParameters
Tento objekt je potřebný pouze pro přenos dat (inforamcí o nastavení) z okna do metody. Základní objekt obsahuje pouze informaci o stisknutém buttonu.

PredictionData
Je nutno přidat volání metody RegisterMethod appletu do těla již existující statické metody InitMethods.

PredictionApplet
Definuje rozhraní pro zpětné volání metod a jejich registraci, přímé volání metod (až na registraci) není potřeba.


Soubory ke stažení

classes.zip     všechny třídy používané appletem. Třída appletu je kota.applets.prediction.PredictionApplet
docs.zip        dokumentace ke třídám appletu a metod vygenerovaná JavaDoc-em
sources.zip    zdrojáky k appletu a metodám včetně mých aproximačních (nejsou obsaženy zdrojáky k překladači a některým komponentám, překompilovat celý applet stejně není třeba, stačí PredictionData a své podtřídy pro metody. Pokud by jste potřebovali i zbylé zdrojáky, napište si.)