Optimalizace průchodu skladem - knihovna
===
## Autor
jméno: Jan Holáň \
login: xholan11 \
email: xholan11@vutbr.cz

# Intro
Kód implementuje knihovnu, která řeší problém optimalizace vychystávání při průchodu skladem. Veškeré specifikace, nezbytné pro implementaci, pocházejí od firmy, která si přeje zůstat v anonymitě. Kód je součástí bakalářské práce. 

# Závislosti
Kód je závislý na knihovnách **python3.11** a **nlohmann/json**.

Knihovnu **python3.11** lze nainstalovat na systému
- Fedora Linux pomocí <pre>$ dnf install python3.11 python3.11-devel</pre>
- Ubuntu Linux pomocí <pre>$ apt install python3.11 python3.11-dev</pre>

Knihovna **nlohmann/json** slouží pro práci se soubory typu JSON. Lze stáhnout z https://github.com/nlohmann/json, případně lze využít nějakou z možností viz https://json.nlohmann.me/integration/package_managers (oficiální stránky knihovny). Následně by měla být tato knihovna umístěna do adresáře */usr/include*.

# Překlad a vytvoření statické a dynamické knihovny
Veškerý kód knihovny, včetně souboru Makefile, se nachází v adresáři *./src*.

Příkaz `make` nebo `make static`, zadaný v adresáři *./src*, vede k překladu kódu a vytvoření statické knihovny s názvem *libwarehouse_pick_opt.a*. Příkaz `make dynamic` potom vytvoří dynamickou verzi knihovny s názvem *libwarehouse_pick_opt.so*.

## Upozornění
Některé verze g++ nemusí podporovat parametr -std=c++20. V tom případě je nutné tento parametr nahradit za -std=c++2a. 

Stejně tak může v některých případech selhat překlad kvůli parametru -pedantic či -Werror. V takovém případě je nezbytné tyto parametry odebrat.

# Použití
Pro použití této knihovny je nezbytné přidat hlavičkový soubor *WarehousePickingOpt.h*. Pokud zamýšlíte práci knihovny debugovat, musíte přidat i hlavičkový soubor *warehouse_picking_opt_debug.h*.

Překlad kódu, ve kterém je využita tato knihovna, vyžaduje parametry `-lwarehouse_pick_opt` a `-lpython3.11`. 

# Testování a data
Kromě testování pomocí grafického uživatelského rozhraní lze k testování použít i soubor **main.cpp** v adresáři *./test*. Lze jej zkompilovat a spustit pomocí souboru makefile příkazem `make run`. Makefile používá statickou knihovnu, která je popsána výše. Jako testovací data mohou být využita ta, která se nacházejí v adresář *./data*.

Kód v souboru **main.cpp** obsahuje pod komentářem *TEST 1* kód pro otestování řazení položek do vozíků pro všechna data v adresáři *./data/data_both* ve srovnání s firemním řazením. Pod komentářem *TEST 2* se potom nachází kód, který zpracuje jednu vlnu uloženou jako *./../data/data_both/wave1422307.json* a uloží výstup (rozřazení položek do vozíků) do souboru *out.json*.

Data v adresáři *./data/data_both* v sobě obsahují údaje o rozdělení položek do vozíků i pořadí jednotlivých adres pro řazení položek ve vozících, tak jak to bylo realizováno firmou. Lze tedy porovnat výsledky získané knihovními algoritmy a výsledky vytvořené řešením firmy. Adresář *./data/data_only_in* obsahuje data, která mohou být pouze vstupem pro zpracování knihovními algoritmy, zatímco data v adresáři *./data/data_only_out* slouží pouze pro získání vzdáleností u vozíků vytvořených firmou.

# Integrita dat
Integritu dat mezi vstupem a výstupem algoritmu lze ověřit skriptem *validate-in-out.py*, který přijímá dva parametry. Těmi jsou originální soubor vstupních dat a soubor, kam byla uloženo výsledné rozdělení položek do vozíků vytvořené knihovnou.

Příklad testu integrity dat (pomocí skriptu validate-in-out.py) mezi vstupním souborem vlny uložené jako *./../data/data_both/wave1422307.json* a souborem *out.json*, který je výsledkem *TESTU 2* (viz výše):

<pre>
$ python validate-in-out.py ./../data/data_both/wave1422307.json out.json
</pre>
