\documentclass[a4paper]{article}
\usepackage{remreset}
\usepackage{optidef}
\usepackage{listings}
\usepackage{enumitem}
\usepackage[hidelinks]{hyperref}

\lstset{basicstyle=\ttfamily,breaklines=true}
% Title Page
\title{\textit{\textbf{Optidef}} \\ A Latex library for optimization problems\\ \textnormal{Version - 3.1}}

\author{Jesus Lago}

\makeatletter
\renewcommand \thesection {\@arabic\c@section}
\@removefromreset{section}{chapter}
\makeatother


\begin{document}
\maketitle

\newpage

\tableofcontents

\newpage

\section{Introduction and features}

This Latex library provides a standard set of environments for writing optimization problems. The most important features are:
\begin{enumerate}
\item It references optimization problem using three different policies: no equation is referenced, the problem is referenced with a single label, each equation has an individual reference. For more details refer to Sections \ref{sec:syntax} and \ref{sec:environments}.
\item It defines two problem size formats: a long format and a short format. For more details refer to Sections \ref{sec:syntax} and \ref{sec:longshort}.
\item It allows four different outputs for the location of the constraints. For more details refer to Sections \ref{sec:syntax} and \ref{sec:format}.
\item It allows the definition of a limitless number of constraints. For more details refer to Section \ref{subsec:syntax}.
\item Four different type of problems: \textit{minimize}, \textit{maximize}, \textit{arg min} and \textit{arg max}. For more details refer to Sections \ref{sec:syntax} and \ref{sec:environments}.
\item The optimization problem can be broken in several pages without compromising the alignment or the structure of the problem. For more details refer to Section \ref{sec:breakpages}. 
\item The objective function can be broken in several lines without compromising the alignment or the structure of the problem. For more details refer to Section \ref{sec:breakObj}.
\end{enumerate}

\section{Using the package}
The package can be imported by directly adding
\begin{lstlisting}
\usepackage{optidef}
\end{lstlisting}
to the document preamble. When importing the packages three options can be used, \verb|short|, \verb|nocomma|, and either \verb|c1|, \verb|c2|, or \verb|c3|:

\begin{lstlisting}
\usepackage[short,c1|c2|c3,nocomma]{optidef}
\end{lstlisting}

The first option changes the default long format of the optimization problems to a shorter format; for a better explanation (including examples) of the \verb|short| option check Section \ref{sec:longshort}. 

The options \verb|c1|, \verb|c2|, and \verb|c3| change the default format of the constraints; the default format is format 0 (as defined in Section \ref{sec:format}); \verb|c1|, \verb|c2|, and \verb|c3| respectively change the default constraint arrangement to format 1, 2, and 3. For a better explanation of the four formats including examples, we refer to Section \ref{sec:format}.

For the \verb|nocomma| option check Section \ref{sec:comma}. For a detailed description of how to use the package keep reading the next section.

\section{Environment Syntax Definition}
\label{sec:syntax}
Considering that \verb|Const.i| stands for constraint $i$, \verb|LHS.i| stands for the left-hand-side of constraint $i$, and \verb|RHS.i| for the right-hand-side counterpart, the basic structure to define a general optimization problem with $N$ constraints is:
\begin{verbatim}

