Funkcje właściwości
Czym są funkcje?
Funkcje w platformie jAgE są właściwościami, których wartości zależą od innych właściwości. Zostały one wprowadzone głównie po to, aby ułatwić agregatom udostępnianie informacji statystycznych dotyczących ich potomków, takich jak ich liczba, średnia, maksymalna i minimalna wartość funkcji.
Obecnie w platformie dostępnych jest pięć wbudowanych funkcji:
- Liczba (
CountFunction
) - Suma (
SumFunction
) - Średnia (
AvgFunction
) - Minimum (
MinFunction
) - Maksimum (
MaxFunction
)
Tworzenie funkcji
Konstruktory wszystkich funkcji przyjmują przynajmniej dwa parametry:
- Nazwę funkcji (
functionName
), która powinna jednoznacznie (wśród wszystkich właściwości) identyfikować funkcję po dodaniu jej do kontenera. - Wzorzec argumentów (
argumentsPattern
), który służy kontenerowi do określenia, jakie argumenty powinien przekazać funkcji. Jego składnia zostanie omówiona w dalszej części.
Po utworzeniu funkcji, należy ją dodać do kontenera poprzez metodę addFunction
. Po tej operacji jest ona dostępna tak, jak pozostałe właściwości kontenera. Funkcję możemy usunąć przez metodę removeFunction
.
Poniższy kod przedstawia utworzenie funkcji, która oblicza średnią wartość funkcji fitness wszystkich agentów znajdujących się w agregacie:
AggregateAgent aggregate = ...; AvgFunction function = new AvgFunction("AverageFitness", "@Agents[*].fitness", 0.0); aggregate.addFunction(function); // Teraz funkcja jest dostępna jako jedna z właściwości kontenera Double functionValue = aggregate.getProperty("AverageFitness").getValue(); ... aggregate.removeFunction(function);
Wzorzec argumentów
Wzorzec argumentów jest listą ścieżek do właściwości, oddzielonych przecinkami. Pojedyncza ścieżka ma format bardzo podobny do formatu omówionego wcześniej, jednak wprowadzone zostały dwa rozszerzenia:
- Jako dowolny indeks tablicy można podać znak
„*"
, który oznacza, że wszystkie elementy tej tablicy powinny zostać przekazane jako argumenty funkcji. - Dla wszystkich agregatów można użyć „wirtualnej właściwości" o nazwie
„@Agents"
, która zwraca listę agentów znajdujących się w tym agregacie.
Poniżej znajduje się kilka przykładów ścieżek z objaśnieniami, jakie argumenty zostaną przekazane funkcji w każdym przypadku. W wszystkich przykładach zakładamy, że funkcja jest dodana do kontenera C.
Wzorzec |
Argumenty przekazane do funkcji |
---|---|
„a,b" |
Wartości właściwości |
„a[*].b" |
Wartość właściwości |
„@Agents[*].fitness" |
Wartość właściwości „fitness" każdego agenta, który należy do agregata C. |
„@Agents[0].fitness,@Agents[1].fitness" |
Wartość właściwości |
„@Agents[*].@Agents[*].fitness" |
Wartość właściwości |
W przypadku zamiany wzorca na argumenty przekazywane funkcji mogą wystąpić dwa rodzaje błędów:
- Podany wzorzec jest nieprawidłowy, tzn. niezgodny z gramatyką. W tym przypadku zgłoszony zostaje wyjątek
InvalidArgumentsPatternException
. - Wzorzec jest prawidłowy, jednak jedna z jego ścieżek zawiera odwołanie do nieistniejącej właściwości. Ten błąd zostaje zignorowany, i funkcji nie jest przekazywany argument odpowiadający nieistniejącej ścieżce.
Przykładowo, jeżeli wzorzec będzie miał postać „myProperty[*.b"
(brak zamykającego nawiasu kwadratowego), zostanie zgłoszony wyjątek. Jeżeli natomiast wzorzec będzie miał postać „@Agents[*].fitness"
, i jeden z agentów znajdujących się w agregacie nie będzie posiadał właściwości o nazwie „fitness"
, zostanie on zignorowany i do funkcji będzie przekazana wartość tej właściwości dla pozostałych agentów.
Wzorzec jest zamieniany na argumenty za każdym razem, kiedy jest obliczana wartość funkcji. Należy także pamiętać, że tzw. białe znaki mogą być częścią nazwy pojedynczej właściwości, i wzorce „a,b"
oraz „a, b"
nie są sobie równoważne.
Definiowanie własnych funkcji
Klasą bazową dla wszystkich funkcji jest klasa PropertyFunction
, która posiada dwie abstrakcyjne metody – computeValue
oraz getReturnType
. Własna implementacja musi jedynie dostarczyć implementacji tych dwóch metod.
Dla funkcji, których argumenty są liczbami, warto skorzystać z klasy NumericFunction
, która konwertuje argumenty na liczby typu double.