# presentation.org -- Pamhyr
# Copyright (C) 2023  INRAE
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

# -*- coding: utf-8 -*-

#+STARTUP: indent hideblocks content beamer

#+TITLE: \textbf{Pamhyr2}
#+SUBTITLE: Scenarios managements

# #+AUTHOR: Pierre-Antoine Rouby
#+LATEX_HEADER: \author[Pierre-Antoine Rouby]{\textbf{Pierre-Antoine Rouby}}
#+EMAIL: pierre-antoine.rouby@inrae.fr
#+INSTITUTE: INRAE Lyon-Villerbanne, teams River Hydraulics
#+LATEX_HEADER: \institute{INRAE Lyon-Villerbanne, River Hydraulics team}
#+DATE: 9th November

#+KEYWORDS: g ui, hydraulics, sedimentary, hydro-sedimentary, 1D modelling, freesoftware, foss

#+OPTIONS: H:2 toc:t num:t author:nil
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [slideopt,A4,showboxes,svgnames,aspectratio=169]
# #+LATEX_CLASS_OPTIONS: [presentation]
#+BEAMER_THEME: default
#+COLUMNS: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col)

#+LANGUAGE: fr
#+LATEX_HEADER: \usepackage[frenchb]{babel}

#+BEGIN_SRC emacs-lisp :results silent :exports none
  (setq org-latex-pdf-process (list
    "latexmk -pdflatex='lualatex -shell-escape -interaction nonstopmode' -pdf -f  %f"))

  (add-to-list 'org-latex-packages-alist '("" "minted"))
  (setq org-latex-listings 'minted)
  (setq org-src-fontify-natively t)

  (org-add-link-type
   "cite" 'ebib
   (lambda (path desc format)
     (cond
      ((eq format 'html)
       (format "(<cite>%s</cite>)" path))
      ((eq format 'text)
       (format "[%s]" path))
      ((eq format 'latex)
       (if (or (not desc) (equal 0 (search "cite:" desc)))
           (format "\\cite{%s}" path)
         (format "\\cite[%s][%s]{%s}"
                 (cadr (split-string desc ";"))
                 (car (split-string desc ";"))  path))))))
#+END_SRC

# Wrapper
#+NAME: attr_wrap
#+HEADER: :var width="\\textwidth"
#+HEADER: :var caption=""
#+HEADER: :var smallcaption=""
#+HEADER: :var name=""
#+HEADER: :var data=""
#+HEADER: :var float="nil"
#+BEGIN_SRC sh :results output :exports none
  echo "#+CAPTION[$smallcaption]: $caption"
  echo "#+NAME: $name"
  echo "#+ATTR_LATEX: :width $width :float $float"
  echo "$data"
#+END_SRC

#+LATEX_HEADER: \setbeamertemplate{footline}[frame number]
#+LATEX_HEADER: \setbeamertemplate{headline}{}
#+LATEX_HEADER: \usepackage{multirow}
#+LATEX_HEADER: \usepackage{fontawesome5}
#+LATEX_HEADER: \usepackage{tcolorbox}
#+LATEX_HEADER: \usepackage{tikz}

#+LATEX_HEADER: \logo{\includegraphics[width=.1\textwidth]{../../../src/View/ui/ressources/Logo-INRAE.png}}

#+LATEX_HEADER: \newcommand{\R}[1]{\rotatebox[origin=c]{90}{#1}}

# Beamer colors
#+LATEX_HEADER: \setbeamersize{text margin left=0.5cm,text margin right=0.5cm}
#+LATEX_HEADER: \setbeamerfont{alerted text}{series=\bfseries}
#+LATEX_HEADER: \setbeamerfont{example text}{series=\bfseries}

#+LATEX_HEADER: \definecolor{inrae_1}{RGB}{102,193,191}
#+LATEX_HEADER: \definecolor{inrae_2}{RGB}{0,150,152}
#+LATEX_HEADER: \definecolor{inrae_3}{RGB}{39,86,98}

#+LATEX_HEADER: \setbeamercolor{alerted text}{fg=inrae_1}
#+LATEX_HEADER: \setbeamercolor{structure}{fg=inrae_2}
#+LATEX_HEADER: \setbeamercolor{normal text}{fg=inrae_3}
#+LATEX_HEADER: \setbeamercolor*{author}{fg=inrae_3}

#+LATEX_HEADER: \usepackage[absolute,showboxes,overlay]{textpos}

#+LATEX_HEADER: \TPshowboxesfalse
#+LATEX_HEADER: \textblockorigin{5mm}{0mm}

# Biblio
#+LATEX_HEADER: \usepackage{natbib}
# #+LATEX_HEADER: \bibliographystyle{apalike}
#+LATEX_HEADER: \setbeamertemplate{bibliography item}{}
#+LATEX_HEADER: \renewcommand\bibfont{\scriptsize}
#+LATEX_HEADER: \setbeamertemplate{frametitle continuation}[from second]
#+LATEX_HEADER: \setbeamercolor*{bibliography entry title}{fg=inrae_3}
#+LATEX_HEADER: \setbeamercolor*{bibliography entry author}{fg=inrae_3}
#+LATEX_HEADER: \setbeamercolor*{bibliography entry location}{fg=inrae_3}

#+LATEX_HEADER: \usepackage{bbding}
#+LATEX_HEADER: \usepackage{pdfpages}

# Renew title page
#+LATEX_HEADER: \defbeamertemplate*{title page}{customized}[1][]
#+LATEX_HEADER: {
# #+LATEX_HEADER:   {
# #+LATEX_HEADER:     \usebeamerfont{date}\usebeamercolor[fg]{date}
# #+LATEX_HEADER:     \tikz[overlay,remember picture]
# #+LATEX_HEADER:     \node[xshift=-1cm,yshift=-1cm,text width=10cm] at (current page.north east) {
# #+LATEX_HEADER:        7$^{th}$ International Conference\\
# #+LATEX_HEADER:        8TH-10TH November\\
# #+LATEX_HEADER:        EDF Lab - CHATOU, FRANCE
# #+LATEX_HEADER:     }
# #+LATEX_HEADER:   }
#+LATEX_HEADER:   {
#+LATEX_HEADER:     \usebeamerfont{title}\inserttitle\par
#+LATEX_HEADER:     \usebeamerfont{title}\usebeamercolor[fg]{title}
#+LATEX_HEADER:   }
#+LATEX_HEADER:   \bigskip
#+LATEX_HEADER:   \begin{center}
#+LATEX_HEADER:     \usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
#+LATEX_HEADER:     {
#+LATEX_HEADER:       \LARGE\insertsubtitle\par
#+LATEX_HEADER:     }
#+LATEX_HEADER:     \bigskip
#+LATEX_HEADER:     \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\par
#+LATEX_HEADER:     \bigskip
#+LATEX_HEADER:     \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute\par
#+LATEX_HEADER:     \bigskip
#+LATEX_HEADER:     \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate\par
#+LATEX_HEADER:     \usebeamercolor[fg]{titlegraphic}\inserttitlegraphic
#+LATEX_HEADER:   \end{center}
#+LATEX_HEADER: }

# #+LATEX_HEADER: \newcommand{\tred}[1]{\textcolor{rouge_inrae}{#1}}

#+TODO: TODO WIP TOREVIEW | DONE

#+MACRO: pamhyr \textsc{PAMHyR}
#+MACRO: pamhyr2 \textsc{Pamhyr2}

#+MACRO: pause \pause
#+MACRO: framebreak \framebreak
#+MACRO: no
# #+MACRO: OK  \checkmark
#+MACRO: OK  \faIcon{check}
#+MACRO: bf \textbf{$1}

# #+latex: \frame{\tocpage}

* Problématique

** Problématique

*** Utilisateur

- Définire une version modifier de l'étude (changement dans les
  données)
- Comparé des résultats entre une variante et l'étude

{{{pause}}}

**** COMMENT Développeur
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

- Un unique fichier
- Limité la duplication de donnée à sauvegarder
- Garder une bonne cohérence entre données et résultats

{{{pause}}}

*** Scénarios
:PROPERTIES:
:BEAMER_COL: 1
:BEAMER_ENV: definition
:END:

Un scénario est une variate d'une étude.

** Problématique -- Avancer

*** Utilisateur

- Définire une version modifier d'un senarios
- Comparé des résultats entre plusieurs senarios

{{{pause}}}

**** COMMENT Développeur
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

- Un unique fichier
- Limité la duplication de donnée à sauvegarder
- Garder une bonne cohérence entre données et résultats

{{{pause}}}

*** Scénarios
:PROPERTIES:
:BEAMER_COL: 1
:BEAMER_ENV: definition
:END:

Un scénario peut être l'étude ou une variate d'un autre scénario.

** Problématique -- Encore plus avancer

*** Utilisateur

- Définire un ensemble fini de variante correspondant a un ensemble de
  valeur pour un(des) paramètre(s) et executer un solveur sur
  l'ensemble des variantes
- Pouvoir comparé des metrics sur un ensemble de résultats trop grand
  pour une comparaisont à la mains

{{{pause}}}

**** COMMENT Développeur
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

- Un unique fichier
- Limité la duplication de donnée à sauvegarder
- Garder une bonne cohérence entre données et résultats

{{{pause}}}

*** Scénarios
:PROPERTIES:
:BEAMER_COL: 1
:BEAMER_ENV: definition
:END:

Un scénario peut être l'étude, une variate d'un scénarios ou un
ensemble fini de variantes d'un scénarios.

** Problématique -- Encore plus plus avancer

*** Utilisateur

- Définire un ensemble fini de variante correspondant a un ensemble de
  valeur pour un(des) paramètre(s) et faire un nombre fini de tirage
  aléatoire dans ces paramètre pour executer un solveur ces paramètres
- Pouvoir comparé des metrics sur un ensemble de résultats trop grand
  pour une comparaisont à la mains

{{{pause}}}

*** Scénarios
:PROPERTIES:
:BEAMER_COL: 1
:BEAMER_ENV: definition
:END:

Un scénario peut être l'étude, une variate d'un scénarios ou un
ensemble fini ou un tirage aléatoire dans un ensemble de variantes
d'un scénarios.

** Problématique -- Développeur

*** Développeur

- Permetre a l'utilisateur de *garder une bonne cohérence entre
  données et résultats* de façon claire
- Permetre a l'utilisateur de *géré les scénarios* de façon claire
  (représentation graphique)
- Garder *un unique fichier* (=.pamhyr=)
- *Limité la duplication* de donnée à sauvegarder
- Permetre à l'utilisateur de garder les *résultats pertinant* sans
  exploser la mémoire de l'ordinateur

* Proposition

** Proposition -- Concept

*** {{{no}}}
\vspace{-1.2cm}
**** Deux type de scénarios
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

- Scénarios simple
- Scénarios d'éxecution d'ensemble

{{{pause}}}

**** Scénarios simple
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

Est composer:
- d'un identifiant unique
- d'un nom (définie par l'utilisateur)
- d'une description (définie par l'utilisateur)
- d'un parent (définie par l'utilisateur)

{{{pause}}}

\vspace{-0.5cm}

*** Scénarios d'ensembles

**** {{{no}}}
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:
\vspace{-1cm}
Est composer:
- d'un identifiant unique
- d'un nom (définie par l'utilisateur)
- d'une description (définie par l'utilisateur)
- d'un parent (définie par l'utilisateur)
- d'un ou plusieurs ensemble de valeur

**** {{{no}}}
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:
\vspace{-0.5cm}
Un ensemble de valeurs est definie par:
- une valeurs de départ
- une valeurs de fin
- un pas de valeur
- un élément d'origine (élément définie dans l'étude)
- une fonctions (modification de l'élément à l'aide d'une valeur de
  l'ensemble)

** Proposition -- Limitation

*** Scénarios simple
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

Si le scénarios est le *parent d'un autre scénarios*, il ne *peut plus
être modifier* sans risquer des comportement difficilement
comprehensible pour l'utilisateur.

{{{pause}}}

*** Scénarios d'ensembles
:PROPERTIES:
:BEAMER_COL: 0.5
:BEAMER_ENV: block
:END:

- Un scénarios d'ensemble *ne peut pas être parent* d'un autre
  scénarios
- Le nombre d'exécution peut très rapidement grossir

** Proposition -- Affichage

#+name: graph-scenarios
#+header: :results drawer
#+header: :exports results
#+header: :post attr_wrap(width="7cm", data=*this*, name="graph-scenarios", caption="Exemple of scenarios graph", float="t")
#+begin_src dot :file "images/graph-scenarios.png" :cache no
  digraph {
        bgcolor="transparent";
        node[colorscheme=pastel19,shape=ellipse,style="filled",fillcolor=9];

        b[fillcolor=2];

        aa[shape=box,fillcolor=2];
        aa2[label="aa'", shape=box, fillcolor=2];
        ad[shape=box, fillcolor=2];
        re[shape=box, fillcolor=2];
        rf[shape=box, fillcolor=2];

        default -> a;
        default -> b;
        default -> c;

        a -> aa;
        a -> aa2;
        a -> f -> rf;
        c -> d -> ad;
        c -> e -> re;
  }
#+end_src

#+RESULTS[80ed2484b9cc71143f800ff23c10846fd04697c3]: graph-scenarios
:results:
#+CAPTION[]: Exemple of scenarios graph
#+NAME: graph-scenarios
#+ATTR_LATEX: :width 7cm :float t
[[file:images/graph-scenarios.png]]
:end:

* Solution technique

** Technique -- scénarios

#+begin_src sql
  CREATE TABLE scenario(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,           -- Name of the scenario
    description TEXT NOT NULL,    -- Rich text description
    parent_id INTEGER REFERENCES scenario(id) -- Recursive references
                                              -- for parent scenario
  )
#+end_src

** Technique -- Données -- Enregistrement

#+begin_src sql
  -- Unique ID (Must be unused, to delete)
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  -- New ID (not unique)
  pamhyr_id INTEGER NOT NULL,
  -- (Optional) Flag for set there is no data in this scenario and
  -- ignore parent scenario
  dummy BOOLEAN NOT NULL,
  -- Corresponding scenario
  scenario_id INTEGER NOT NULL,
  PRIMARY KEY(pamhyr_id, scenario_id),
  FOREIGN KEY(scenario_id) REFERENCES scenario(id),
#+end_src

** Technique -- Données -- Chargement

#+begin_src python :python python3 :results output :noweb yes
  def load(cls, db, current_scenario):
    # Default case, end of recursion
    if current_scenario is None:
      return []                   # Default value

    table = db.execute(f"<MY SELECT> WHERE scenario_id = {current_scenario}")

    # If no data for this scenario, recursion
    if len(table) == 0:
      parent_id = db.get_parent_id(current_scenario)
      return cls.load(db, parent_id)

    # Otherelse, parse data and return...
#+end_src

** Technique -- Données -- Modification

#+begin_src python :python python3 :results output :noweb yes
  def set_modified(self, current_scenario):
      self.scenario = current_scenario
#+end_src

#+begin_src python :python python3 :results output :noweb yes
  def delete(self, current_scenario):
      self.deleted = True
      self.set_modified(current_scenario)
#+end_src

** Technique -- Exécution d'ensemble

#+begin_src sql
  CREATE TABLE range_set(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    start REAL NOT NULL,          -- Range start
    end REAL NOT NULL,            -- Range end
    step REAL NOT NULL,           -- Range step
    generator_name TEXT NOT NULL, -- Generator function name (ex:
                                  -- 'minor_strickler')
    original_data_id INTEGER,     -- (optional) Ref to data who apply
                                  -- this range (ex: a strickler id)
    scenario_id INTEGER NOT NULL,
    FOREIGN KEY(scenario_id) REFERENCES scenario(id)
  )
#+end_src

* Sauvegarde des résultats

** Sauvegarde des résultats

*** Scénarios simple

Sauvegarde d'un seul résultats complet par scénarios (et par solver).

*** Scénarios d'ensemble

Sauvegarde de metrics récupéré sur un ensemble de résultats (pas de
sauvegarde de tous les résultats) ou certain résultats particuliers.

* Question & remarque

** Question & remarque

- Solution satisfaisante ?
- Cas d'usage intéressent non couvert ?
- Contre exemple ?
- Meilleur solution ?