\begin{mini#}|sizeFormat|[constraintFormat]<break>
{optimizationVariable}
{objectiveFunction\label{objective}}
{\label{optimizationProblem}}  
{optimizationResult}

\addConstraint{LHS.1}{RHS.1\label{Const1}}{extraConst1}
\addConstraint{LHS.2}{RHS.2\label{Const2}}{extraConst2}
.
.
\addConstraint{LHS.N}{RHS.N\label{ConstN}}{extraConstN}
\end{mini#}
\end{verbatim}

\subsection{Definition of Problem parameters}

\begin{enumerate}[label=(\roman*)]
	\item \verb|mini#|: defines the type of environment and reference used. There are four environments: \verb|mini|, \verb|maxi|, \verb|argmini|, and \verb|argmaxi|. There are three types of referencing: \verb|mini|, \verb|mini*| and \verb|mini!|. Consult Section \ref{sec:environments} for more details. 
	\item (Optional) \verb|sizeFormat|: optional parameter to define the size format of the problem. The possible values are:
	\begin{itemize}
		\item l: for the long format as defined in Section \ref{sec:longshort}.
		\item s: for the short format as defined in Section \ref{sec:longshort}.
	\end{itemize}	
	\item (Optional) \verb|constraintFormat|: optional parameter to change the format of the constraints. The parameter \verb|constraintFormat| can take the following values: 
	\begin{itemize}
	\item 0: for the Standard definition in Section \ref{sec:format}.
	\item 1: for Alternative 1 in Section \ref{sec:format}.
	\item 2: for Alternative 2 in Section \ref{sec:format}
	\item 3: for Alternative 3 in Section \ref{sec:format}		
	\end{itemize}
	\item (Optional) \verb|break|: optional parameter to allow the optimization problem to break across multiple pages. For details on this feature, check Section \ref{sec:breakpages}.
	\item \verb|optimizationVariable|: variable to be optimizated in the problem, e.g. $w \in \Re^N$.
	\item \verb|objectiveFunction\label{objective}|: function to be minimized/maximized as a function of the optimization variable, e.g. $\|w\|_2$. If required, the objective function label should also be included withing this term
	\item \verb|\label{optimizationProblem}|: it defines the main and general reference for the optimization problem. It is used for the \verb|mini| and \verb|mini!| enviroments. In the \verb|mini*| environment should be left blank, i.e. \{\}, \textbf{not to be ommited}.
	\item \verb|optimizationResult|: a term expressing the result of the optimization problem, e.g. $J(w^*)~=$. If not needed leave it blank, \textbf{not to be ommited}.
\end{enumerate}

The last two defined problem parameters,  \verb|\label{optimizationProblem}| and \verb|optimizationResult|, could be made optional. However, in order to improve the problem readibility, line breaking between the 7 parametes was implemented; unfortunately, linea breaking and optional parameters are not compatible and these two parameters had to be made mandatory.

\subsection{Adding Constraints}
\label{subsec:syntax}
After the definition of the problem parameters, the environment accepts the definition of an infinite number of constraints. For this definitions the following command is used:
~\\

\verb|\addConstraint{LHS.k}{RHS.k\label{Const.k}}{extraConst.k}| 
~\\

The command accepts three different parameters
\begin{enumerate}
	\item \verb|LHS.k|: the left-hand side of the the constraint $k$, e.g. $3w^\top w$.
	\item (Optional) \verb|RHS.k\label{Const.k}|: the right-hand side of the constraint k if the equations should be aligned in the equality or inequality signs, e.g. $\leq \|w\|_\infty$. If required, the constraint label should also be included in this term. 
	\item (Optional) \verb|extraConst.k|: optional parameter to add extra alignment point for additional constraint information. An example would be the constraint names. Look Example \ref{ex:extra} or the Section \ref{sec:extraAlign}.
\end{enumerate}

\subsubsection{Constraints referencing}
Notice that the label for the constraints is always included in the right hand side expression and it only makes sense for the case of using the \verb|mini!| enviroment. The label of the objective function can also be included in a similar way.


\section{Environment Types}
\label{sec:environments}
There are four basic environments depending on the type of referencing that should be used.
\begin{enumerate}
	\item The \textbf{mini} environment for defining problems with a single reference label:
	\begin{mini}
		{w}{f(w)+R(w+6x)}
		{\label{eq:Ex1}}{}
		\breakObjective{+L(x)}
		\addConstraint{g(w)}{=0}
	\end{mini}
	\item The \textbf{mini*} environment if the problem does not have to be referenced:
	\begin{mini*}
		{w}{f(w)+ R(w+6x)}
		{}{}
		\addConstraint{g(w)}{=0}
	\end{mini*}
	\item  The \textbf{mini!} environment if each equation should be referenced:
	\begin{mini!}
		{w}{f(w)+ R(w+6x)\label{eq:Ex2}}
		{\label{eq:Ex1}}{}
		\addConstraint{g(w)}{=0}
	\end{mini!}	
\item The \textbf{minie} environment: same functionality as the \textbf{mini!} environment and it replaces \textbf{mini!} when using the \texttt{optidef} library with some languages in the babel package. For further details we refer to Section \ref{sec:babel}.
%in older versions of the package it was the same as the current \textbf{minie} environment. \textbf{mini?} has been re-branded to \textbf{minie} for compatibility issues with some languages in the babel package. While its use is deprecated, it is kept in the package to ensure back-compatibility with old documents.
\end{enumerate}

\noindent Additionally, there are four basic definitions of optimization problems:

\begin{enumerate}
	\item The \textbf{mini} environment:
	\begin{mini}
		{w}{f(w)+ R(w+6x)}
		{}{}
		\addConstraint{g(w)}{=0}
	\end{mini}
	\item The \textbf{maxi} environment:
	\begin{maxi}
		{w}{f(w)+ R(w+6x)}
		{}{}
		\addConstraint{g(w)}{=0}
	\end{maxi}	
	\item The \textbf{argmini} environment:
	\begin{argmini}
		{w}{f(w)+ R(w+6x)}
		{}{}
		\addConstraint{g(w)}{=0}
	\end{argmini}	
	\item The \textbf{argmaxi} environment:
	\begin{argmaxi}
		{w}{f(w)+ R(w+6x)}
		{}{}
		\addConstraint{g(w)}{=0}
	\end{argmaxi}
\end{enumerate}

\section{Long and Short Output Formats}
\label{sec:longshort}
The library permits the definition of two different problem size: a long format and a short format.

\subsection{Long Format}
Selected by \verb|sizeFormat|=l. It makes use of \textit{subject to} and \textit{minimize/maximize}
\begin{mini*}|l|
	{w}{f(w)+ R(w+6x)}{}{}
	\addConstraint{g(w)}{=0}
\end{mini*}
\subsection{Short Format}
Selected by \verb|sizeFormat|=s. It uses instead the shorter \textit{s.t.} and \textit{min/max}
\begin{mini*}|s|
	{w}{f(w)+ R(w+6x)}{}{}
	\addConstraint{g(w)}{=0}
\end{mini*}

\noindent By the default the long format is used. To change the default to  the short format the package must be imported with the \verb|short| option:

\begin{lstlisting}
\usepackage[short]{optidef}
\end{lstlisting}

%\section{Alignment of Equations}
%\label{sec:alignment}
%
%\begin{enumerate}
%\item Alignment at the beginning of the words \textit{minimize} and \textit{subject to}:
%\begin{mini}
%{w}{f(w)+ R(w+6x)}{}{}
%\addConstraint{g(w)}{=0}
%\end{mini}
%\item (Optional) Alignment at the $=,~>,~<$ signs of the constraints.
%\begin{mini*}[1]
%{w}{f(w)+ R(w+6x)}{}{}
%\addConstraint{g(w)+h(w)}{=0}
%\addConstraint{l(w)}{=5w.}
%\end{mini*}
%\item (Optional) Alignment of the longest constraint and the objective function:
%\begin{mini*}
%	{w}{f(w)+ R(w+6x)}{}{}
%	\addConstraint{g(w)+h(w)}{=0}
%	\addConstraint{l(w)}{=5w.}
%\end{mini*}
%\item (Optional) Third alignment point on the constraints to set some constraint features. A clear example could be the constraints names:
%\begin{mini*}
%{w}{f(w)+ R(w+6x)}{}{}
%\addConstraint{g(w)+h(w)}{=0,}{\text{(Topological Constraint)}}
%\addConstraint{l(w)}{=5w,\quad}{\text{(Boundary Constraint)}}
%\end{mini*}
%or the index of the constraints:
%\begin{mini*}
%{w,u}{f(w)+ R(w+6x)}{}{}
%\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1}
%\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
%\end{mini*}
%\end{enumerate}

\section{Output Formats for the Constraints}
\label{sec:format}
There are four basic output formats for the location of the constraints. They are controlled by the environment parameter \verb|constraintFormat|.
\subsection{Alternative 0}
In this format option, the constraints are located to the right of \textit{subject to} and aligned with the objective function. It also has a second alignment point at the $=,~\leq,~\geq$ signs:
 	\begin{mini}
 		{w}{f(w)+ R(w+6x)}
 		{\label{eq:Ex1}}{}
 		\addConstraint{g(w)+h(w)}{=0}
 		\addConstraint{t(w)}{=0.}
 	\end{mini}

\noindent	It is the default format if no format option is provided. Alternatively, it can also be set by selecting \verb|constraintFormat|=0.  
 
\subsection{Alternative 1} 	
	Selected by \verb|constraintFormat|=1. It locates the constraints below \textit{subject to} and keeps them aligned at the inequality/equality signs:
 	\begin{mini}[1]
 		{w}{f(w)+ R(w+6x)}
 		{\label{eq:Ex1}}{}
 		\addConstraint{g(w)+h(w)}{=0}
 		\addConstraint{t(w)}{=0.}
 	\end{mini}
 \subsection{Alternative 2} 		
 	Selected by \verb|constraintFormat|=2. It aligns all the constraints with the objective function.
 	\begin{mini}[2]
 		{w}{f(w)+ R(w+6x)}
 		{\label{eq:Ex1}}{}
 		\addConstraint{g(w)+h(w)}{=0}
 		\addConstraint{t(w)}{=0.}
 	\end{mini} 	
 \subsection{Alternative 3} 		
 	Selected by \verb|constraintFormat|=3. It aligns all the constraints below \textit{subject to}:
 	\begin{mini}[3]
 		{w}{f(w)+ R(w+6x)}
 		{\label{eq:Ex1}}{}
 		\addConstraint{g(w)+h(w)}{=0}
 		\addConstraint{t(w)}{=0.}
 	\end{mini} 	

\begin{lstlisting}
	\usepackage[c1|c2|c3]{optidef}
	\end{lstlisting} 

 \subsection{Extra alignment alternative} 		
 \label{sec:extraAlign}
By default, the constraints have 2 aligned elements. However, a third alignment point can be used to set some constraint features. A clear example could be the constraints names:
\begin{mini*}
	{w}{f(w)+ R(w+6x)}{}{}
	\addConstraint{g(w)+h(w)}{=0,}{\text{(Topological Constraint)}}
	\addConstraint{l(w)}{=5w,\quad}{\text{(Boundary Constraint)}}
\end{mini*}
or the index of the constraints:
\begin{mini*}
	{w,u}{f(w)+ R(w+6x)}{}{}
	\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1}
	\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini*}
This extra alignment point can be added using a third input parameter on the \verb|\addConstraint| parameter. An example using the last constraint of the previous example would be:
\begin{lstlisting}
\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{lstlisting}


\subsection{Default format}
The default format is alternative 0. To change the default format across the whole document, the package can be imported using one of the three options: \verb|c1|, \verb|c2|, \verb|c3|, i.e.:

\section{Breaking the optimization problem across multiple pages}
\label{sec:breakpages}
In several cases, people encounter the problem of having an optimization problem that is too long to fit in a single page. In those cases, optidef can automatically break the problem across multiple pages by simply using the optional argument \verb|<b>|. For example:

\begin{lstlisting}
\begin{mini*}<b>
{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1}
\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini*}
\end{lstlisting}


However, when using this option \verb|<b>|, it is important to note that labeling of equations is no longer automatic. To create the number/label, the command \verb|\labelOP{label}| should be used. In particular, in the equation/constraint of the optimization problem where the label/number should be located, simply add \verb|\labelOP{label}|. For example, the following code:

\begin{lstlisting}
\begin{mini}<b>
{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1 \labelOP{eq:label}}
\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini}
\end{lstlisting}

\noindent would display this:

\begin{mini}<b>
	{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
	\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1 \labelOP{eq:label}}
	\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini}

The option \verb|<b>| automatically breaks the optimization problem when the problem is too large to fit in one page (e.g.\ see an example in \ref{ex:break}). However, manual breaks at selected locations are also possible using the \verb|\displaybreak| command. Just add \verb|\displaybreak| between the two constraints that need to be broken, e.g.:

\begin{lstlisting}
\begin{mini}<b>
{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
\breakObjective{-g(w^3-x^2*200+10000*w^5)}
\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1 \labelOP{eq:label}}
\displaybreak
\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini}
\end{lstlisting}
\noindent would display:
\begin{mini}<b>
	{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
	\breakObjective{-g(w^3-x^2*200+10000*w^5)}
	\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1 \labelOP{eq:label}}
	\displaybreak
	\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini}

\section{Breaking the objective across several lines}
\label{sec:breakObj}
In several cases, people encounter the problem of having an optimization problem which objective function is too long to be set in a single line. In such cases, a line breaking that respects the rest of the problem syntax would be desirable. To account for that, the command \verb|\breakObjective| can be used. The idea is that, if the objective function shall be split in $n$ different functions, e.g.~$f_1,\ldots,f_n$, the default objective parameter would include just $f_1$ and then, we would include $n-1$ statements \verb|\breakObjective|($f_k$), $\forall k=2,\ldots,n$ right before defining the \verb|\addConstraint| commands.

