Compare commits
9 Commits
TSDiff-S4
...
February-R
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3f05f386f | ||
|
|
76a597af28 | ||
|
|
7bd0476085 | ||
|
|
d10f8a5ff6 | ||
|
|
77be7371df | ||
|
|
acaad2710a | ||
|
|
c6fa17fa40 | ||
|
|
e8e53ab185 | ||
|
|
32de50b87e |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.csv filter=lfs diff=lfs merge=lfs -text
|
||||
BIN
Reports/February/MP2324_verslag2_Mylle_Victor.pdf
Normal file
BIN
Reports/February/MP2324_verslag2_Mylle_Victor.pdf
Normal file
Binary file not shown.
BIN
Reports/February/ea-en.pdf
Normal file
BIN
Reports/February/ea-en.pdf
Normal file
Binary file not shown.
BIN
Reports/February/ea-nl.pdf
Normal file
BIN
Reports/February/ea-nl.pdf
Normal file
Binary file not shown.
BIN
Reports/February/eb-en.pdf
Normal file
BIN
Reports/February/eb-en.pdf
Normal file
Binary file not shown.
185
Reports/February/ugent-doc.cls
Normal file
185
Reports/February/ugent-doc.cls
Normal file
@@ -0,0 +1,185 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
% Ghent University document class
|
||||
% Created by DF Benoit, December 15, 2022
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\NeedsTeXFormat{LaTeX2e}
|
||||
\ProvidesClass{ugent-doc}
|
||||
|
||||
% Required packages
|
||||
\RequirePackage{kvoptions}
|
||||
\RequirePackage{geometry}
|
||||
\RequirePackage{calc}
|
||||
\RequirePackage{graphicx}
|
||||
\RequirePackage{xcolor}
|
||||
|
||||
% ugent-doc specific options (kvoptions)
|
||||
\SetupKeyvalOptions{family=ugd,prefix=ugd@} %UGentArticle
|
||||
|
||||
% Declare the class specific options
|
||||
\DeclareStringOption[eb]{faculty}[eb]
|
||||
\DeclareStringOption[en]{language}[en]
|
||||
\DeclareStringOption[article]{doctype}[article]
|
||||
\DeclareBoolOption[true]{sftitles} % Default: true
|
||||
\ProcessKeyvalOptions*
|
||||
|
||||
% Pass options not specified above to the parent class
|
||||
% \@unusedoptionlist is a macro in kvoptions
|
||||
\LoadClass[\@unusedoptionlist]{\ugd@doctype}
|
||||
|
||||
% All sections, subsections and subsubsections in sans serif
|
||||
\ifugd@sftitles
|
||||
\RequirePackage[sf]{titlesec}
|
||||
\fi
|
||||
|
||||
% Define UGent colors
|
||||
%= = = = = = = = = = =
|
||||
% Base colors
|
||||
% UGent blue
|
||||
\definecolor{ugentblue}{RGB}{30,100,200}
|
||||
% UGent yellow
|
||||
\definecolor{ugentyellow}{RGB}{255,210,0}
|
||||
% UGent white
|
||||
\definecolor{ugentwhite}{RGB}{255,255,255}
|
||||
% UGent black
|
||||
\definecolor{ugentblack}{RGB}{0,0,0}
|
||||
|
||||
% Faculty specific colors
|
||||
% Faculty of Literature & Philosophy
|
||||
\definecolor{ugent-lw}{RGB}{241,164,43}
|
||||
% Faculty of Law
|
||||
\definecolor{ugent-re}{RGB}{220,78,40}
|
||||
% Faculty of Science
|
||||
\definecolor{ugent-we}{RGB}{45,140,168}
|
||||
% Faculty of Medicine and Health Sciences
|
||||
\definecolor{ugent-ge}{RGB}{232,94,113}
|
||||
% Faculty of Engineering and Architecture
|
||||
\definecolor{ugent-ea}{RGB}{139,190,232}
|
||||
% Faculty of Economics and Business Administration
|
||||
\definecolor{ugent-eb}{RGB}{174,176,80}
|
||||
% Faculty of Veterinary Medicine
|
||||
\definecolor{ugent-di}{RGB}{130,84,145}
|
||||
% Faculty of Psychology and Educational Sciences
|
||||
\definecolor{ugent-pp}{RGB}{251,126,58}
|
||||
% Faculty of Bioscience Engineering
|
||||
\definecolor{ugent-bw}{RGB}{39,171,173}
|
||||
% Faculty of Pharmaceutical Sciences
|
||||
\definecolor{ugent-fw}{RGB}{190,81,144}
|
||||
% Faculty of Political and Social Sciences
|
||||
\definecolor{ugent-ps}{RGB}{113,168,96}
|
||||
|
||||
% Define new commands
|
||||
\def\thetitle#1{\def\@thetitle{#1}}
|
||||
\def\thesubtitle#1{\def\@thesubtitle{#1}}
|
||||
\def\infoboxa#1{\def\@infoboxa{#1}}
|
||||
\def\infoboxb#1{\def\@infoboxb{#1}}
|
||||
\def\infoboxc#1{\def\@infoboxc{#1}}
|
||||
\def\infoboxd#1{\def\@infoboxd{#1}}
|
||||
|
||||
% Initialize new commands as 'empty'
|
||||
\def\@thetitle{}
|
||||
\def\@thesubtitle{}
|
||||
\def\@infoboxa{}
|
||||
\def\@infoboxb{}
|
||||
\def\@infoboxc{}
|
||||
\def\@infoboxd{}
|
||||
|
||||
% Define lengths based on UGent document grid
|
||||
% See: https://styleguide.ugent.be/basic-principles/grid-and-layout.html
|
||||
\newlength{\longedge}
|
||||
\setlength{\longedge}{\maxof{\paperheight}{\paperwidth}}
|
||||
\newlength{\gridunit}
|
||||
\setlength{\gridunit}{\longedge/28} %Divide long edge by 7 and next by 4
|
||||
\newlength{\subpaperheight}
|
||||
\setlength{\subpaperheight}{\paperheight-7\gridunit} %Type area: 3 units for faculty logo, 4 units for UGent logo
|
||||
\newlength{\subpaperwidth}
|
||||
\setlength{\subpaperwidth}{\paperwidth-\gridunit} %Left margin of 1 gridunit
|
||||
|
||||
% Define strut based on \gridunit
|
||||
\newcommand{\mystrut}[1][-.5]{\rule[#1\gridunit]{0pt}{0pt}}
|
||||
|
||||
% Set default page layout
|
||||
% Can be overwritten in preamble of document
|
||||
\renewcommand{\baselinestretch}{1.15} % line spacing
|
||||
\geometry{bottom=2.5cm,top=2.5cm,left=3cm,right=2cm} % margins
|
||||
|
||||
% Redefine the titlepage in accordance with UGent styleguide
|
||||
\renewcommand\maketitle{\begin{titlepage}%
|
||||
\thispagestyle{empty} % by default, the pagestyle of title page is plain
|
||||
\newgeometry{top=0cm, bottom=0cm, left=0cm, right=0cm} % set special margins
|
||||
\setlength{\parindent}{0cm} % necessary to put minipages/boxes at extreme left of page
|
||||
\setlength{\parsep}{0cm} % necessary to stack minipages/boxes without space
|
||||
\setlength{\fboxsep}{0cm} % no border around minipages/boxes
|
||||
\setlength{\parskip}{0cm}
|
||||
\setlength{\lineskip}{0cm}
|
||||
|
||||
\ifugd@sftitles
|
||||
\sffamily % Titlepage in sans serif font
|
||||
\fi
|
||||
|
||||
\includegraphics[height=3\gridunit]{\ugd@faculty-\ugd@language.pdf}%
|
||||
|
||||
\makebox[\gridunit]{}% Left margin of 1 gridunit
|
||||
\colorbox{ugent-\ugd@faculty!30}{%
|
||||
%\colorbox{ugentwhite}{%
|
||||
\begin{minipage}[c][\subpaperheight][t]{\subpaperwidth}%
|
||||
\vskip 5\gridunit % top margin within minipage
|
||||
\hskip \gridunit % left margin of 1 within the colorbox
|
||||
%\fbox{%
|
||||
\begin{minipage}{\subpaperwidth-2\gridunit} % tile minipage, right margin of 1
|
||||
\raggedright\bfseries\huge
|
||||
\textcolor{ugentblue}{\mystrut\@thetitle}\newline
|
||||
\Large\textcolor{ugentblue}{\@thesubtitle}
|
||||
\mystrut[1]
|
||||
\end{minipage}%}
|
||||
|
||||
\vskip\fill % Push down to bottom of minipage
|
||||
|
||||
\ifx\@infoboxa\empty\else % ony put box if not empty
|
||||
\hskip\gridunit % left margin of infobox
|
||||
%\fbox{%
|
||||
\begin{minipage}[b]{\subpaperwidth-3\gridunit} % right margin of 1
|
||||
\@infoboxa
|
||||
\end{minipage}%}
|
||||
|
||||
\baselineskip0pt\mystrut
|
||||
\fi
|
||||
|
||||
\ifx\@infoboxb\empty\else % ony put box if not empty
|
||||
\hskip\gridunit % left margin of infobox
|
||||
%\fbox{%
|
||||
\begin{minipage}[b]{\subpaperwidth-3\gridunit} % right margin of 1
|
||||
\@infoboxb
|
||||
\end{minipage}%}
|
||||
|
||||
\baselineskip0pt\mystrut
|
||||
\fi
|
||||
|
||||
\ifx\@infoboxc\empty\else % ony put box if not empty
|
||||
\hskip\gridunit % left margin of infobox
|
||||
%\fbox{%
|
||||
\begin{minipage}[b]{\subpaperwidth-3\gridunit} % right margin of 1
|
||||
\@infoboxc
|
||||
\end{minipage}%}
|
||||
|
||||
\baselineskip0pt\mystrut
|
||||
\fi
|
||||
|
||||
\ifx\@infoboxd\empty\else % ony put box if not empty
|
||||
\hskip\gridunit % left margin of infobox
|
||||
%\fbox{%
|
||||
\begin{minipage}[b]{\subpaperwidth-3\gridunit} % right margin of 1
|
||||
\@infoboxd
|
||||
\end{minipage}%}
|
||||
\fi
|
||||
|
||||
\baselineskip0pt\mystrut[-1]
|
||||
\end{minipage}
|
||||
}%
|
||||
|
||||
\includegraphics[height=4\gridunit]{ugent-\ugd@language.pdf}%
|
||||
\end{titlepage}
|
||||
\restoregeometry
|
||||
}
|
||||
BIN
Reports/February/ugent-en.pdf
Normal file
BIN
Reports/February/ugent-en.pdf
Normal file
Binary file not shown.
34
Reports/February/verslag.aux
Normal file
34
Reports/February/verslag.aux
Normal file
@@ -0,0 +1,34 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@nameuse{bbl@beforestart}
|
||||
\abx@aux@refcontext{nyt/global//global/global}
|
||||
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
|
||||
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
|
||||
\global\let\oldcontentsline\contentsline
|
||||
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
|
||||
\global\let\oldnewlabel\newlabel
|
||||
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
|
||||
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
|
||||
\AtEndDocument{\ifx\hyper@anchor\@undefined
|
||||
\let\contentsline\oldcontentsline
|
||||
\let\newlabel\oldnewlabel
|
||||
\fi}
|
||||
\fi}
|
||||
\global\let\hyper@last\relax
|
||||
\gdef\HyperFirstAtBeginDocument#1{#1}
|
||||
\providecommand\HyField@AuxAddToFields[1]{}
|
||||
\providecommand\HyField@AuxAddToCoFields[2]{}
|
||||
\@writefile{toc}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
|
||||
\@writefile{lof}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
|
||||
\@writefile{lot}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
|
||||
\babel@aux{english}{}
|
||||
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {1}Intermediate Results}{1}{section.1}\protected@file@percent }
|
||||
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Net Regulation Volume Modeling}{1}{subsection.1.1}\protected@file@percent }
|
||||
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}Input Features}{1}{subsubsection.1.1.1}\protected@file@percent }
|
||||
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Models}{1}{subsubsection.1.1.2}\protected@file@percent }
|
||||
\@writefile{lot}{\defcounter {refsection}{0}\relax }\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Performance of Autoregressive Models}}{1}{table.1}\protected@file@percent }
|
||||
\newlabel{tab:general_models}{{1}{1}{Performance of Autoregressive Models}{table.1}{}}
|
||||
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.3}Charging Policy}{2}{subsubsection.1.1.3}\protected@file@percent }
|
||||
\@writefile{lot}{\defcounter {refsection}{0}\relax }\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Comparison of Energy Storage Policies Using Predicted NRV. Battery of 2MWh with 1MW charge/discharge power. Evaluated on data from 01-01-2023 until 08-10-2023.}}{2}{table.2}\protected@file@percent }
|
||||
\newlabel{table:energy_storage_policies}{{2}{2}{Comparison of Energy Storage Policies Using Predicted NRV. Battery of 2MWh with 1MW charge/discharge power. Evaluated on data from 01-01-2023 until 08-10-2023}{table.2}{}}
|
||||
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {2}Schedule next months}{3}{section.2}\protected@file@percent }
|
||||
2592
Reports/February/verslag.bcf
Normal file
2592
Reports/February/verslag.bcf
Normal file
File diff suppressed because it is too large
Load Diff
1000
Reports/February/verslag.log
Normal file
1000
Reports/February/verslag.log
Normal file
File diff suppressed because it is too large
Load Diff
6
Reports/February/verslag.out
Normal file
6
Reports/February/verslag.out
Normal file
@@ -0,0 +1,6 @@
|
||||
\BOOKMARK [1][-]{section.1}{Intermediate Results}{}% 1
|
||||
\BOOKMARK [2][-]{subsection.1.1}{Net Regulation Volume Modeling}{section.1}% 2
|
||||
\BOOKMARK [3][-]{subsubsection.1.1.1}{Input Features}{subsection.1.1}% 3
|
||||
\BOOKMARK [3][-]{subsubsection.1.1.2}{Models}{subsection.1.1}% 4
|
||||
\BOOKMARK [3][-]{subsubsection.1.1.3}{Charging Policy}{subsection.1.1}% 5
|
||||
\BOOKMARK [1][-]{section.2}{Schedule next months}{}% 6
|
||||
BIN
Reports/February/verslag.pdf
Normal file
BIN
Reports/February/verslag.pdf
Normal file
Binary file not shown.
89
Reports/February/verslag.run.xml
Normal file
89
Reports/February/verslag.run.xml
Normal file
@@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" standalone="yes"?>
|
||||
<!-- logreq request file -->
|
||||
<!-- logreq version 1.0 / dtd version 1.0 -->
|
||||
<!-- Do not edit this file! -->
|
||||
<!DOCTYPE requests [
|
||||
<!ELEMENT requests (internal | external)*>
|
||||
<!ELEMENT internal (generic, (provides | requires)*)>
|
||||
<!ELEMENT external (generic, cmdline?, input?, output?, (provides | requires)*)>
|
||||
<!ELEMENT cmdline (binary, (option | infile | outfile)*)>
|
||||
<!ELEMENT input (file)+>
|
||||
<!ELEMENT output (file)+>
|
||||
<!ELEMENT provides (file)+>
|
||||
<!ELEMENT requires (file)+>
|
||||
<!ELEMENT generic (#PCDATA)>
|
||||
<!ELEMENT binary (#PCDATA)>
|
||||
<!ELEMENT option (#PCDATA)>
|
||||
<!ELEMENT infile (#PCDATA)>
|
||||
<!ELEMENT outfile (#PCDATA)>
|
||||
<!ELEMENT file (#PCDATA)>
|
||||
<!ATTLIST requests
|
||||
version CDATA #REQUIRED
|
||||
>
|
||||
<!ATTLIST internal
|
||||
package CDATA #REQUIRED
|
||||
priority (9) #REQUIRED
|
||||
active (0 | 1) #REQUIRED
|
||||
>
|
||||
<!ATTLIST external
|
||||
package CDATA #REQUIRED
|
||||
priority (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8) #REQUIRED
|
||||
active (0 | 1) #REQUIRED
|
||||
>
|
||||
<!ATTLIST provides
|
||||
type (static | dynamic | editable) #REQUIRED
|
||||
>
|
||||
<!ATTLIST requires
|
||||
type (static | dynamic | editable) #REQUIRED
|
||||
>
|
||||
<!ATTLIST file
|
||||
type CDATA #IMPLIED
|
||||
>
|
||||
]>
|
||||
<requests version="1.0">
|
||||
<internal package="biblatex" priority="9" active="0">
|
||||
<generic>latex</generic>
|
||||
<provides type="dynamic">
|
||||
<file>verslag.bcf</file>
|
||||
</provides>
|
||||
<requires type="dynamic">
|
||||
<file>verslag.bbl</file>
|
||||
</requires>
|
||||
<requires type="static">
|
||||
<file>blx-dm.def</file>
|
||||
<file>apa.dbx</file>
|
||||
<file>blx-compat.def</file>
|
||||
<file>biblatex.def</file>
|
||||
<file>standard.bbx</file>
|
||||
<file>apa.bbx</file>
|
||||
<file>apa.cbx</file>
|
||||
<file>biblatex.cfg</file>
|
||||
<file>english.lbx</file>
|
||||
<file>american.lbx</file>
|
||||
<file>american-apa.lbx</file>
|
||||
<file>english-apa.lbx</file>
|
||||
</requires>
|
||||
</internal>
|
||||
<external package="biblatex" priority="5" active="0">
|
||||
<generic>biber</generic>
|
||||
<cmdline>
|
||||
<binary>biber</binary>
|
||||
<infile>verslag</infile>
|
||||
</cmdline>
|
||||
<input>
|
||||
<file>verslag.bcf</file>
|
||||
</input>
|
||||
<output>
|
||||
<file>verslag.bbl</file>
|
||||
</output>
|
||||
<provides type="dynamic">
|
||||
<file>verslag.bbl</file>
|
||||
</provides>
|
||||
<requires type="dynamic">
|
||||
<file>verslag.bcf</file>
|
||||
</requires>
|
||||
<requires type="editable">
|
||||
<file>./references.bib</file>
|
||||
</requires>
|
||||
</external>
|
||||
</requests>
|
||||
BIN
Reports/February/verslag.synctex.gz
Normal file
BIN
Reports/February/verslag.synctex.gz
Normal file
Binary file not shown.
213
Reports/February/verslag.tex
Normal file
213
Reports/February/verslag.tex
Normal file
@@ -0,0 +1,213 @@
|
||||
\documentclass[12pt,a4paper,faculty=ea,language=en,doctype=article]{ugent-doc}
|
||||
|
||||
% Optional: margins and spacing
|
||||
%-------------------------------
|
||||
% Uncomment and adjust to change the default values set by the template
|
||||
% Note: the defaults are suggested values by Ghent University
|
||||
%\geometry{bottom=2.5cm,top=2.5cm,left=3cm,right=2cm}
|
||||
%\renewcommand{\baselinestretch}{1.15} % line spacing
|
||||
|
||||
% Font
|
||||
%------
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc} % allows non-ascii input characters
|
||||
% Comment or remove the two lines below to use the default Computer Modern font
|
||||
\usepackage{libertine}
|
||||
\usepackage{libertinust1math}
|
||||
\usepackage{enumitem}
|
||||
% NOTE: because the UGent font Panno is proprietary, it is not possible to use it
|
||||
% in Overleaf. But UGent does not suggest to use Panno for documents (or maybe only for
|
||||
% the titlepage). For the body, the UGent suggestion is to use a good serif font (for
|
||||
% LaTeX this could be libertine or Computer Modern).
|
||||
|
||||
% Proper word splitting
|
||||
%-----------------------
|
||||
\usepackage[english]{babel}
|
||||
|
||||
% Mathematics
|
||||
%-------------
|
||||
\usepackage{amsmath}
|
||||
|
||||
% Figures
|
||||
%---------
|
||||
\usepackage{graphicx} % optional: the package is already loaded by the template
|
||||
\graphicspath{{./figures/}}
|
||||
|
||||
% Bibliography settings
|
||||
%-----------------------
|
||||
\usepackage[backend=biber, style=apa, sorting=nyt, hyperref=true]{biblatex}
|
||||
\addbibresource{./references.bib}
|
||||
\usepackage{csquotes} % Suggested when using babel+biblatex
|
||||
|
||||
% Hyperreferences
|
||||
%-----------------
|
||||
\usepackage[colorlinks=true, allcolors=ugentblue]{hyperref}
|
||||
|
||||
% Whitespace between paragraphs and no indentation
|
||||
%--------------------------------------------------
|
||||
\usepackage[parfill]{parskip}
|
||||
|
||||
% Input for title page
|
||||
%----------------------
|
||||
|
||||
% The title
|
||||
\thesubtitle{February Intermediate Report}
|
||||
|
||||
%% Note: a stricter UGent style could be achieved with, e.g.:
|
||||
\usepackage{ulem} % for colored underline
|
||||
\renewcommand{\ULthickness}{2pt} % adjust thickness of underline
|
||||
\thetitle{Forecasting and generative modeling of the Belgian electricity market}
|
||||
% Note: do not forget to reset the \ULthickness to 1pt after invoking \maketitle
|
||||
% (otherwise all underlines in the rest of your document will be too thick):
|
||||
%\renewcommand{\ULthickness}{1pt}
|
||||
|
||||
% The first (top) infobox at bottom of titlepage
|
||||
\infoboxa{\bfseries\large Master Thesis}
|
||||
|
||||
% The second infobox at bottom of titlepage
|
||||
\infoboxb{Name:
|
||||
\begin{tabular}[t]{l}
|
||||
Victor Mylle
|
||||
\end{tabular}
|
||||
}
|
||||
|
||||
% The third infobox at bottom of titlepage
|
||||
\infoboxc{
|
||||
Promotors:
|
||||
\begin{tabular}[t]{l}
|
||||
prof. dr. ir. Chris Develder \\
|
||||
prof. Bert Claessens
|
||||
\end{tabular}
|
||||
\\\\
|
||||
Supervisor:
|
||||
\begin{tabular}[t]{l}
|
||||
Jonas Van Gompel
|
||||
\end{tabular}
|
||||
}
|
||||
|
||||
% The last (bottom) infobox at bottom of titlepage
|
||||
\infoboxd{Academic year: 2023--2024} % note dash, not hyphen
|
||||
|
||||
|
||||
\begin{document}
|
||||
|
||||
% =====================================================================
|
||||
% Cover
|
||||
% =====================================================================
|
||||
|
||||
% ------------ TITLE PAGE ---------
|
||||
\maketitle
|
||||
\renewcommand{\ULthickness}{1pt}
|
||||
|
||||
% =====================================================================
|
||||
% Front matter
|
||||
% =====================================================================
|
||||
|
||||
% ------------ TABLE OF CONTENTS ---------
|
||||
% {\hypersetup{hidelinks}\tableofcontents} % hide link color in toc
|
||||
% \newpage
|
||||
% \begin{titlepage}
|
||||
|
||||
% \centering % Centers everything on the page
|
||||
|
||||
% % Logo or Image (Optional)
|
||||
% % \includegraphics[width=0.5\textwidth]{path_to_logo.jpg}
|
||||
|
||||
% \vspace*{2cm} % Add vertical space
|
||||
|
||||
% {\large Title: Forecasting and generative modeling of the Belgian electricity market\par}
|
||||
|
||||
% \vspace{2cm}
|
||||
% {\Large Victor Mylle\par}
|
||||
|
||||
% \vspace{1cm}
|
||||
% {\large Period of Internship: 3 July 2023 - 31 August 2023\par}
|
||||
|
||||
% \vspace{1cm}
|
||||
% {\large Mentor: dr. ir. Femke De Backere\par}
|
||||
% {\large TechWolf supervisor: ir. Jens-Joris Decorte}
|
||||
|
||||
% \end{titlepage}
|
||||
|
||||
\newpage
|
||||
|
||||
\section{Intermediate Results}
|
||||
|
||||
\subsection{Net Regulation Volume Modeling}
|
||||
Using a generative model, we try to predict the NRV for the next day. The model is trained on historical data and uses multiple input features to model the NRV. The data for the input features can all be downloaded from \href{https://www.elia.be/en/grid-data/open-data}{Elia Open Data}.
|
||||
|
||||
\subsubsection{Input Features}
|
||||
The generative model uses multiple input features to predict the NRV.
|
||||
|
||||
\begin{itemize}[noitemsep]
|
||||
\item NRV History (NRV of yesterday)
|
||||
\item Load Forecast (Forecasted load of tomorrow)
|
||||
\item Load History (Load of yesterday)
|
||||
\item Wind Forecast (Forecasted wind of tomorrow)
|
||||
\item Wind History (Wind of yesterday)
|
||||
\item Implicit net position (Nominal net position of tomorrow)
|
||||
\item Time features (Day of the week + quarter of the day)
|
||||
\item Photovoltaic Forecast\textsuperscript{*}
|
||||
\item Photovoltaic History\textsuperscript{*}
|
||||
\end{itemize}
|
||||
\textsuperscript{*} These features are not used currently, the data was not available. These features can easily be added without changing any code.
|
||||
|
||||
\subsubsection{Models}
|
||||
In the intermediate report of November, baselines were discussed. Now, other more advanced models are used. Samples must be generated using the model, this means the model can't just output one value but a distribution is needed. Quantile Regression can be used for this task. The model then outputs the values of multiple quantiles. For example, the model outputs the value for which 10\% of the data is lower, the value for which 50\% of the data is lower, etc. This way, the model outputs a distribution which can be used to sample from. The NRV predicitons are done in a quarter-hourly resolution. To predict the NRV for the next day, 96 values need to be sampled. This can be done in an autoregressive manner. The model outputs the quantiles for the first quarter-hour, a sample is drawn from this distribution and this sample is used as input for the next quarter-hour. This process is repeated 96 times.
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{lcc}
|
||||
\hline
|
||||
\textbf{Model} & \textbf{test\_L1Loss} & \textbf{test\_CRPSLoss} \\
|
||||
\hline
|
||||
Linear Model & 101.639 & 68.485 \\
|
||||
Non Linear Model & 102.031 & 68.968 \\
|
||||
LSTM/GRU Model & 104.261 & 66.052 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\caption{Performance of Autoregressive Models}
|
||||
\label{tab:general_models}
|
||||
\end{table}
|
||||
|
||||
At the moment, I am experimenting with a diffusion model to generatively model the NRV but more research and expermimenting needs to be done.
|
||||
|
||||
\subsubsection{Charging Policy}
|
||||
Using the predicted NRV, a policy can be implemented to charge and discharge a battery. The goal of the policy is to maximize the profit made by selling the stored electricity. A simple policy is implemented to charge and discharge the battery based on 2 thresholds determined by the predicted NRV. The policy is evaluated on historical data and the profit is calculated. To determine the charge and discharge threshold, 1000 full NRV predictions are done for the next day and for each of these predicitions, the thresholds are determined. Next, the mean of these thresholds is used as the final threshold.
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{lccc}
|
||||
\hline
|
||||
\textbf{Policy} & \textbf{Total Profit (€)} & \textbf{Charge Cycles} \\
|
||||
\hline
|
||||
Baseline (charge: €150, discharge: €175) & 251,202.59 & 725 \\
|
||||
Baseline (yesterday imbalance price) & 342,980.09 & 903 \\
|
||||
GRU Predicted NRV (mean thresholds) & 339,846.91 & 842 \\
|
||||
Diffusion Predicted NRV (mean thresholds) & 338,168.03 & 886 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\caption{Comparison of Energy Storage Policies Using Predicted NRV. Battery of 2MWh with 1MW charge/discharge power. Evaluated on data from 01-01-2023 until 08-10-2023.}
|
||||
\label{table:energy_storage_policies}
|
||||
\end{table}
|
||||
|
||||
The recommended charge cycles for a battery is <400 cycles per year. The policy also needs to take this into account. A penalty parameter can be introduced and determined so that the policy is penalized for every charge cycle above 400. The policy can then be optimized using this penalty parameter. I am currenlty experimenting with this.
|
||||
|
||||
|
||||
\newpage
|
||||
\section{Schedule next months}
|
||||
\begin{itemize}
|
||||
\item Baselines with penalties for charge cycles above 400
|
||||
\item Better visualizations of the policy profit results.
|
||||
\item Case studies of days with extreme thresholds
|
||||
|
||||
\item Finetuning of models and hyperparametres based on model errors and profits of the policy
|
||||
\item Ablation study of input features
|
||||
|
||||
\item Experiment further with diffusion models
|
||||
|
||||
\item During the experimenting, I will write my thesis and update the results and conclusions chapters.
|
||||
\end{itemize}
|
||||
|
||||
\end{document}
|
||||
|
||||
@@ -144,5 +144,61 @@ Test data: 01-01-2023 until 08-10–2023
|
||||
- [x] Profit penalty parameter als over charge cycles voor een dag -> parameter bepalen op training data (convex probleem) (< 400 charge cycles per jaar) (over een dag kijken hoeveel charge cycles -> profit - penalty * charge cycles erover, (misschien belonen als eronder charge cycles))
|
||||
|
||||
- [ ] Meer verschil bekijken tussen GRU en diffusion
|
||||
- [ ] Andere lagen voor diffusion model (GRU, kijken naar TSDiff)
|
||||
- [x] Policies met andere modellen (Linear, Non Linear)
|
||||
- [ ] (In Progress) Andere lagen voor diffusion model (GRU, kijken naar TSDiff)
|
||||
- [x] Policies met andere modellen (Linear, Non Linear)
|
||||
|
||||
- [ ] Visualize the policies over the whole testr set -> thresholds plotten voor elke dag (elke policy) -> mss distribution om overzichtelijk te houden (mean and std)
|
||||
- [ ] Probleem met diffusion model (activation function? waarom direct grote waardes?)
|
||||
|
||||
- [ ] Autoregressive confidence problem -> Quantiles zelf uit elkaar halen (helpt dit?)
|
||||
|
||||
- [ ] time steps reducing for diffusion model (UNet activation functions?)
|
||||
|
||||
- [ ] (State space model? S4)
|
||||
|
||||
|
||||
|
||||
TODO:
|
||||
- [ ] diffusion model oefening generative models vragen
|
||||
- [ ] Non autoregressive models policy testen (Non Linear eerst) -> als dit al slect, niet verder kijken, wel vermelden
|
||||
- [ ] Policy in test set -> over charge cycles (stop trading electricity)
|
||||
|
||||
- [ ] penalty bepalen op training data
|
||||
|
||||
- [ ] cycles en profit herschalen naar per jaar
|
||||
|
||||
|
||||
baseline -> NRV van gisteren gebruiken om thresholds te bepalen voor vandaag
|
||||
andere policies -> NRV van vandaag voorspellen met model en thresholds bepalen voor vandaag
|
||||
|
||||
|
||||
Eerste baseline -> thresholds bepalen op training data maar ook stoppen als 400 cycles (herschalen) per jaar bereikt zijn -> thresholds zouden anders moeten zijn (Ook met penalty parameter)
|
||||
-> deze toepassen op test set (ook stoppen als 400/jaar bereikt zijn)
|
||||
|
||||
|
||||
Visualizatie van thresholds over test set voor baselines en complexere modellen -> zonder penalties tonen
|
||||
|
||||
|
||||
|
||||
|
||||
1 a 2 Case studies (extreme gevallen, thresholds 150, -5, normale mss)
|
||||
|
||||
- Generatie van NRV (echte NRV)
|
||||
- Thresholds die eruit komen
|
||||
- Profit en charge cycles
|
||||
|
||||
|
||||
|
||||
Policy volledig fixen en later training script met policy direct erachter (tijdens schrijven door laten runnen)
|
||||
|
||||
1) Policy
|
||||
2) Finetuning van modellen (+ vergelijken met elkaar opbv profit en error)
|
||||
3) Ablation Study (input features weghalen en kijken wat er gebeurt)
|
||||
( 4) Diffusion tussendoor )
|
||||
|
||||
|
||||
Inleiding +
|
||||
Literatuurstudie +
|
||||
Tabellen die we gaan bespreken -> updaten met nieuwe data dan
|
||||
|
||||
Nog eens 3e meeting opbrengen voor 2e deel maart.
|
||||
@@ -45,3 +45,53 @@ class SimpleDiffusionModel(DiffusionModel):
|
||||
self.layers.append(nn.ReLU())
|
||||
|
||||
self.layers.append(nn.Linear(hidden_sizes[-1] + time_dim + other_inputs_dim, input_size))
|
||||
|
||||
class GRUDiffusionModel(DiffusionModel):
|
||||
def __init__(self, input_size: int, hidden_sizes: list, other_inputs_dim: int, gru_hidden_size: int, time_dim: int = 64):
|
||||
super(GRUDiffusionModel, self).__init__(time_dim)
|
||||
|
||||
self.other_inputs_dim = other_inputs_dim
|
||||
self.gru_hidden_size = gru_hidden_size
|
||||
|
||||
# GRU layer
|
||||
self.gru = nn.GRU(input_size=input_size + time_dim + other_inputs_dim,
|
||||
hidden_size=gru_hidden_size,
|
||||
num_layers=3,
|
||||
batch_first=True)
|
||||
|
||||
# Fully connected layers after GRU
|
||||
self.fc_layers = nn.ModuleList()
|
||||
prev_size = gru_hidden_size
|
||||
for hidden_size in hidden_sizes:
|
||||
self.fc_layers.append(nn.Linear(prev_size, hidden_size))
|
||||
self.fc_layers.append(nn.ReLU())
|
||||
prev_size = hidden_size
|
||||
|
||||
# Final output layer
|
||||
self.fc_layers.append(nn.Linear(prev_size, input_size))
|
||||
|
||||
def forward(self, x, t, inputs):
|
||||
batch_size, seq_len = x.shape
|
||||
x = x.unsqueeze(-1).repeat(1, 1, seq_len)
|
||||
|
||||
# Positional encoding for each time step
|
||||
t = t.unsqueeze(-1).type(torch.float)
|
||||
t = self.pos_encoding(t, self.time_dim) # Shape: [batch_size, seq_len, time_dim]
|
||||
|
||||
# repeat time encoding for each time step t is shape [batch_size, time_dim], i want [batch_size, seq_len, time_dim]
|
||||
t = t.unsqueeze(1).repeat(1, seq_len, 1)
|
||||
|
||||
# Concatenate x, t, and inputs along the feature dimension
|
||||
x = torch.cat((x, t, inputs), dim=-1) # Shape: [batch_size, seq_len, input_size + time_dim + other_inputs_dim]
|
||||
|
||||
# Pass through GRU
|
||||
output, hidden = self.gru(x) # Hidden Shape: [batch_size, seq_len, 1]
|
||||
|
||||
# Get last hidden state
|
||||
x = hidden[-1]
|
||||
|
||||
# Process each time step's output with fully connected layers
|
||||
for layer in self.fc_layers:
|
||||
x = layer(x)
|
||||
|
||||
return x
|
||||
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -31,7 +31,7 @@
|
||||
"from datetime import datetime\n",
|
||||
"import torch.nn as nn\n",
|
||||
"from src.models.time_embedding_layer import TimeEmbedding\n",
|
||||
"from src.models.diffusion_model import SimpleDiffusionModel\n",
|
||||
"from src.models.diffusion_model import SimpleDiffusionModel, GRUDiffusionModel\n",
|
||||
"from src.trainers.diffusion_trainer import DiffusionTrainer\n",
|
||||
"from torchinfo import summary\n",
|
||||
"\n",
|
||||
@@ -62,30 +62,99 @@
|
||||
"\n",
|
||||
"data_config.NOMINAL_NET_POSITION = True\n",
|
||||
"\n",
|
||||
"data_processor = DataProcessor(data_config, path=\"../../\")\n",
|
||||
"data_processor = DataProcessor(data_config, path=\"../../\", lstm=True)\n",
|
||||
"data_processor.set_batch_size(1024)\n",
|
||||
"data_processor.set_full_day_skip(True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"ClearML Task: created new task id=b71216825809432682ea3c7841c07612\n",
|
||||
"ClearML results page: http://192.168.1.182:8080/projects/2e46d4af6f1e4c399cf9f5aa30bc8795/experiments/b71216825809432682ea3c7841c07612/output/log\n"
|
||||
"torch.Size([1024, 96, 96])\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"500 model found when searching for `file:///workspaces/Thesis/src/notebooks/checkpoint.pt`\n",
|
||||
"Selected model `Autoregressive Non Linear Quantile Regression + Quarter + DoW + Net` (id=bc0cb0d7fc614e2e8b0edf5b85348646)\n"
|
||||
"/opt/conda/lib/python3.10/site-packages/torch/nn/modules/loss.py:536: UserWarning: Using a target size (torch.Size([1024, 96])) that is different to the input size (torch.Size([2, 1024, 96])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n",
|
||||
" return F.mse_loss(input, target, reduction=self.reduction)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"torch.Size([556, 96, 96])\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/opt/conda/lib/python3.10/site-packages/torch/nn/modules/loss.py:536: UserWarning: Using a target size (torch.Size([556, 96])) that is different to the input size (torch.Size([2, 556, 96])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n",
|
||||
" return F.mse_loss(input, target, reduction=self.reduction)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n",
|
||||
"torch.Size([1024, 96, 96])\n",
|
||||
"torch.Size([556, 96, 96])\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"KeyboardInterrupt\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -95,14 +164,15 @@
|
||||
"epochs=150\n",
|
||||
"\n",
|
||||
"#### Model ####\n",
|
||||
"model = SimpleDiffusionModel(96, [512, 512, 512], other_inputs_dim=inputDim[1], time_dim=64)\n",
|
||||
"# model = SimpleDiffusionModel(96, [512, 512, 512], other_inputs_dim=inputDim[1], time_dim=64)\n",
|
||||
"model = GRUDiffusionModel(96, [256, 256], other_inputs_dim=inputDim[2], time_dim=64, gru_hidden_size=128)\n",
|
||||
"\n",
|
||||
"#### ClearML ####\n",
|
||||
"task = clearml_helper.get_task(task_name=\"Diffusion Model\")\n",
|
||||
"# task = clearml_helper.get_task(task_name=\"Diffusion Model\")\n",
|
||||
"\n",
|
||||
"#### Trainer ####\n",
|
||||
"trainer = DiffusionTrainer(model, data_processor, \"cuda\")\n",
|
||||
"trainer.train(epochs, learningRate, task)"
|
||||
"trainer.train(epochs, learningRate, None)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -246,7 +316,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.11"
|
||||
"version": "3.10.8"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1197,7 +1197,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.11"
|
||||
"version": "3.10.8"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -124,6 +124,9 @@ def get_next_day_profits_for_date(model, data_processor, test_loader, date, ipc,
|
||||
predicted_nrv_profits_cycles = {i: [0, 0] for i in penalties}
|
||||
baseline_profits_cycles = {i: [0, 0] for i in penalties}
|
||||
|
||||
_charge_thresholds = {}
|
||||
_discharge_thresholds = {}
|
||||
|
||||
initial, nrvs, target = predict_NRV(model, date, data_processor, test_loader)
|
||||
|
||||
initial = np.repeat(initial, nrvs.shape[0])
|
||||
@@ -139,6 +142,10 @@ def get_next_day_profits_for_date(model, data_processor, test_loader, date, ipc,
|
||||
|
||||
for penalty in penalties:
|
||||
found_charge_thresholds, found_discharge_thresholds = baseline_policy.get_optimal_thresholds(reconstructed_imbalance_prices, charge_thresholds, discharge_thresholds, penalty)
|
||||
|
||||
_charge_thresholds[penalty] = found_charge_thresholds
|
||||
_discharge_thresholds[penalty] = found_discharge_thresholds
|
||||
|
||||
next_day_charge_threshold = found_charge_thresholds.mean(axis=0)
|
||||
next_day_discharge_threshold = found_discharge_thresholds.mean(axis=0)
|
||||
yesterday_charge_thresholds, yesterday_discharge_thresholds = baseline_policy.get_optimal_thresholds(yesterday_imbalance_prices, charge_thresholds, discharge_thresholds, penalty)
|
||||
@@ -153,23 +160,29 @@ def get_next_day_profits_for_date(model, data_processor, test_loader, date, ipc,
|
||||
baseline_profits_cycles[penalty][0] += yesterday_profit.item()
|
||||
baseline_profits_cycles[penalty][1] += yesterday_charge_cycles.item()
|
||||
|
||||
return predicted_nrv_profits_cycles, baseline_profits_cycles
|
||||
return predicted_nrv_profits_cycles, baseline_profits_cycles, _charge_thresholds, _discharge_thresholds
|
||||
|
||||
def next_day_test_set(model, data_processor, test_loader, ipc, predict_NRV: callable):
|
||||
penalties = [0, 10, 50, 150, 300, 500, 600, 800, 1000, 1500, 2000, 2500]
|
||||
predicted_nrv_profits_cycles = {i: [0, 0] for i in penalties}
|
||||
baseline_profits_cycles = {i: [0, 0] for i in penalties}
|
||||
|
||||
charge_thresholds = {}
|
||||
discharge_thresholds = {}
|
||||
|
||||
# get all dates in test set
|
||||
dates = baseline_policy.test_data["DateTime"].dt.date.unique()
|
||||
|
||||
# dates back to datetime
|
||||
dates = pd.to_datetime(dates)
|
||||
|
||||
for date in tqdm(dates):
|
||||
for date in tqdm(dates[:10]):
|
||||
try:
|
||||
new_predicted_nrv_profits_cycles, new_baseline_profits_cycles = get_next_day_profits_for_date(model, data_processor, test_loader, date, ipc, predict_NRV, penalties)
|
||||
new_predicted_nrv_profits_cycles, new_baseline_profits_cycles, new_charge_thresholds, new_discharge_thresholds = get_next_day_profits_for_date(model, data_processor, test_loader, date, ipc, predict_NRV, penalties)
|
||||
|
||||
charge_thresholds[date] = new_charge_thresholds
|
||||
discharge_thresholds[date] = new_discharge_thresholds
|
||||
|
||||
for penalty in penalties:
|
||||
predicted_nrv_profits_cycles[penalty][0] += new_predicted_nrv_profits_cycles[penalty][0]
|
||||
predicted_nrv_profits_cycles[penalty][1] += new_predicted_nrv_profits_cycles[penalty][1]
|
||||
@@ -179,15 +192,15 @@ def next_day_test_set(model, data_processor, test_loader, ipc, predict_NRV: call
|
||||
|
||||
except Exception as e:
|
||||
# print(f"Error for date {date}")
|
||||
continue
|
||||
raise e
|
||||
|
||||
return predicted_nrv_profits_cycles, baseline_profits_cycles
|
||||
return predicted_nrv_profits_cycles, baseline_profits_cycles, charge_thresholds, discharge_thresholds
|
||||
|
||||
def main():
|
||||
clearml_helper = ClearMLHelper(project_name="Thesis/NrvForecast")
|
||||
task = clearml_helper.get_task(task_name="Policy Test")
|
||||
|
||||
task.execute_remotely(queue_name="default", exit_process=True)
|
||||
# task.execute_remotely(queue_name="default", exit_process=True)
|
||||
|
||||
configuration, model, data_processor, test_loader = load_model(args.task_id)
|
||||
|
||||
@@ -205,7 +218,69 @@ def main():
|
||||
|
||||
ipc = ImbalancePriceCalculator(data_path="")
|
||||
|
||||
predicted_nrv_profits_cycles, baseline_profits_cycles = next_day_test_set(model, data_processor, test_loader, ipc, predict_NRV)
|
||||
predicted_nrv_profits_cycles, baseline_profits_cycles, charge_thresholds, discharge_thresholds = next_day_test_set(model, data_processor, test_loader, ipc, predict_NRV)
|
||||
# the charge_thresholds is a dictionary with date as key. The values of the dictionary is another dictionary with keys as penalties and values as the charge thresholds
|
||||
# create density plot that shows a density plot of the charge thresholds for each penalty (use seaborn displot) (One plot with a different color for each penalty)
|
||||
|
||||
import seaborn as sns
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
charge_thresholds_for_penalty = {}
|
||||
for d in charge_thresholds.values():
|
||||
for penalty, thresholds in d.items():
|
||||
if penalty not in charge_thresholds_for_penalty:
|
||||
charge_thresholds_for_penalty[penalty] = []
|
||||
charge_thresholds_for_penalty[penalty].extend(thresholds)
|
||||
|
||||
discharge_thresholds_for_penalty = {}
|
||||
for d in discharge_thresholds.values():
|
||||
for penalty, thresholds in d.items():
|
||||
if penalty not in discharge_thresholds_for_penalty:
|
||||
discharge_thresholds_for_penalty[penalty] = []
|
||||
discharge_thresholds_for_penalty[penalty].extend(thresholds)
|
||||
|
||||
### Plot charge thresholds distribution ###
|
||||
data_to_plot = []
|
||||
for penalty, values in charge_thresholds_for_penalty.items():
|
||||
for value in values:
|
||||
data_to_plot.append({'Penalty': penalty, 'Value': value.item()})
|
||||
df = pd.DataFrame(data_to_plot)
|
||||
print(df.head())
|
||||
palette = sns.color_palette("bright", len(charge_thresholds.keys()))
|
||||
fig = sns.displot(data=df, x="Value", hue="Penalty", kind="kde", palette=palette)
|
||||
plt.title('Density of Charge Thresholds by Penalty')
|
||||
plt.xlabel('Charge Threshold')
|
||||
plt.ylabel('Density')
|
||||
plt.legend(title='Penalty')
|
||||
task.get_logger().report_matplotlib_figure(
|
||||
"Policy Results",
|
||||
"Charge Thresholds",
|
||||
iteration=0,
|
||||
figure=fig
|
||||
)
|
||||
plt.close()
|
||||
|
||||
### Plot discharge thresholds distribution ###
|
||||
data_to_plot = []
|
||||
for penalty, values in discharge_thresholds_for_penalty.items():
|
||||
for value in values:
|
||||
data_to_plot.append({'Penalty': penalty, 'Value': value.item()})
|
||||
df = pd.DataFrame(data_to_plot)
|
||||
palette = sns.color_palette("bright", len(discharge_thresholds.keys()))
|
||||
fig = sns.displot(data=df, x="Value", hue="Penalty", kind="kde", palette=palette)
|
||||
plt.title('Density of Charge Thresholds by Penalty')
|
||||
plt.xlabel('Charge Threshold')
|
||||
plt.ylabel('Density')
|
||||
plt.legend(title='Penalty')
|
||||
task.get_logger().report_matplotlib_figure(
|
||||
"Policy Results",
|
||||
"Discharge Thresholds",
|
||||
iteration=0,
|
||||
figure=fig
|
||||
)
|
||||
plt.close()
|
||||
|
||||
|
||||
|
||||
# create dataframe with columns "name", "penalty", "profit", "cycles"
|
||||
df = pd.DataFrame(columns=["name", "penalty", "profit", "cycles"])
|
||||
|
||||
@@ -19,7 +19,13 @@ def sample_diffusion(model: DiffusionModel, n: int, inputs: torch.tensor, noise_
|
||||
alpha = 1. - beta
|
||||
alpha_hat = torch.cumprod(alpha, dim=0)
|
||||
|
||||
inputs = inputs.repeat(n, 1).to(device)
|
||||
# inputs: (num_features) -> (batch_size, num_features)
|
||||
# inputs: (time_steps, num_features) -> (batch_size, time_steps, num_features)
|
||||
if len(inputs.shape) == 2:
|
||||
inputs = inputs.repeat(n, 1)
|
||||
elif len(inputs.shape) == 3:
|
||||
inputs = inputs.repeat(n, 1, 1)
|
||||
|
||||
model.eval()
|
||||
with torch.no_grad():
|
||||
x = torch.randn(inputs.shape[0], ts_length).to(device)
|
||||
@@ -45,7 +51,7 @@ class DiffusionTrainer:
|
||||
self.model = model
|
||||
self.device = device
|
||||
|
||||
self.noise_steps = 1000
|
||||
self.noise_steps = 20
|
||||
self.beta_start = 1e-4
|
||||
self.beta_end = 0.02
|
||||
self.ts_length = 96
|
||||
@@ -101,8 +107,12 @@ class DiffusionTrainer:
|
||||
|
||||
input_data = torch.randn(1024, 96).to(self.device)
|
||||
time_steps = torch.randn(1024).long().to(self.device)
|
||||
other_input_data = torch.randn(1024, self.model.other_inputs_dim).to(self.device)
|
||||
|
||||
if self.data_processor.lstm:
|
||||
inputDim = self.data_processor.get_input_size()
|
||||
other_input_data = torch.randn(1024, inputDim[1], self.model.other_inputs_dim).to(self.device)
|
||||
else:
|
||||
other_input_data = torch.randn(1024, self.model.other_inputs_dim).to(self.device)
|
||||
task.set_configuration_object("model", str(summary(self.model, input_data=[input_data, time_steps, other_input_data])))
|
||||
|
||||
self.data_processor = task.connect(self.data_processor, name="data_processor")
|
||||
@@ -120,8 +130,8 @@ class DiffusionTrainer:
|
||||
predict_sequence_length=self.ts_length
|
||||
)
|
||||
|
||||
train_sample_indices = self.random_samples(train=True, num_samples=10)
|
||||
test_sample_indices = self.random_samples(train=False, num_samples=10)
|
||||
train_sample_indices = self.random_samples(train=True, num_samples=5)
|
||||
test_sample_indices = self.random_samples(train=False, num_samples=5)
|
||||
|
||||
for epoch in range(epochs):
|
||||
running_loss = 0.0
|
||||
@@ -143,7 +153,7 @@ class DiffusionTrainer:
|
||||
|
||||
running_loss /= len(train_loader.dataset)
|
||||
|
||||
if epoch % 20 == 0 and epoch != 0:
|
||||
if epoch % 40 == 0 and epoch != 0:
|
||||
self.test(test_loader, epoch, task)
|
||||
|
||||
if task:
|
||||
@@ -154,7 +164,7 @@ class DiffusionTrainer:
|
||||
value=loss.item(),
|
||||
)
|
||||
|
||||
if epoch % 100 == 0 and epoch != 0:
|
||||
if epoch % 150 == 0 and epoch != 0:
|
||||
self.debug_plots(task, True, train_loader, train_sample_indices, epoch)
|
||||
self.debug_plots(task, False, test_loader, test_sample_indices, epoch)
|
||||
|
||||
@@ -167,6 +177,7 @@ class DiffusionTrainer:
|
||||
features, target, _ = data_loader.dataset[idx]
|
||||
|
||||
features = features.to(self.device)
|
||||
features = features.unsqueeze(0)
|
||||
|
||||
self.model.eval()
|
||||
with torch.no_grad():
|
||||
@@ -222,7 +233,7 @@ class DiffusionTrainer:
|
||||
|
||||
number_of_samples = 100
|
||||
sample = self.sample(self.model, number_of_samples, inputs)
|
||||
|
||||
|
||||
# reduce samples from (batch_size*number_of_samples, time_steps) to (batch_size, number_of_samples, time_steps)
|
||||
samples_batched = sample.reshape(inputs.shape[0], number_of_samples, 96)
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ from torch.nn import MSELoss, L1Loss
|
||||
from datetime import datetime
|
||||
import torch.nn as nn
|
||||
from src.models.time_embedding_layer import TimeEmbedding
|
||||
from src.models.diffusion_model import SimpleDiffusionModel
|
||||
from src.models.diffusion_model import GRUDiffusionModel, SimpleDiffusionModel
|
||||
from src.trainers.diffusion_trainer import DiffusionTrainer
|
||||
|
||||
|
||||
@@ -38,10 +38,11 @@ data_config.NOMINAL_NET_POSITION = True
|
||||
data_config = task.connect(data_config, name="data_features")
|
||||
|
||||
data_processor = DataProcessor(data_config, path="", lstm=False)
|
||||
data_processor.set_batch_size(8192)
|
||||
data_processor.set_batch_size(128)
|
||||
data_processor.set_full_day_skip(True)
|
||||
|
||||
inputDim = data_processor.get_input_size()
|
||||
print("Input dim: ", inputDim)
|
||||
|
||||
model_parameters = {
|
||||
"epochs": 5000,
|
||||
@@ -53,7 +54,8 @@ model_parameters = {
|
||||
model_parameters = task.connect(model_parameters, name="model_parameters")
|
||||
|
||||
#### Model ####
|
||||
model = SimpleDiffusionModel(96, model_parameters["hidden_sizes"], other_inputs_dim=inputDim[1], time_dim=model_parameters["time_dim"])
|
||||
# model = SimpleDiffusionModel(96, model_parameters["hidden_sizes"], other_inputs_dim=inputDim[1], time_dim=model_parameters["time_dim"])
|
||||
model = GRUDiffusionModel(96, model_parameters["hidden_sizes"], other_inputs_dim=inputDim[2], time_dim=model_parameters["time_dim"], gru_hidden_size=256)
|
||||
|
||||
print("Starting training ...")
|
||||
|
||||
|
||||
@@ -10,6 +10,6 @@ class ClearMLHelper:
|
||||
Task.ignore_requirements("torchvision")
|
||||
Task.ignore_requirements("tensorboard")
|
||||
task = Task.init(project_name=self.project_name, task_name=task_name, continue_last_task=False)
|
||||
task.set_base_docker(f"docker.io/clearml/pytorch-cuda-gcc:2.0.0-cuda11.7-cudnn8-runtime --env GIT_SSL_NO_VERIFY=true --env CLEARML_AGENT_GIT_USER=VictorMylle --env CLEARML_AGENT_GIT_PASS=Voetballer1" )
|
||||
task.set_base_docker(f"docker.io/clearml/pytorch-cuda-gcc:2.0.0-cuda11.7-cudnn8-runtime")
|
||||
task.set_packages("requirements.txt")
|
||||
return task
|
||||
Reference in New Issue
Block a user