1 /*
2 
3 HyPhy - Hypothesis Testing Using Phylogenies.
4 
5 Copyright (C) 1997-now
6 Core Developers:
7   Sergei L Kosakovsky Pond (sergeilkp@mac.com)
8   Art FY Poon    (apoon42@uwo.ca)
9   Steven Weaver (sweaver@temple.edu)
10 
11 Module Developers:
12 	Lance Hepler (nlhepler@gmail.com)
13 	Martin Smith (martin.audacis@gmail.com)
14 
15 Significant contributions from:
16   Spencer V Muse (muse@stat.ncsu.edu)
17   Simon DW Frost (sdf22@cam.ac.uk)
18 
19 Permission is hereby granted, free of charge, to any person obtaining a
20 copy of this software and associated documentation files (the
21 "Software"), to deal in the Software without restriction, including
22 without limitation the rights to use, copy, modify, merge, publish,
23 distribute, sublicense, and/or sell copies of the Software, and to
24 permit persons to whom the Software is furnished to do so, subject to
25 the following conditions:
26 
27 The above copyright notice and this permission notice shall be included
28 in all copies or substantial portions of the Software.
29 
30 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
31 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
33 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
34 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
35 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
36 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 
38 */
39 
40 
41 #ifndef     __HY_DEFINES__
42 #define     __HY_DEFINES__
43 
44 #include    <math.h>
45 
46 #ifndef FALSE
47     #define FALSE 0
48 #endif
49 
50 #ifndef TRUE
51     #define TRUE  1
52 #endif
53 
54 #ifndef nil
55 #define nil   NULL
56 #endif
57 
58 #ifdef __GNUC__
59 #define _hprestrict_ __restrict
60 #else
61 #define _hprestrict_
62 #endif
63 
64 #define  HY_WIDTH_OF_LONG          ((long)(sizeof(long)*8))
65 
66 #define  PRINTF_FORMAT_STRING    "%.16g"
67 
68 #define  fNone              0L      // default 0 bit flags
69 
70 #define  kNotFound          (-1L)
71 
72 #define  kMaxDialogPrompts  10L
73 
74 #define  HY_UNDEFINED       0x400UL
75 #define  NUMBER             0x001UL
76 #define  MATRIX             0x004UL
77 #define  CONTAINER          0x008UL
78 #define  TREE_NODE          0x010UL
79 #define  TREE               0x020UL
80 #define  STRING             0x040UL
81 #define  ASSOCIATIVE_LIST   0x080UL
82 #define  TOPOLOGY           0x100UL
83 #define  POLYNOMIAL         0x200UL
84 
85 #define  HY_ANY_OBJECT      0xFFFFUL
86 #define  HY_MUTABLE_OBJECT  (NUMBER | STRING | HY_UNDEFINED)
87 
88 #define  DEFAULTLOWERBOUND  -1e26
89 #define  DEFAULTUPPERBOUND  1e26
90 
91 #define  GLOBAL_VARIABLE   1
92 #define  CATEGORY_VARIABLE 2
93 #define  RANDOM_VARIABLE   3
94 
95 #define  HY_VARIABLE_GLOBAL     0x01
96 #define  HY_VARIABLE_CHANGED    0x02
97 #define  HY_VARIABLE_CHANGED_CLEAR    0xFFFD
98 #define  HY_DEP_V_COMPUTED      0x04
99 #define  HY_DEP_V_INSPECTED     0x08
100 #define  HY_DEP_V_INSPECTED_CLR 0xFF7
101 #define  HY_DEP_V_MODIFIED      0x10
102 #define  HY_DEP_V_MODIFIED_CATS 0x20
103 #define  HY_VC_NO_CHECK         0x40 // do not check this variable container in
104 // NeedToExponentiate
105 #define  HY_VARIABLE_NOTSET     0x80
106 #define  HY_VARIABLE_SET        0x7F
107 #define  HY_VARIABLE_COMPUTING  0x100
108 
109 #define  HY_VARIABLE_COMPUTING_CLR 0x0FF
110 
111 #define  HY_VC_CLR_NO_CHECK     0xFBF
112 #define  HY_DEP_CLEAR_MASK      0xFC7
113 #define  HY_HY_VARIABLE_CHANGED_CLEAR   0xFFC
114 
115 #define  HY_NO_MODEL            (-1)
116 
117 #define  GOLDEN_RATIO 1.618034
118 #define MAX_BRENT_ITERATES 100L
119 
120 // START OPCODES
121 
122 #define  HY_OP_CODE_NONE            -1                              // noop
123 
124 #define  HY_OP_CODE_NOT             0                               // !
125 #define  HY_OP_CODE_NEQ             (1+HY_OP_CODE_NOT)              // !=
126 #define  HY_OP_CODE_IDIV            (1+HY_OP_CODE_NEQ)              // $
127 #define  HY_OP_CODE_MOD             (1+HY_OP_CODE_IDIV)             // %
128 #define  HY_OP_CODE_REF             (1+HY_OP_CODE_MOD)              // &
129 #define  HY_OP_CODE_AND             (1+HY_OP_CODE_REF)              // &&
130 #define  HY_OP_CODE_MUL             (1+HY_OP_CODE_AND)              // *
131 #define  HY_OP_CODE_ADD             (1+HY_OP_CODE_MUL)              // +
132 #define  HY_OP_CODE_SUB             (1+HY_OP_CODE_ADD)          // -
133 #define  HY_OP_CODE_DIV             (1+HY_OP_CODE_SUB)              // /
134 #define  HY_OP_CODE_LESS            (1+HY_OP_CODE_DIV)  // <
135 
136 #define  HY_OP_CODE_LEQ             (1+HY_OP_CODE_LESS) // <=
137 #define  HY_OP_CODE_EQ              (1+HY_OP_CODE_LEQ) // ==
138 #define  HY_OP_CODE_GREATER         (1+HY_OP_CODE_EQ) // >
139 #define  HY_OP_CODE_GEQ             (1+HY_OP_CODE_GREATER) // >=
140 #define  HY_OP_CODE_ABS             (1+HY_OP_CODE_GEQ) // Abs
141 #define  HY_OP_CODE_ARCTAN          (1+HY_OP_CODE_ABS) // Arctan
142 #define  HY_OP_CODE_BETA            (1+HY_OP_CODE_ARCTAN) // Beta
143 #define  HY_OP_CODE_BRANCHCOUNT     (1+HY_OP_CODE_BETA) // BranchCount
144 #define  HY_OP_CODE_BRANCHLENGTH    (1+HY_OP_CODE_BRANCHCOUNT) // BranchLength
145 #define  HY_OP_CODE_BRANCHNAME      (1+HY_OP_CODE_BRANCHLENGTH) // BranchName
146 
147 
148 #define  HY_OP_CODE_CCHI2           (1+HY_OP_CODE_BRANCHNAME) // CChi2
149 #define  HY_OP_CODE_CGAMMADIST      (1+HY_OP_CODE_CCHI2) // CGammaDist
150 #define  HY_OP_CODE_CALL            (1+HY_OP_CODE_CGAMMADIST) // Call
151 #define  HY_OP_CODE_COLUMNS         (1+HY_OP_CODE_CALL) // Columns
152 #define  HY_OP_CODE_COS             (1+HY_OP_CODE_COLUMNS) // Cos
153 #define  HY_OP_CODE_DIFF            (1+HY_OP_CODE_COS) // D
154 #define  HY_OP_CODE_EIGENSYSTEM     (1+HY_OP_CODE_DIFF) // Eigensystem
155 #define  HY_OP_CODE_ERF             (1+HY_OP_CODE_EIGENSYSTEM) // Erf
156 #define  HY_OP_CODE_EVAL            (1+HY_OP_CODE_ERF) // Eval
157 #define  HY_OP_CODE_EXP             (1+HY_OP_CODE_EVAL) // Exp
158 #define  HY_OP_CODE_FORMAT          (1+HY_OP_CODE_EXP) // Format
159 #define  HY_OP_CODE_GAMMA           (1+HY_OP_CODE_FORMAT) // Gamma
160 
161 #define  HY_OP_CODE_GAMMADIST       (1+HY_OP_CODE_GAMMA) // GammaDist
162 #define  HY_OP_CODE_IBETA           (1+HY_OP_CODE_GAMMADIST) // IBeta
163 #define  HY_OP_CODE_IGAMMA          (1+HY_OP_CODE_IBETA) // IGamma
164 #define  HY_OP_CODE_INVCHI2         (1+HY_OP_CODE_IGAMMA) // InvChi2
165 #define  HY_OP_CODE_INVERSE         (1+HY_OP_CODE_INVCHI2) // Inverse
166 #define  HY_OP_CODE_JOIN            (1+HY_OP_CODE_INVERSE) // Join
167 #define  HY_OP_CODE_LUDECOMPOSE     (1+HY_OP_CODE_JOIN) // LUDecompose
168 #define  HY_OP_CODE_LUSOLVE         (1+HY_OP_CODE_LUDECOMPOSE) // LUSolve
169 #define  HY_OP_CODE_LNGAMMA         (1+HY_OP_CODE_LUSOLVE) // LnGamma
170 #define  HY_OP_CODE_LOG             (1+HY_OP_CODE_LNGAMMA) // Log
171 #define  HY_OP_CODE_MACCESS         (1+HY_OP_CODE_LOG) // MAccess
172 #define  HY_OP_CODE_MCOORD          (1+HY_OP_CODE_MACCESS) // MCoord
173 
174 #define  HY_OP_CODE_MAX             (1+HY_OP_CODE_MCOORD) // Max
175 #define  HY_OP_CODE_MIN             (1+HY_OP_CODE_MAX) // Min
176 #define  HY_OP_CODE_PSTREESTRING    (1+HY_OP_CODE_MIN) // PSTreeString
177 #define  HY_OP_CODE_RANDOM          (1+HY_OP_CODE_PSTREESTRING) // Random
178 #define  HY_OP_CODE_REROOTTREE      (1+HY_OP_CODE_RANDOM) // RerootTree
179 #define  HY_OP_CODE_ROWS            (1+HY_OP_CODE_REROOTTREE) // Rows
180 #define  HY_OP_CODE_SIMPLEX         (1+HY_OP_CODE_ROWS) // Simplex
181 #define  HY_OP_CODE_SIMPLIFY        (1+HY_OP_CODE_SIMPLEX) // Simplify
182 #define  HY_OP_CODE_SIN             (1+HY_OP_CODE_SIMPLIFY) // Sin
183 #define  HY_OP_CODE_SQRT            (1+HY_OP_CODE_SIN) // Sqrt
184 #define  HY_OP_CODE_TEXTREESTRING   (1+HY_OP_CODE_SQRT) // TEXTreeString
185 
186 #define  HY_OP_CODE_TAN             (1+HY_OP_CODE_TEXTREESTRING) // Tan
187 #define  HY_OP_CODE_TIME            (1+HY_OP_CODE_TAN) // Time
188 #define  HY_OP_CODE_TIPCOUNT        (1+HY_OP_CODE_TIME) // TipCount
189 #define  HY_OP_CODE_TIPNAME         (1+HY_OP_CODE_TIPCOUNT) // TipName
190 #define  HY_OP_CODE_TRANSPOSE       (1+HY_OP_CODE_TIPNAME) // Transpose
191 #define  HY_OP_CODE_TYPE            (1+HY_OP_CODE_TRANSPOSE) // Type
192 #define  HY_OP_CODE_ZCDF            (1+HY_OP_CODE_TYPE) // ZCDF
193 #define  HY_OP_CODE_POWER           (1+HY_OP_CODE_ZCDF) // ^
194 #define  HY_OP_CODE_OR              (1+HY_OP_CODE_POWER) // ||
195 
196 // END OPCODES
197 
198 // START FORMULA RETURN CODES
199 
200 #define  HY_FORMULA_EXPRESSION                          0
201 #define  HY_FORMULA_FAILED                              (-1)
202 #define  HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT           1
203 #define  HY_FORMULA_VARIABLE_FORMULA_ASSIGNMENT         2
204 #define  HY_FORMULA_FORMULA_FORMULA_ASSIGNMENT          3
205 #define  HY_FORMULA_FORMULA_VALUE_ASSIGNMENT            4
206 #define  HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT     5
207 #define  HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT     6
208 #define  HY_FORMULA_FORMULA_VALUE_INCREMENT             7
209 #define  HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT          20
210 #define  HY_FORMULA_REFERENCE_FORMULA_ASSIGNMENT        30
211 
212 #define  HY_FORMULA_REFERENCE_LOWER_BOUND_ASSIGNMENT    40
213 #define  HY_FORMULA_REFERENCE_UPPER_BOUND_ASSIGNMENT    41
214 
215 // END FORMULA RETURN CODES
216 
217 //Some useful defines
218 #define  HY_INVALID_RETURN_VALUE                        NAN
219 #define  HY_CONSTANT_FALSE                              _Constant (0.0)
220 #define  HY_CONSTANT_TRUE                               _Constant (1.0)
221 #define  HY_NULL_RETURN                                 _MathObject ()
222 
223 //!  Batch Language 'Object' type codes
224 /*!
225      20110608 SLKP introduced.
226 
227      Bit flag style type tags and masks
228      This is primarily to be used for object retrieval
229      using the _HYRetrieveBLObjectByName function
230      and in the _HY_GetStringGlobalTypes list
231 */
232 
233 #define   HY_BL_NOT_DEFINED             0
234 #define   HY_BL_DATASET                 1
235 #define   HY_BL_DATASET_FILTER          2
236 #define   HY_BL_LIKELIHOOD_FUNCTION     4
237 #define   HY_BL_SCFG                    8
238 #define   HY_BL_BGM                     16
239 #define   HY_BL_MODEL                   32
240 #define   HY_BL_HBL_FUNCTION            64
241 #define   HY_BL_TREE                    128
242 #define   HY_BL_VARIABLE                256
243 
244 #define   HY_BL_ANY                     65535
245 
246 //!  Batch Lanuage Command Codes
247 /*!
248      20111222 SLKP introduced.
249      Define tags to replace ExecuteCaseWhatever
250 
251 */
252 
253 #define   HY_HBL_COMMAND_FORMULA                                        0L
254 
255 #define   HY_HBL_COMMAND_FOR                                            500L
256 #define   HY_HBL_COMMAND_WHILE                                          501L
257 #define   HY_HBL_COMMAND_FUNCTION                                       502L
258 #define   HY_HBL_COMMAND_FFUNCTION                                      503L
259 #define   HY_HBL_COMMAND_RETURNSPACE                                    504L
260 #define   HY_HBL_COMMAND_RETURNPAREN                                    505L
261 #define   HY_HBL_COMMAND_IF                                             506L
262 #define   HY_HBL_COMMAND_ELSE                                           507L
263 #define   HY_HBL_COMMAND_DO                                             508L
264 #define   HY_HBL_COMMAND_BREAK                                          509L
265 #define   HY_HBL_COMMAND_CONTINUE                                       510L
266 #define   HY_HBL_COMMAND_INCLUDE                                        511L
267 #define   HY_HBL_COMMAND_DATA_SET                                       512L
268 #define   HY_HBL_COMMAND_DATA_SET_FILTER                                513L
269 #define   HY_HBL_COMMAND_HARVEST_FREQUENCIES                            514L
270 #define   HY_HBL_COMMAND_CONSTRUCT_CATEGORY_MATRIX                      515L
271 #define   HY_HBL_COMMAND_TREE                                           516L
272 #define   HY_HBL_COMMAND_LIKELIHOOD_FUNCTION                            517L
273 #define   HY_HBL_COMMAND_LIKELIHOOD_FUNCTION_3                          518L
274 #define   HY_HBL_COMMAND_OPTIMIZE                                       519L
275 #define   HY_HBL_COMMAND_COVARIANCE_MATRIX                              520L
276 #define   HY_HBL_COMMAND_MOLECULAR_CLOCK                                521L
277 #define   HY_HBL_COMMAND_FPRINTF                                        522L
278 #define   HY_HBL_COMMAND_FSCANF                                         523L
279 #define   HY_HBL_COMMAND_SSCANF                                         524L
280 #define   HY_HBL_COMMAND_GET_STRING                                     525L
281 #define   HY_HBL_COMMAND_EXPORT                                         526L
282 #define   HY_HBL_COMMAND_IMPORT                                         527L
283 #define   HY_HBL_COMMAND_CATEGORY                                       528L
284 #define   HY_HBL_COMMAND_CLEAR_CONSTRAINTS                              529L
285 #define   HY_HBL_COMMAND_SET_DIALOG_PROMPT                              530L
286 #define   HY_HBL_COMMAND_SELECT_TEMPLATE_MODEL                          531L
287 #define   HY_HBL_COMMAND_USE_MODEL                                      532L
288 #define   HY_HBL_COMMAND_MODEL                                          533L
289 #define   HY_HBL_COMMAND_SET_PARAMETER                                  534L
290 #define   HY_HBL_COMMAND_CHOICE_LIST                                    535L
291 #define   HY_HBL_COMMAND_GET_INFORMATION                                537L
292 #define   HY_HBL_COMMAND_EXECUTE_COMMANDS                               538L
293 #define   HY_HBL_COMMAND_EXECUTE_A_FILE                                 539L
294 #define   HY_HBL_COMMAND_LOAD_FUNCTION_LIBRARY                          541L
295 #define   HY_HBL_COMMAND_DIFFERENTIATE                                  544L
296 #define   HY_HBL_COMMAND_FIND_ROOT                                      545L
297 #define   HY_HBL_COMMAND_MPI_RECEIVE                                    546L
298 #define   HY_HBL_COMMAND_MPI_SEND                                       547L
299 #define   HY_HBL_COMMAND_GET_DATA_INFO                                  548L
300 #define   HY_HBL_COMMAND_STATE_COUNTER                                  549L
301 #define   HY_HBL_COMMAND_INTEGRATE                                      550L
302 #define   HY_HBL_COMMAND_LFCOMPUTE                                      551L
303 #define   HY_HBL_COMMAND_GET_URL                                        552L
304 #define   HY_HBL_COMMAND_DO_SQL                                         553L
305 #define   HY_HBL_COMMAND_TOPOLOGY                                       554L
306 #define   HY_HBL_COMMAND_ALIGN_SEQUENCES                                555L
307 #define   HY_HBL_COMMAND_GET_NEUTRAL_NULL                               556L
308 #define   HY_HBL_COMMAND_PROFILE                                        557L
309 #define   HY_HBL_COMMAND_DELETE_OBJECT                                  558L
310 #define   HY_HBL_COMMAND_REQUIRE_VERSION                                559L
311 #define   HY_HBL_COMMAND_SCFG                                           560L
312 #define   HY_HBL_COMMAND_NEURAL_NET                                     561L
313 #define   HY_HBL_COMMAND_BGM                                            562L
314 #define   HY_HBL_COMMAND_SIMULATE_DATA_SET                              563L
315 #define   HY_HBL_COMMAND_ASSERT                                         564L
316 #define   HY_HBL_COMMAND_REPLICATE_CONSTRAINT                           565L
317 #define   HY_HBL_COMMAND_NESTED_LIST                                    566L
318 #define   HY_HBL_COMMAND_KEYWORD_ARGUMENT                               567L
319 #define   HY_HBL_COMMAND_INIT_ITERATOR                                  568L
320 #define   HY_HBL_COMMAND_ADVANCE_ITERATOR                               569L
321 
322 
323 //!  HyPhy standard directory locations
324 /*!
325     retrieve using _HYStandardDirectory
326 
327 */
328 
329 #define   HY_HBL_DIRECTORY_TEMPLATE_MODELS                              1000L
330 
331 #define   HY_MAX_LONG_VALUE                                             0xffffffffL
332 
333 
334 #define   HY_HBL_GET_STRING_BGM_SCORE                                   0L
335 #define   HY_HBL_GET_STRING_BGM_SERIALIZE                               1L
336 
337 
338 //TODO 20170413: not sure where to put the conditional includes below
339 #ifdef _SLKP_USE_ARM_NEON
340     #include <arm_neon.h>
341 #endif
342 
343 #ifdef _SLKP_USE_SSE_INTRINSICS
344     //#include "sse2neon.h"
345     //#else
346     #include <pmmintrin.h>
347     //#endif
348 #endif
349 
350 #ifdef _SLKP_USE_AVX_INTRINSICS
351 #include <immintrin.h>
352 #endif
353 
354 #endif
355