Let's illustrate this with an example. We could consider the example from before:

\begin{mini}
	{w,u}{f(w)+ R(w+6x)}{}{}
	\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1}
	\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini}
If now the cost function were too long, i.e:
\[
f(w)+ R(w+6x)+ H(100w-x*w/500)-g(w^3-x^2*200+10000*w^5)
\]
We could split it as:

\begin{mini}
{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
\breakObjective{-g(w^3-x^2*200+10000*w^5)}
\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1}
\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini}
by simpling using the following command:

\begin{lstlisting}
\begin{mini*}
{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
\breakObjective{-g(w^3-x^2*200+10000*w^5)}
\addConstraint{g(w_k)+h(w_k)}{=0,}{k=0,\ldots,N-1}
\addConstraint{l(w_k)}{=5u,\quad}{k=0,\ldots,N-1}
\end{mini*}
\end{lstlisting}

It is important to notice the specific location of the \verb|\breakObjective| command. In order to work properly, it has to be defined right before \verb|\addConstraint| and right after the definition of the environment parameters; i.e.~in any case the command should be used right after defining the first part of the objective function and not finishing the definition of the mandatory environment parameters.

\section{Default comma at the end of the constraint}
\label{sec:comma}
By default, the algorithms adds a comma at the end of any constraint that is not the last one. This feature was implemented due to correctness of mathematical notation. However, this behavior can be removed by adding the option \verb|nocomma| when importing the package:

\begin{lstlisting}
\usepackage[nocomma]{optidef}
\end{lstlisting}



\section{Long Optimization Variables}
The standard appearance for long optimization variables is as follows:

\begin{mini!}
	{x_0,u_0,x_1,\hdots,u_{N-1},x_N}
	{\sum_{k=0}^{N-1} L(x_k,u_k)\!\!+\!\!E(x_N)\label{OCPobj}}
	{\label{eq:OCP}}{}
	\addConstraint{x_{k+1}-f(x_k,u_k)}{=  0, \label{dOCP:modelc}\quad k=0,\dots,N-1}
	\addConstraint{h(x_k,u_k)}{\leq 0,  \quad k=0,\dots,N-1}
	\addConstraint{r(x_0,x_N)}{= 0.  \label{dOCP:boundary}}
\end{mini!}

\noindent A possible way to reduce the large variable spacing is to stack them with the command: \begin{verbatim}
\substack{x_0,u_0,x_1,\hdots,\\u_{N-1},x_N}
\end{verbatim}

\begin{mini!}
	{\substack{x_0,u_0,x_1,\hdots,\\ u_{N-1},x_N}}
	{\sum_{k=0}^{N-1} L(x_k,u_k)\!\!+\!\!E(x_N)\label{OCPobj}}
	{\label{eq:OCP}}{}
	\addConstraint{x_{k+1}-f(x_k,u_k)}{=  0, \label{dOCP:modelc}\quad k=0,\dots,N-1}
	\addConstraint{h(x_k,u_k)}{\leq 0,  \quad k=0,\dots,N-1}
	\addConstraint{r(x_0,x_N)}{= 0.  \label{dOCP:boundary}}
\end{mini!}

\section{Compatibility issues with other packages}
Issues with three different packages have been reported: cleveref, babel, and mathabx.
\subsection{Cleveref}
When using the cleveref package in couple with the optidef package two measures have to taken for the packages to work properly:

\begin{enumerate}
	\item As also indicated in the cleveref documentation, the optidef package has to be loaded before the cleveref package.
	\item To avoid crashes, the \verb|\label| commands in the optidef environments have to be replaced by the protected counterparts \verb|\protect\label|. This is required because of the standard Latex issue of moving arguments and fragile commands\footnote{\url{goo.gl/wmKbNU}}.
\end{enumerate} 

\noindent A code example taking into account both measures is the following:

\begin{verbatim}
  \documentclass{article}
  \usepackage{optidef}
  \usepackage{cleveref}
  
  \begin{document}
  
  \begin{mini!}
    {w}{f(w)+ R(w+6x) \protect\label{eq:ObjectiveExample1}}
    {\label{eq:Example1}}{}
    \addConstraint{g(w)}{=0 \protect\label{eq:C1Example3}}
    \addConstraint{n(w)}{= 6 \protect\label{eq:C2Example1}}
    \addConstraint{L(w)+r(x)}{=Kw+p \protect\label{eq:C3Example1}}
  \end{mini!}

  Example labels: \cref{eq:Example1} and \cref{eq:ObjectiveExample1}.

  \end{document}
\end{verbatim}

As an alternative to the second step, i.e.~protecting the \verb|\label| command, the command can be robustify in the document preamble and then \verb|\protect| is not longer needed. To robustify the \verb|\label| command, the following has to be added to the preamble:
	
	
\begin{verbatim}
\usepackage{etoolbox}
\robustify{\label} 	
\end{verbatim}

\subsection{Babel}
\label{sec:babel}
When importing the package babel with some specific languages, e.g.~French, the \verb|mini!| environment clashes because of the exclamation mark. 

This issue has been resolved starting from Optidef 2.7, where a working alternative to the \verb|mini!| environment is included: the \verb|minie| enviroment. Both environemnts have the same functionality, but when using the babel package it is recommended to use the \verb|minie| environment to avoid issues.

\subsection{Mathabx}
When using the mathabx package in couple with the optidef package, the optidef package must be loaded first in order to avoid malfunction of the mathabx package. In addition, the amsmath package should also be loaded before both of them. The preamble should look like:

\begin{verbatim}
\usepackage{amsmath}
\usepackage{mathabx}
\usepackage{optidef}
\end{verbatim}


\section{Examples}
\subsection{Example 1 - mini environment}
The code:

\begin{verbatim}
\begin{mini}
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}{}

\addConstraint{g(w)}{=0} 
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}
\end{verbatim}

\noindent outputs:

\begin{mini}
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex11}}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini}

\subsection{Example 2 - mini* environment}
On the other hand:

\begin{verbatim}
\begin{mini*}
{w}{f(w)+ R(w+6x)}
{}{}

\addConstraint{g(w)}{=0}   
\addConstraint{n(w)}{= 6,}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}  
\end{mini*}
\end{verbatim}

\noindent it is almost the same but removing the reference:

\begin{mini*}
	{w}{f(w)+ R(w+6x)}
	{}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini*}

\subsection{Example 3 - mini! environment}

\noindent Finally, the multireferencing environment outputs:

\begin{verbatim}
\begin{mini!}
{w}{f(w)+ R(w+6x) \label{eq:ObjectiveExample1}}
{\label{eq:Example1}}{}

\addConstraint{g(w)}{=0 \label{eq:C1Example3}}
\addConstraint{n(w)}{= 6 \label{eq:C2Example1}}
\addConstraint{L(w)+r(x)}{=Kw+p \label{eq:C3Example1}}
\addConstraint{h(x)}{=0. \label{eq:C4Example1}}
\end{mini!}
\end{verbatim}

\begin{mini!}
	{w}{f(w)+ R(w+6x)\label{eq:ObjectiveExample3}}
	{\label{eq:Example3}}
	{}
	\addConstraint{g(w)}{=0 \label{eq:C1Example3}}
	\addConstraint{n(w)}{= 6 \label{eq:C2Example3}}
	\addConstraint{L(w)+r(x)}{=Kw+p \label{eq:C3Example3}}
	\addConstraint{h(x)}{=0.\label{eq:C4Example3}}
