libCSP--/doc/latex/classCSP.tex

301 lines
18 KiB
TeX
Raw Permalink Normal View History

2010-05-24 02:45:09 +02:00
\hypertarget{classCSP}{
\section{CSP$<$ T $>$ Class Template Reference}
\label{classCSP}\index{CSP@{CSP}}
}
Main class for managing a \hyperlink{classCSP}{CSP}.
{\ttfamily \#include $<$csp++.h$>$}
\subsection*{Classes}
\begin{DoxyCompactItemize}
\item
struct {\bfseries arc}
\end{DoxyCompactItemize}
\subsection*{Public Member Functions}
\begin{DoxyCompactItemize}
\item
\hypertarget{classCSP_a3a4c1cfab4f5c2376b5f9da588e73f5a}{
\hyperlink{classCSP_a3a4c1cfab4f5c2376b5f9da588e73f5a}{CSP} ()}
\label{classCSP_a3a4c1cfab4f5c2376b5f9da588e73f5a}
\begin{DoxyCompactList}\small\item\em Empty constructor -\/ just do nothing, used for declaring an object and initialize it later. \item\end{DoxyCompactList}\item
\hyperlink{classCSP_ad49548121582cc2d59e0d7f100092b75}{CSP} (int n, bool($\ast$c)(std::vector$<$ \hyperlink{structCSPvariable}{CSPvariable}$<$ T $>$ $>$)=\_\-\_\-default\_\-constraint)
\begin{DoxyCompactList}\small\item\em Class constructor. \item\end{DoxyCompactList}\item
\hyperlink{classCSP_a734bb08d8f45394a2acfc8822981a6d0}{CSP} (int n, T default\_\-value, bool set\_\-variables=false, bool($\ast$c)(std::vector$<$ \hyperlink{structCSPvariable}{CSPvariable}$<$ T $>$ $>$)=\_\-\_\-default\_\-constraint)
\begin{DoxyCompactList}\small\item\em Class constructor. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a4017c17aac9d3e96d0e821ebbe09da7b}{setDomain} (size\_\-t index, std::vector$<$ T $>$ domain)
\begin{DoxyCompactList}\small\item\em Set the domain for the i-\/th variable. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a65518e67e33e31bff1b5f9aabdf80a01}{setDomain} (size\_\-t index, T domain\mbox{[}$\,$\mbox{]}, int size)
\begin{DoxyCompactList}\small\item\em Set the domain for the i-\/th variable. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a534a0d9bd10fb544f94196bf3c386657}{setConstraint} (bool($\ast$c)(std::vector$<$ \hyperlink{structCSPvariable}{CSPvariable}$<$ T $>$ $>$))
\begin{DoxyCompactList}\small\item\em Apply the constraint to the \hyperlink{classCSP}{CSP} as a boolean function. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a457e1df05d4ec16be00118bda22fd882}{setConstraint} (std::vector$<$ bool($\ast$)(std::vector$<$ \hyperlink{structCSPvariable}{CSPvariable}$<$ T $>$ $>$) $>$ c)
\begin{DoxyCompactList}\small\item\em Apply the constraints to the \hyperlink{classCSP}{CSP} as vector of boolean functions. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a0231b93bceae257f0e1c35041f8fe63f}{dropConstraint} (size\_\-t index)
\begin{DoxyCompactList}\small\item\em Drops a constraint from the \hyperlink{classCSP}{CSP}. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a8dc6aec6ca7e40d198e58b0ec14fee66}{appendConstraint} (bool($\ast$c)(std::vector$<$ \hyperlink{structCSPvariable}{CSPvariable}$<$ T $>$ $>$))
\begin{DoxyCompactList}\small\item\em Append a constraint to the list of the constraint of the \hyperlink{classCSP}{CSP}. \item\end{DoxyCompactList}\item
2010-05-27 11:55:27 +02:00
void \hyperlink{classCSP_a466845256e638c5e258fd728b641359f}{refreshDomains} (void)
2010-05-24 02:45:09 +02:00
\begin{DoxyCompactList}\small\item\em Updates the domains of the variables. Any constraint or node fixed value is applied. \item\end{DoxyCompactList}\item
2010-05-27 11:55:27 +02:00
\hypertarget{classCSP_a7ff61c379081881c21626926bdfd8733}{
void \hyperlink{classCSP_a7ff61c379081881c21626926bdfd8733}{solve} (size\_\-t maxIterations=0)}
\label{classCSP_a7ff61c379081881c21626926bdfd8733}
\begin{DoxyCompactList}\small\item\em Get, if it exists, the solution of the \hyperlink{classCSP}{CSP}, calling refreshDomains until a fixed point is reached. \item\end{DoxyCompactList}\item
std::vector$<$ T $>$ \hyperlink{classCSP_ae9db774b971c480cbef66168b9b6cf07}{domain} (size\_\-t index)
2010-05-24 02:45:09 +02:00
\begin{DoxyCompactList}\small\item\em Get the domain of the i-\/th variable. \item\end{DoxyCompactList}\item
2010-05-27 11:55:27 +02:00
size\_\-t \hyperlink{classCSP_a125c7171c19b99e631926bbe011f127d}{size} (void)
2010-05-24 02:45:09 +02:00
\begin{DoxyCompactList}\small\item\em Get the number of variables in the current \hyperlink{classCSP}{CSP}. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_ac25064c5b2d4e1020173b56913251ebd}{setValue} (size\_\-t index, T value)
\begin{DoxyCompactList}\small\item\em Set the value of a variable as a constraint. \item\end{DoxyCompactList}\item
void \hyperlink{classCSP_a4c0cae125a610f519dc22eaec255a0ae}{unsetValue} (size\_\-t index)
\begin{DoxyCompactList}\small\item\em Marks a variable as not set, and if a default value was assigned in the \hyperlink{classCSP}{CSP} constructor, this value will be set. By default, unless specified in the constructor, all the variables are considered as not set. \item\end{DoxyCompactList}\item
bool \hyperlink{classCSP_a7ef9eb91c38815c9d82182696a6bd5d3}{isSatisfiable} (void)
\begin{DoxyCompactList}\small\item\em Check if the current \hyperlink{classCSP}{CSP}, with the applied constraints, is satisfiable. \item\end{DoxyCompactList}\item
bool \hyperlink{classCSP_ae96286c6c7dfb6fe077544e0d4af15f4}{hasUniqueSolution} (void)
\begin{DoxyCompactList}\small\item\em Check if the \hyperlink{classCSP}{CSP}, with the given variables, domains and constraints, admits a unique solution, i.e. each domain of each variable contains an only element. \item\end{DoxyCompactList}\item
\hypertarget{classCSP_ac74cb751589a58bf6f2815f6878d2213}{
void \hyperlink{classCSP_ac74cb751589a58bf6f2815f6878d2213}{assignUniqueDomains} (void)}
\label{classCSP_ac74cb751589a58bf6f2815f6878d2213}
\begin{DoxyCompactList}\small\item\em Check if any of the variables in the \hyperlink{classCSP}{CSP} has a domain containing an only item. If so, it automatically assignes that item as value of the variable. \item\end{DoxyCompactList}\item
bool \hyperlink{classCSP_a213dafc1aae7b1825371810a511eca4f}{isSet} (size\_\-t i)
\begin{DoxyCompactList}\small\item\em Check if the i-\/th variable in the \hyperlink{classCSP}{CSP} has a fixed value. \item\end{DoxyCompactList}\item
T \hyperlink{classCSP_aafa5e1a65d6c5d80780437d8d684f32a}{value} (size\_\-t i)
\begin{DoxyCompactList}\small\item\em Get the value of the i-\/th variable of the \hyperlink{classCSP}{CSP}. Be careful: before using this function you should check whether the variable you're going to check is actually set, using the \hyperlink{classCSP_a213dafc1aae7b1825371810a511eca4f}{isSet()} method, unless you know what you're doing, in order to avoid reading inconsistent data. \item\end{DoxyCompactList}\end{DoxyCompactItemize}
\subsection{Detailed Description}
\subsubsection*{template$<$class T$>$ class CSP$<$ T $>$}
Main class for managing a \hyperlink{classCSP}{CSP}.
\subsection{Constructor \& Destructor Documentation}
\hypertarget{classCSP_ad49548121582cc2d59e0d7f100092b75}{
\index{CSP@{CSP}!CSP@{CSP}}
\index{CSP@{CSP}!CSP@{CSP}}
\subsubsection[{CSP}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ {\bf CSP}$<$ T $>$::{\bf CSP} (int {\em n}, \/ bool($\ast$)(std::vector$<$ {\bf CSPvariable}$<$ T $>$ $>$) {\em c} = {\ttfamily \_\-\_\-default\_\-constraint})}}
\label{classCSP_ad49548121582cc2d59e0d7f100092b75}
Class constructor.
\begin{DoxyParams}{Parameters}
\item[{\em n}]Number of variables in the \hyperlink{classCSP}{CSP} \item[{\em c}]Boolean function representing the constraint of the \hyperlink{classCSP}{CSP} If no constraint function is set in the constructor or using the applyConstraint() method, a default function always returning true will be used, that allows any domain for any variable to be valid (no constraint) \end{DoxyParams}
\hypertarget{classCSP_a734bb08d8f45394a2acfc8822981a6d0}{
\index{CSP@{CSP}!CSP@{CSP}}
\index{CSP@{CSP}!CSP@{CSP}}
\subsubsection[{CSP}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ {\bf CSP}$<$ T $>$::{\bf CSP} (int {\em n}, \/ T {\em default\_\-value}, \/ bool {\em set\_\-variables} = {\ttfamily false}, \/ bool($\ast$)(std::vector$<$ {\bf CSPvariable}$<$ T $>$ $>$) {\em c} = {\ttfamily \_\-\_\-default\_\-constraint})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a734bb08d8f45394a2acfc8822981a6d0}
Class constructor.
\begin{DoxyParams}{Parameters}
\item[{\em n}]Number of variables in the \hyperlink{classCSP}{CSP} \item[{\em default\_\-value}]Default value for the variables in the \hyperlink{classCSP}{CSP} when initialized \item[{\em set\_\-variables}]Decide whether mark the variables set with default\_\-value as \char`\"{}set\char`\"{} or \char`\"{}not set\char`\"{} (default: not set) \item[{\em c}]Boolean function representing the constraint of the \hyperlink{classCSP}{CSP} If no constraint function is set in the constructor or using the applyConstraint() method, a default function always returning true will be used, that allows any domain for any variable to be valid (no constraint) \end{DoxyParams}
\subsection{Member Function Documentation}
\hypertarget{classCSP_a8dc6aec6ca7e40d198e58b0ec14fee66}{
\index{CSP@{CSP}!appendConstraint@{appendConstraint}}
\index{appendConstraint@{appendConstraint}!CSP@{CSP}}
\subsubsection[{appendConstraint}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::appendConstraint (bool($\ast$)(std::vector$<$ {\bf CSPvariable}$<$ T $>$ $>$) {\em c})}}
\label{classCSP_a8dc6aec6ca7e40d198e58b0ec14fee66}
Append a constraint to the list of the constraint of the \hyperlink{classCSP}{CSP}.
\begin{DoxyParams}{Parameters}
\item[{\em c}]A function pointer returning a boolean value representing the new constraint \end{DoxyParams}
2010-05-27 11:55:27 +02:00
\hypertarget{classCSP_ae9db774b971c480cbef66168b9b6cf07}{
\index{CSP@{CSP}!domain@{domain}}
\index{domain@{domain}!CSP@{CSP}}
\subsubsection[{domain}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ std::vector$<$ T $>$ {\bf CSP}$<$ T $>$::domain (size\_\-t {\em index})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_ae9db774b971c480cbef66168b9b6cf07}
2010-05-24 02:45:09 +02:00
Get the domain of the i-\/th variable.
\begin{DoxyParams}{Parameters}
\item[{\em index}]Variable for which we're going to get the domain \end{DoxyParams}
\begin{DoxyReturn}{Returns}
The domain of the i-\/th variable as a vector of T
\end{DoxyReturn}
2010-05-27 11:55:27 +02:00
\hypertarget{classCSP_a0231b93bceae257f0e1c35041f8fe63f}{
\index{CSP@{CSP}!dropConstraint@{dropConstraint}}
\index{dropConstraint@{dropConstraint}!CSP@{CSP}}
\subsubsection[{dropConstraint}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::dropConstraint (size\_\-t {\em index})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a0231b93bceae257f0e1c35041f8fe63f}
2010-05-24 02:45:09 +02:00
2010-05-27 11:55:27 +02:00
Drops a constraint from the \hyperlink{classCSP}{CSP}.
2010-05-24 02:45:09 +02:00
2010-05-27 11:55:27 +02:00
\begin{DoxyParams}{Parameters}
\item[{\em index}]Index of the constraint to be dropped \end{DoxyParams}
2010-05-24 02:45:09 +02:00
\hypertarget{classCSP_ae96286c6c7dfb6fe077544e0d4af15f4}{
\index{CSP@{CSP}!hasUniqueSolution@{hasUniqueSolution}}
\index{hasUniqueSolution@{hasUniqueSolution}!CSP@{CSP}}
\subsubsection[{hasUniqueSolution}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ bool {\bf CSP}$<$ T $>$::hasUniqueSolution (void)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_ae96286c6c7dfb6fe077544e0d4af15f4}
Check if the \hyperlink{classCSP}{CSP}, with the given variables, domains and constraints, admits a unique solution, i.e. each domain of each variable contains an only element.
\begin{DoxyReturn}{Returns}
true if the \hyperlink{classCSP}{CSP} has an only possible solution, false otherwise
\end{DoxyReturn}
\hypertarget{classCSP_a7ef9eb91c38815c9d82182696a6bd5d3}{
\index{CSP@{CSP}!isSatisfiable@{isSatisfiable}}
\index{isSatisfiable@{isSatisfiable}!CSP@{CSP}}
\subsubsection[{isSatisfiable}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ bool {\bf CSP}$<$ T $>$::isSatisfiable (void)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a7ef9eb91c38815c9d82182696a6bd5d3}
Check if the current \hyperlink{classCSP}{CSP}, with the applied constraints, is satisfiable.
\begin{DoxyReturn}{Returns}
true if the \hyperlink{classCSP}{CSP} has at least a possible solution, false otherwise
\end{DoxyReturn}
\hypertarget{classCSP_a213dafc1aae7b1825371810a511eca4f}{
\index{CSP@{CSP}!isSet@{isSet}}
\index{isSet@{isSet}!CSP@{CSP}}
\subsubsection[{isSet}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ bool {\bf CSP}$<$ T $>$::isSet (size\_\-t {\em i})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a213dafc1aae7b1825371810a511eca4f}
Check if the i-\/th variable in the \hyperlink{classCSP}{CSP} has a fixed value.
\begin{DoxyParams}{Parameters}
\item[{\em i}]Index of the variable to be checked \end{DoxyParams}
\begin{DoxyReturn}{Returns}
true if the i-\/th variable has a fixed value, false otherwise
\end{DoxyReturn}
2010-05-27 11:55:27 +02:00
\hypertarget{classCSP_a466845256e638c5e258fd728b641359f}{
\index{CSP@{CSP}!refreshDomains@{refreshDomains}}
\index{refreshDomains@{refreshDomains}!CSP@{CSP}}
\subsubsection[{refreshDomains}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::refreshDomains (void)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a466845256e638c5e258fd728b641359f}
Updates the domains of the variables. Any constraint or node fixed value is applied.
\begin{DoxyParams}{Parameters}
\item[{\em max\_\-iterations}]Maximum number of iterations, after which the function will quit. This can be used to break endless loops in domains assignations. \end{DoxyParams}
2010-05-24 02:45:09 +02:00
\hypertarget{classCSP_a457e1df05d4ec16be00118bda22fd882}{
\index{CSP@{CSP}!setConstraint@{setConstraint}}
\index{setConstraint@{setConstraint}!CSP@{CSP}}
\subsubsection[{setConstraint}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::setConstraint (std::vector$<$ bool($\ast$)(std::vector$<$ {\bf CSPvariable}$<$ T $>$ $>$) $>$ {\em c})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a457e1df05d4ec16be00118bda22fd882}
Apply the constraints to the \hyperlink{classCSP}{CSP} as vector of boolean functions.
\begin{DoxyParams}{Parameters}
\item[{\em c}]Vector containing pointers to boolean functions representing the constraints of the \hyperlink{classCSP}{CSP} \end{DoxyParams}
\hypertarget{classCSP_a534a0d9bd10fb544f94196bf3c386657}{
\index{CSP@{CSP}!setConstraint@{setConstraint}}
\index{setConstraint@{setConstraint}!CSP@{CSP}}
\subsubsection[{setConstraint}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::setConstraint (bool($\ast$)(std::vector$<$ {\bf CSPvariable}$<$ T $>$ $>$) {\em c})}}
\label{classCSP_a534a0d9bd10fb544f94196bf3c386657}
Apply the constraint to the \hyperlink{classCSP}{CSP} as a boolean function.
\begin{DoxyParams}{Parameters}
\item[{\em c}]Boolean function representing the constraint of the \hyperlink{classCSP}{CSP} \end{DoxyParams}
\hypertarget{classCSP_a65518e67e33e31bff1b5f9aabdf80a01}{
\index{CSP@{CSP}!setDomain@{setDomain}}
\index{setDomain@{setDomain}!CSP@{CSP}}
\subsubsection[{setDomain}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::setDomain (size\_\-t {\em index}, \/ T {\em domain}\mbox{[}$\,$\mbox{]}, \/ int {\em size})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a65518e67e33e31bff1b5f9aabdf80a01}
Set the domain for the i-\/th variable.
\begin{DoxyParams}{Parameters}
\item[{\em index}]Variable for which we're setting the domain \item[{\em domain}]Array containing the possible values for that variable \item[{\em size}]Size of \char`\"{}domain\char`\"{} array \end{DoxyParams}
\hypertarget{classCSP_a4017c17aac9d3e96d0e821ebbe09da7b}{
\index{CSP@{CSP}!setDomain@{setDomain}}
\index{setDomain@{setDomain}!CSP@{CSP}}
\subsubsection[{setDomain}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::setDomain (size\_\-t {\em index}, \/ std::vector$<$ T $>$ {\em domain})}}
\label{classCSP_a4017c17aac9d3e96d0e821ebbe09da7b}
Set the domain for the i-\/th variable.
\begin{DoxyParams}{Parameters}
\item[{\em index}]Variable for which we're setting the domain \item[{\em domain}]Vector containing the possible values for that variable \end{DoxyParams}
\hypertarget{classCSP_ac25064c5b2d4e1020173b56913251ebd}{
\index{CSP@{CSP}!setValue@{setValue}}
\index{setValue@{setValue}!CSP@{CSP}}
\subsubsection[{setValue}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::setValue (size\_\-t {\em index}, \/ T {\em value})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_ac25064c5b2d4e1020173b56913251ebd}
Set the value of a variable as a constraint.
\begin{DoxyParams}{Parameters}
\item[{\em index}]Index of the parameter to be set \item[{\em value}]Value to be set \end{DoxyParams}
2010-05-27 11:55:27 +02:00
\hypertarget{classCSP_a125c7171c19b99e631926bbe011f127d}{
\index{CSP@{CSP}!size@{size}}
\index{size@{size}!CSP@{CSP}}
\subsubsection[{size}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ size\_\-t {\bf CSP}$<$ T $>$::size (void)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a125c7171c19b99e631926bbe011f127d}
Get the number of variables in the current \hyperlink{classCSP}{CSP}.
\begin{DoxyReturn}{Returns}
Size of the \hyperlink{classCSP}{CSP}
\end{DoxyReturn}
2010-05-24 02:45:09 +02:00
\hypertarget{classCSP_a4c0cae125a610f519dc22eaec255a0ae}{
\index{CSP@{CSP}!unsetValue@{unsetValue}}
\index{unsetValue@{unsetValue}!CSP@{CSP}}
\subsubsection[{unsetValue}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ void {\bf CSP}$<$ T $>$::unsetValue (size\_\-t {\em index})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_a4c0cae125a610f519dc22eaec255a0ae}
Marks a variable as not set, and if a default value was assigned in the \hyperlink{classCSP}{CSP} constructor, this value will be set. By default, unless specified in the constructor, all the variables are considered as not set.
\begin{DoxyParams}{Parameters}
\item[{\em index}]Index of the variable to be unset \end{DoxyParams}
\hypertarget{classCSP_aafa5e1a65d6c5d80780437d8d684f32a}{
\index{CSP@{CSP}!value@{value}}
\index{value@{value}!CSP@{CSP}}
\subsubsection[{value}]{\setlength{\rightskip}{0pt plus 5cm}template$<$class T $>$ T {\bf CSP}$<$ T $>$::value (size\_\-t {\em i})\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}}
\label{classCSP_aafa5e1a65d6c5d80780437d8d684f32a}
Get the value of the i-\/th variable of the \hyperlink{classCSP}{CSP}. Be careful: before using this function you should check whether the variable you're going to check is actually set, using the \hyperlink{classCSP_a213dafc1aae7b1825371810a511eca4f}{isSet()} method, unless you know what you're doing, in order to avoid reading inconsistent data.
\begin{DoxyParams}{Parameters}
\item[{\em i}]Index of the variable to get \end{DoxyParams}
\begin{DoxyReturn}{Returns}
The value of the variable, if the variable exists
\end{DoxyReturn}
The documentation for this class was generated from the following files:\begin{DoxyCompactItemize}
\item
csp++-\/def.h\item
csp++.cpp\end{DoxyCompactItemize}