From 77bc8c6aa3608df79f2fffca687e047a1ffa9981 Mon Sep 17 00:00:00 2001 From: Markus Schmidt Date: Wed, 12 Nov 2025 02:04:18 +0100 Subject: [PATCH] Ex8 and minor improvements --- sheet3/1/{output_pc1.txt => output.txt} | 36 +- sheet3/345/Doxyfile:Zone.Identifier | 0 sheet3/345/Makefile:Zone.Identifier | 0 sheet3/345/benchmark.cpp | 10 +- sheet3/345/main.cpp | 13 +- sheet3/345/main.cpp:Zone.Identifier | 0 sheet3/345/mylib.cpp:Zone.Identifier | 0 sheet3/345/mylib.h:Zone.Identifier | 0 sheet3/345/output.txt | 51 + sheet3/345/small_Doxyfile:Zone.Identifier | 0 sheet3/6/main.cpp | 2 +- sheet3/6/output.txt | 24 + sheet3/7/Makefile | 3 +- sheet3/7/benchmark.cpp | 43 + sheet3/7/benchmark.h | 21 + sheet3/7/benchmark.o | Bin 103416 -> 0 bytes sheet3/7/main.cpp | 83 +- sheet3/7/mylib.o | Bin 86040 -> 0 bytes sheet3/7/timing.h | 51 + sheet3/8/Doxyfile | 2877 + sheet3/8/Makefile | 54 + sheet3/8/ToDo.txt | 5 + sheet3/8/ascii_read_meshvector.m | 43 + sheet3/8/ascii_write_mesh.m | 49 + sheet3/8/geom.cpp | 522 + sheet3/8/geom.h | 381 + sheet3/8/getmatrix.cpp | 348 + sheet3/8/getmatrix.h | 178 + sheet3/8/gnuplot.rot | 5 + sheet3/8/gprofng_script1 | 7 + sheet3/8/gprofng_script2 | 7 + sheet3/8/jac.dem | 21 + sheet3/8/jacobi.cbp | 75 + sheet3/8/jacobi.layout | 4 + sheet3/8/jacsolve.cpp | 61 + sheet3/8/jacsolve.h | 18 + sheet3/8/main.cpp | 129 + sheet3/8/nl.awk | 20 + sheet3/8/out_100_GCC.txt | 9 + sheet3/8/output.txt | 24 + sheet3/8/small_Doxyfile | 1826 + sheet3/8/square.m | 41 + sheet3/8/square_100.txt | 138487 +++++++++++++++++++ sheet3/8/square_tiny.txt | 95 + sheet3/8/userset.cpp | 16 + sheet3/8/userset.h | 44 + sheet3/8/uv.txt | 69043 +++++++++ sheet3/8/vdop.cpp | 84 + sheet3/8/vdop.h | 58 + sheet3/8/visualize_results.m | 20 + 50 files changed, 214845 insertions(+), 43 deletions(-) rename sheet3/1/{output_pc1.txt => output.txt} (68%) delete mode 100644 sheet3/345/Doxyfile:Zone.Identifier delete mode 100644 sheet3/345/Makefile:Zone.Identifier delete mode 100644 sheet3/345/main.cpp:Zone.Identifier delete mode 100644 sheet3/345/mylib.cpp:Zone.Identifier delete mode 100644 sheet3/345/mylib.h:Zone.Identifier create mode 100644 sheet3/345/output.txt delete mode 100644 sheet3/345/small_Doxyfile:Zone.Identifier create mode 100644 sheet3/6/output.txt create mode 100644 sheet3/7/benchmark.cpp create mode 100644 sheet3/7/benchmark.h delete mode 100644 sheet3/7/benchmark.o delete mode 100644 sheet3/7/mylib.o create mode 100644 sheet3/7/timing.h create mode 100644 sheet3/8/Doxyfile create mode 100644 sheet3/8/Makefile create mode 100644 sheet3/8/ToDo.txt create mode 100644 sheet3/8/ascii_read_meshvector.m create mode 100644 sheet3/8/ascii_write_mesh.m create mode 100644 sheet3/8/geom.cpp create mode 100644 sheet3/8/geom.h create mode 100644 sheet3/8/getmatrix.cpp create mode 100644 sheet3/8/getmatrix.h create mode 100644 sheet3/8/gnuplot.rot create mode 100644 sheet3/8/gprofng_script1 create mode 100644 sheet3/8/gprofng_script2 create mode 100644 sheet3/8/jac.dem create mode 100644 sheet3/8/jacobi.cbp create mode 100644 sheet3/8/jacobi.layout create mode 100644 sheet3/8/jacsolve.cpp create mode 100644 sheet3/8/jacsolve.h create mode 100644 sheet3/8/main.cpp create mode 100644 sheet3/8/nl.awk create mode 100644 sheet3/8/out_100_GCC.txt create mode 100644 sheet3/8/output.txt create mode 100644 sheet3/8/small_Doxyfile create mode 100644 sheet3/8/square.m create mode 100644 sheet3/8/square_100.txt create mode 100644 sheet3/8/square_tiny.txt create mode 100644 sheet3/8/userset.cpp create mode 100644 sheet3/8/userset.h create mode 100644 sheet3/8/uv.txt create mode 100644 sheet3/8/vdop.cpp create mode 100644 sheet3/8/vdop.h create mode 100644 sheet3/8/visualize_results.m diff --git a/sheet3/1/output_pc1.txt b/sheet3/1/output.txt similarity index 68% rename from sheet3/1/output_pc1.txt rename to sheet3/1/output.txt index 487d1f9..6c013a1 100644 --- a/sheet3/1/output_pc1.txt +++ b/sheet3/1/output.txt @@ -19,8 +19,8 @@ Each kernel will be executed 20 times. will be used to compute the reported bandwidth. ------------------------------------------------------------- Your clock granularity/precision appears to be 1 microseconds. -Each test below will take on the order of 46252 microseconds. - (= 46252 clock ticks) +Each test below will take on the order of 59858 microseconds. + (= 59858 clock ticks) Increase the size of the arrays if this shows that you are not getting at least 20 clock ticks per test. ------------------------------------------------------------- @@ -29,10 +29,10 @@ For best results, please be sure you know the precision of your system timer. ------------------------------------------------------------- Function Best Rate MB/s Avg time Min time Max time -Copy: 28478.6 0.047858 0.044946 0.054333 -Scale: 20551.4 0.066044 0.062283 0.077807 -Add: 22534.2 0.089671 0.085204 0.099586 -Triad: 22709.5 0.088864 0.084546 0.098536 +Copy: 23508.2 0.063228 0.054449 0.074427 +Scale: 18323.7 0.089940 0.069855 0.116932 +Add: 19762.6 0.276166 0.097153 3.054857 +Triad: 19559.9 0.123390 0.098160 0.156530 ------------------------------------------------------------- Solution Validates: avg error less than 1.000000e-13 on all three arrays ------------------------------------------------------------- @@ -42,19 +42,19 @@ Solution Validates: avg error less than 1.000000e-13 on all three arrays Module Error RunTime MFLOPS (usec) - 1 4.0146e-13 0.0021 6622.7552 - 2 -1.4166e-13 0.0006 12723.3419 - 3 4.7184e-14 0.0027 6253.2599 - 4 -1.2557e-13 0.0026 5758.6323 - 5 -1.3800e-13 0.0051 5740.4851 - 6 3.2380e-13 0.0051 5674.2511 - 7 -8.4583e-11 0.0031 3827.0478 - 8 3.4867e-13 0.0053 5610.0203 + 1 4.0146e-13 0.0029 4831.3737 + 2 -1.4166e-13 0.0006 11258.2969 + 3 4.7184e-14 0.0031 5448.3769 + 4 -1.2557e-13 0.0030 5042.5895 + 5 -1.3800e-13 0.0060 4867.7339 + 6 3.2380e-13 0.0054 5322.4399 + 7 -8.4583e-11 0.0031 3907.7854 + 8 3.4867e-13 0.0056 5323.6214 Iterations = 512000000 NullTime (usec) = 0.0000 - MFLOPS(1) = 9507.3864 - MFLOPS(2) = 5042.7572 - MFLOPS(3) = 5597.4972 - MFLOPS(4) = 5766.1547 + MFLOPS(1) = 8348.0311 + MFLOPS(2) = 4650.8807 + MFLOPS(3) = 5016.3434 + MFLOPS(4) = 5297.2428 diff --git a/sheet3/345/Doxyfile:Zone.Identifier b/sheet3/345/Doxyfile:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/sheet3/345/Makefile:Zone.Identifier b/sheet3/345/Makefile:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/sheet3/345/benchmark.cpp b/sheet3/345/benchmark.cpp index 2e950d4..8c3bd85 100644 --- a/sheet3/345/benchmark.cpp +++ b/sheet3/345/benchmark.cpp @@ -82,8 +82,12 @@ vector benchmark_D(const vector& coeff, const vector& x) double norm2(const vector& x) { double s = 0.0; - for (unsigned int i = 0; i < x.size(); ++i) - s += x[i]*x[i]; + double xi; + for (unsigned int i = 0; i < x.size(); ++i){ + xi = x[i]; + s += xi*xi; + } + return sqrt(s); } @@ -116,7 +120,7 @@ vector matrixMultColumnWise(const vector &A, const vector = 1.4e+06 +Timing in sec. : 0.00893637 +GFLOPS : 0.291808 +GiByte/s : 2.33446 + +===== Benchmark B ===== +340000 +bytes: 2.31472e+07 +Timing in sec. : 0.0133897 +GFLOPS : 0.402029 +GiByte/s : 1.61001 + +===== Benchmark C ===== +7.37196e+07 +bytes: 2.4e+07 +Timing in sec. : 8.67235 +GFLOPS : 0.21478 +GiByte/s : 0.00257736 + +===== Benchmark D ===== +10500 +bytes: 3.20001e+07 +Timing in sec. : 0.101087 +GFLOPS : 0.515935 +GiByte/s : 0.294821 + +===== Benchmark 5A ===== +NORM = 150114 +Timing in sec. : 0.00703533 +GFLOPS : 0.370658 +GiByte/s : 1.48263 + +===== Benchmark 5B ===== + = 1.4e+06 +Timing in sec. : 0.0108377 +GFLOPS : 0.601533 +GiByte/s : 1.92491 + +===== Benchmark 5C ===== +7.37196e+07 +bytes: 2.4e+07 +Timing in sec. : 15.2407 +GFLOPS : 0.122215 +GiByte/s : 0.00146658 diff --git a/sheet3/345/small_Doxyfile:Zone.Identifier b/sheet3/345/small_Doxyfile:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/sheet3/6/main.cpp b/sheet3/6/main.cpp index 7012cdb..5436a3a 100644 --- a/sheet3/6/main.cpp +++ b/sheet3/6/main.cpp @@ -139,4 +139,4 @@ int main(int argc, char **argv) return 0; -} // memory for x and y will be deallocated by their destructors +} diff --git a/sheet3/6/output.txt b/sheet3/6/output.txt new file mode 100644 index 0000000..8959f91 --- /dev/null +++ b/sheet3/6/output.txt @@ -0,0 +1,24 @@ +g++ -c -g -O0 -funroll-all-loops -std=c++17 -Wall -pedantic -Wextra -Weffc++ -Woverloaded-virtual -Wfloat-equal -Wshadow -Wredundant-decls -Winline -fmax-errors=1 -flto -o main.o main.cpp +g++ -c -g -O0 -funroll-all-loops -std=c++17 -Wall -pedantic -Wextra -Weffc++ -Woverloaded-virtual -Wfloat-equal -Wshadow -Wredundant-decls -Winline -fmax-errors=1 -flto -o mylib.o mylib.cpp +g++ -c -g -O0 -funroll-all-loops -std=c++17 -Wall -pedantic -Wextra -Weffc++ -Woverloaded-virtual -Wfloat-equal -Wshadow -Wredundant-decls -Winline -fmax-errors=1 -flto -o benchmark.o benchmark.cpp +g++ main.o mylib.o benchmark.o -g -O0 -llapack -lblas -flto -o main.GCC_ +./main.GCC_ + +===== Benchmark A ===== + = 1.4e+06 +Timing in sec. : 0.000900578 +GFLOPS : 2.89559 +GiByte/s : 23.1647 + +===== Benchmark B ===== +1.7e+07 +bytes: 2.31472e+07 +Timing in sec. : 0.000687268 +GFLOPS : 7.83252 +GiByte/s : 31.3669 + +===== Benchmark C ===== +bytes: 2.4e+07 +Timing in sec. : 0.0151789 +GFLOPS : 122.713 +GiByte/s : 1.47255 diff --git a/sheet3/7/Makefile b/sheet3/7/Makefile index b463be3..0d6dc8f 100644 --- a/sheet3/7/Makefile +++ b/sheet3/7/Makefile @@ -13,8 +13,7 @@ COMPILER=GCC_ # COMPILER=PGI_ - -SOURCES = main.cpp +SOURCES = main.cpp benchmark.cpp OBJECTS = $(SOURCES:.cpp=.o) PROGRAM = main.${COMPILER} diff --git a/sheet3/7/benchmark.cpp b/sheet3/7/benchmark.cpp new file mode 100644 index 0000000..357902a --- /dev/null +++ b/sheet3/7/benchmark.cpp @@ -0,0 +1,43 @@ +#include +#include +#include +using namespace std; +#include + +// Inner product +double benchmark_A(const vector &x, const vector &y) +{ + + + return cblas_ddot(x.size(),x.data(),1,y.data(),1); + +} + +//Matrix-vector product +vector benchmark_B(const vector &A, const vector &x) +{ + unsigned int N = x.size(); + unsigned int M = A.size() / N; + vector b(M, 0.0); + + cblas_dgemv(CblasRowMajor,CblasNoTrans,M,N,1,A.data(),N,x.data(),1,0.0,b.data(),1); + + return b; +} + + +//Matrix-Matrix product +vector benchmark_C(const vector &A, const vector &B, unsigned int M) +{ + unsigned int L = A.size()/M; + unsigned int N = B.size()/L; + vector C(M*N,0.0); + + cblas_dgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,M,N,L,1.0,A.data(),L,B.data(),N,0.0,C.data(),N); + + return C; + +} + + + diff --git a/sheet3/7/benchmark.h b/sheet3/7/benchmark.h new file mode 100644 index 0000000..d7b1ee7 --- /dev/null +++ b/sheet3/7/benchmark.h @@ -0,0 +1,21 @@ +#ifndef BENCHMARK_H +#define BENCHMARK_H + + +#include +using namespace std; + +double benchmark_A(const vector &x, + const vector &y); + +vector benchmark_B(const vector &A, + const vector &x); + +vector benchmark_C(const vector &A, + const vector &B, + unsigned int M); + + + + +#endif diff --git a/sheet3/7/benchmark.o b/sheet3/7/benchmark.o deleted file mode 100644 index b183aa8f1d745943a5a2038c93999fbe73710fa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103416 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 VFF=T$l8!(NpY2%ve!Zan{|CLL!WsYo diff --git a/sheet3/7/main.cpp b/sheet3/7/main.cpp index 7c62618..8d702c4 100644 --- a/sheet3/7/main.cpp +++ b/sheet3/7/main.cpp @@ -8,17 +8,17 @@ #include #include #include - +#include "timing.h" +#include "benchmark.h" using namespace std; using namespace std::chrono; // timing int main() { - unsigned int n= 10; - unsigned int nhrs = 1; + unsigned int n= 32; vector M(n*n,4.0); - + for(unsigned int i=0; i M2 = M; vector ipiv(n); //pivots LAPACKE_dgetrf(LAPACK_ROW_MAJOR,n,n, M.data(),n,ipiv.data()); //M=PLU + - unsigned int runtimes[] = {1,2,4,8,16,32}; - for(unsigned int i=0; i < 6;i++) + double time; + unsigned int nhrsmax = 1000000; + for(unsigned int i=nhrsmax/10; i < nhrsmax;i+=nhrsmax/10) { - nhrs = runtimes[i]; - vector b(n*nhrs,0.0); - for (unsigned int j=0; j X(n*nhrs,1.0); + + vector b = benchmark_C(M2,X,n); + + tic(); + LAPACKE_dgetrs(LAPACK_ROW_MAJOR,'N',n,nhrs,M.data(),n,ipiv.data(),b.data(),nhrs); + time = toc(); + cout << "Time for nhrs=" << nhrs << ": " << time << endl; + + + + double max_err = 0.0; + for (unsigned int j = 0; j < n * nhrs; j++) + { + double err = b[j] - X[j]; + err *= err; + if (err > max_err) max_err = err; + } + cout <<"max err^2:" << max_err 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 Pn^TdJaQ!72;Pn3==9i!! diff --git a/sheet3/7/timing.h b/sheet3/7/timing.h new file mode 100644 index 0000000..1c79e9d --- /dev/null +++ b/sheet3/7/timing.h @@ -0,0 +1,51 @@ +// +// Gundolf Haase, Oct 18 2024 +// +#pragma once +#include // timing +#include + +//using Clock = std::chrono::system_clock; //!< The wall clock timer chosen +using Clock = std::chrono::high_resolution_clock; +using TPoint= std::chrono::time_point; + +// [Galowicz, C++17 STL Cookbook, p. 29] + +std::stack MyStopWatch; //!< starting time of stopwatch + +/** Starts stopwatch timer. + * Use as @code tic(); myfunction(...) ; double tsec = toc(); @endcode + * + * The timining can be nested and the recent time point is stored on top of the stack. + * + * @return recent time point + * @see toc + */ + auto tic() +{ + MyStopWatch.push(Clock::now()); + return MyStopWatch.top(); +} + +/** Returns the elapsed time from stopwatch. + * + * The time point from top of the stack is used + * if time point @p t_b is not passed as input parameter. + * Use as @code tic(); myfunction(...) ; double tsec = toc(); @endcode + * or as @code auto t_b = tic(); myfunction(...) ; double tsec = toc(t_b); @endcode + * The last option is to be used in the case of + * non-nested but overlapping time measurements. + * + * @param[in] t_b start time of some stop watch + * @return elapsed time in seconds. + * +*/ + double toc(TPoint const &t_b = MyStopWatch.top()) +{ + // https://en.cppreference.com/w/cpp/chrono/treat_as_floating_point + using Unit = std::chrono::seconds; + using FpSeconds = std::chrono::duration; + auto t_e = Clock::now(); + MyStopWatch.pop(); + return FpSeconds(t_e-t_b).count(); +} diff --git a/sheet3/8/Doxyfile b/sheet3/8/Doxyfile new file mode 100644 index 0000000..f7a3ef7 --- /dev/null +++ b/sheet3/8/Doxyfile @@ -0,0 +1,2877 @@ +# Doxyfile 1.10.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = jacobi_oo_STL + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, +# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to +# be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# multi-line macros, enums or list initialized variables directly into the +# documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = YES + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /