1 /*===========================================================================*/ 2 /* */ 3 /* This file is part of the SYMPHONY MILP Solver Framework. */ 4 /* */ 5 /* SYMPHONY was jointly developed by Ted Ralphs (ted@lehigh.edu) and */ 6 /* Laci Ladanyi (ladanyi@us.ibm.com). */ 7 /* */ 8 /* (c) Copyright 2000-2019 Ted Ralphs. All Rights Reserved. */ 9 /* */ 10 /* This software is licensed under the Eclipse Public License. Please see */ 11 /* accompanying file for terms. */ 12 /* */ 13 /*===========================================================================*/ 14 15 #ifndef __TIMEMEAS_H 16 #define __TIMEMEAS_H 17 18 #if defined (_MSC_VER) || defined (__MNO_CYGWIN) 19 #include "sym_win32_time.h" 20 #else 21 #include <sys/time.h> 22 #endif 23 24 #ifdef __DARWIN 25 #include <sys/resource.h> 26 #endif 27 28 #include "sym_proto.h" 29 30 #define PRINT_TIME(tm, f) { /* Print the elapsed time in vbctool format*/ \ 31 double elapsed = wall_clock(NULL) - tm->start_time; \ 32 int hours, minutes, seconds, msec; \ 33 hours = (int)(elapsed/3600.0); \ 34 elapsed -= hours*3600.0; \ 35 minutes = (int)(elapsed/60.0); \ 36 elapsed -= minutes*60.0; \ 37 seconds = (int)elapsed; \ 38 elapsed -= (double)seconds; \ 39 msec = (int)(elapsed*100.0); \ 40 fprintf(f, "%.2d:%.2d:%.2d:%.2d ", hours, minutes, seconds, msec); \ 41 } 42 43 /* PRINT_TIME function when vbc_emulation = 3 */ 44 #define PRINT_TIME2(tm, f) { /* Print the elapsed time in vbctool format*/ \ 45 double elapsed_t = wall_clock(NULL) - tm->start_time; \ 46 fprintf(f, "%10.6f ", elapsed_t); \ 47 } 48 49 #define TVCLEAR(tvp) (tvp.tv_sec = tvp.tv_usec = 0) 50 #define PTVCLEAR(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) 51 52 #define TVISSET(tvp) (tvp.tv_sec || tvp.tv_usec) 53 #define PTVISSET(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) 54 55 #define TVXLTY(xtv, ytv) \ 56 ( (xtv.tv_sec < ytv.tv_sec) || \ 57 (xtv.tv_sec == ytv.tv_sec && xtv.tv_usec < ytv.tv_usec)) 58 #define PTVXLTY(xtv, ytv) \ 59 ( ((xtv)->tv_sec < (ytv)->tv_sec) || \ 60 ((xtv)->tv_sec == (ytv)->tv_sec && (xtv)->tv_usec < (ytv)->tv_usec)) 61 62 #define TVXADDY(ztv, xtv, ytv) \ 63 if ((ztv.tv_usec = xtv.tv_usec + ytv.tv_usec) < 1000000) { \ 64 ztv.tv_sec = xtv.tv_sec + ytv.tv_sec; \ 65 } else { \ 66 ztv.tv_usec -= 1000000; \ 67 ztv.tv_sec = xtv.tv_sec + ytv.tv_sec + 1; \ 68 } 69 #define PTVXADDY(ztv, xtv, ytv) \ 70 if (((ztv)->tv_usec = (xtv)->tv_usec + (ytv)->tv_usec) < 1000000) { \ 71 (ztv)->tv_sec = (xtv)->tv_sec + (ytv)->tv_sec; \ 72 } else { \ 73 (ztv)->tv_usec -= 1000000; \ 74 (ztv)->tv_sec = (xtv)->tv_sec + (ytv)->tv_sec + 1; \ 75 } 76 77 #define TVXSUBY(ztv, xtv, ytv) \ 78 if (xtv.tv_usec >= ytv.tv_usec) { \ 79 ztv.tv_sec = xtv.tv_sec - ytv.tv_sec; \ 80 ztv.tv_usec = xtv.tv_usec - ytv.tv_usec; \ 81 } else { \ 82 ztv.tv_sec = xtv.tv_sec - ytv.tv_sec - 1; \ 83 ztv.tv_usec = xtv.tv_usec + 1000000 - ytv.tv_usec; \ 84 } 85 #define PTVXSUBY(ztv, xtv, ytv) \ 86 if ((xtv)->tv_usec >= (ytv)->tv_usec) { \ 87 (ztv)->tv_sec = (xtv)->tv_sec - (ytv)->tv_sec; \ 88 (ztv)->tv_usec = (xtv)->tv_usec - (ytv)->tv_usec; \ 89 } else { \ 90 (ztv)->tv_sec = (xtv)->tv_sec - (ytv)->tv_sec - 1; \ 91 (ztv)->tv_usec = (xtv)->tv_usec + 1000000 - (ytv)->tv_usec; \ 92 } 93 94 #define TVTODBL(tvp) ((double)tvp.tv_sec + ((double)tvp.tv_usec)/1000000 ) 95 #define TVPTODBL(tvp) ((double)(tvp)->tv_sec+((double)(tvp)->tv_usec)/1000000) 96 97 #define DBLTOTV(x, tv) \ 98 tv.tv_sec = (int) floor(x); \ 99 tv.tv_usec = (int) floor(1000000 * (x - (double)tv.tv_sec)); 100 #define DBLTOPTV(x, tvp) \ 101 (tvp)->tv_sec = (int) floor(x); \ 102 (tvp)->tv_usec = (int) floor(1000000 * (x - (tvp)->tv_sec)); 103 104 void start_time PROTO((void)); 105 double used_time PROTO((double *T)); 106 double wall_clock PROTO((double *T)); 107 108 #endif 109