1 /*----------------------------------------------------------------------------
2  ADOL-C -- Automatic Differentiation by Overloading in C++
3  File:     taping.h
4  Revision: $Id: taping.h 764 2019-01-30 14:44:40Z mbanovic $
5  Contents: all C functions directly accessing at least one of the four tapes
6            (operations, locations, constants, value stack)
7 
8  Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
9                Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
10 
11  This file is part of ADOL-C. This software is provided as open source.
12  Any use, reproduction, or distribution of the software constitutes
13  recipient's acceptance of the terms of the accompanying license file.
14 
15 ----------------------------------------------------------------------------*/
16 #if !defined(ADOLC_TAPING_H)
17 #define ADOLC_TAPING_H 1
18 
19 #include <adolc/internal/common.h>
20 
21 BEGIN_C_DECLS
22 
23 enum StatEntries {
24     NUM_INDEPENDENTS,                          /* # of independent variables */
25     NUM_DEPENDENTS,                              /* # of dependent variables */
26     NUM_MAX_LIVES,                                /* max # of live variables */
27     TAY_STACK_SIZE,               /* # of values in the taylor (value) stack */
28     OP_BUFFER_SIZE,   /* # of operations per buffer == OBUFSIZE (usrparms.h) */
29     NUM_OPERATIONS,                               /* overall # of operations */
30     OP_FILE_ACCESS,                        /* operations file written or not */
31     NUM_LOCATIONS,                                 /* overall # of locations */
32     LOC_FILE_ACCESS,                        /* locations file written or not */
33     NUM_VALUES,                                       /* overall # of values */
34     VAL_FILE_ACCESS,                           /* values file written or not */
35     LOC_BUFFER_SIZE,   /* # of locations per buffer == LBUFSIZE (usrparms.h) */
36     VAL_BUFFER_SIZE,      /* # of values per buffer == CBUFSIZE (usrparms.h) */
37     TAY_BUFFER_SIZE,     /* # of taylors per buffer <= TBUFSIZE (usrparms.h) */
38     NUM_EQ_PROD,                      /* # of eq_*_prod for sparsity pattern */
39     NO_MIN_MAX,  /* no use of min_op, deferred to abs_op for piecewise stuff */
40     NUM_SWITCHES,                   /* # of abs calls that can switch branch */
41     NUM_PARAM, /* no of parameters (doubles) interchangable without retaping */
42     STAT_SIZE                     /* represents the size of the stats vector */
43 };
44 
45 enum TapeRemovalType {
46     ADOLC_REMOVE_FROM_CORE,
47     ADOLC_REMOVE_COMPLETELY
48 };
49 
50 enum LocationMgrType {
51     ADOLC_LOCATION_BLOCKS,     /* can allocate contiguous location blocks */
52     ADOLC_LOCATION_SINGLETONS  /* only singleton locations, no blocks */
53 };
54 
55 ADOLC_DLL_EXPORT void skip_tracefile_cleanup(short tnum);
56 
57 /* Returns statistics on the tape "tag". Use enumeration StatEntries for
58  * accessing the individual elements of the vector "tape_stats"! */
59 ADOLC_DLL_EXPORT void tapestats(short tag, size_t *tape_stats);
60 
61 ADOLC_DLL_EXPORT void set_nested_ctx(short tag, char nested);
62 
63 ADOLC_DLL_EXPORT char currently_nested(short tag);
64 /* An all-in-one tape stats printing routine */
65 ADOLC_DLL_EXPORT void printTapeStats(FILE *stream, short tag);
66 
67 ADOLC_DLL_EXPORT void cleanUp();
68 
69 ADOLC_DLL_EXPORT int removeTape(short tapeID, short type);
70 
71 ADOLC_DLL_EXPORT void enableBranchSwitchWarnings();
72 ADOLC_DLL_EXPORT void disableBranchSwitchWarnings();
73 
74 ADOLC_DLL_EXPORT void enableMinMaxUsingAbs();
75 ADOLC_DLL_EXPORT void disableMinMaxUsingAbs();
76 /*
77  * free location block sorting/consolidation upon calls to ensureContiguousLocations
78  * happens when  the ratio between allocated and used locations exceeds gcTriggerRatio or
79  * the allocated locations exceed gcTriggerMaxSize
80  */
81 ADOLC_DLL_EXPORT void setStoreManagerType(unsigned char loctypes);
82 
83 ADOLC_DLL_EXPORT void setStoreManagerControl(double gcTriggerRatio, size_t gcTriggerMaxSize);
84 
85 END_C_DECLS
86 
87 /**
88  * Normally, theKeeper would take care of the initialization and finalization
89  * of ADOL-C. However, some compilers do not include the keeper code when
90  * linking. "initADOLC" should be called right after main(...), in this case.
91  * "initADOLC" will not initialize memory, but is only necessary to reference
92  * "theKeeper", such that this static instance is used at least once. :-(
93  */
94 ADOLC_DLL_EXPORT void initADOLC();
95 
96 #if defined(__cplusplus)
97 
98 /* Initialization for the taping process. Creates buffers for this tape, sets
99  * files names, and calls appropriate setup routines.
100  * This functions return value is different from zero if a tape with with ID
101  * tnum is available only in core. The old tape gets overwritten by the new
102  * one in this case. */
103 ADOLC_DLL_EXPORT int trace_on(short tnum, int keepTaylors = 0);
104 
105 /* special version including buffersize customization
106  *      obs - size of the operation buffer (number of elements)
107  *      lbs - size of the location buffer (number of elements)
108  *      vbs - size of the value buffer (number of elements)
109  *      tbs - size of the taylor buffer (number of elements)
110  * trace_on is the last point in time we want to allow the change of buffer
111  * sizes for a given tape */
112 ADOLC_DLL_EXPORT int trace_on(short tnum, int keepTaylors,
113         uint obs, uint lbs, uint vbs, uint tbs, int skipFileCleanup=0);
114 
115 /* Stop Tracing. Cleans up, and turns off trace_flag. Flag not equal zero
116  * enforces writing of the three main tape files (op+loc+val). */
117 ADOLC_DLL_EXPORT void trace_off(int flag = 0);
118 
119 ADOLC_DLL_EXPORT bool isTaping();
120 
121 #include <vector>
122 ADOLC_DLL_EXPORT void cachedTraceTags(std::vector<short>& result);
123 
124 #endif
125 
126 #endif /* ADOLC_TAPING_H */
127