From 2195a9db0a74e1ad53ef155285345b50339f811a Mon Sep 17 00:00:00 2001 From: Markus Schmidt Date: Wed, 12 Nov 2025 00:14:28 +0100 Subject: [PATCH] sheet3 --- sheet3/1/HISTORY.txt | 152 + sheet3/1/HISTORY.txt:Zone.Identifier | 0 sheet3/1/LICENSE.txt | 34 + sheet3/1/LICENSE.txt:Zone.Identifier | 0 sheet3/1/Makefile | 44 + sheet3/1/Makefile:Zone.Identifier | 0 sheet3/1/READ.ME | 110 + sheet3/1/READ.ME:Zone.Identifier | 0 sheet3/1/flops.c | 1156 ++++++++ sheet3/1/flops.c:Zone.Identifier | 0 sheet3/1/mysecond.c | 27 + sheet3/1/mysecond.c:Zone.Identifier | 0 sheet3/1/output_pc1.txt | 60 + sheet3/1/stream.c | 585 ++++ sheet3/1/stream.c:Zone.Identifier | 0 sheet3/1/stream.f | 462 +++ sheet3/1/stream.f:Zone.Identifier | 0 sheet3/2.txt | 17 + sheet3/345/.vscode/settings.json | 6 + sheet3/345/Doxyfile | 2563 +++++++++++++++++ sheet3/345/Doxyfile:Zone.Identifier | 0 sheet3/345/Makefile | 30 + sheet3/345/Makefile:Zone.Identifier | 0 sheet3/345/benchmark.cpp | 127 + sheet3/345/benchmark.h | 29 + sheet3/345/main | Bin 0 -> 156680 bytes sheet3/345/main.cpp | 286 ++ sheet3/345/main.cpp:Zone.Identifier | 0 sheet3/345/mylib.cpp | 65 + sheet3/345/mylib.cpp:Zone.Identifier | 0 sheet3/345/mylib.h | 30 + sheet3/345/mylib.h:Zone.Identifier | 0 sheet3/345/small_Doxyfile | 1826 ++++++++++++ sheet3/345/small_Doxyfile:Zone.Identifier | 0 sheet3/6/.vscode/settings.json | 6 + .../6/.vscode/settings.json:Zone.Identifier | 0 sheet3/6/Doxyfile | 2563 +++++++++++++++++ sheet3/6/Makefile | 31 + sheet3/6/benchmark.cpp | 43 + sheet3/6/benchmark.h | 21 + sheet3/6/main | Bin 0 -> 156680 bytes sheet3/6/main.cpp | 142 + sheet3/6/mylib.cpp | 65 + sheet3/6/mylib.h | 30 + sheet3/6/small_Doxyfile | 1826 ++++++++++++ sheet3/CLANG_default.mk | 124 + sheet3/GCC_default.mk | 183 ++ sheet3/ICC_default.mk | 125 + sheet3/Neues Textdokument.txt | 0 sheet3/ONEAPI_default.mk | 176 ++ sheet3/PGI_default.mk | 94 + 51 files changed, 13038 insertions(+) create mode 100644 sheet3/1/HISTORY.txt create mode 100644 sheet3/1/HISTORY.txt:Zone.Identifier create mode 100644 sheet3/1/LICENSE.txt create mode 100644 sheet3/1/LICENSE.txt:Zone.Identifier create mode 100644 sheet3/1/Makefile create mode 100644 sheet3/1/Makefile:Zone.Identifier create mode 100644 sheet3/1/READ.ME create mode 100644 sheet3/1/READ.ME:Zone.Identifier create mode 100644 sheet3/1/flops.c create mode 100644 sheet3/1/flops.c:Zone.Identifier create mode 100644 sheet3/1/mysecond.c create mode 100644 sheet3/1/mysecond.c:Zone.Identifier create mode 100644 sheet3/1/output_pc1.txt create mode 100644 sheet3/1/stream.c create mode 100644 sheet3/1/stream.c:Zone.Identifier create mode 100644 sheet3/1/stream.f create mode 100644 sheet3/1/stream.f:Zone.Identifier create mode 100644 sheet3/2.txt create mode 100644 sheet3/345/.vscode/settings.json create mode 100644 sheet3/345/Doxyfile create mode 100644 sheet3/345/Doxyfile:Zone.Identifier create mode 100644 sheet3/345/Makefile create mode 100644 sheet3/345/Makefile:Zone.Identifier create mode 100644 sheet3/345/benchmark.cpp create mode 100644 sheet3/345/benchmark.h create mode 100755 sheet3/345/main create mode 100644 sheet3/345/main.cpp create mode 100644 sheet3/345/main.cpp:Zone.Identifier create mode 100644 sheet3/345/mylib.cpp create mode 100644 sheet3/345/mylib.cpp:Zone.Identifier create mode 100644 sheet3/345/mylib.h create mode 100644 sheet3/345/mylib.h:Zone.Identifier create mode 100644 sheet3/345/small_Doxyfile create mode 100644 sheet3/345/small_Doxyfile:Zone.Identifier create mode 100644 sheet3/6/.vscode/settings.json create mode 100644 sheet3/6/.vscode/settings.json:Zone.Identifier create mode 100644 sheet3/6/Doxyfile create mode 100644 sheet3/6/Makefile create mode 100644 sheet3/6/benchmark.cpp create mode 100644 sheet3/6/benchmark.h create mode 100644 sheet3/6/main create mode 100644 sheet3/6/main.cpp create mode 100644 sheet3/6/mylib.cpp create mode 100644 sheet3/6/mylib.h create mode 100644 sheet3/6/small_Doxyfile create mode 100644 sheet3/CLANG_default.mk create mode 100644 sheet3/GCC_default.mk create mode 100644 sheet3/ICC_default.mk create mode 100644 sheet3/Neues Textdokument.txt create mode 100644 sheet3/ONEAPI_default.mk create mode 100644 sheet3/PGI_default.mk diff --git a/sheet3/1/HISTORY.txt b/sheet3/1/HISTORY.txt new file mode 100644 index 0000000..496fca6 --- /dev/null +++ b/sheet3/1/HISTORY.txt @@ -0,0 +1,152 @@ +------------------------------------------------------------------------- + +Revisions as of Thu, Jan 17, 2013 3:50:01 PM + +Version 5.10 of stream.c has been released. +This version includes improved validation code and will automatically +use 64-bit array indices on 64-bit systems to allow very large arrays. + +------------------------------------------------------------------------- + +Revisions as of Thu Feb 19 08:16:57 CST 2009 + +Note that the codes in the "Versions" subdirectory should be +considered obsolete -- the versions of stream.c and stream.f +in this main directory include the OpenMP directives and structure +for creating "TUNED" versions. + +Only the MPI version in the "Versions" subdirectory should be +of any interest, and I have not recently checked that version for +errors or compliance with the current versions of stream.c and +stream.f. + +I added a simple Makefile to this directory. It works under Cygwin +on my Windows XP box (using gcc and g77). + +A user suggested a sneaky trick for "mysecond.c" -- instead of using +the #ifdef UNDERSCORE to generate the function name that the Fortran +compiler expects, the new version simply defines both "mysecond()" +and "mysecond_()", so it should automagically link with most Fortran +compilers. + +------------------------------------------------------------------------- + +Revisions as of Wed Nov 17 09:15:37 CST 2004 + +The most recent "official" versions have been renamed "stream.f" and +"stream.c" -- all other versions have been moved to the "Versions" +subdirectory. + +The "official" timer (was "second_wall.c") has been renamed "mysecond.c". +This is embedded in the C version ("stream.c"), but still needs to be +externally linked to the FORTRAN version ("stream.f"). + +------------------------------------------------------------------------- + +Revisions as of Tue May 27 11:51:23 CDT 2003 + +Copyright and License info added to stream_d.f, stream_mpi.f, and +stream_tuned.f + + +------------------------------------------------------------------------- + +Revisions as of Tue Apr 8 10:26:48 CDT 2003 + +I changed the name of the timer interface from "second" to "mysecond" +and removed the dummy argument in all versions of the source code (but +not the "Contrib" versions). + + +------------------------------------------------------------------------- + +Revisions as of Mon Feb 25 06:48:14 CST 2002 + +Added an OpenMP version of stream_d.c, called stream_d_omp.c. This is +still not up to date with the Fortran version, which includes error +checking and advanced data flow to prevent overoptimization, but it is +a good start.... + + +------------------------------------------------------------------------- + +Revisions as of Tue Jun 4 16:31:31 EDT 1996 + +I have fixed an "off-by-one" error in the RMS time calculation in +stream_d.f. This was already corrected in stream_d.c. No results are +invalidated, since I use minimum time instead of RMS time anyway.... + +------------------------------------------------------------------------- + +Revisions as of Fri Dec 8 14:49:56 EST 1995 + +I have renamed the timer routines to: + second_cpu.c + second_wall.c + second_cpu.f + +All have a function interface named 'second' which returns a double +precision floating point number. It should be possible to link +second_wall.c with stream_d.f without too much trouble, though the +details will depend on your environment. + +If anyone builds versions of these timers for machines running the +Macintosh O/S or DOS/Windows, I would appreciate getting a copy. + +To clarify: + * For single-user machines, the wallclock timer is preferred. + * For parallel machines, the wallclock timer is required. + * For time-shared systems, the cpu timer is more reliable, + though less accurate. + + +------------------------------------------------------------------------- + +Revisions as of Wed Oct 25 09:40:32 EDT 1995 + +(1) NOTICE to C users: + + stream_d.c has been updated to version 4.0 (beta), and + should be functionally identical to stream_d.f + + Two timers are provided --- second_cpu.c and second_wall.c + second_cpu.c measures cpu time, while second_wall.c measures + elapsed (real) time. + + For single-user machines, the wallclock timer is preferred. + For parallel machines, the wallclock timer is required. + For time-shared systems, the cpu timer is more reliable, + though less accurate. + +(2) cstream.c has been removed -- use stream_d.c + +(3) stream_wall.f has been removed --- to do parallel aggregate + bandwidth runs, comment out the definition of FUNCTION SECOND + in stream_d.f and compile/link with second_wall.c + +(4) stream_offset has been deprecated. It is still here + and usable, but stream_d.f is the "standard" version. + There are easy hooks in stream_d.f to change the + array offsets if you want to. + +(5) The rules of the game are clarified as follows: + + The reference case uses array sizes of 2,000,000 elements + and no additional offsets. I would like to see results + for this case. + + But, you are free to use any array size and any offset + you want, provided that the arrays are each bigger than + the last-level of cache. The output will show me what + parameters you chose. + + I expect that I will report just the best number, but + if there is a serious discrepancy between the reference + case and the "best" case, I reserve the right to report + both. + + Of course, I also reserve the right to reject any results + that I do not trust.... +-- +John D. McCalpin, Ph.D. +john@mccalpin.com diff --git a/sheet3/1/HISTORY.txt:Zone.Identifier b/sheet3/1/HISTORY.txt:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/sheet3/1/LICENSE.txt b/sheet3/1/LICENSE.txt new file mode 100644 index 0000000..cf1c8e0 --- /dev/null +++ b/sheet3/1/LICENSE.txt @@ -0,0 +1,34 @@ +*======================================================================= +*----------------------------------------------------------------------- +* Copyright 1991-2003: John D. McCalpin +*----------------------------------------------------------------------- +* License: +* 1. You are free to use this program and/or to redistribute +* this program. +* 2. You are free to modify this program for your own use, +* including commercial use, subject to the publication +* restrictions in item 3. +* 3. You are free to publish results obtained from running this +* program, or from works that you derive from this program, +* with the following limitations: +* 3a. In order to be referred to as "STREAM benchmark results", +* published results must be in conformance to the STREAM +* Run Rules, (briefly reviewed below) published at +* http://www.cs.virginia.edu/stream/ref.html +* and incorporated herein by reference. +* As the copyright holder, John McCalpin retains the +* right to determine conformity with the Run Rules. +* 3b. Results based on modified source code or on runs not in +* accordance with the STREAM Run Rules must be clearly +* labelled whenever they are published. Examples of +* proper labelling include: +* "tuned STREAM benchmark results" +* "based on a variant of the STREAM benchmark code" +* Other comparable, clear and reasonable labelling is +* acceptable. +* 3c. Submission of results to the STREAM benchmark web site +* is encouraged, but not required. +* 4. Use of this program or creation of derived works based on this +* program constitutes acceptance of these licensing restrictions. +* 5. Absolutely no warranty is expressed or implied. +*----------------------------------------------------------------------- diff --git a/sheet3/1/LICENSE.txt:Zone.Identifier b/sheet3/1/LICENSE.txt:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/sheet3/1/Makefile b/sheet3/1/Makefile new file mode 100644 index 0000000..d6fa443 --- /dev/null +++ b/sheet3/1/Makefile @@ -0,0 +1,44 @@ +CC = gcc +CFLAGS = -O3 +DIMENSIONS = -DSTREAM_ARRAY_SIZE=80000000 -DNTIMES=20 + +FF = gfortran +FFLAGS = -O3 + +all: stream_f.exe stream_c.exe flops.exe + +stream_f.exe: stream.f mysecond.o + $(CC) $(CFLAGS) -c mysecond.c + $(FF) $(FFLAGS) $(DIMENSIONS) -c stream.f + $(FF) $(FFLAGS) stream.o mysecond.o -o stream_f.exe + +stream_c.exe: stream.c + $(CC) $(CFLAGS) $(DIMENSIONS) stream.c -o stream_c.exe + +clean: + rm -f *.exe *.o + +# an example of a more complex build line for the Intel icc compiler +stream.icc: stream.c + icc -O3 -xCORE-AVX2 -ffreestanding -qopenmp -DSTREAM_ARRAY_SIZE=80000000 -DNTIMES=20 stream.c -o stream.omp.AVX2.80M.20x.icc + +# GH +flops.exe: + $(CC) $(CFLAGS) -DUNIX flops.c -o flops.exe + +run: clean all + ./stream_c.exe + ./flops.exe + +MY_DIR = `basename ${PWD}` +tar: clean + @cd .. ;\ + tar cf ${MY_DIR}.tar ${MY_DIR} *default.mk ;\ + cd ${MY_DIR} + + +zip: clean + @cd .. ;\ + zip -r ${MY_DIR}.zip ${MY_DIR} *default.mk;\ + cd ${MY_DIR} +# HG diff --git a/sheet3/1/Makefile:Zone.Identifier b/sheet3/1/Makefile:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/sheet3/1/READ.ME b/sheet3/1/READ.ME new file mode 100644 index 0000000..175a3f0 --- /dev/null +++ b/sheet3/1/READ.ME @@ -0,0 +1,110 @@ +=============================================== + +STREAM is the de facto industry standard benchmark +for measuring sustained memory bandwidth. + +Documentation for STREAM is on the web at: + http://www.cs.virginia.edu/stream/ref.html + +=============================================== +NEWS +=============================================== +UPDATE: October 28 2014: + +"stream_mpi.c" released in the Versions directory. + +Based on Version 5.10 of stream.c, stream_mpi.c +brings the following new features: +* MPI implementation that *distributes* the arrays + across all MPI ranks. (The older Fortran version + of STREAM in MPI *replicates* the arrays across + all MPI ranks.) +* Data is allocated using "posix_memalign" + rather than using static arrays. Different + compiler flags may be needed for both portability + and optimization. + See the READ.ME file in the Versions directory + for more details. +* Error checking and timing done by all ranks and + gathered by rank 0 for processing and output. +* Timing code uses barriers to ensure correct + operation even when multiple MPI ranks run on + shared memory systems. + +NOTE: MPI is not a preferred implementation for + STREAM, which is intended to measure memory + bandwidth in shared-memory systems. In stream_mpi, + the MPI calls are only used to properly synchronize + the timers (using MPI_Barrier) and to gather + timing and error data, so the performance should + scale linearly with the size of the cluster. + But it may be useful, and was an interesting + exercise to develop and debug. + +=============================================== +UPDATE: January 17 2013: + +Version 5.10 of stream.c is finally available! + +There are no changes to what is being measured, but +a number of long-awaited improvements have been made: + +* Updated validation code does not suffer from + accumulated roundoff error for large arrays. +* Defining the preprocessor variable "VERBOSE" + when compiling will (1) cause the code to print the + measured average relative absolute error (rather than + simply printing "Solution Validates", and (2) print + the first 10 array entries with relative error exceeding + the error tolerance. +* Array index variables have been upgraded from + "int" to "ssize_t" to allow arrays with more + than 2 billion elements on 64-bit systems. +* Substantial improvements to the comments in + the source on how to configure/compile/run the + benchmark. +* The proprocessor variable controlling the array + size has been changed from "N" to "STREAM_ARRAY_SIZE". +* A new preprocessor variable "STREAM_TYPE" can be + used to override the data type from the default + "double" to "float". + This mechanism could also be used to change to + non-floating-point types, but several "printf" + statements would need to have their formats changed + to accomodate the modified data type. +* Some small changes in output, including printing + array sizes is GiB as well as MiB. +* Change to the default output format to print fewer + decimals for the bandwidth and more decimals for + the min/max/avg execution times. + + +=============================================== +UPDATE: February 19 2009: + +The most recent "official" versions have been renamed +"stream.f" and "stream.c" -- all other versions have +been moved to the "Versions" subdirectory and should be +considered obsolete. + +The "official" timer (was "second_wall.c") has been +renamed "mysecond.c". This is embedded in the C version +("stream.c"), but still needs to be externally linked to +the FORTRAN version ("stream.f"). The new version defines +entry points both with and without trailing underscores, +so it *should* link automagically with any Fortran compiler. + +=============================================== + +STREAM is a project of "Dr. Bandwidth": + John D. McCalpin, Ph.D. + john@mccalpin.com + +=============================================== + +The STREAM web and ftp sites are currently hosted at +the Department of Computer Science at the University of +Virginia under the generous sponsorship of Professor Bill +Wulf and Professor Alan Batson. + +=============================================== diff --git a/sheet3/1/READ.ME:Zone.Identifier b/sheet3/1/READ.ME:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/sheet3/1/flops.c b/sheet3/1/flops.c new file mode 100644 index 0000000..10325c1 --- /dev/null +++ b/sheet3/1/flops.c @@ -0,0 +1,1156 @@ +/* gcc -O3 -DUNIX -funroll-all-loops -o flops flops.c */ +/* ./flops */ + +/*--------------------- Start flops.c source code ----------------------*/ + +/*****************************/ +/* flops.c */ +/* Version 2.0, 18 Dec 1992 */ +/* Al Aburto */ +/* aburto@nosc.mil */ +/*****************************/ + +/* + Flops.c is a 'c' program which attempts to estimate your systems + floating-point 'MFLOPS' rating for the FADD, FSUB, FMUL, and FDIV + operations based on specific 'instruction mixes' (discussed below). + The program provides an estimate of PEAK MFLOPS performance by making + maximal use of register variables with minimal interaction with main + memory. The execution loops are all small so that they will fit in + any cache. Flops.c can be used along with Linpack and the Livermore + kernels (which exersize memory much more extensively) to gain further + insight into the limits of system performance. The flops.c execution + modules also include various percent weightings of FDIV's (from 0% to + 25% FDIV's) so that the range of performance can be obtained when + using FDIV's. FDIV's, being computationally more intensive than + FADD's or FMUL's, can impact performance considerably on some systems. + + Flops.c consists of 8 independent modules (routines) which, except for + module 2, conduct numerical integration of various functions. Module + 2, estimates the value of pi based upon the Maclaurin series expansion + of atan(1). MFLOPS ratings are provided for each module, but the + programs overall results are summerized by the MFLOPS(1), MFLOPS(2), + MFLOPS(3), and MFLOPS(4) outputs. + + The MFLOPS(1) result is identical to the result provided by all + previous versions of flops.c. It is based only upon the results from + modules 2 and 3. Two problems surfaced in using MFLOPS(1). First, it + was difficult to completely 'vectorize' the result due to the + recurrence of the 's' variable in module 2. This problem is addressed + in the MFLOPS(2) result which does not use module 2, but maintains + nearly the same weighting of FDIV's (9.2%) as in MFLOPS(1) (9.6%). + The second problem with MFLOPS(1) centers around the percentage of + FDIV's (9.6%) which was viewed as too high for an important class of + problems. This concern is addressed in the MFLOPS(3) result where NO + FDIV's are conducted at all. + + The number of floating-point instructions per iteration (loop) is + given below for each module executed: + + MODULE FADD FSUB FMUL FDIV TOTAL Comment + 1 7 0 6 1 14 7.1% FDIV's + 2 3 2 1 1 7 difficult to vectorize. + 3 6 2 9 0 17 0.0% FDIV's + 4 7 0 8 0 15 0.0% FDIV's + 5 13 0 15 1 29 3.4% FDIV's + 6 13 0 16 0 29 0.0% FDIV's + 7 3 3 3 3 12 25.0% FDIV's + 8 13 0 17 0 30 0.0% FDIV's + + A*2+3 21 12 14 5 52 A=5, MFLOPS(1), Same as + 40.4% 23.1% 26.9% 9.6% previous versions of the + flops.c program. Includes + only Modules 2 and 3, does + 9.6% FDIV's, and is not + easily vectorizable. + + 1+3+4 58 14 66 14 152 A=4, MFLOPS(2), New output + +5+6+ 38.2% 9.2% 43.4% 9.2% does not include Module 2, + A*7 but does 9.2% FDIV's. + + 1+3+4 62 5 74 5 146 A=0, MFLOPS(3), New output + +5+6+ 42.9% 3.4% 50.7% 3.4% does not include Module 2, + 7+8 but does 3.4% FDIV's. + + 3+4+6 39 2 50 0 91 A=0, MFLOPS(4), New output + +8 42.9% 2.2% 54.9% 0.0% does not include Module 2, + and does NO FDIV's. + + NOTE: Various timer routines are included as indicated below. The + timer routines, with some comments, are attached at the end + of the main program. + + NOTE: Please do not remove any of the printouts. + + EXAMPLE COMPILATION: + UNIX based systems + cc -DUNIX -O flops.c -o flops + cc -DUNIX -DROPT flops.c -o flops + cc -DUNIX -fast -O4 flops.c -o flops + . + . + . + etc. + + Al Aburto + aburto@nosc.mil +*/ + +/***************************************************************/ +/* Timer options. You MUST uncomment one of the options below */ +/* or compile, for example, with the '-DUNIX' option. */ +/***************************************************************/ +/* #define Amiga */ +/* #define UNIX */ +/* #define UNIX_Old */ +/* #define VMS */ +/* #define BORLAND_C */ +/* #define MSC */ +/* #define MAC */ +/* #define IPSC */ +/* #define FORTRAN_SEC */ +/* #define GTODay */ +/* #define CTimer */ +/* #define UXPM */ +/* #define MAC_TMgr */ +/* #define PARIX */ +/* #define POSIX */ +/* #define WIN32 */ +/* #define POSIX1 */ +/***********************/ + +#include +#include + /* 'Uncomment' the line below to run */ + /* with 'register double' variables */ + /* defined, or compile with the */ + /* '-DROPT' option. Don't need this if */ + /* registers used automatically, but */ + /* you might want to try it anyway. */ +/* #define ROPT */ + +double nulltime, TimeArray[3]; /* Variables needed for 'dtime()'. */ +double TLimit; /* Threshold to determine Number of */ + /* Loops to run. Fixed at 15.0 seconds.*/ + +double T[36]; /* Global Array used to hold timing */ + /* results and other information. */ + +double sa,sb,sc,sd,one,two,three; +double four,five,piref,piprg; +double scale,pierr; + +double A0 = 1.0; +double A1 = -0.1666666666671334; +double A2 = 0.833333333809067E-2; +double A3 = 0.198412715551283E-3; +double A4 = 0.27557589750762E-5; +double A5 = 0.2507059876207E-7; +double A6 = 0.164105986683E-9; + +double B0 = 1.0; +double B1 = -0.4999999999982; +double B2 = 0.4166666664651E-1; +double B3 = -0.1388888805755E-2; +double B4 = 0.24801428034E-4; +double B5 = -0.2754213324E-6; +double B6 = 0.20189405E-8; + +double C0 = 1.0; +double C1 = 0.99999999668; +double C2 = 0.49999995173; +double C3 = 0.16666704243; +double C4 = 0.4166685027E-1; +double C5 = 0.832672635E-2; +double C6 = 0.140836136E-2; +double C7 = 0.17358267E-3; +double C8 = 0.3931683E-4; + +double D1 = 0.3999999946405E-1; +double D2 = 0.96E-3; +double D3 = 0.1233153E-5; + +double E2 = 0.48E-3; +double E3 = 0.411051E-6; + +// void dtime(double p[]); + +int main() +{ + +#ifdef ROPT + register double s,u,v,w,x; +#else + double s,u,v,w,x; +#endif + + long loops, NLimit; + register long i, m, n; + + printf("\n"); + printf(" FLOPS C Program (Double Precision), V2.0 18 Dec 1992\n\n"); + + /****************************/ + loops = 15625; /* Initial number of loops. */ + /* DO NOT CHANGE! */ + /****************************/ + +/****************************************************/ +/* Set Variable Values. */ +/* T[1] references all timing results relative to */ +/* one million loops. */ +/* */ +/* The program will execute from 31250 to 512000000 */ +/* loops based on a runtime of Module 1 of at least */ +/* TLimit = 15.0 seconds. That is, a runtime of 15 */ +/* seconds for Module 1 is used to determine the */ +/* number of loops to execute. */ +/* */ +/* No more than NLimit = 512000000 loops are allowed*/ +/****************************************************/ + + T[1] = 1.0E+06/(double)loops; + + TLimit = 15.0; + NLimit = 512000000; + + piref = 3.14159265358979324; + one = 1.0; + two = 2.0; + three = 3.0; + four = 4.0; + five = 5.0; + scale = one; + + printf(" Module Error RunTime MFLOPS\n"); + printf(" (usec)\n"); +/*************************/ +/* Initialize the timer. */ +/*************************/ + + dtime(TimeArray); + dtime(TimeArray); + +/*******************************************************/ +/* Module 1. Calculate integral of df(x)/f(x) defined */ +/* below. Result is ln(f(1)). There are 14 */ +/* double precision operations per loop */ +/* ( 7 +, 0 -, 6 *, 1 / ) that are included */ +/* in the timing. */ +/* 50.0% +, 00.0% -, 42.9% *, and 07.1% / */ +/*******************************************************/ + n = loops; + sa = 0.0; + + while ( sa < TLimit ) + { + n = 2 * n; + x = one / (double)n; /*********************/ + s = 0.0; /* Loop 1. */ + v = 0.0; /*********************/ + w = one; + + dtime(TimeArray); + for( i = 1 ; i <= n-1 ; i++ ) + { + v = v + w; + u = v * x; + s = s + (D1+u*(D2+u*D3))/(w+u*(D1+u*(E2+u*E3))); + } + dtime(TimeArray); + sa = TimeArray[1]; + + if ( n == NLimit ) break; + /* printf(" %10ld %12.5lf\n",n,sa); */ + } + + scale = 1.0E+06 / (double)n; + T[1] = scale; + +/****************************************/ +/* Estimate nulltime ('for' loop time). */ +/****************************************/ + dtime(TimeArray); + for( i = 1 ; i <= n-1 ; i++ ) + { + } + dtime(TimeArray); + nulltime = T[1] * TimeArray[1]; + if ( nulltime < 0.0 ) nulltime = 0.0; + + T[2] = T[1] * sa - nulltime; + + sa = (D1+D2+D3)/(one+D1+E2+E3); + sb = D1; + + T[3] = T[2] / 14.0; /*********************/ + sa = x * ( sa + sb + two * s ) / two; /* Module 1 Results. */ + sb = one / sa; /*********************/ + n = (long)( (double)( 40000 * (long)sb ) / scale ); + sc = sb - 25.2; + T[4] = one / T[3]; + /********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /********************/ + printf(" 1 %13.4le %10.4lf %10.4lf\n",sc,T[2],T[4]); + + m = n; + +/*******************************************************/ +/* Module 2. Calculate value of PI from Taylor Series */ +/* expansion of atan(1.0). There are 7 */ +/* double precision operations per loop */ +/* ( 3 +, 2 -, 1 *, 1 / ) that are included */ +/* in the timing. */ +/* 42.9% +, 28.6% -, 14.3% *, and 14.3% / */ +/*******************************************************/ + + s = -five; /********************/ + sa = -one; /* Loop 2. */ + /********************/ + dtime(TimeArray); + for ( i = 1 ; i <= m ; i++ ) + { + s = -s; + sa = sa + s; + } + dtime(TimeArray); + T[5] = T[1] * TimeArray[1]; + if ( T[5] < 0.0 ) T[5] = 0.0; + + sc = (double)m; + + u = sa; /*********************/ + v = 0.0; /* Loop 3. */ + w = 0.0; /*********************/ + x = 0.0; + + dtime(TimeArray); + for ( i = 1 ; i <= m ; i++) + { + s = -s; + sa = sa + s; + u = u + two; + x = x +(s - u); + v = v - s * u; + w = w + s / u; + } + dtime(TimeArray); + T[6] = T[1] * TimeArray[1]; + + T[7] = ( T[6] - T[5] ) / 7.0; /*********************/ + m = (long)( sa * x / sc ); /* PI Results */ + sa = four * w / five; /*********************/ + sb = sa + five / v; + sc = 31.25; + piprg = sb - sc / (v * v * v); + pierr = piprg - piref; + T[8] = one / T[7]; + /*********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /*********************/ + printf(" 2 %13.4le %10.4lf %10.4lf\n",pierr,T[6]-T[5],T[8]); + +/*******************************************************/ +/* Module 3. Calculate integral of sin(x) from 0.0 to */ +/* PI/3.0 using Trapazoidal Method. Result */ +/* is 0.5. There are 17 double precision */ +/* operations per loop (6 +, 2 -, 9 *, 0 /) */ +/* included in the timing. */ +/* 35.3% +, 11.8% -, 52.9% *, and 00.0% / */ +/*******************************************************/ + + x = piref / ( three * (double)m ); /*********************/ + s = 0.0; /* Loop 4. */ + v = 0.0; /*********************/ + + dtime(TimeArray); + for( i = 1 ; i <= m-1 ; i++ ) + { + v = v + one; + u = v * x; + w = u * u; + s = s + u * ((((((A6*w-A5)*w+A4)*w-A3)*w+A2)*w+A1)*w+one); + } + dtime(TimeArray); + T[9] = T[1] * TimeArray[1] - nulltime; + + u = piref / three; + w = u * u; + sa = u * ((((((A6*w-A5)*w+A4)*w-A3)*w+A2)*w+A1)*w+one); + + T[10] = T[9] / 17.0; /*********************/ + sa = x * ( sa + two * s ) / two; /* sin(x) Results. */ + sb = 0.5; /*********************/ + sc = sa - sb; + T[11] = one / T[10]; + /*********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /*********************/ + printf(" 3 %13.4le %10.4lf %10.4lf\n",sc,T[9],T[11]); + +/************************************************************/ +/* Module 4. Calculate Integral of cos(x) from 0.0 to PI/3 */ +/* using the Trapazoidal Method. Result is */ +/* sin(PI/3). There are 15 double precision */ +/* operations per loop (7 +, 0 -, 8 *, and 0 / ) */ +/* included in the timing. */ +/* 50.0% +, 00.0% -, 50.0% *, 00.0% / */ +/************************************************************/ + A3 = -A3; + A5 = -A5; + x = piref / ( three * (double)m ); /*********************/ + s = 0.0; /* Loop 5. */ + v = 0.0; /*********************/ + + dtime(TimeArray); + for( i = 1 ; i <= m-1 ; i++ ) + { + u = (double)i * x; + w = u * u; + s = s + w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one; + } + dtime(TimeArray); + T[12] = T[1] * TimeArray[1] - nulltime; + + u = piref / three; + w = u * u; + sa = w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one; + + T[13] = T[12] / 15.0; /*******************/ + sa = x * ( sa + one + two * s ) / two; /* Module 4 Result */ + u = piref / three; /*******************/ + w = u * u; + sb = u * ((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+A0); + sc = sa - sb; + T[14] = one / T[13]; + /*********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /*********************/ + printf(" 4 %13.4le %10.4lf %10.4lf\n",sc,T[12],T[14]); + +/************************************************************/ +/* Module 5. Calculate Integral of tan(x) from 0.0 to PI/3 */ +/* using the Trapazoidal Method. Result is */ +/* ln(cos(PI/3)). There are 29 double precision */ +/* operations per loop (13 +, 0 -, 15 *, and 1 /)*/ +/* included in the timing. */ +/* 46.7% +, 00.0% -, 50.0% *, and 03.3% / */ +/************************************************************/ + + x = piref / ( three * (double)m ); /*********************/ + s = 0.0; /* Loop 6. */ + v = 0.0; /*********************/ + + dtime(TimeArray); + for( i = 1 ; i <= m-1 ; i++ ) + { + u = (double)i * x; + w = u * u; + v = u * ((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+one); + s = s + v / (w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one); + } + dtime(TimeArray); + T[15] = T[1] * TimeArray[1] - nulltime; + + u = piref / three; + w = u * u; + sa = u*((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+one); + sb = w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one; + sa = sa / sb; + + T[16] = T[15] / 29.0; /*******************/ + sa = x * ( sa + two * s ) / two; /* Module 5 Result */ + sb = 0.6931471805599453; /*******************/ + sc = sa - sb; + T[17] = one / T[16]; + /*********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /*********************/ + printf(" 5 %13.4le %10.4lf %10.4lf\n",sc,T[15],T[17]); + +/************************************************************/ +/* Module 6. Calculate Integral of sin(x)*cos(x) from 0.0 */ +/* to PI/4 using the Trapazoidal Method. Result */ +/* is sin(PI/4)^2. There are 29 double precision */ +/* operations per loop (13 +, 0 -, 16 *, and 0 /)*/ +/* included in the timing. */ +/* 46.7% +, 00.0% -, 53.3% *, and 00.0% / */ +/************************************************************/ + + x = piref / ( four * (double)m ); /*********************/ + s = 0.0; /* Loop 7. */ + v = 0.0; /*********************/ + + dtime(TimeArray); + for( i = 1 ; i <= m-1 ; i++ ) + { + u = (double)i * x; + w = u * u; + v = u * ((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+one); + s = s + v*(w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one); + } + dtime(TimeArray); + T[18] = T[1] * TimeArray[1] - nulltime; + + u = piref / four; + w = u * u; + sa = u*((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+one); + sb = w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one; + sa = sa * sb; + + T[19] = T[18] / 29.0; /*******************/ + sa = x * ( sa + two * s ) / two; /* Module 6 Result */ + sb = 0.25; /*******************/ + sc = sa - sb; + T[20] = one / T[19]; + /*********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /*********************/ + printf(" 6 %13.4le %10.4lf %10.4lf\n",sc,T[18],T[20]); + + +/*******************************************************/ +/* Module 7. Calculate value of the definite integral */ +/* from 0 to sa of 1/(x+1), x/(x*x+1), and */ +/* x*x/(x*x*x+1) using the Trapizoidal Rule.*/ +/* There are 12 double precision operations */ +/* per loop ( 3 +, 3 -, 3 *, and 3 / ) that */ +/* are included in the timing. */ +/* 25.0% +, 25.0% -, 25.0% *, and 25.0% / */ +/*******************************************************/ + + /*********************/ + s = 0.0; /* Loop 8. */ + w = one; /*********************/ + sa = 102.3321513995275; + v = sa / (double)m; + + dtime(TimeArray); + for ( i = 1 ; i <= m-1 ; i++) + { + x = (double)i * v; + u = x * x; + s = s - w / ( x + w ) - x / ( u + w ) - u / ( x * u + w ); + } + dtime(TimeArray); + T[21] = T[1] * TimeArray[1] - nulltime; + /*********************/ + /* Module 7 Results */ + /*********************/ + T[22] = T[21] / 12.0; + x = sa; + u = x * x; + sa = -w - w / ( x + w ) - x / ( u + w ) - u / ( x * u + w ); + sa = 18.0 * v * (sa + two * s ); + + m = -2000 * (long)sa; + m = (long)( (double)m / scale ); + + sc = sa + 500.2; + T[23] = one / T[22]; + /********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /********************/ + printf(" 7 %13.4le %10.4lf %10.4lf\n",sc,T[21],T[23]); + +/************************************************************/ +/* Module 8. Calculate Integral of sin(x)*cos(x)*cos(x) */ +/* from 0 to PI/3 using the Trapazoidal Method. */ +/* Result is (1-cos(PI/3)^3)/3. There are 30 */ +/* double precision operations per loop included */ +/* in the timing: */ +/* 13 +, 0 -, 17 * 0 / */ +/* 46.7% +, 00.0% -, 53.3% *, and 00.0% / */ +/************************************************************/ + + x = piref / ( three * (double)m ); /*********************/ + s = 0.0; /* Loop 9. */ + v = 0.0; /*********************/ + + dtime(TimeArray); + for( i = 1 ; i <= m-1 ; i++ ) + { + u = (double)i * x; + w = u * u; + v = w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one; + s = s + v*v*u*((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+one); + } + dtime(TimeArray); + T[24] = T[1] * TimeArray[1] - nulltime; + + u = piref / three; + w = u * u; + sa = u*((((((A6*w+A5)*w+A4)*w+A3)*w+A2)*w+A1)*w+one); + sb = w*(w*(w*(w*(w*(B6*w+B5)+B4)+B3)+B2)+B1)+one; + sa = sa * sb * sb; + + T[25] = T[24] / 30.0; /*******************/ + sa = x * ( sa + two * s ) / two; /* Module 8 Result */ + sb = 0.29166666666666667; /*******************/ + sc = sa - sb; + T[26] = one / T[25]; + /*********************/ + /* DO NOT REMOVE */ + /* THIS PRINTOUT! */ + /*********************/ + printf(" 8 %13.4le %10.4lf %10.4lf\n",sc,T[24],T[26]); + +/**************************************************/ +/* MFLOPS(1) output. This is the same weighting */ +/* used for all previous versions of the flops.c */ +/* program. Includes Modules 2 and 3 only. */ +/**************************************************/ + T[27] = ( five * (T[6] - T[5]) + T[9] ) / 52.0; + T[28] = one / T[27]; + +/**************************************************/ +/* MFLOPS(2) output. This output does not include */ +/* Module 2, but it still does 9.2% FDIV's. */ +/**************************************************/ + T[29] = T[2] + T[9] + T[12] + T[15] + T[18]; + T[29] = (T[29] + four * T[21]) / 152.0; + T[30] = one / T[29]; + +/**************************************************/ +/* MFLOPS(3) output. This output does not include */ +/* Module 2, but it still does 3.4% FDIV's. */ +/**************************************************/ + T[31] = T[2] + T[9] + T[12] + T[15] + T[18]; + T[31] = (T[31] + T[21] + T[24]) / 146.0; + T[32] = one / T[31]; + +/**************************************************/ +/* MFLOPS(4) output. This output does not include */ +/* Module 2, and it does NO FDIV's. */ +/**************************************************/ + T[33] = (T[9] + T[12] + T[18] + T[24]) / 91.0; + T[34] = one / T[33]; + + + printf("\n"); + printf(" Iterations = %10ld\n",m); + printf(" NullTime (usec) = %10.4lf\n",nulltime); + printf(" MFLOPS(1) = %10.4lf\n",T[28]); + printf(" MFLOPS(2) = %10.4lf\n",T[30]); + printf(" MFLOPS(3) = %10.4lf\n",T[32]); + printf(" MFLOPS(4) = %10.4lf\n\n",T[34]); + return 0; +} + +/*****************************************************/ +/* Various timer routines. */ +/* Al Aburto, aburto@nosc.mil, 18 Feb 1997 */ +/* */ +/* dtime(p) outputs the elapsed time seconds in p[1] */ +/* from a call of dtime(p) to the next call of */ +/* dtime(p). Use CAUTION as some of these routines */ +/* will mess up when timing across the hour mark!!! */ +/* */ +/* For timing I use the 'user' time whenever */ +/* possible. Using 'user+sys' time is a separate */ +/* issue. */ +/* */ +/* Example Usage: */ +/* [Timer options added here] */ +/* double RunTime, TimeArray[3]; */ +/* main() */ +/* { */ +/* dtime(TimeArray); */ +/* [routine to time] */ +/* dtime(TimeArray); */ +/* RunTime = TimeArray[1]; */ +/* } */ +/* [Timer code added here] */ +/*****************************************************/ + +/******************************/ +/* Timer code. */ +/******************************/ + +/*******************/ +/* Amiga dtime() */ +/*******************/ +#ifdef Amiga +#include +#define HZ 50 + +dtime(p) +double p[]; +{ + double q; + + struct tt { + long days; + long minutes; + long ticks; + } tt; + + q = p[2]; + + DateStamp(&tt); + + p[2] = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)) ) / (double)HZ; + p[1] = p[2] - q; + + return 0; +} +#endif + +/*****************************************************/ +/* UNIX dtime(). This is the preferred UNIX timer. */ +/* Provided by: Markku Kolkka, mk59200@cc.tut.fi */ +/* HP-UX Addition by: Bo Thide', bt@irfu.se */ +/*****************************************************/ +#ifdef UNIX +#include +#include + +#ifdef hpux +#include +#define getrusage(a,b) syscall(SYS_getrusage,a,b) +#endif + +struct rusage rusage; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + getrusage(RUSAGE_SELF,&rusage); + + p[2] = (double)(rusage.ru_utime.tv_sec); + p[2] = p[2] + (double)(rusage.ru_utime.tv_usec) * 1.0e-06; + p[1] = p[2] - q; + + return 0; +} +#endif + +/***************************************************/ +/* UNIX_Old dtime(). This is the old UNIX timer. */ +/* Use only if absolutely necessary as HZ may be */ +/* ill defined on your system. */ +/***************************************************/ +#ifdef UNIX_Old +#include +#include +#include + +#ifndef HZ +#define HZ 60 +#endif + +struct tms tms; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + times(&tms); + + p[2] = (double)(tms.tms_utime) / (double)HZ; + p[1] = p[2] - q; + + return 0; +} +#endif + +/*********************************************************/ +/* VMS dtime() for VMS systems. */ +/* Provided by: RAMO@uvphys.phys.UVic.CA */ +/* Some people have run into problems with this timer. */ +/*********************************************************/ +#ifdef VMS +#include time + +#ifndef HZ +#define HZ 100 +#endif + +struct tbuffer_t + { + int proc_user_time; + int proc_system_time; + int child_user_time; + int child_system_time; + }; + +struct tbuffer_t tms; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + times(&tms); + + p[2] = (double)(tms.proc_user_time) / (double)HZ; + p[1] = p[2] - q; + + return 0; +} +#endif + +/******************************/ +/* BORLAND C dtime() for DOS */ +/******************************/ +#ifdef BORLAND_C +#include +#include +#include + +#define HZ 100 +struct time tnow; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + gettime(&tnow); + + p[2] = 60.0 * (double)(tnow.ti_min); + p[2] = p[2] + (double)(tnow.ti_sec); + p[2] = p[2] + (double)(tnow.ti_hund)/(double)HZ; + p[1] = p[2] - q; + + return 0; +} +#endif + +/**************************************/ +/* Microsoft C (MSC) dtime() for DOS */ +/**************************************/ +#ifdef MSC +#include +#include + +#define HZ CLOCKS_PER_SEC +clock_t tnow; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + tnow = clock(); + + p[2] = (double)tnow / (double)HZ; + p[1] = p[2] - q; + + return 0; +} +#endif + +/*************************************/ +/* Macintosh (MAC) Think C dtime() */ +/*************************************/ +#ifdef MAC +#include + +#define HZ 60 + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + p[2] = (double)clock() / (double)HZ; + p[1] = p[2] - q; + + return 0; +} +#endif + +/************************************************************/ +/* iPSC/860 (IPSC) dtime() for i860. */ +/* Provided by: Dan Yergeau, yergeau@gloworm.Stanford.EDU */ +/************************************************************/ +#ifdef IPSC +extern double dclock(); + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + p[2] = dclock(); + p[1] = p[2] - q; + + return 0; +} +#endif + +/**************************************************/ +/* FORTRAN dtime() for Cray type systems. */ +/* This is the preferred timer for Cray systems. */ +/**************************************************/ +#ifdef FORTRAN_SEC + +fortran double second(); + +dtime(p) +double p[]; +{ + double q,v; + + q = p[2]; + + second(&v); + p[2] = v; + p[1] = p[2] - q; + + return 0; +} +#endif + +/***********************************************************/ +/* UNICOS C dtime() for Cray UNICOS systems. Don't use */ +/* unless absolutely necessary as returned time includes */ +/* 'user+system' time. Provided by: R. Mike Dority, */ +/* dority@craysea.cray.com */ +/***********************************************************/ +#ifdef CTimer +#include + +dtime(p) +double p[]; +{ + double q; + clock_t clock(void); + + q = p[2]; + + p[2] = (double)clock() / (double)CLOCKS_PER_SEC; + p[1] = p[2] - q; + + return 0; +} +#endif + +/********************************************/ +/* Another UNIX timer using gettimeofday(). */ +/* However, getrusage() is preferred. */ +/********************************************/ +#ifdef GTODay +#include + +struct timeval tnow; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + gettimeofday(&tnow,NULL); + p[2] = (double)tnow.tv_sec + (double)tnow.tv_usec * 1.0e-6; + p[1] = p[2] - q; + + return 0; +} +#endif + +/*****************************************************/ +/* Fujitsu UXP/M timer. */ +/* Provided by: Mathew Lim, ANUSF, M.Lim@anu.edu.au */ +/*****************************************************/ +#ifdef UXPM +#include +#include +struct tmsu rusage; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + timesu(&rusage); + + p[2] = (double)(rusage.tms_utime) * 1.0e-06; + p[1] = p[2] - q; + + return 0; +} +#endif + +/**********************************************/ +/* Macintosh (MAC_TMgr) Think C dtime() */ +/* requires Think C Language Extensions or */ +/* #include in the prefix */ +/* provided by Francis H Schiffer 3rd (fhs) */ +/* skipschiffer@genie.geis.com */ +/**********************************************/ +#ifdef MAC_TMgr +#include +#include + +static TMTask mgrTimer; +static Boolean mgrInited = FALSE; +static double mgrClock; + +#define RMV_TIMER RmvTime( (QElemPtr)&mgrTimer ) +#define MAX_TIME 1800000000L +/* MAX_TIME limits time between calls to */ +/* dtime( ) to no more than 30 minutes */ +/* this limitation could be removed by */ +/* creating a completion routine to sum */ +/* 30 minute segments (fhs 1994 feb 9) */ + +static void Remove_timer( ) +{ + RMV_TIMER; + mgrInited = FALSE; +} + +int dtime( p ) +double p[]; +{ + if ( mgrInited ) { + RMV_TIMER; + mgrClock += (MAX_TIME + mgrTimer.tmCount)*1.0e-6; + } else { + if ( _atexit( &Remove_timer ) == 0 ) mgrInited = TRUE; + mgrClock = 0.0; + } + + p[1] = mgrClock - p[2]; + p[2] = mgrClock; + if ( mgrInited ) { + mgrTimer.tmAddr = NULL; + mgrTimer.tmCount = 0; + mgrTimer.tmWakeUp = 0; + mgrTimer.tmReserved = 0; + InsTime( (QElemPtr)&mgrTimer ); + PrimeTime( (QElemPtr)&mgrTimer, -MAX_TIME ); + } + return( 0 ); +} +#endif + +/***********************************************************/ +/* Parsytec GCel timer. */ +/* Provided by: Georg Wambach, gw@informatik.uni-koeln.de */ +/***********************************************************/ +#ifdef PARIX +#include + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + p[2] = (double) (TimeNowHigh()) / (double) CLK_TCK_HIGH; + p[1] = p[2] - q; + + return 0; +} +#endif + +/************************************************/ +/* Sun Solaris POSIX dtime() routine */ +/* Provided by: Case Larsen, CTLarsen@lbl.gov */ +/************************************************/ +#ifdef POSIX +#include +#include +#include + +#ifdef __hpux +#include +#define getrusage(a,b) syscall(SYS_getrusage,a,b) +#endif + +struct rusage rusage; + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + getrusage(RUSAGE_SELF,&rusage); + + p[2] = (double)(rusage.ru_utime.tv_sec); + p[2] = p[2] + (double)(rusage.ru_utime.tv_nsec) * 1.0e-09; + p[1] = p[2] - q; + + return 0; +} +#endif + +/****************************************************/ +/* Windows NT (32 bit) dtime() routine */ +/* Provided by: Piers Haken, piersh@microsoft.com */ +/****************************************************/ +#ifdef WIN32 +#include + +dtime(p) +double p[]; +{ + double q; + + q = p[2]; + + p[2] = (double)GetTickCount() * 1.0e-03; + p[1] = p[2] - q; + + return 0; +} +#endif + +/*****************************************************/ +/* Time according to POSIX.1 - */ +/* Ref: "POSIX Programmer's Guide" O'Reilly & Assoc.*/ +/*****************************************************/ +#ifdef POSIX1 +#define _POSIX_SOURCE 1 +#include +#include +#include + +struct tms tms; + +dtime(p) +double p[]; +{ + double q; + times(&tms); + q = p[2]; + p[2] = (double)tms.tms_utime / (double)CLK_TCK; + p[1] = p[2] - q; + return 0; +} +#endif + +/*------ End flops.c code, say good night Jan! (Sep 1992) ------*/ diff --git a/sheet3/1/flops.c:Zone.Identifier b/sheet3/1/flops.c:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/sheet3/1/mysecond.c b/sheet3/1/mysecond.c new file mode 100644 index 0000000..d206a4a --- /dev/null +++ b/sheet3/1/mysecond.c @@ -0,0 +1,27 @@ +/* A gettimeofday routine to give access to the wall + clock timer on most UNIX-like systems. + + This version defines two entry points -- with + and without appended underscores, so it *should* + automagically link with FORTRAN */ + +#include + +double mysecond() +{ +/* struct timeval { long tv_sec; + long tv_usec; }; + +struct timezone { int tz_minuteswest; + int tz_dsttime; }; */ + + struct timeval tp; + struct timezone tzp; + int i; + + i = gettimeofday(&tp,&tzp); + return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 ); +} + +double mysecond_() {return mysecond();} + diff --git a/sheet3/1/mysecond.c:Zone.Identifier b/sheet3/1/mysecond.c:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/sheet3/1/output_pc1.txt b/sheet3/1/output_pc1.txt new file mode 100644 index 0000000..487d1f9 --- /dev/null +++ b/sheet3/1/output_pc1.txt @@ -0,0 +1,60 @@ +rm -f *.exe *.o +gcc -O3 -c -o mysecond.o mysecond.c +gcc -O3 -c mysecond.c +gfortran -O3 -DSTREAM_ARRAY_SIZE=80000000 -DNTIMES=20 -c stream.f +gfortran -O3 stream.o mysecond.o -o stream_f.exe +gcc -O3 -DSTREAM_ARRAY_SIZE=80000000 -DNTIMES=20 stream.c -o stream_c.exe +gcc -O3 -DUNIX flops.c -o flops.exe +./stream_c.exe +------------------------------------------------------------- +STREAM version $Revision: 5.10 $ +------------------------------------------------------------- +This system uses 8 bytes per array element. +------------------------------------------------------------- +Array size = 80000000 (elements), Offset = 0 (elements) +Memory per array = 610.4 MiB (= 0.6 GiB). +Total memory required = 1831.1 MiB (= 1.8 GiB). +Each kernel will be executed 20 times. + The *best* time for each kernel (excluding the first iteration) + 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) +Increase the size of the arrays if this shows that +you are not getting at least 20 clock ticks per test. +------------------------------------------------------------- +WARNING -- The above is only a rough guideline. +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 +------------------------------------------------------------- +Solution Validates: avg error less than 1.000000e-13 on all three arrays +------------------------------------------------------------- +./flops.exe + + FLOPS C Program (Double Precision), V2.0 18 Dec 1992 + + 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 + + Iterations = 512000000 + NullTime (usec) = 0.0000 + MFLOPS(1) = 9507.3864 + MFLOPS(2) = 5042.7572 + MFLOPS(3) = 5597.4972 + MFLOPS(4) = 5766.1547 + diff --git a/sheet3/1/stream.c b/sheet3/1/stream.c new file mode 100644 index 0000000..b9a2cee --- /dev/null +++ b/sheet3/1/stream.c @@ -0,0 +1,585 @@ +/*-----------------------------------------------------------------------*/ +/* Program: STREAM */ +/* Revision: $Id: stream.c,v 5.10 2013/01/17 16:01:06 mccalpin Exp mccalpin $ */ +/* Original code developed by John D. McCalpin */ +/* Programmers: John D. McCalpin */ +/* Joe R. Zagar */ +/* */ +/* This program measures memory transfer rates in MB/s for simple */ +/* computational kernels coded in C. */ +/*-----------------------------------------------------------------------*/ +/* Copyright 1991-2013: John D. McCalpin */ +/*-----------------------------------------------------------------------*/ +/* License: */ +/* 1. You are free to use this program and/or to redistribute */ +/* this program. */ +/* 2. You are free to modify this program for your own use, */ +/* including commercial use, subject to the publication */ +/* restrictions in item 3. */ +/* 3. You are free to publish results obtained from running this */ +/* program, or from works that you derive from this program, */ +/* with the following limitations: */ +/* 3a. In order to be referred to as "STREAM benchmark results", */ +/* published results must be in conformance to the STREAM */ +/* Run Rules, (briefly reviewed below) published at */ +/* http://www.cs.virginia.edu/stream/ref.html */ +/* and incorporated herein by reference. */ +/* As the copyright holder, John McCalpin retains the */ +/* right to determine conformity with the Run Rules. */ +/* 3b. Results based on modified source code or on runs not in */ +/* accordance with the STREAM Run Rules must be clearly */ +/* labelled whenever they are published. Examples of */ +/* proper labelling include: */ +/* "tuned STREAM benchmark results" */ +/* "based on a variant of the STREAM benchmark code" */ +/* Other comparable, clear, and reasonable labelling is */ +/* acceptable. */ +/* 3c. Submission of results to the STREAM benchmark web site */ +/* is encouraged, but not required. */ +/* 4. Use of this program or creation of derived works based on this */ +/* program constitutes acceptance of these licensing restrictions. */ +/* 5. Absolutely no warranty is expressed or implied. */ +/*-----------------------------------------------------------------------*/ +# include +# include +# include +# include +# include +# include + +/*----------------------------------------------------------------------- + * INSTRUCTIONS: + * + * 1) STREAM requires different amounts of memory to run on different + * systems, depending on both the system cache size(s) and the + * granularity of the system timer. + * You should adjust the value of 'STREAM_ARRAY_SIZE' (below) + * to meet *both* of the following criteria: + * (a) Each array must be at least 4 times the size of the + * available cache memory. I don't worry about the difference + * between 10^6 and 2^20, so in practice the minimum array size + * is about 3.8 times the cache size. + * Example 1: One Xeon E3 with 8 MB L3 cache + * STREAM_ARRAY_SIZE should be >= 4 million, giving + * an array size of 30.5 MB and a total memory requirement + * of 91.5 MB. + * Example 2: Two Xeon E5's with 20 MB L3 cache each (using OpenMP) + * STREAM_ARRAY_SIZE should be >= 20 million, giving + * an array size of 153 MB and a total memory requirement + * of 458 MB. + * (b) The size should be large enough so that the 'timing calibration' + * output by the program is at least 20 clock-ticks. + * Example: most versions of Windows have a 10 millisecond timer + * granularity. 20 "ticks" at 10 ms/tic is 200 milliseconds. + * If the chip is capable of 10 GB/s, it moves 2 GB in 200 msec. + * This means the each array must be at least 1 GB, or 128M elements. + * + * Version 5.10 increases the default array size from 2 million + * elements to 10 million elements in response to the increasing + * size of L3 caches. The new default size is large enough for caches + * up to 20 MB. + * Version 5.10 changes the loop index variables from "register int" + * to "ssize_t", which allows array indices >2^32 (4 billion) + * on properly configured 64-bit systems. Additional compiler options + * (such as "-mcmodel=medium") may be required for large memory runs. + * + * Array size can be set at compile time without modifying the source + * code for the (many) compilers that support preprocessor definitions + * on the compile line. E.g., + * gcc -O -DSTREAM_ARRAY_SIZE=100000000 stream.c -o stream.100M + * will override the default size of 10M with a new size of 100M elements + * per array. + */ +#ifndef STREAM_ARRAY_SIZE +# define STREAM_ARRAY_SIZE 10000000 +#endif + +/* 2) STREAM runs each kernel "NTIMES" times and reports the *best* result + * for any iteration after the first, therefore the minimum value + * for NTIMES is 2. + * There are no rules on maximum allowable values for NTIMES, but + * values larger than the default are unlikely to noticeably + * increase the reported performance. + * NTIMES can also be set on the compile line without changing the source + * code using, for example, "-DNTIMES=7". + */ +#ifdef NTIMES +#if NTIMES<=1 +# define NTIMES 10 +#endif +#endif +#ifndef NTIMES +# define NTIMES 10 +#endif + +/* Users are allowed to modify the "OFFSET" variable, which *may* change the + * relative alignment of the arrays (though compilers may change the + * effective offset by making the arrays non-contiguous on some systems). + * Use of non-zero values for OFFSET can be especially helpful if the + * STREAM_ARRAY_SIZE is set to a value close to a large power of 2. + * OFFSET can also be set on the compile line without changing the source + * code using, for example, "-DOFFSET=56". + */ +#ifndef OFFSET +# define OFFSET 0 +#endif + +/* + * 3) Compile the code with optimization. Many compilers generate + * unreasonably bad code before the optimizer tightens things up. + * If the results are unreasonably good, on the other hand, the + * optimizer might be too smart for me! + * + * For a simple single-core version, try compiling with: + * cc -O stream.c -o stream + * This is known to work on many, many systems.... + * + * To use multiple cores, you need to tell the compiler to obey the OpenMP + * directives in the code. This varies by compiler, but a common example is + * gcc -O -fopenmp stream.c -o stream_omp + * The environment variable OMP_NUM_THREADS allows runtime control of the + * number of threads/cores used when the resulting "stream_omp" program + * is executed. + * + * To run with single-precision variables and arithmetic, simply add + * -DSTREAM_TYPE=float + * to the compile line. + * Note that this changes the minimum array sizes required --- see (1) above. + * + * The preprocessor directive "TUNED" does not do much -- it simply causes the + * code to call separate functions to execute each kernel. Trivial versions + * of these functions are provided, but they are *not* tuned -- they just + * provide predefined interfaces to be replaced with tuned code. + * + * + * 4) Optional: Mail the results to mccalpin@cs.virginia.edu + * Be sure to include info that will help me understand: + * a) the computer hardware configuration (e.g., processor model, memory type) + * b) the compiler name/version and compilation flags + * c) any run-time information (such as OMP_NUM_THREADS) + * d) all of the output from the test case. + * + * Thanks! + * + *-----------------------------------------------------------------------*/ + +# define HLINE "-------------------------------------------------------------\n" + +# ifndef MIN +# define MIN(x,y) ((x)<(y)?(x):(y)) +# endif +# ifndef MAX +# define MAX(x,y) ((x)>(y)?(x):(y)) +# endif + +#ifndef STREAM_TYPE +#define STREAM_TYPE double +#endif + +static STREAM_TYPE a[STREAM_ARRAY_SIZE+OFFSET], + b[STREAM_ARRAY_SIZE+OFFSET], + c[STREAM_ARRAY_SIZE+OFFSET]; + +static double avgtime[4] = {0}, maxtime[4] = {0}, + mintime[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX}; + +static char *label[4] = {"Copy: ", "Scale: ", + "Add: ", "Triad: "}; + +static double bytes[4] = { + 2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE, + 2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE, + 3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE, + 3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE + }; + +extern double mysecond(); +extern void checkSTREAMresults(); +#ifdef TUNED +extern void tuned_STREAM_Copy(); +extern void tuned_STREAM_Scale(STREAM_TYPE scalar); +extern void tuned_STREAM_Add(); +extern void tuned_STREAM_Triad(STREAM_TYPE scalar); +#endif +#ifdef _OPENMP +extern int omp_get_num_threads(); +#endif +int +main() + { + int quantum, checktick(); + int BytesPerWord; + int k; + ssize_t j; + STREAM_TYPE scalar; + double t, times[4][NTIMES]; + + /* --- SETUP --- determine precision and check timing --- */ + + printf(HLINE); + printf("STREAM version $Revision: 5.10 $\n"); + printf(HLINE); + BytesPerWord = sizeof(STREAM_TYPE); + printf("This system uses %d bytes per array element.\n", + BytesPerWord); + + printf(HLINE); +#ifdef N + printf("***** WARNING: ******\n"); + printf(" It appears that you set the preprocessor variable N when compiling this code.\n"); + printf(" This version of the code uses the preprocesor variable STREAM_ARRAY_SIZE to control the array size\n"); + printf(" Reverting to default value of STREAM_ARRAY_SIZE=%llu\n",(unsigned long long) STREAM_ARRAY_SIZE); + printf("***** WARNING: ******\n"); +#endif + + printf("Array size = %llu (elements), Offset = %d (elements)\n" , (unsigned long long) STREAM_ARRAY_SIZE, OFFSET); + printf("Memory per array = %.1f MiB (= %.1f GiB).\n", + BytesPerWord * ( (double) STREAM_ARRAY_SIZE / 1024.0/1024.0), + BytesPerWord * ( (double) STREAM_ARRAY_SIZE / 1024.0/1024.0/1024.0)); + printf("Total memory required = %.1f MiB (= %.1f GiB).\n", + (3.0 * BytesPerWord) * ( (double) STREAM_ARRAY_SIZE / 1024.0/1024.), + (3.0 * BytesPerWord) * ( (double) STREAM_ARRAY_SIZE / 1024.0/1024./1024.)); + printf("Each kernel will be executed %d times.\n", NTIMES); + printf(" The *best* time for each kernel (excluding the first iteration)\n"); + printf(" will be used to compute the reported bandwidth.\n"); + +#ifdef _OPENMP + printf(HLINE); +#pragma omp parallel + { +#pragma omp master + { + k = omp_get_num_threads(); + printf ("Number of Threads requested = %i\n",k); + } + } +#endif + +#ifdef _OPENMP + k = 0; +#pragma omp parallel +#pragma omp atomic + k++; + printf ("Number of Threads counted = %i\n",k); +#endif + + /* Get initial value for system clock. */ +#pragma omp parallel for + for (j=0; j= 1) + printf("Your clock granularity/precision appears to be " + "%d microseconds.\n", quantum); + else { + printf("Your clock granularity appears to be " + "less than one microsecond.\n"); + quantum = 1; + } + + t = mysecond(); +#pragma omp parallel for + for (j = 0; j < STREAM_ARRAY_SIZE; j++) + a[j] = 2.0E0 * a[j]; + t = 1.0E6 * (mysecond() - t); + + printf("Each test below will take on the order" + " of %d microseconds.\n", (int) t ); + printf(" (= %d clock ticks)\n", (int) (t/quantum) ); + printf("Increase the size of the arrays if this shows that\n"); + printf("you are not getting at least 20 clock ticks per test.\n"); + + printf(HLINE); + + printf("WARNING -- The above is only a rough guideline.\n"); + printf("For best results, please be sure you know the\n"); + printf("precision of your system timer.\n"); + printf(HLINE); + + /* --- MAIN LOOP --- repeat test cases NTIMES times --- */ + + scalar = 3.0; + for (k=0; k + +double mysecond() +{ + struct timeval tp; + struct timezone tzp; + int i; + + i = gettimeofday(&tp,&tzp); + return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 ); +} + +#ifndef abs +#define abs(a) ((a) >= 0 ? (a) : -(a)) +#endif +void checkSTREAMresults () +{ + STREAM_TYPE aj,bj,cj,scalar; + STREAM_TYPE aSumErr,bSumErr,cSumErr; + STREAM_TYPE aAvgErr,bAvgErr,cAvgErr; + double epsilon; + ssize_t j; + int k,ierr,err; + + /* reproduce initialization */ + aj = 1.0; + bj = 2.0; + cj = 0.0; + /* a[] is modified during timing check */ + aj = 2.0E0 * aj; + /* now execute timing loop */ + scalar = 3.0; + for (k=0; k epsilon) { + err++; + printf ("Failed Validation on array a[], AvgRelAbsErr > epsilon (%e)\n",epsilon); + printf (" Expected Value: %e, AvgAbsErr: %e, AvgRelAbsErr: %e\n",aj,aAvgErr,abs(aAvgErr)/aj); + ierr = 0; + for (j=0; j epsilon) { + ierr++; +#ifdef VERBOSE + if (ierr < 10) { + printf(" array a: index: %ld, expected: %e, observed: %e, relative error: %e\n", + j,aj,a[j],abs((aj-a[j])/aAvgErr)); + } +#endif + } + } + printf(" For array a[], %d errors were found.\n",ierr); + } + if (abs(bAvgErr/bj) > epsilon) { + err++; + printf ("Failed Validation on array b[], AvgRelAbsErr > epsilon (%e)\n",epsilon); + printf (" Expected Value: %e, AvgAbsErr: %e, AvgRelAbsErr: %e\n",bj,bAvgErr,abs(bAvgErr)/bj); + printf (" AvgRelAbsErr > Epsilon (%e)\n",epsilon); + ierr = 0; + for (j=0; j epsilon) { + ierr++; +#ifdef VERBOSE + if (ierr < 10) { + printf(" array b: index: %ld, expected: %e, observed: %e, relative error: %e\n", + j,bj,b[j],abs((bj-b[j])/bAvgErr)); + } +#endif + } + } + printf(" For array b[], %d errors were found.\n",ierr); + } + if (abs(cAvgErr/cj) > epsilon) { + err++; + printf ("Failed Validation on array c[], AvgRelAbsErr > epsilon (%e)\n",epsilon); + printf (" Expected Value: %e, AvgAbsErr: %e, AvgRelAbsErr: %e\n",cj,cAvgErr,abs(cAvgErr)/cj); + printf (" AvgRelAbsErr > Epsilon (%e)\n",epsilon); + ierr = 0; + for (j=0; j epsilon) { + ierr++; +#ifdef VERBOSE + if (ierr < 10) { + printf(" array c: index: %ld, expected: %e, observed: %e, relative error: %e\n", + j,cj,c[j],abs((cj-c[j])/cAvgErr)); + } +#endif + } + } + printf(" For array c[], %d errors were found.\n",ierr); + } + if (err == 0) { + printf ("Solution Validates: avg error less than %e on all three arrays\n",epsilon); + } +#ifdef VERBOSE + printf ("Results Validation Verbose Results: \n"); + printf (" Expected a(1), b(1), c(1): %f %f %f \n",aj,bj,cj); + printf (" Observed a(1), b(1), c(1): %f %f %f \n",a[1],b[1],c[1]); + printf (" Rel Errors on a, b, c: %e %e %e \n",abs(aAvgErr/aj),abs(bAvgErr/bj),abs(cAvgErr/cj)); +#endif +} + +#ifdef TUNED +/* stubs for "tuned" versions of the kernels */ +void tuned_STREAM_Copy() +{ + ssize_t j; +#pragma omp parallel for + for (j=0; j2*N +B) M times skalar prod => 2*M*N +C) (Matrix vector product of M*L Matrix with an L Vector) N times => 2*M*N*L +D) N times(p times * and p times +/- [with Horner's method]) => 2*N*p + +Number of Read/Write operations +A) Read: 2*N Write: 1 +B) Read: 2*M*N Write: M +C) Read: 2*M*N*L Write: M*N +D) Read: N*p Write: N diff --git a/sheet3/345/.vscode/settings.json b/sheet3/345/.vscode/settings.json new file mode 100644 index 0000000..48bd760 --- /dev/null +++ b/sheet3/345/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "ostream": "cpp", + "iostream": "cpp" + } +} \ No newline at end of file diff --git a/sheet3/345/Doxyfile b/sheet3/345/Doxyfile new file mode 100644 index 0000000..58d8e68 --- /dev/null +++ b/sheet3/345/Doxyfile @@ -0,0 +1,2563 @@ +# Doxyfile 1.8.20 + +# 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 (\" \"). + +#--------------------------------------------------------------------------- +# 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 = Skalar_seq_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 = + +# 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 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. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# 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, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, 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 + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# 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:\n" +# 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:". You can 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++, 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. + +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 + +# 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 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 efficively 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 + +#--------------------------------------------------------------------------- +# 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 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 +# 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 + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# (including Cygwin) and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +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_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. +# +# 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 not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = 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 or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# 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) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# 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). + +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. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# 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. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.doc (to be provided as doxygen C comment), *.txt (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, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */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 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 = + +#--------------------------------------------------------------------------- +# 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, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = YES + +# 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 + +#--------------------------------------------------------------------------- +# 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 COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. 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. +# 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). 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_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 colorwheel, 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 grayscales 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_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# 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 + +# 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 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 +# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# 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 + +# 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 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. 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 + +# 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 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 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# 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 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) 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: https://cdn.jsdelivr.net/npm/mathjax@2. +# 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 +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# 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/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 +# , /