\end{mini!}

\subsection{Example 4 - Problem Result}

\noindent Adding the problem result:

\begin{verbatim}
\begin{mini}
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}
{J(w^*)=}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}
\end{verbatim}

\noindent outputs:

\begin{mini}
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex1}}{J(w^*)~=~}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini}

\subsection{Example 5 - Short Format}

\noindent Adding the short format parameter:

\begin{verbatim}
\begin{mini}|s|
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}
{}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}
\end{verbatim}

\noindent outputs:

\begin{mini}|s|
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex1}}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini}

\subsection{Example 6 - Alternative 1 for Constraints}

\noindent If including a 1 as optional parameter, the first constraint will appear aligned to the left right below \textit{subject to}.

\begin{verbatim}
\begin{mini}[1]
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}
{}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}
\end{verbatim}

\noindent outputs:

\begin{mini}[1]
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex1}}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini}

\subsection{Example 7 - Alternative 2 for Constraints}

\noindent If including a 2 as optional parameter, the constraint will appear to the right of  \textit{subject to} but a single alignment point.

\begin{verbatim}
\begin{mini}[2]
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}
{}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}
\end{verbatim}

\noindent outputs:

\begin{mini}[2]
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex1}}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini}

\subsection{Example 8 - Alternative 3 for Constraints}

\noindent If including a 3 as optional parameter, the first constraint will appear aligned to the left right below \textit{subject to} and with a single alignment point.

\begin{verbatim}
\begin{mini}[3]
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}
{}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}
\end{verbatim}

\noindent outputs:

\begin{mini}[3]
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex1}}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{mini}



\subsection{Example 9 - Breaking a long objective}
\begin{lstlisting}
\begin{mini*}
{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
\breakObjective{-g(w^3-x^2*200+10000*w^5)}
\addConstraint{g(w_k)+h(w_k)}{=0,}
\addConstraint{l(w_k)}{=5u,\quad}
\end{mini*}
\end{lstlisting}
outputs:
\begin{mini}
	{w,u}{f(w)+ R(w+6x)+ H(100w-x*w/500)}{}{}
	\breakObjective{-g(w^3-x^2*200+10000*w^5)}
	\addConstraint{g(w_k)+h(w_k)}{=0}
	\addConstraint{l(w_k)}{=5u.}
\end{mini}


\subsection{Example 10 - Extra Alignment in the Constraints}
\label{ex:extra}
Adding optional alignment to add constraint names:

\begin{verbatim}
\begin{mini*}
{w}{f(w)+ R(w+6x)}
{}{}
\addConstraint{g(w)}{=0,}{ \quad  \text{(Dynamic constraint)}}
\addConstraint{n(w)}{= 6,}{ \quad  \text{(Boundary constraint)}}
\addConstraint{L(w)+r(x)}{=Kw+p,}{ \quad  \text{(Random constraint)}}
\addConstraint{h(x)}{=0,}{ \quad  \text{(Path constraint).}}
\end{mini*}
\end{verbatim}

\subsection{Example 11 - The \textit{argmini} Environment}
Similar to the \verb|mini|, \verb|mini*| and \verb|mini!| environments, the environments \verb|argmini|, \verb|argmini*| and \verb|argmini!| are very similar environments that use the same syntax but the output is slightly different:

\begin{verbatim}
\begin{argmini}
{w}{f(w)+ R(w+6x)}

{\label{eq:Example1}}{w^*=}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{argmini}
\end{verbatim}

\noindent outputs:

\begin{argmini}
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Ex1}}{w^*~=~}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{argmini}

\subsection{Example 12 - The \textit{maxi} and \textit{argmaxi} Environments}
Exactly the same syntax and definition as the previous environments, but now for defining maximization environments. The following code serves for illustration:

\begin{verbatim}
\begin{maxi}
{w}{f(w)+ R(w+6x)}
{g(w)}{=0}

{\label{eq:Example1}}{}

\addConstraint{g(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{maxi}
\end{verbatim}

\noindent outputs:

\begin{maxi}
	{w}{f(w)+ R(w+6x)}
	{\label{eq:Example1}}{}
	\addConstraint{g(w)}{=0}
	\addConstraint{n(w)}{= 6}
	\addConstraint{L(w)+r(x)}{=Kw+p}
	\addConstraint{h(x)}{=0.}
\end{maxi}

\subsection{Example 13 - Breaking optimization problem}
\label{ex:break}
\begin{lstlisting}
\begin{mini}<b>
{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}{}
\addConstraint{g(w)}{=0}
\addConstraint{p(w)}{=0}
\addConstraint{q(w)}{=0}
\addConstraint{r(w)}{=0\labelOP{testLabel}}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}

\end{lstlisting}
outputs:
\begin{mini}<b>
	{w}{f(w)+ R(w+6x)}
{\label{eq:Example1}}{}
\addConstraint{g(w)}{=0}
\addConstraint{p(w)}{=0}
\addConstraint{q(w)}{=0}
\addConstraint{r(w)}{=0\labelOP{testLabel}}
%\addConstraint{s(w)}{=0}
%\addConstraint{t(w)}{=0}
%\addConstraint{v(w)}{=0}
%\addConstraint{z(w)}{=0}
\addConstraint{n(w)}{= 6}
\addConstraint{L(w)+r(x)}{=Kw+p}
\addConstraint{h(x)}{=0.}
\end{mini}


\subsection{Example 14 - All Possible Parameters}

\begin{verbatim}
\begin{mini!}|s|[2]<b>
{w}{f(w)+ R(w+6x)\label{eq:ObjectiveExample3}}
{\label{eq:Example3}}
{w^*=}
\addConstraint{g(w)}{=0 \label{eq:C1Example3}}
\addConstraint{n(w)}{= 6 \label{eq:C2Example3}}
\addConstraint{L(w)+r(x)}{=Kw+p \label{eq:C3Example3}}
\addConstraint{h(x)}{=0.\label{eq:C4Example3}}
\end{mini!}
\end{verbatim}

\begin{mini!}|s|[2]<b>
	{w}{f(w)+ R(w+6x)\label{eq:ObjectiveExample3}}
	{\label{eq:Example3}}
	{w^*=}
	\addConstraint{g(w)}{=0 \label{eq:C1Example3}}
	\addConstraint{n(w)}{= 6 \label{eq:C2Example3}}
	\addConstraint{L(w)+r(x)}{=Kw+p \label{eq:C3Example3}}
	\addConstraint{h(x)}{=0.\label{eq:C4Example3}}
\end{mini!}

\section{Reporting bugs and feature requests}
To report any bug or request some feature please use the issue section in the github repository: \url{https://github.com/jeslago/optidef/issues}. 

%\section{Code definition}
%\begin{lstlisting}
%\end{lstlisting}

\end{document}          
