Dekodery

Dekodery mUQSA odgrywają analogiczną rolę jak enkodery, jednak operują po drugiej stronie ewaluacji. Dekoder to funkcja, która przekształca dane wyjściowe z kodu symulacji lub modelu z ich pierwotnego formatu na format mUQSA wymagany w pozostałej części przepływu pracy mUQSA, tj. analizie i wizualizacji. Na przykład, jeśli kod symulacji generuje dane w określonym formacie, takim jak plik binarny lub określona struktura danych, funkcja dekodera jest używana do pobrania danych dotyczących określonych QoI z wyjścia symulacji i umieszczenia ich w generycznej strukturze danych wspieranej przez mUQSA.

mUQSA dostarcza kilka rodzajów wbudowanych dekoderów, które zostały odziedziczone z biblioteki EasyVVUQ, i które można używać do dekodowania powszechnie spotykanych formatów danych. Możliwe jest również tworzenie niestandardowych dekoderów dla innych przypadków użycia.

Wbudowane Dekodery

Dekoder CSV

Dekoder CSV pozwala na dekodowanie danych z plików danych csv. Aby możliwe było jego użycie, Dekoder CSV wymaga informacji o nazwie pliku csv wygenerowanego przez kod symulacji oraz listy nazw kolumn, z których dane powinny zostać zdekodowane i umieszczone w strukturach mUQSA.

Przyjmijmy następujące wyjście CSV z symulacji:

c1,c2,c3
0.1,10,20
0.2,11,21

Jeśli interesują nas wartości z c1 i c3, możemy użyć Dekodera CSV i przekazać następującą listę nazw kolumn jako jego parametr:

c1, c3

Wybrane kolumny c1 i c3 zostaną automatycznie wyodrębnione i umieszczone odpowiednio w strukturach danych mUQSA.

Dekoder JSON

Dekoder JSON umożliwia dekodowanie danych przechowywanych w plikach JSON. Wymaga nazwy pliku JSON oraz listy nazw elementów JSON do zdekodowania jako danych wejściowych. Możliwe jest żądanie dekodowania jednego z elementów json najwyższego poziomu lub dowolnego elementu podrzędnego. W pierwszym przypadku element listy powinien być po prostu nazwą; w drugim, element listy powinien być kolejną listą zawierającą nazwy wszystkich kolejnych elementów JSON: począwszy od nazwy elementu głównego, a kończąc na nazwie docelowego, najbardziej zagnieżdżonego elementu.

Rozważmy następujący plik JSON:

{
  "e1": {
    "e11": {
      "v111": 1.0,
      "v112": 2.0
    },
    "v12": true
  },
  "v2": "Some string"
}

Zakładając, że interesują nas wartości v112 i v2, nasza lista elementów do zdekodowania powinna wyglądać następująco:

[e1, e11, v112], v2

Dekoder YAML

Dekoder YAML zapewnia takie same funkcje jak Dekoder JSON, ale dla plików YAML. Dane wejściowe dla dekodera to plik YAML i lista elementów, których wartości należy zdekodować. Podobnie jak w przypadku Dekodera JSON, lista może zawierać nazwy elementów YAML najwyższego poziomu lub listy odzwierciedlające nazwy zagnieżdżonych elementów.

Zobaczmy jak powyższy przykład będzie wyglądał w pliku YAML:

"e1":
  "e11":
    "v111": 1.0
    "v112": 2.0
  "v12": true
"v2": "Some string"

Ponownie, zakładając, że interesują nas v112 i v2, lista z opisem elementów do zdekodowania będzie miała dokładnie ten sam format jak powyżej:

[e1, e11, v112], v2

Niestandardowe Dekodery

mUQSA obsługuje tworzenie niestandardowych dekoderów, na wypadek gdyby funkcjonalność wbudowanych nie była wystarczająca. Jednak pierwsze pytanie, na które powinniśmy odpowiedzieć przed przejściem do implementacji niestandardowego dekodera, brzmi: czy naprawdę musimy to zrobić? Być może lepiej byłoby po prostu zmienić format danych wyjściowych naszej aplikacji albo byłoby łatwiej utworzyć skrypt postprocesu, który automatycznie przetłumaczy wyjście na format CSV lub JSON, który wbudowane dekodery mogą obsłużyć.

Jeśli zdecydujesz się na implementację własnego dekodera, musisz zaimplementować klasę z następującym schematem:

class CustomDecoder:
    def __init__(self, target_filename=None, output_columns=None):
        pass

    def parse_sim_output(self, run_info={}):
        return {}

Metoda parse_sim_output przyjmuje jako parametr run_info. Metoda ta jest wywoływana wewnętrznie przez bibliotekę EasyVVUQ, a parametr run_info zawiera ona wiele danych, z których run_dir, zawierający bezwzględną ścieżkę do katalogu wykonania, może być najbardziej przydatny. Metoda powinna zwrócić słownik jednopoziomowy, gdzie klucze to nazwy zmiennych QoI, a wartości to wartości skalarne lub listy, jeśli wyniki są wektorami:

{"a" : 0.01, "b" : [1, 2, 3], "c" : "..."}