From 157955cdb5afe71338ac62ecb4fd34366f63b53a Mon Sep 17 00:00:00 2001 From: Apostolos Chalkis Date: Mon, 16 Oct 2023 16:09:25 -0600 Subject: [PATCH 01/44] Fix the warning message in R Mac's cran test (#285) * copy and replace lp_rlp.h * remove re-initialization of eta * update ubuntu version from 18 to 20 in R cran tests * minor improvements (explanatory comments) --------- Co-authored-by: Apostolos Chalkis --- .github/workflows/R-CMD-check-ubuntu.yml | 4 +- R-proj/src/sample_points.cpp | 6 +- cran_gen/genCRANpkg.R | 2 + .../lpsolve_modified_header_files/lp_rlp.h | 2460 +++++++++++++++++ 4 files changed, 2466 insertions(+), 6 deletions(-) create mode 100644 external/cmake-files/lpsolve_modified_header_files/lp_rlp.h diff --git a/.github/workflows/R-CMD-check-ubuntu.yml b/.github/workflows/R-CMD-check-ubuntu.yml index 645396120..9fe81de99 100644 --- a/.github/workflows/R-CMD-check-ubuntu.yml +++ b/.github/workflows/R-CMD-check-ubuntu.yml @@ -22,8 +22,8 @@ jobs: config: - {os: ubuntu-latest, r: 'devel'} - {os: ubuntu-latest, r: 'release'} - - {os: ubuntu-18.04, r: 'devel'} - - {os: ubuntu-18.04, r: 'release'} + - {os: ubuntu-20.04, r: 'devel'} + - {os: ubuntu-20.04, r: 'release'} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true diff --git a/R-proj/src/sample_points.cpp b/R-proj/src/sample_points.cpp index d03c9b33f..b1150877f 100644 --- a/R-proj/src/sample_points.cpp +++ b/R-proj/src/sample_points.cpp @@ -346,7 +346,7 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, random_walks walk; ode_solvers solver; // Used only for logconcave sampling - NT eta; + NT eta = 1; std::list randPoints; std::pair InnerBall; Point mode(dim); @@ -410,7 +410,7 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, Rcpp::Function negative_logprob = Rcpp::as(distribution)["negative_logprob"]; Rcpp::Function negative_logprob_gradient = Rcpp::as(distribution)["negative_logprob_gradient"]; - NT L_, m, eta; + NT L_, m; if (Rcpp::as(distribution).containsElementNamed("L_")) { L_ = Rcpp::as(Rcpp::as(distribution)["L_"]); @@ -459,8 +459,6 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, functor_defined = false; - NT eta; - if (Rcpp::as(random_walk).containsElementNamed("step_size")) { eta = NT(Rcpp::as(Rcpp::as(random_walk)["step_size"])); if (eta <= NT(0)) { diff --git a/cran_gen/genCRANpkg.R b/cran_gen/genCRANpkg.R index f12905f06..e4f6008be 100644 --- a/cran_gen/genCRANpkg.R +++ b/cran_gen/genCRANpkg.R @@ -42,6 +42,8 @@ dir_lp = paste0(path,"/lpSolveAPI/inst/include") h_files = dir(dir_lp, "*.h", ignore.case = TRUE, all.files = TRUE) lp_dist = paste0(path,"/external/LPsolve_src/include") file.copy(file.path(dir_lp, h_files), lp_dist, recursive=TRUE, overwrite=TRUE) +# replace the lpsolve header file that issues a warning in mac's cran test +file.copy(paste0(path,"/external/cmake-files/lpsolve_modified_header_files/lp_rlp.h"), lp_dist, recursive=TRUE, overwrite=TRUE) dir_lp = paste0(path,"/lpSolve/src") h_files = dir(dir_lp, "*.h", ignore.case = TRUE, all.files = TRUE) lp_dist = paste0(path,"/external/LPsolve_src/run_headers") diff --git a/external/cmake-files/lpsolve_modified_header_files/lp_rlp.h b/external/cmake-files/lpsolve_modified_header_files/lp_rlp.h new file mode 100644 index 000000000..058b45232 --- /dev/null +++ b/external/cmake-files/lpsolve_modified_header_files/lp_rlp.h @@ -0,0 +1,2460 @@ +// Copyright(c) 2016-2018 Kjell Konis . +// Version: 5.5.2.0-17 +// Description: The lpSolveAPI package provides an R interface to 'lp_solve', +// a Mixed Integer Linear Programming (MILP) solver with support for pure +// linear, (mixed) integer/binary, semi-continuous and special ordered sets +// (SOS) models. +// License: LGPL-2 +// Repository: CRAN + + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define lp_yyconst const +#else +#define lp_yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* lp_yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define lp_yyin lp_yyg->lp_yyin_r +#define lp_yyout lp_yyg->lp_yyout_r +#define lp_yyextra lp_yyg->lp_yyextra_r +#define lp_yyleng lp_yyg->lp_yyleng_r +#define lp_yytext lp_yyg->lp_yytext_r +#define lp_yylineno (YY_CURRENT_BUFFER_LVALUE->lp_yy_bs_lineno) +#define lp_yycolumn (YY_CURRENT_BUFFER_LVALUE->lp_yy_bs_column) +#define lp_yy_flex_debug lp_yyg->lp_yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN lp_yyg->lp_yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((lp_yyg->lp_yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE lp_yyrestart(lp_yyin ,lp_yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(lp_yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct lp_yy_buffer_state *YY_BUFFER_STATE; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for lp_yy_rule_can_match_eol because it requires + * access to the local variable lp_yy_act. Since lp_yyless() is a macro, it would break + * existing scanners that call lp_yyless() from OUTSIDE lp_yylex. + * One obvious solution it to make lp_yy_act a global. I tried that, and saw + * a 5% performance hit in a non-lp_yylineno scanner, because lp_yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int lp_yyl;\ + for ( lp_yyl = n; lp_yyl < lp_yyleng; ++lp_yyl )\ + if ( lp_yytext[lp_yyl] == '\n' )\ + --lp_yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define lp_yyless(n) \ + do \ + { \ + /* Undo effects of setting up lp_yytext. */ \ + int lp_yyless_macro_arg = (n); \ + YY_LESS_LINENO(lp_yyless_macro_arg);\ + *lp_yy_cp = lp_yyg->lp_yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + lp_yyg->lp_yy_c_buf_p = lp_yy_cp = lp_yy_bp + lp_yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up lp_yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) lp_yyunput( c, lp_yyg->lp_yytext_ptr , lp_yyscanner ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t lp_yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct lp_yy_buffer_state + { + FILE *lp_yy_input_file; + + char *lp_yy_ch_buf; /* input buffer */ + char *lp_yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + lp_yy_size_t lp_yy_buf_size; + + /* Number of characters read into lp_yy_ch_buf, not including EOB + * characters. + */ + int lp_yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int lp_yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int lp_yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int lp_yy_at_bol; + + int lp_yy_bs_lineno; /**< The line count. */ + int lp_yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int lp_yy_fill_buffer; + + int lp_yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via lp_yyrestart()), so that the user can continue scanning by + * just pointing lp_yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( lp_yyg->lp_yy_buffer_stack \ + ? lp_yyg->lp_yy_buffer_stack[lp_yyg->lp_yy_buffer_stack_top] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE lp_yyg->lp_yy_buffer_stack[lp_yyg->lp_yy_buffer_stack_top] + +void lp_yyrestart (FILE *input_file ,lp_yyscan_t lp_yyscanner ); +void lp_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,lp_yyscan_t lp_yyscanner ); +YY_BUFFER_STATE lp_yy_create_buffer (FILE *file,int size ,lp_yyscan_t lp_yyscanner ); +void lp_yy_delete_buffer (YY_BUFFER_STATE b ,lp_yyscan_t lp_yyscanner ); +void lp_yy_flush_buffer (YY_BUFFER_STATE b ,lp_yyscan_t lp_yyscanner ); +void lp_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,lp_yyscan_t lp_yyscanner ); +void lp_yypop_buffer_state (lp_yyscan_t lp_yyscanner ); + +static void lp_yyensure_buffer_stack (lp_yyscan_t lp_yyscanner ); +static void lp_yy_load_buffer_state (lp_yyscan_t lp_yyscanner ); +static void lp_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,lp_yyscan_t lp_yyscanner ); + +#define YY_FLUSH_BUFFER lp_yy_flush_buffer(YY_CURRENT_BUFFER ,lp_yyscanner) + +YY_BUFFER_STATE lp_yy_scan_buffer (char *base,lp_yy_size_t size ,lp_yyscan_t lp_yyscanner ); +YY_BUFFER_STATE lp_yy_scan_string (lp_yyconst char *lp_yy_str ,lp_yyscan_t lp_yyscanner ); +YY_BUFFER_STATE lp_yy_scan_bytes (lp_yyconst char *bytes,int len ,lp_yyscan_t lp_yyscanner ); + +void *lp_yyalloc (lp_yy_size_t ,lp_yyscan_t lp_yyscanner ); +void *lp_yyrealloc (void *,lp_yy_size_t ,lp_yyscan_t lp_yyscanner ); +void lp_yyfree (void * ,lp_yyscan_t lp_yyscanner ); + +#define lp_yy_new_buffer lp_yy_create_buffer + +#define lp_yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + lp_yyensure_buffer_stack (lp_yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->lp_yy_is_interactive = is_interactive; \ + } + +#define lp_yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + lp_yyensure_buffer_stack (lp_yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol) + +/* Begin user sect3 */ + +#define lp_yywrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef int lp_yy_state_type; + +#define lp_yytext_ptr lp_yytext_r + +static lp_yy_state_type lp_yy_get_previous_state (lp_yyscan_t lp_yyscanner ); +static lp_yy_state_type lp_yy_try_NUL_trans (lp_yy_state_type current_state ,lp_yyscan_t lp_yyscanner); +static int lp_yy_get_next_buffer (lp_yyscan_t lp_yyscanner ); +static void lp_yy_fatal_error (lp_yyconst char msg[] ,lp_yyscan_t lp_yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up lp_yytext. + */ +#define YY_DO_BEFORE_ACTION \ + lp_yyg->lp_yytext_ptr = lp_yy_bp; \ + lp_yyleng = (size_t) (lp_yy_cp - lp_yy_bp); \ + lp_yyg->lp_yy_hold_char = *lp_yy_cp; \ + *lp_yy_cp = '\0'; \ + lp_yyg->lp_yy_c_buf_p = lp_yy_cp; + +#define YY_NUM_RULES 33 +#define YY_END_OF_BUFFER 34 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct lp_yy_trans_info + { + flex_int32_t lp_yy_verify; + flex_int32_t lp_yy_nxt; + }; +static lp_yyconst flex_int16_t lp_yy_accept[144] = + { 0, + 0, 0, 0, 0, 0, 0, 34, 32, 10, 10, + 27, 17, 11, 32, 32, 14, 26, 31, 29, 28, + 30, 25, 25, 10, 25, 25, 25, 25, 3, 4, + 3, 3, 9, 7, 8, 10, 17, 17, 0, 15, + 1, 6, 15, 14, 0, 29, 30, 0, 25, 24, + 0, 25, 25, 10, 0, 0, 0, 0, 25, 25, + 25, 25, 25, 2, 0, 15, 0, 15, 22, 0, + 25, 25, 0, 0, 0, 0, 0, 19, 25, 18, + 20, 25, 25, 21, 0, 25, 0, 13, 25, 0, + 12, 25, 19, 0, 18, 20, 21, 25, 23, 25, + + 20, 21, 21, 16, 16, 0, 25, 25, 0, 23, + 0, 21, 25, 25, 0, 0, 25, 25, 0, 0, + 19, 25, 0, 0, 25, 25, 19, 0, 18, 0, + 0, 25, 25, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + } ; + +static lp_yyconst flex_int32_t lp_yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 5, 6, 5, 5, 5, 1, + 1, 7, 8, 9, 10, 11, 12, 13, 14, 14, + 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, + 18, 19, 1, 5, 20, 21, 22, 23, 24, 25, + 26, 23, 27, 23, 23, 23, 28, 29, 30, 23, + 23, 31, 32, 33, 34, 23, 23, 35, 36, 37, + 5, 1, 5, 5, 5, 1, 20, 21, 22, 23, + + 24, 25, 26, 23, 27, 23, 23, 23, 28, 29, + 30, 23, 23, 31, 32, 33, 34, 23, 23, 35, + 36, 37, 5, 1, 5, 5, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static lp_yyconst flex_int32_t lp_yy_meta[38] = + { 0, + 1, 2, 3, 3, 4, 5, 6, 3, 6, 3, + 5, 5, 5, 5, 7, 6, 7, 6, 6, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4 + } ; + +static lp_yyconst flex_int16_t lp_yy_base[150] = + { 0, + 0, 36, 36, 38, 43, 45, 366, 388, 48, 62, + 388, 338, 388, 40, 48, 60, 388, 388, 346, 388, + 326, 60, 65, 91, 81, 74, 85, 102, 388, 388, + 388, 330, 388, 388, 388, 125, 313, 134, 308, 96, + 388, 388, 117, 132, 139, 388, 388, 88, 146, 320, + 0, 149, 152, 0, 307, 301, 294, 83, 153, 156, + 157, 189, 160, 388, 286, 126, 65, 108, 388, 289, + 181, 185, 272, 273, 250, 249, 220, 199, 203, 208, + 192, 211, 219, 227, 243, 109, 163, 225, 202, 174, + 224, 215, 213, 207, 191, 388, 189, 227, 228, 231, + + 244, 240, 253, 276, 388, 170, 260, 262, 166, 388, + 169, 179, 263, 241, 166, 159, 270, 272, 149, 155, + 284, 288, 130, 124, 296, 303, 388, 103, 300, 96, + 45, 324, 328, 388, 82, 311, 79, 68, 54, 56, + 25, 12, 388, 345, 353, 360, 367, 372, 379 + } ; + +static lp_yyconst flex_int16_t lp_yy_def[150] = + { 0, + 143, 1, 144, 144, 145, 145, 143, 143, 143, 143, + 143, 146, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 147, 147, 143, 147, 147, 147, 147, 143, 143, + 143, 143, 143, 143, 143, 143, 146, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 147, 143, + 148, 147, 147, 24, 143, 143, 143, 143, 147, 147, + 147, 147, 147, 143, 143, 143, 143, 143, 143, 148, + 147, 147, 143, 143, 143, 143, 143, 147, 147, 147, + 147, 147, 147, 147, 149, 143, 143, 143, 62, 143, + 143, 62, 143, 143, 143, 143, 143, 62, 62, 62, + + 62, 62, 62, 143, 143, 143, 62, 62, 143, 143, + 143, 143, 62, 62, 143, 143, 62, 62, 143, 143, + 62, 62, 143, 143, 62, 62, 143, 143, 62, 143, + 143, 147, 147, 143, 143, 149, 143, 143, 143, 143, + 143, 143, 0, 143, 143, 143, 143, 143, 143 + } ; + +static lp_yyconst flex_int16_t lp_yy_nxt[426] = + { 0, + 8, 9, 10, 9, 8, 8, 11, 12, 13, 12, + 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, + 22, 22, 22, 22, 22, 22, 22, 23, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 24, 30, 31, + 30, 31, 32, 96, 32, 34, 35, 34, 35, 36, + 36, 36, 40, 40, 41, 37, 25, 37, 142, 42, + 26, 48, 27, 36, 36, 36, 48, 28, 136, 37, + 43, 37, 44, 44, 50, 48, 51, 68, 68, 50, + 136, 51, 48, 45, 52, 141, 48, 140, 50, 48, + 51, 53, 54, 36, 36, 50, 139, 51, 37, 50, + + 37, 51, 50, 48, 60, 138, 76, 59, 40, 40, + 48, 55, 77, 61, 137, 56, 50, 57, 51, 45, + 68, 68, 58, 50, 135, 62, 36, 36, 36, 66, + 66, 63, 37, 134, 37, 38, 38, 38, 66, 66, + 45, 38, 43, 38, 44, 44, 67, 48, 67, 45, + 48, 68, 68, 48, 48, 45, 131, 48, 48, 130, + 50, 48, 51, 50, 87, 51, 50, 50, 51, 51, + 50, 50, 51, 51, 50, 90, 51, 88, 128, 79, + 72, 78, 87, 71, 127, 124, 90, 123, 91, 80, + 48, 84, 112, 48, 120, 88, 119, 51, 116, 91, + + 48, 51, 112, 50, 48, 51, 50, 89, 51, 48, + 81, 92, 48, 50, 111, 51, 82, 50, 98, 51, + 48, 83, 50, 49, 51, 50, 99, 51, 48, 107, + 110, 100, 109, 50, 49, 51, 49, 101, 69, 69, + 103, 50, 108, 51, 104, 104, 104, 49, 49, 49, + 102, 97, 49, 115, 49, 49, 114, 113, 49, 49, + 49, 49, 49, 49, 122, 49, 103, 49, 49, 106, + 96, 49, 49, 49, 49, 81, 49, 104, 104, 104, + 49, 49, 95, 49, 49, 49, 117, 49, 118, 49, + 49, 49, 49, 49, 49, 49, 94, 49, 121, 49, + + 93, 125, 49, 126, 49, 49, 125, 86, 126, 49, + 85, 49, 104, 104, 104, 49, 49, 49, 129, 132, + 49, 49, 75, 49, 49, 87, 133, 49, 49, 90, + 49, 74, 49, 73, 69, 49, 65, 143, 88, 39, + 51, 64, 91, 47, 51, 29, 29, 29, 29, 29, + 29, 29, 29, 33, 33, 33, 33, 33, 33, 33, + 33, 38, 38, 46, 39, 143, 143, 38, 49, 143, + 49, 49, 143, 49, 49, 70, 70, 143, 143, 70, + 105, 105, 143, 105, 105, 105, 105, 7, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143 + } ; + +static lp_yyconst flex_int16_t lp_yy_chk[426] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, + 4, 4, 3, 142, 4, 5, 5, 6, 6, 9, + 9, 9, 14, 14, 15, 9, 2, 9, 141, 15, + 2, 22, 2, 10, 10, 10, 23, 2, 131, 10, + 16, 10, 16, 16, 22, 26, 22, 67, 67, 23, + 131, 23, 25, 16, 23, 140, 27, 139, 26, 48, + 26, 23, 24, 24, 24, 25, 138, 25, 24, 27, + + 24, 27, 48, 28, 26, 137, 58, 25, 40, 40, + 86, 24, 58, 27, 135, 24, 28, 24, 28, 40, + 68, 68, 24, 86, 130, 28, 36, 36, 36, 43, + 43, 28, 36, 128, 36, 38, 38, 38, 66, 66, + 43, 38, 44, 38, 44, 44, 45, 49, 45, 66, + 52, 45, 45, 53, 59, 44, 124, 60, 61, 123, + 49, 63, 49, 52, 87, 52, 53, 59, 53, 59, + 60, 61, 60, 61, 63, 90, 63, 87, 120, 60, + 53, 59, 71, 52, 119, 116, 72, 115, 90, 61, + 62, 63, 112, 81, 111, 71, 109, 71, 106, 72, + + 78, 72, 97, 62, 79, 62, 81, 71, 81, 80, + 62, 72, 82, 78, 95, 78, 62, 79, 78, 79, + 83, 62, 80, 89, 80, 82, 79, 82, 84, 89, + 94, 80, 93, 83, 89, 83, 92, 82, 91, 88, + 84, 84, 92, 84, 85, 85, 85, 92, 98, 99, + 83, 77, 100, 101, 98, 99, 100, 98, 100, 98, + 99, 102, 114, 100, 114, 101, 103, 102, 114, 85, + 76, 101, 102, 114, 103, 101, 101, 104, 104, 104, + 103, 107, 75, 108, 113, 103, 107, 107, 108, 108, + 113, 117, 107, 118, 108, 113, 74, 117, 113, 118, + + 73, 117, 117, 118, 118, 121, 117, 70, 118, 122, + 65, 121, 136, 136, 136, 122, 121, 125, 122, 125, + 122, 129, 57, 125, 126, 132, 126, 129, 125, 133, + 126, 56, 129, 55, 50, 126, 39, 136, 132, 37, + 132, 32, 133, 21, 133, 144, 144, 144, 144, 144, + 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, + 145, 146, 146, 19, 12, 7, 0, 146, 147, 0, + 147, 147, 0, 147, 147, 148, 148, 0, 0, 148, + 149, 149, 0, 149, 149, 149, 149, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143 + } ; + +/* Table of booleans, true if rule could match eol. */ +static lp_yyconst flex_int32_t lp_yy_rule_can_match_eol[34] = + { 0, +0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define lp_yymore() lp_yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +/* + made reentrant with help of + http://www.usualcoding.eu/post/2007/09/03/Building-a-reentrant-parser-in-C-with-Flex/Bison +*/ +/* + Note that a minimum version of flex is needed to be able to compile this. + Older version don't know the reentrant code. + Version 2.5.4 is not enough. Probably at least v2.5.31 is needed. Tested with v2.5.35 +*/ +/* +** We want the scanner to be reentrant, therefore generate no global variables. +** That what the 'reentrant' option is for. +** 'bison-bridge' is used to create a bison compatible scanner and share lp_yylval +*/ + +#define INITIAL 0 +#define COMMENT 1 +#define LINECOMMENT 2 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct lp_yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE lp_yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *lp_yyin_r, *lp_yyout_r; + size_t lp_yy_buffer_stack_top; /**< index of top of stack. */ + size_t lp_yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * lp_yy_buffer_stack; /**< Stack as an array. */ + char lp_yy_hold_char; + int lp_yy_n_chars; + int lp_yyleng_r; + char *lp_yy_c_buf_p; + int lp_yy_init; + int lp_yy_start; + int lp_yy_did_buffer_switch_on_eof; + int lp_yy_start_stack_ptr; + int lp_yy_start_stack_depth; + int *lp_yy_start_stack; + lp_yy_state_type lp_yy_last_accepting_state; + char* lp_yy_last_accepting_cpos; + + int lp_yylineno_r; + int lp_yy_flex_debug_r; + + char *lp_yytext_r; + int lp_yy_more_flag; + int lp_yy_more_len; + + YYSTYPE * lp_yylval_r; + + }; /* end struct lp_yyguts_t */ + +static int lp_yy_init_globals (lp_yyscan_t lp_yyscanner ); + + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define lp_yylval lp_yyg->lp_yylval_r + +int lp_yylex_init (lp_yyscan_t* scanner); + +int lp_yylex_init_extra (YY_EXTRA_TYPE user_defined,lp_yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int lp_yylex_destroy (lp_yyscan_t lp_yyscanner ); + +int lp_yyget_debug (lp_yyscan_t lp_yyscanner ); + +void lp_yyset_debug (int debug_flag ,lp_yyscan_t lp_yyscanner ); + +YY_EXTRA_TYPE lp_yyget_extra (lp_yyscan_t lp_yyscanner ); + +void lp_yyset_extra (YY_EXTRA_TYPE user_defined ,lp_yyscan_t lp_yyscanner ); + +FILE *lp_yyget_in (lp_yyscan_t lp_yyscanner ); + +void lp_yyset_in (FILE * in_str ,lp_yyscan_t lp_yyscanner ); + +FILE *lp_yyget_out (lp_yyscan_t lp_yyscanner ); + +void lp_yyset_out (FILE * out_str ,lp_yyscan_t lp_yyscanner ); + +int lp_yyget_leng (lp_yyscan_t lp_yyscanner ); + +char *lp_yyget_text (lp_yyscan_t lp_yyscanner ); + +int lp_yyget_lineno (lp_yyscan_t lp_yyscanner ); + +void lp_yyset_lineno (int line_number ,lp_yyscan_t lp_yyscanner ); + +YYSTYPE * lp_yyget_lval (lp_yyscan_t lp_yyscanner ); + +void lp_yyset_lval (YYSTYPE * lp_yylval_param ,lp_yyscan_t lp_yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int lp_yywrap (lp_yyscan_t lp_yyscanner ); +#else +extern int lp_yywrap (lp_yyscan_t lp_yyscanner ); +#endif +#endif + + static void lp_yyunput (int c,char *buf_ptr ,lp_yyscan_t lp_yyscanner); + +#ifndef lp_yytext_ptr +static void lp_yy_flex_strncpy (char *,lp_yyconst char *,int ,lp_yyscan_t lp_yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int lp_yy_flex_strlen (lp_yyconst char * ,lp_yyscan_t lp_yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int lp_yyinput (lp_yyscan_t lp_yyscanner ); +#else +static int input (lp_yyscan_t lp_yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO fwrite( lp_yytext, lp_yyleng, 1, lp_yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->lp_yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( lp_yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( lp_yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, lp_yyin))==0 && ferror(lp_yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(lp_yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "lp_yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef lp_yyterminate +#define lp_yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) lp_yy_fatal_error( msg , lp_yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int lp_yylex \ + (YYSTYPE * lp_yylval_param ,lp_yyscan_t lp_yyscanner); + +#define YY_DECL int lp_yylex \ + (YYSTYPE * lp_yylval_param , lp_yyscan_t lp_yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after lp_yytext and lp_yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( lp_yyleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol = \ + (lp_yytext[lp_yyleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register lp_yy_state_type lp_yy_current_state; + register char *lp_yy_cp, *lp_yy_bp; + register int lp_yy_act; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + lp_yylval = lp_yylval_param; + + if ( !lp_yyg->lp_yy_init ) + { + lp_yyg->lp_yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! lp_yyg->lp_yy_start ) + lp_yyg->lp_yy_start = 1; /* first start state */ + + if ( ! lp_yyin ) + lp_yyin = stdin; + + if ( ! lp_yyout ) + lp_yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + lp_yyensure_buffer_stack (lp_yyscanner); + YY_CURRENT_BUFFER_LVALUE = + lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner); + } + + lp_yy_load_buffer_state(lp_yyscanner ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + lp_yy_cp = lp_yyg->lp_yy_c_buf_p; + + /* Support of lp_yytext. */ + *lp_yy_cp = lp_yyg->lp_yy_hold_char; + + /* lp_yy_bp points to the position in lp_yy_ch_buf of the start of + * the current run. + */ + lp_yy_bp = lp_yy_cp; + + lp_yy_current_state = lp_yyg->lp_yy_start; + lp_yy_current_state += YY_AT_BOL(); +lp_yy_match: + do + { + register YY_CHAR lp_yy_c = lp_yy_ec[YY_SC_TO_UI(*lp_yy_cp)]; + if ( lp_yy_accept[lp_yy_current_state] ) + { + lp_yyg->lp_yy_last_accepting_state = lp_yy_current_state; + lp_yyg->lp_yy_last_accepting_cpos = lp_yy_cp; + } + while ( lp_yy_chk[lp_yy_base[lp_yy_current_state] + lp_yy_c] != lp_yy_current_state ) + { + lp_yy_current_state = (int) lp_yy_def[lp_yy_current_state]; + if ( lp_yy_current_state >= 144 ) + lp_yy_c = lp_yy_meta[(unsigned int) lp_yy_c]; + } + lp_yy_current_state = lp_yy_nxt[lp_yy_base[lp_yy_current_state] + (unsigned int) lp_yy_c]; + ++lp_yy_cp; + } + while ( lp_yy_base[lp_yy_current_state] != 388 ); + +lp_yy_find_action: + lp_yy_act = lp_yy_accept[lp_yy_current_state]; + if ( lp_yy_act == 0 ) + { /* have to back up */ + lp_yy_cp = lp_yyg->lp_yy_last_accepting_cpos; + lp_yy_current_state = lp_yyg->lp_yy_last_accepting_state; + lp_yy_act = lp_yy_accept[lp_yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( lp_yy_act != YY_END_OF_BUFFER && lp_yy_rule_can_match_eol[lp_yy_act] ) + { + int lp_yyl; + for ( lp_yyl = 0; lp_yyl < lp_yyleng; ++lp_yyl ) + if ( lp_yytext[lp_yyl] == '\n' ) + + do{ lp_yylineno++; + lp_yycolumn=0; + }while(0) +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( lp_yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *lp_yy_cp = lp_yyg->lp_yy_hold_char; + lp_yy_cp = lp_yyg->lp_yy_last_accepting_cpos; + lp_yy_current_state = lp_yyg->lp_yy_last_accepting_state; + goto lp_yy_find_action; + +case 1: +YY_RULE_SETUP +{ + BEGIN COMMENT; +} /* begin skip comment */ + YY_BREAK +case 2: +YY_RULE_SETUP +{ + BEGIN INITIAL; +} /* end skip comment */ + YY_BREAK +case 3: +YY_RULE_SETUP +{ +} + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +{ +} + YY_BREAK +case 5: +YY_RULE_SETUP +{ +} + YY_BREAK +case 6: +YY_RULE_SETUP +{ + BEGIN LINECOMMENT; +} /* begin skip LINECOMMENT */ + YY_BREAK +case 7: +/* rule 7 can match eol */ +YY_RULE_SETUP +{ + BEGIN INITIAL; +} /* end skip LINECOMMENT */ + YY_BREAK +case 8: +YY_RULE_SETUP +{ + BEGIN INITIAL; +} /* end skip LINECOMMENT */ + YY_BREAK +case 9: +YY_RULE_SETUP +{ +} + YY_BREAK +case 10: +/* rule 10 can match eol */ +YY_RULE_SETUP +{ +} + YY_BREAK +case 11: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + + pp->lineno = lp_yylineno; + return(COMMA); +} + YY_BREAK +case 12: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + + pp->lineno = lp_yylineno; + return(MINIMISE); +} + YY_BREAK +case 13: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + + pp->lineno = lp_yylineno; + return(MAXIMISE); +} + YY_BREAK +case 14: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + pv->f = atof((char *)lp_yytext); + return(INTCONS); +} /* f contains the last float */ + YY_BREAK +case 15: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + pv->f = atof((char *)lp_yytext); + return(CONS); +} /* f contains the last float */ + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + char *ptr, c; + + pp->lineno = lp_yylineno; + pv->f = DEF_INFINITE; + pv->Sign = 0; + ptr = (char *)lp_yytext; + while (isspace(*ptr)) ptr++; + if(*ptr == '-') + pv->Sign = 1; + if(lp_yyleng > 0) { + c = lp_yytext[lp_yyleng - 1]; + if(!isalnum(c)) + unput(c); + } + return(INF); +} /* f contains the last float */ + YY_BREAK +case 17: +/* rule 17 can match eol */ +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + int x; + + pp->lineno = lp_yylineno; + pv->Sign = 0; + for(x = 0; x < lp_yyleng; x++) + if(lp_yytext[x] == '-' || lp_yytext[x] == '+') + pv->Sign = (pv->Sign == (lp_yytext[x] == '+')); + return (TOK_SIGN); + /* Sign is TRUE if the sign-string + represents a '-'. Otherwise Sign + is FALSE */ +} + YY_BREAK +case 18: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) { + pv->Within_int_decl = 1; + pv->Within_sos_decl1 = FALSE; + } + return(SEC_INT); +} + YY_BREAK +case 19: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) { + pv->Within_int_decl = 2; + pv->Within_sos_decl1 = FALSE; + } + return(SEC_BIN); +} + YY_BREAK +case 20: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) { + pv->Within_sec_decl = TRUE; + pv->Within_sos_decl1 = FALSE; + } + return(SEC_SEC); +} + YY_BREAK +case 21: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + if(!pv->Within_sos_decl) + pv->SOStype0 = (short)atoi(((char *)lp_yytext) + 3); + if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) + pv->Within_sos_decl = TRUE; + return(SEC_SOS); +} + YY_BREAK +case 22: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + FREE(pv->Last_var); + pv->Last_var = strdup((char *)lp_yytext); + pv->Last_var[strlen(pv->Last_var) - 2] = 0; + return(SOSDESCR); +} + YY_BREAK +case 23: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) { + pv->Within_free_decl = TRUE; + pv->Within_sos_decl1 = FALSE; + } + return(SEC_FREE); +} + YY_BREAK +case 24: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + char *ptr; + + pp->lineno = lp_yylineno; + FREE(pv->Last_var); + pv->Last_var = strdup((char *)lp_yytext); + ptr = pv->Last_var + strlen(pv->Last_var); + ptr[-1] = ' '; + while ((--ptr >= pv->Last_var) && (isspace(*ptr))) + *ptr = 0; + return(VARIABLECOLON); +} + YY_BREAK +case 25: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + FREE(pv->Last_var); + pv->Last_var = strdup((char *)lp_yytext); + return(VAR); +} + YY_BREAK +case 26: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + + pp->lineno = lp_yylineno; + return (COLON); +} + YY_BREAK +case 27: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + + pp->lineno = lp_yylineno; + return(AR_M_OP); +} + YY_BREAK +case 28: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + pv->OP = *lp_yytext; + return(RE_OPEQ); +} + YY_BREAK +case 29: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + pv->OP = *lp_yytext; + return(RE_OPLE); +} + YY_BREAK +case 30: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + pv->OP = *lp_yytext; + return(RE_OPGE); +} + YY_BREAK +case 31: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + parse_vars *pv = (parse_vars *) pp->parse_vars; + + pp->lineno = lp_yylineno; + pv->Within_int_decl = pv->Within_sec_decl = pv->Within_sos_decl = pv->Within_free_decl = FALSE; + check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, (int) pv->Within_sos_decl, (int) pv->Within_free_decl); + return(END_C); +} + YY_BREAK +case 32: +YY_RULE_SETUP +{ + parse_parm *pp = PARM; + + pp->lineno = lp_yylineno; + report(NULL, CRITICAL, "LEX ERROR : %s lineno %d\n", lp_yytext, lp_yylineno); + return(UNDEFINED); +} + YY_BREAK +case 33: +YY_RULE_SETUP +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMENT): +case YY_STATE_EOF(LINECOMMENT): + lp_yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int lp_yy_amount_of_matched_text = (int) (lp_yy_cp - lp_yyg->lp_yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *lp_yy_cp = lp_yyg->lp_yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed lp_yyin at a new source and called + * lp_yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + lp_yyg->lp_yy_n_chars = YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->lp_yy_input_file = lp_yyin; + YY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for lp_yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since lp_yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( lp_yyg->lp_yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars] ) + { /* This was really a NUL. */ + lp_yy_state_type lp_yy_next_state; + + lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yytext_ptr + lp_yy_amount_of_matched_text; + + lp_yy_current_state = lp_yy_get_previous_state( lp_yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * lp_yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + lp_yy_next_state = lp_yy_try_NUL_trans( lp_yy_current_state , lp_yyscanner); + + lp_yy_bp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ; + + if ( lp_yy_next_state ) + { + /* Consume the NUL. */ + lp_yy_cp = ++lp_yyg->lp_yy_c_buf_p; + lp_yy_current_state = lp_yy_next_state; + goto lp_yy_match; + } + + else + { + lp_yy_cp = lp_yyg->lp_yy_c_buf_p; + goto lp_yy_find_action; + } + } + + else switch ( lp_yy_get_next_buffer( lp_yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + lp_yyg->lp_yy_did_buffer_switch_on_eof = 0; + + if ( lp_yywrap(lp_yyscanner ) ) + { + /* Note: because we've taken care in + * lp_yy_get_next_buffer() to have set up + * lp_yytext, we can now set up + * lp_yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ; + + lp_yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! lp_yyg->lp_yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + lp_yyg->lp_yy_c_buf_p = + lp_yyg->lp_yytext_ptr + lp_yy_amount_of_matched_text; + + lp_yy_current_state = lp_yy_get_previous_state( lp_yyscanner ); + + lp_yy_cp = lp_yyg->lp_yy_c_buf_p; + lp_yy_bp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ; + goto lp_yy_match; + + case EOB_ACT_LAST_MATCH: + lp_yyg->lp_yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars]; + + lp_yy_current_state = lp_yy_get_previous_state( lp_yyscanner ); + + lp_yy_cp = lp_yyg->lp_yy_c_buf_p; + lp_yy_bp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ; + goto lp_yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of lp_yylex */ + +/* lp_yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int lp_yy_get_next_buffer (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + register char *dest = YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf; + register char *source = lp_yyg->lp_yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( lp_yyg->lp_yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->lp_yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( lp_yyg->lp_yy_c_buf_p - lp_yyg->lp_yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (lp_yyg->lp_yy_c_buf_p - lp_yyg->lp_yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int lp_yy_c_buf_p_offset = + (int) (lp_yyg->lp_yy_c_buf_p - b->lp_yy_ch_buf); + + if ( b->lp_yy_is_our_buffer ) + { + int new_size = b->lp_yy_buf_size * 2; + + if ( new_size <= 0 ) + b->lp_yy_buf_size += b->lp_yy_buf_size / 8; + else + b->lp_yy_buf_size *= 2; + + b->lp_yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + lp_yyrealloc((void *) b->lp_yy_ch_buf,b->lp_yy_buf_size + 2 ,lp_yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->lp_yy_ch_buf = 0; + + if ( ! b->lp_yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + lp_yyg->lp_yy_c_buf_p = &b->lp_yy_ch_buf[lp_yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[number_to_move]), + lp_yyg->lp_yy_n_chars, (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars; + } + + if ( lp_yyg->lp_yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + lp_yyrestart(lp_yyin ,lp_yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((lp_yy_size_t) (lp_yyg->lp_yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + lp_yy_size_t new_size = lp_yyg->lp_yy_n_chars + number_to_move + (lp_yyg->lp_yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf = (char *) lp_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf,new_size ,lp_yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yy_get_next_buffer()" ); + } + + lp_yyg->lp_yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + lp_yyg->lp_yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[0]; + + return ret_val; +} + +/* lp_yy_get_previous_state - get the state just before the EOB char was reached */ + + static lp_yy_state_type lp_yy_get_previous_state (lp_yyscan_t lp_yyscanner) +{ + register lp_yy_state_type lp_yy_current_state; + register char *lp_yy_cp; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + lp_yy_current_state = lp_yyg->lp_yy_start; + lp_yy_current_state += YY_AT_BOL(); + + for ( lp_yy_cp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ; lp_yy_cp < lp_yyg->lp_yy_c_buf_p; ++lp_yy_cp ) + { + register YY_CHAR lp_yy_c = (*lp_yy_cp ? lp_yy_ec[YY_SC_TO_UI(*lp_yy_cp)] : 1); + if ( lp_yy_accept[lp_yy_current_state] ) + { + lp_yyg->lp_yy_last_accepting_state = lp_yy_current_state; + lp_yyg->lp_yy_last_accepting_cpos = lp_yy_cp; + } + while ( lp_yy_chk[lp_yy_base[lp_yy_current_state] + lp_yy_c] != lp_yy_current_state ) + { + lp_yy_current_state = (int) lp_yy_def[lp_yy_current_state]; + if ( lp_yy_current_state >= 144 ) + lp_yy_c = lp_yy_meta[(unsigned int) lp_yy_c]; + } + lp_yy_current_state = lp_yy_nxt[lp_yy_base[lp_yy_current_state] + (unsigned int) lp_yy_c]; + } + + return lp_yy_current_state; +} + +/* lp_yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = lp_yy_try_NUL_trans( current_state ); + */ + static lp_yy_state_type lp_yy_try_NUL_trans (lp_yy_state_type lp_yy_current_state , lp_yyscan_t lp_yyscanner) +{ + register int lp_yy_is_jam; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; /* This var may be unused depending upon options. */ + register char *lp_yy_cp = lp_yyg->lp_yy_c_buf_p; + + register YY_CHAR lp_yy_c = 1; + if ( lp_yy_accept[lp_yy_current_state] ) + { + lp_yyg->lp_yy_last_accepting_state = lp_yy_current_state; + lp_yyg->lp_yy_last_accepting_cpos = lp_yy_cp; + } + while ( lp_yy_chk[lp_yy_base[lp_yy_current_state] + lp_yy_c] != lp_yy_current_state ) + { + lp_yy_current_state = (int) lp_yy_def[lp_yy_current_state]; + if ( lp_yy_current_state >= 144 ) + lp_yy_c = lp_yy_meta[(unsigned int) lp_yy_c]; + } + lp_yy_current_state = lp_yy_nxt[lp_yy_base[lp_yy_current_state] + (unsigned int) lp_yy_c]; + lp_yy_is_jam = (lp_yy_current_state == 143); + + return lp_yy_is_jam ? 0 : lp_yy_current_state; +} + + static void lp_yyunput (int c, register char * lp_yy_bp , lp_yyscan_t lp_yyscanner) +{ + register char *lp_yy_cp; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + lp_yy_cp = lp_yyg->lp_yy_c_buf_p; + + /* undo effects of setting up lp_yytext */ + *lp_yy_cp = lp_yyg->lp_yy_hold_char; + + if ( lp_yy_cp < YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = lp_yyg->lp_yy_n_chars + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf ) + *--dest = *--source; + + lp_yy_cp += (int) (dest - source); + lp_yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = + lp_yyg->lp_yy_n_chars = YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size; + + if ( lp_yy_cp < YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--lp_yy_cp = (char) c; + + if ( c == '\n' ){ + --lp_yylineno; + } + + lp_yyg->lp_yytext_ptr = lp_yy_bp; + lp_yyg->lp_yy_hold_char = *lp_yy_cp; + lp_yyg->lp_yy_c_buf_p = lp_yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static inline int lp_yyinput (lp_yyscan_t lp_yyscanner) +#else + static inline int input (lp_yyscan_t lp_yyscanner) +#endif + +{ + int c; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + *lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yy_hold_char; + + if ( *lp_yyg->lp_yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* lp_yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( lp_yyg->lp_yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars] ) + /* This was really a NUL. */ + *lp_yyg->lp_yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = lp_yyg->lp_yy_c_buf_p - lp_yyg->lp_yytext_ptr; + ++lp_yyg->lp_yy_c_buf_p; + + switch ( lp_yy_get_next_buffer( lp_yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because lp_yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + lp_yyrestart(lp_yyin ,lp_yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( lp_yywrap(lp_yyscanner ) ) + return EOF; + + if ( ! lp_yyg->lp_yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return lp_yyinput(lp_yyscanner); +#else + return input(lp_yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) lp_yyg->lp_yy_c_buf_p; /* cast for 8-bit char's */ + *lp_yyg->lp_yy_c_buf_p = '\0'; /* preserve lp_yytext */ + lp_yyg->lp_yy_hold_char = *++lp_yyg->lp_yy_c_buf_p; + + YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol = (c == '\n'); + if ( YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol ) + + do{ lp_yylineno++; + lp_yycolumn=0; + }while(0) +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param lp_yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void lp_yyrestart (FILE * input_file , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + lp_yyensure_buffer_stack (lp_yyscanner); + YY_CURRENT_BUFFER_LVALUE = + lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner); + } + + lp_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,lp_yyscanner); + lp_yy_load_buffer_state(lp_yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param lp_yyscanner The scanner object. + */ + void lp_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * lp_yypop_buffer_state(); + * lp_yypush_buffer_state(new_buffer); + */ + lp_yyensure_buffer_stack (lp_yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_pos = lp_yyg->lp_yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + lp_yy_load_buffer_state(lp_yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (lp_yywrap()) processing, but the only time this flag + * is looked at is after lp_yywrap() is called, so it's safe + * to go ahead and always set it. + */ + lp_yyg->lp_yy_did_buffer_switch_on_eof = 1; +} + +static void lp_yy_load_buffer_state (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + lp_yyg->lp_yy_n_chars = YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars; + lp_yyg->lp_yytext_ptr = lp_yyg->lp_yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_pos; + lp_yyin = YY_CURRENT_BUFFER_LVALUE->lp_yy_input_file; + lp_yyg->lp_yy_hold_char = *lp_yyg->lp_yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param lp_yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE lp_yy_create_buffer (FILE * file, int size , lp_yyscan_t lp_yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) lp_yyalloc(sizeof( struct lp_yy_buffer_state ) ,lp_yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yy_create_buffer()" ); + + b->lp_yy_buf_size = size; + + /* lp_yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->lp_yy_ch_buf = (char *) lp_yyalloc(b->lp_yy_buf_size + 2 ,lp_yyscanner ); + if ( ! b->lp_yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yy_create_buffer()" ); + + b->lp_yy_is_our_buffer = 1; + + lp_yy_init_buffer(b,file ,lp_yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with lp_yy_create_buffer() + * @param lp_yyscanner The scanner object. + */ + void lp_yy_delete_buffer (YY_BUFFER_STATE b , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->lp_yy_is_our_buffer ) + lp_yyfree((void *) b->lp_yy_ch_buf ,lp_yyscanner ); + + lp_yyfree((void *) b ,lp_yyscanner ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a lp_yyrestart() or at EOF. + */ + static void lp_yy_init_buffer (YY_BUFFER_STATE b, FILE * file , lp_yyscan_t lp_yyscanner) + +{ + int oerrno = errno; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + lp_yy_flush_buffer(b ,lp_yyscanner); + + b->lp_yy_input_file = file; + b->lp_yy_fill_buffer = 1; + + /* If b is the current buffer, then lp_yy_init_buffer was _probably_ + * called from lp_yyrestart() or through lp_yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->lp_yy_bs_lineno = 1; + b->lp_yy_bs_column = 0; + } + + b->lp_yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param lp_yyscanner The scanner object. + */ + void lp_yy_flush_buffer (YY_BUFFER_STATE b , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + if ( ! b ) + return; + + b->lp_yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->lp_yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->lp_yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->lp_yy_buf_pos = &b->lp_yy_ch_buf[0]; + + b->lp_yy_at_bol = 1; + b->lp_yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + lp_yy_load_buffer_state(lp_yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param lp_yyscanner The scanner object. + */ +void lp_yypush_buffer_state (YY_BUFFER_STATE new_buffer , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + if (new_buffer == NULL) + return; + + lp_yyensure_buffer_stack(lp_yyscanner); + + /* This block is copied from lp_yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_pos = lp_yyg->lp_yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + lp_yyg->lp_yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from lp_yy_switch_to_buffer. */ + lp_yy_load_buffer_state(lp_yyscanner ); + lp_yyg->lp_yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param lp_yyscanner The scanner object. + */ +void lp_yypop_buffer_state (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + lp_yy_delete_buffer(YY_CURRENT_BUFFER ,lp_yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (lp_yyg->lp_yy_buffer_stack_top > 0) + --lp_yyg->lp_yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + lp_yy_load_buffer_state(lp_yyscanner ); + lp_yyg->lp_yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void lp_yyensure_buffer_stack (lp_yyscan_t lp_yyscanner) +{ + int num_to_alloc; + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + if (!lp_yyg->lp_yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + lp_yyg->lp_yy_buffer_stack = (struct lp_yy_buffer_state**)lp_yyalloc + (num_to_alloc * sizeof(struct lp_yy_buffer_state*) + , lp_yyscanner); + if ( ! lp_yyg->lp_yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yyensure_buffer_stack()" ); + + memset(lp_yyg->lp_yy_buffer_stack, 0, num_to_alloc * sizeof(struct lp_yy_buffer_state*)); + + lp_yyg->lp_yy_buffer_stack_max = num_to_alloc; + lp_yyg->lp_yy_buffer_stack_top = 0; + return; + } + + if (lp_yyg->lp_yy_buffer_stack_top >= (lp_yyg->lp_yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = lp_yyg->lp_yy_buffer_stack_max + grow_size; + lp_yyg->lp_yy_buffer_stack = (struct lp_yy_buffer_state**)lp_yyrealloc + (lp_yyg->lp_yy_buffer_stack, + num_to_alloc * sizeof(struct lp_yy_buffer_state*) + , lp_yyscanner); + if ( ! lp_yyg->lp_yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(lp_yyg->lp_yy_buffer_stack + lp_yyg->lp_yy_buffer_stack_max, 0, grow_size * sizeof(struct lp_yy_buffer_state*)); + lp_yyg->lp_yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param lp_yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE lp_yy_scan_buffer (char * base, lp_yy_size_t size , lp_yyscan_t lp_yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) lp_yyalloc(sizeof( struct lp_yy_buffer_state ) ,lp_yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yy_scan_buffer()" ); + + b->lp_yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->lp_yy_buf_pos = b->lp_yy_ch_buf = base; + b->lp_yy_is_our_buffer = 0; + b->lp_yy_input_file = 0; + b->lp_yy_n_chars = b->lp_yy_buf_size; + b->lp_yy_is_interactive = 0; + b->lp_yy_at_bol = 1; + b->lp_yy_fill_buffer = 0; + b->lp_yy_buffer_status = YY_BUFFER_NEW; + + lp_yy_switch_to_buffer(b ,lp_yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to lp_yylex() will + * scan from a @e copy of @a str. + * @param lp_yystr a NUL-terminated string to scan + * @param lp_yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * lp_yy_scan_bytes() instead. + */ +YY_BUFFER_STATE lp_yy_scan_string (lp_yyconst char * lp_yystr , lp_yyscan_t lp_yyscanner) +{ + + return lp_yy_scan_bytes(lp_yystr,strlen(lp_yystr) ,lp_yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to lp_yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * @param lp_yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE lp_yy_scan_bytes (lp_yyconst char * lp_yybytes, int _lp_yybytes_len , lp_yyscan_t lp_yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + lp_yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _lp_yybytes_len + 2; + buf = (char *) lp_yyalloc(n ,lp_yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in lp_yy_scan_bytes()" ); + + for ( i = 0; i < _lp_yybytes_len; ++i ) + buf[i] = lp_yybytes[i]; + + buf[_lp_yybytes_len] = buf[_lp_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = lp_yy_scan_buffer(buf,n ,lp_yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in lp_yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->lp_yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void lp_yy_fatal_error (lp_yyconst char* msg , lp_yyscan_t lp_yyscanner) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine lp_yyless() so it works in section 3 code. */ + +#undef lp_yyless +#define lp_yyless(n) \ + do \ + { \ + /* Undo effects of setting up lp_yytext. */ \ + int lp_yyless_macro_arg = (n); \ + YY_LESS_LINENO(lp_yyless_macro_arg);\ + lp_yytext[lp_yyleng] = lp_yyg->lp_yy_hold_char; \ + lp_yyg->lp_yy_c_buf_p = lp_yytext + lp_yyless_macro_arg; \ + lp_yyg->lp_yy_hold_char = *lp_yyg->lp_yy_c_buf_p; \ + *lp_yyg->lp_yy_c_buf_p = '\0'; \ + lp_yyleng = lp_yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param lp_yyscanner The scanner object. + */ +YY_EXTRA_TYPE lp_yyget_extra (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yyextra; +} + +/** Get the current line number. + * @param lp_yyscanner The scanner object. + */ +int lp_yyget_lineno (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return lp_yylineno; +} + +/** Get the current column number. + * @param lp_yyscanner The scanner object. + */ +int lp_yyget_column (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return lp_yycolumn; +} + +/** Get the input stream. + * @param lp_yyscanner The scanner object. + */ +FILE *lp_yyget_in (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yyin; +} + +/** Get the output stream. + * @param lp_yyscanner The scanner object. + */ +FILE *lp_yyget_out (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yyout; +} + +/** Get the length of the current token. + * @param lp_yyscanner The scanner object. + */ +int lp_yyget_leng (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yyleng; +} + +/** Get the current token. + * @param lp_yyscanner The scanner object. + */ + +char *lp_yyget_text (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param lp_yyscanner The scanner object. + */ +void lp_yyset_extra (YY_EXTRA_TYPE user_defined , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + lp_yyextra = user_defined ; +} + +/** Set the current line number. + * @param line_number + * @param lp_yyscanner The scanner object. + */ +void lp_yyset_lineno (int line_number , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + lp_yy_fatal_error( "lp_yyset_lineno called with no buffer" , lp_yyscanner); + + lp_yylineno = line_number; +} + +/** Set the current column. + * @param line_number + * @param lp_yyscanner The scanner object. + */ +void lp_yyset_column (int column_no , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + lp_yy_fatal_error( "lp_yyset_column called with no buffer" , lp_yyscanner); + + lp_yycolumn = column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * @param lp_yyscanner The scanner object. + * @see lp_yy_switch_to_buffer + */ +void lp_yyset_in (FILE * in_str , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + lp_yyin = in_str ; +} + +void lp_yyset_out (FILE * out_str , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + lp_yyout = out_str ; +} + +int lp_yyget_debug (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yy_flex_debug; +} + +void lp_yyset_debug (int bdebug , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + lp_yy_flex_debug = bdebug ; +} + +/* Accessor methods for lp_yylval and lp_yylloc */ + +YYSTYPE * lp_yyget_lval (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + return lp_yylval; +} + +void lp_yyset_lval (YYSTYPE * lp_yylval_param , lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + lp_yylval = lp_yylval_param; +} + +/* User-visible API */ + +/* lp_yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int lp_yylex_init(lp_yyscan_t* ptr_lp_yy_globals) + +{ + if (ptr_lp_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_lp_yy_globals = (lp_yyscan_t) lp_yyalloc ( sizeof( struct lp_yyguts_t ), NULL ); + + if (*ptr_lp_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in lp_yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_lp_yy_globals,0x00,sizeof(struct lp_yyguts_t)); + + return lp_yy_init_globals ( *ptr_lp_yy_globals ); +} + +/* lp_yylex_init_extra has the same functionality as lp_yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to lp_yyalloc in + * the lp_yyextra field. + */ + +int lp_yylex_init_extra(YY_EXTRA_TYPE lp_yy_user_defined,lp_yyscan_t* ptr_lp_yy_globals ) + +{ + struct lp_yyguts_t dummy_lp_yyguts; + + lp_yyset_extra (lp_yy_user_defined, &dummy_lp_yyguts); + + if (ptr_lp_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_lp_yy_globals = (lp_yyscan_t) lp_yyalloc ( sizeof( struct lp_yyguts_t ), &dummy_lp_yyguts ); + + if (*ptr_lp_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + lp_yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_lp_yy_globals,0x00,sizeof(struct lp_yyguts_t)); + + lp_yyset_extra (lp_yy_user_defined, *ptr_lp_yy_globals); + + return lp_yy_init_globals ( *ptr_lp_yy_globals ); +} + +static int lp_yy_init_globals (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from lp_yylex_destroy(), so don't allocate here. + */ + + lp_yyg->lp_yy_buffer_stack = 0; + lp_yyg->lp_yy_buffer_stack_top = 0; + lp_yyg->lp_yy_buffer_stack_max = 0; + lp_yyg->lp_yy_c_buf_p = (char *) 0; + lp_yyg->lp_yy_init = 0; + lp_yyg->lp_yy_start = 0; + + lp_yyg->lp_yy_start_stack_ptr = 0; + lp_yyg->lp_yy_start_stack_depth = 0; + lp_yyg->lp_yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + lp_yyin = stdin; + lp_yyout = stdout; +#else + lp_yyin = (FILE *) 0; + lp_yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * lp_yylex_init() + */ + return 0; +} + +/* lp_yylex_destroy is for both reentrant and non-reentrant scanners. */ +int lp_yylex_destroy (lp_yyscan_t lp_yyscanner) +{ + struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + lp_yy_delete_buffer(YY_CURRENT_BUFFER ,lp_yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + lp_yypop_buffer_state(lp_yyscanner); + } + + /* Destroy the stack itself. */ + lp_yyfree(lp_yyg->lp_yy_buffer_stack ,lp_yyscanner); + lp_yyg->lp_yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + lp_yyfree(lp_yyg->lp_yy_start_stack ,lp_yyscanner ); + lp_yyg->lp_yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * lp_yylex() is called, initialization will occur. */ + lp_yy_init_globals( lp_yyscanner); + + /* Destroy the main struct (reentrant only). */ + lp_yyfree ( lp_yyscanner , lp_yyscanner ); + lp_yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef lp_yytext_ptr +static void lp_yy_flex_strncpy (char* s1, lp_yyconst char * s2, int n , lp_yyscan_t lp_yyscanner) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int lp_yy_flex_strlen (lp_yyconst char * s , lp_yyscan_t lp_yyscanner) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *lp_yyalloc (lp_yy_size_t size , lp_yyscan_t lp_yyscanner) +{ + return (void *) malloc( size ); +} + +void *lp_yyrealloc (void * ptr, lp_yy_size_t size , lp_yyscan_t lp_yyscanner) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void lp_yyfree (void * ptr , lp_yyscan_t lp_yyscanner) +{ + free( (char *) ptr ); /* see lp_yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "lp_yytables" + From 074a562ab1984fcd1f3aa58f6bd63d0d109842ca Mon Sep 17 00:00:00 2001 From: Apostolos Chalkis Date: Tue, 17 Oct 2023 07:00:09 -0600 Subject: [PATCH 02/44] No-U-Turn Sampler in HMC (#216) * initialize nuts sampler class * implement the burnin of nuts sampler * add tests and resolve bugs * implement e0 estimation in burnin of nuts * optimize leapfrog * integrate nuts into the R interface * document random walk in sample_points.cpp in R interface * fix burnin for the non-truncated case * resolve bugs in hmc and nuts pipelines * improve the preprocess in burin step of nuts * split large lines in sample_points.cpp * Add NUTS C++ example and update CMake (#29) * resolve PR comments * fix minor bug * fix compiler bug * fix error in building the C++ examples * resolve warnings in sample_points * fix lpsolve cran warning * fix cran warning on mac * improve lpsolve cmake for cran check * fix R warning in mac test * remove lpsolve header * resolve PR comments --------- Co-authored-by: Marios Papachristou Co-authored-by: Apostolos Chalkis --- R-proj/R/RcppExports.R | 5 - R-proj/examples/logconcave/nuts_rand_poly.R | 55 +++ .../logconcave/simple_hmc_rand_poly.R | 4 +- R-proj/man/sample_points.Rd | 18 +- R-proj/src/sample_points.cpp | 54 ++- examples/logconcave/CMakeLists.txt | 18 +- external/cmake-files/LPSolve.cmake | 2 +- include/cartesian_geom/point.h | 1 + include/ode_solvers/leapfrog.hpp | 39 +- .../estimate_L_smooth_parameter.hpp | 73 ++++ .../hamiltonian_monte_carlo_walk.hpp | 9 +- include/random_walks/nuts_hmc_walk.hpp | 380 ++++++++++++++++++ include/random_walks/random_walks.hpp | 1 + include/sampling/random_point_generators.hpp | 19 +- include/sampling/sampling.hpp | 38 +- test/CMakeLists.txt | 5 + test/logconcave_sampling_test.cpp | 89 ++++ 17 files changed, 732 insertions(+), 78 deletions(-) create mode 100644 R-proj/examples/logconcave/nuts_rand_poly.R create mode 100644 include/preprocess/estimate_L_smooth_parameter.hpp create mode 100644 include/random_walks/nuts_hmc_walk.hpp diff --git a/R-proj/R/RcppExports.R b/R-proj/R/RcppExports.R index 5713d11a3..c3f192aee 100644 --- a/R-proj/R/RcppExports.R +++ b/R-proj/R/RcppExports.R @@ -361,11 +361,6 @@ sample_points <- function(P, n, random_walk = NULL, distribution = NULL, seed = .Call(`_volesti_sample_points`, P, n, random_walk, distribution, seed) } -#' @export -sample_spectra <- function(file = NULL, N = NULL, walk_length = NULL) { - .Call(`_volesti_sample_spectra`, file, N, walk_length) -} - #' Write a SDPA format file #' #' Outputs a spectrahedron (the matrices defining a linear matrix inequality) and a vector (the objective function) diff --git a/R-proj/examples/logconcave/nuts_rand_poly.R b/R-proj/examples/logconcave/nuts_rand_poly.R new file mode 100644 index 000000000..00400ba72 --- /dev/null +++ b/R-proj/examples/logconcave/nuts_rand_poly.R @@ -0,0 +1,55 @@ +# VolEsti (volume computation and sampling library) + +# Copyright (c) 2012-2020 Vissarion Fisikopoulos +# Copyright (c) 2018-2020 Apostolos Chalkis +# Copyright (c) 2020-2020 Marios Papachristou + +# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. + +# Licensed under GNU LGPL.3, see LICENCE file + +# Example script for using the logconcave sampling methods + +# Import required libraries +library(ggplot2) +library(volesti) + +# Sampling from logconcave density example + +# Helper function +norm_vec <- function(x) sqrt(sum(x^2)) + +# Negative log-probability oracle +f <- function(x) (norm_vec(x)^2 + sum(x)) + +# Negative log-probability gradient oracle +grad_f <- function(x) (2 * x + 1) + +dimension <- 50 +facets <- 200 + +# Create domain of truncation +H <- gen_rand_hpoly(dimension, facets, seed = 15) + +# Rounding +Tr <- rounding(H, seed = 127) + +P <- Hpolytope$new(A = Tr$Mat[1:nrow(Tr$Mat), 2:ncol(Tr$Mat)], b = Tr$Mat[,1]) + +x_min = matrix(0, dimension, 1) + +# Warm start point from truncated Gaussian +warm_start <- sample_points(P, n = 1, random_walk = list("nburns" = 5000), distribution = list("density" = "gaussian", "variance" = 1/2, "mode" = x_min)) + +# Sample points +n_samples <- 20000 + +samples <- sample_points(P, n = n_samples, random_walk = list("walk" = "NUTS", "solver" = "leapfrog", "starting_point" = warm_start[,1]), + distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f)) + +# Plot histogram +hist(samples[1,], probability=TRUE, breaks = 100) + +psrfs <- psrf_univariate(samples) +n_ess <- ess(samples) + diff --git a/R-proj/examples/logconcave/simple_hmc_rand_poly.R b/R-proj/examples/logconcave/simple_hmc_rand_poly.R index 9f785aaa8..b352c9a16 100644 --- a/R-proj/examples/logconcave/simple_hmc_rand_poly.R +++ b/R-proj/examples/logconcave/simple_hmc_rand_poly.R @@ -29,10 +29,10 @@ dimension <- 50 facets <- 200 # Create domain of truncation -H <- gen_rand_hpoly(dimension, facets) +H <- gen_rand_hpoly(dimension, facets, seed = 15) # Rounding -Tr <- rounding(H) +Tr <- rounding(H, seed = 127) P <- Hpolytope$new(A = Tr$Mat[1:nrow(Tr$Mat), 2:ncol(Tr$Mat)], b = Tr$Mat[,1]) diff --git a/R-proj/man/sample_points.Rd b/R-proj/man/sample_points.Rd index f5ea6f2bf..ca2ef87fa 100644 --- a/R-proj/man/sample_points.Rd +++ b/R-proj/man/sample_points.Rd @@ -13,7 +13,7 @@ sample_points(P, n, random_walk = NULL, distribution = NULL, seed = NULL) \item{random_walk}{Optional. A list that declares the random walk and some related parameters as follows: \itemize{ -\item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave) xi) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method. The default walk is \code{'aBiW'} for the uniform distribution or \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes.} +\item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'NUTS'} for NUTS Hamiltonian Monte Carlo sampler (logconcave densities) xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities) xii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities) xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities.} \item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} \item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} \item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} @@ -25,13 +25,14 @@ sample_points(P, n, random_walk = NULL, distribution = NULL, seed = NULL) \item{distribution}{Optional. A list that declares the target density and some related parameters as follows: \itemize{ -\item{\code{density} }{ A string: (a) \code{'uniform'} for the uniform distribution or b) \code{'gaussian'} for the multidimensional spherical distribution. The default target distribution is uniform. c) Logconcave with form proportional to exp(-f(x)) where f(x) is L-smooth and m-strongly-convex. } -\item{\code{variance} }{ The variance of the multidimensional spherical gaussian. The default value is 1.} +\item{\code{density} }{ A string: (a) \code{'uniform'} for the uniform distribution or b) \code{'gaussian'} for the multidimensional spherical distribution c) \code{logconcave} with form proportional to exp(-f(x)) where f(x) is L-smooth and m-strongly-convex d) \code{'exponential'} for the exponential distribution. The default target distribution is the uniform distribution.} +\item{\code{variance} }{ The variance of the multidimensional spherical gaussian or the exponential distribution. The default value is 1.} \item{\code{mode} }{ A \eqn{d}-dimensional numerical vector that declares the mode of the Gaussian distribution. The default choice is the center of the as that one computed by the function \code{inner_ball()}.} -\item{\code{L_}} { Smoothness constant (for logconcave). } -\item{\code{m}} { Strong-convexity constant (for logconcave). } -\item{\code{negative_logprob}} { Negative log-probability (for logconcave). } -\item{\code{negative_logprob_gradient}} { Negative log-probability gradient (for logconcave). } +\item{\code{bias} }{ The bias vector for the exponential distribution. The default vector is \eqn{c_1 = 1} and \eqn{c_i = 0} for \eqn{i \neq 1}.} +\item{\code{L_} }{ Smoothness constant (for logconcave). } +\item{\code{m} }{ Strong-convexity constant (for logconcave). } +\item{\code{negative_logprob} }{ Negative log-probability (for logconcave). } +\item{\code{negative_logprob_gradient} }{ Negative log-probability gradient (for logconcave). } }} \item{seed}{Optional. A fixed seed for the number generator.} @@ -75,4 +76,7 @@ points = sample_points(P, n = 100, random_walk = list("walk" = "BRDHR")) \cite{Shen, Ruoqi, and Yin Tat Lee, \dQuote{"The randomized midpoint method for log-concave sampling.",} \emph{Advances in Neural Information Processing Systems}, 2019.} + +\cite{Augustin Chevallier, Sylvain Pion, Frederic Cazals, +\dQuote{"Hamiltonian Monte Carlo with boundary reflections, and application to polytope volume calculations,"} \emph{Research Report preprint hal-01919855}, 2018.} } diff --git a/R-proj/src/sample_points.cpp b/R-proj/src/sample_points.cpp index b1150877f..4756d0915 100644 --- a/R-proj/src/sample_points.cpp +++ b/R-proj/src/sample_points.cpp @@ -36,6 +36,7 @@ enum random_walks { brdhr, bcdhr, hmc, + nuts, gaussian_hmc, exponential_hmc, uld @@ -213,6 +214,26 @@ void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPo } break; + case nuts: + + logconcave_sampling < + PointList, + Polytope, + RNGType, + NutsHamiltonianMonteCarloWalk, + NT, + Point, + NegativeGradientFunctor, + NegativeLogprobFunctor, + LeapfrogODESolver < + Point, + NT, + Polytope, + NegativeGradientFunctor + > + >(randPoints, P, rng, walkL, numpoints, StartingPoint, nburns, *F, *f); + + break; case uld: logconcave_sampling < @@ -244,7 +265,16 @@ void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPo //' @param n The number of points that the function is going to sample from the convex polytope. //' @param random_walk Optional. A list that declares the random walk and some related parameters as follows: //' \itemize{ -//' \item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities) xi) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method xii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). The default walk is \code{'aBiW'} for the uniform distribution or \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes.} +//' \item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, +//' ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, +//' iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, +//' vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or +//' ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'NUTS'} for +//' NUTS Hamiltonian Monte Carlo sampler (logconcave densities) xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities) +//' xii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities) +//' xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). +//' The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes +//' and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities.} //' \item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} //' \item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} //' \item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} @@ -410,18 +440,24 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, Rcpp::Function negative_logprob = Rcpp::as(distribution)["negative_logprob"]; Rcpp::Function negative_logprob_gradient = Rcpp::as(distribution)["negative_logprob_gradient"]; - NT L_, m; + NT L_ = 1, m = 1; if (Rcpp::as(distribution).containsElementNamed("L_")) { L_ = Rcpp::as(Rcpp::as(distribution)["L_"]); + if (L_ <= NT(0)) { + throw Rcpp::exception("The smoothness constant must be positive"); + } } else { - throw Rcpp::exception("The smoothness constant is absent"); + L_ = -1; } if (Rcpp::as(distribution).containsElementNamed("m")) { m = Rcpp::as(Rcpp::as(distribution)["m"]); + if (m <= NT(0)) { + throw Rcpp::exception("The strong-convexity constant must be positive"); + } } else { - throw Rcpp::exception("The strong-convexity constant is absent"); + m = -1; } if (Rcpp::as(random_walk).containsElementNamed("step_size")) { @@ -443,7 +479,6 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, throw Rcpp::exception("Invalid ODE solver specified. Aborting."); } } else { - Rcpp::warning("Solver set to leapfrog."); solver = leapfrog; } @@ -495,6 +530,8 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, throw Rcpp::exception("Exponential sampling is supported only for H-polytopes"); } walk = exponential_hmc; + } else if (logconcave) { + walk = nuts; } else if (gaussian) { if (type == 1) { walk = cdhr; @@ -571,7 +608,12 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, } } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("HMC")) == 0) { if (!logconcave) throw Rcpp::exception("HMC is not supported for non first-order sampling"); + if (F->params.L < 0) throw Rcpp::exception("The smoothness constant is absent"); + if (F->params.m < 0) throw Rcpp::exception("The strong-convexity constant is absent"); walk = hmc; + } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("NUTS")) == 0) { + if (!logconcave) throw Rcpp::exception("NUTS is not supported for non first-order sampling"); + walk = nuts; } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("ULD")) == 0) { if (!logconcave) throw Rcpp::exception("ULD is not supported for non first-order sampling"); walk = uld; @@ -703,7 +745,7 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, if (numpoints % 2 == 1 && (walk == brdhr || walk == bcdhr)) numpoints--; MT RetMat(dim, numpoints); unsigned int jj = 0; - + for (typename std::list::iterator rpit = randPoints.begin(); rpit!=randPoints.end(); rpit++, jj++) { if (gaussian) { RetMat.col(jj) = (*rpit).getCoefficients() + mode.getCoefficients(); diff --git a/examples/logconcave/CMakeLists.txt b/examples/logconcave/CMakeLists.txt index 0448ce3e3..33725d0c9 100644 --- a/examples/logconcave/CMakeLists.txt +++ b/examples/logconcave/CMakeLists.txt @@ -20,7 +20,7 @@ endif(COMMAND cmake_policy) option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON) option(BUILTIN_EIGEN "Use eigen from ../external" OFF) -option(USE_MKL "Use MKL library to build eigen" ON) +option(USE_MKL "Use MKL library to build eigen" OFF) if(DISABLE_NLP_ORACLES) add_definitions(-DDISABLE_NLP_ORACLES) @@ -73,16 +73,24 @@ else () include_directories(BEFORE /usr/include/eigen3) endif(BUILTIN_EIGEN) +find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) + if (USE_MKL) - find_library(BLAS NAME libblas.so PATHS /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu) + find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) + find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) + find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) + find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) + include_directories (BEFORE ${MKLROOT}/include) - set(PROJECT_LIBS ${BLAS_LIBRARIES}) + set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") add_definitions(-DEIGEN_USE_MKL_ALL) +else() + set(MKL_LINK "") endif(USE_MKL) # Find lpsolve library -find_library(LP_SOLVE NAMES liblpsolve55.so PATHS /usr/lib/lp_solve) +find_library(LP_SOLVE NAMES liblpsolve55.so liblpsolve55.dylib PATHS /usr/lib/lp_solve /usr/local/lib) if (NOT LP_SOLVE) message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") @@ -145,6 +153,6 @@ else () TARGET_LINK_LIBRARIES(simple_hmc ${LP_SOLVE} ${BLAS} ${MKL_LINK} ) TARGET_LINK_LIBRARIES(exponential_exact_hmc ${LP_SOLVE} ${BLAS} ${MKL_LINK} ) TARGET_LINK_LIBRARIES(gaussian_exact_hmc ${LP_SOLVE} ${BLAS} ${MKL_LINK} ) - + endif() diff --git a/external/cmake-files/LPSolve.cmake b/external/cmake-files/LPSolve.cmake index b3f3cf98b..c5a173837 100644 --- a/external/cmake-files/LPSolve.cmake +++ b/external/cmake-files/LPSolve.cmake @@ -26,7 +26,7 @@ function(GetLPSolve) message(STATUS "lp_solve library found: ${LP_SOLVE_DIR}") endif() - + include_directories(${LP_SOLVE_DIR}) endfunction() diff --git a/include/cartesian_geom/point.h b/include/cartesian_geom/point.h index a2209f4f5..b8c8e32b4 100644 --- a/include/cartesian_geom/point.h +++ b/include/cartesian_geom/point.h @@ -81,6 +81,7 @@ class point void set_dimension(const unsigned int dim) { d = dim; + coeffs.setZero(d); } void set_coord(const unsigned int i, FT coord) diff --git a/include/ode_solvers/leapfrog.hpp b/include/ode_solvers/leapfrog.hpp index 4c1f299b0..b7f2724b4 100644 --- a/include/ode_solvers/leapfrog.hpp +++ b/include/ode_solvers/leapfrog.hpp @@ -56,6 +56,8 @@ struct LeapfrogODESolver { pts xs; pts xs_prev; + Point grad_x; + MT _AA; std::pair pbpair; @@ -69,11 +71,11 @@ struct LeapfrogODESolver { eta(step), eta0(step), t(initial_time), F(oracle), Ks(boundaries), xs(initial_state), adaptive(adaptive_) { dim = xs[0].dimension(); _update_parameters = update_parameters(); + grad_x.set_dimension(dim); initialize(); }; - void initialize() { for (unsigned int i = 0; i < xs.size(); i++) { VT ar, av; @@ -88,7 +90,6 @@ struct LeapfrogODESolver { Av.push_back(av); lambda_prev.push_back(NT(0)); } - //step(); } void disable_adaptive() { @@ -101,27 +102,28 @@ struct LeapfrogODESolver { void step(int k, bool accepted) { num_steps++; - if (adaptive) eta = (eta0 * num_steps) / (num_steps + num_reflections); xs_prev = xs; unsigned int x_index, v_index, it; t += eta; + Point y; for (unsigned int i = 1; i < xs.size(); i += 2) { - //pbpair.second = -1; + x_index = i - 1; v_index = i; // v' <- v + eta / 2 F(x) - Point z = F(v_index, xs_prev, t); - z = (eta / 2) * z; - xs[v_index] = xs[v_index] + z; + if (k == 0 && !accepted) { + grad_x = F(v_index, xs_prev, t); + } + xs[v_index] += (eta / 2) * grad_x; // x <- x + eta v' - Point y = xs[v_index]; + y = xs[v_index]; if (Ks[x_index] == NULL) { - xs[x_index] = xs_prev[x_index] + eta*y; + xs[x_index] += eta*y; } else { // Find intersection (assuming a line trajectory) between x and y @@ -173,10 +175,8 @@ struct LeapfrogODESolver { } // tilde v <- v + eta / 2 F(tilde x) - z = F(v_index, xs, t); - z = (eta / 2) * z; - xs[v_index] = xs[v_index] + z; - + grad_x = F(v_index, xs, t); + xs[v_index] += (eta / 2) * grad_x; } } @@ -202,6 +202,19 @@ struct LeapfrogODESolver { xs[index] = p; } + NT get_eta() { + return eta; + } + + void set_eta(NT &eta_) { + eta = eta_; + eta0 = eta_; + } + + bounds get_bounds() { + return Ks; + } + }; diff --git a/include/preprocess/estimate_L_smooth_parameter.hpp b/include/preprocess/estimate_L_smooth_parameter.hpp new file mode 100644 index 000000000..8f5a1e89c --- /dev/null +++ b/include/preprocess/estimate_L_smooth_parameter.hpp @@ -0,0 +1,73 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis + +//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. + +// Licensed under GNU LGPL.3, see LICENCE file + + +#ifndef ESTIMATE_L_SMOOTH_PARAMETER_HPP +#define ESTIMATE_L_SMOOTH_PARAMETER_HPP + +#include "random_walks/random_walks.hpp" + +template +< + typename WalkTypePolicy = AcceleratedBilliardWalk, + typename Polytope, + typename Point, + typename NegativeGradientFunctor, + typename RandomNumberGenerator +> +double estimate_L_smooth(Polytope &P, Point &p, unsigned int const& walk_length, + NegativeGradientFunctor F, RandomNumberGenerator &rng) +{ + typedef typename Point::FT NT; + typedef typename WalkTypePolicy::template Walk + < + Polytope, + RandomNumberGenerator + > RandomWalk; + + P.ComputeInnerBall(); + + unsigned int d = P.dimension(); + unsigned int rnum = 5 * d; + std::vector randPoints(1); + std::vector vecPoint1; + std::vector vecPoint2; + std::vector< std::vector > listOfPoints; + Point F1; + + RandomWalk walk(P, p, rng); + for (unsigned int i=0; i::lowest(), Ltemp; + + for (auto pit=listOfPoints.begin(); pit!=(listOfPoints.end()-1); ++pit) + { + F1 = F(1, *pit, 0); + + for (auto qit=(pit+1); qit!=listOfPoints.end(); ++qit) + { + vecPoint2 = *qit; + Ltemp = (F1 - F(1, *qit, 0)).length() / ((*pit)[0] - (*qit)[0]).length(); + + if (Ltemp > L) + { + L = Ltemp; + } + } + } + return L; +} + + +#endif diff --git a/include/random_walks/hamiltonian_monte_carlo_walk.hpp b/include/random_walks/hamiltonian_monte_carlo_walk.hpp index 3c50ca5e9..23342ea57 100644 --- a/include/random_walks/hamiltonian_monte_carlo_walk.hpp +++ b/include/random_walks/hamiltonian_monte_carlo_walk.hpp @@ -114,12 +114,10 @@ struct HamiltonianMonteCarloWalk { }; - inline void apply( - RandomNumberGenerator &rng, - int walk_length=1, - bool metropolis_filter=true) + inline void apply(RandomNumberGenerator &rng, + int walk_length=1, + bool metropolis_filter=true) { - num_runs++; // Pick a random velocity @@ -156,6 +154,7 @@ struct HamiltonianMonteCarloWalk { } } else { x = x_tilde; + accepted = true; } discard_ratio = (1.0 * total_discarded_samples) / num_runs; diff --git a/include/random_walks/nuts_hmc_walk.hpp b/include/random_walks/nuts_hmc_walk.hpp new file mode 100644 index 000000000..857064c0e --- /dev/null +++ b/include/random_walks/nuts_hmc_walk.hpp @@ -0,0 +1,380 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2022 Vissarion Fisikopoulos +// Copyright (c) 2018-2022 Apostolos Chalkis +// Copyright (c) 2020-2022 Elias Tsigaridas +// Copyright (c) 2020-2022 Marios Papachristou + +// Licensed under GNU LGPL.3, see LICENCE file + +// References +// Matthew D. Hoffman, Andrew Gelman. "The No-U-Turn Sampler: +// Adaptively Setting Path Lengths in Hamiltonian Monte Carlo", 2011. + +// Comment: Compared to [Matthew D. Hoffman, Andrew Gelman, 2011] +// we modify the step of Nesterov's algorithm in the burn in phase. + +#ifndef NUTS_HAMILTONIAN_MONTE_CARLO_WALK_HPP +#define NUTS_HAMILTONIAN_MONTE_CARLO_WALK_HPP + + +#include "generators/boost_random_number_generator.hpp" +#include "random_walks/gaussian_helpers.hpp" +#include "ode_solvers/ode_solvers.hpp" +#include "preprocess/estimate_L_smooth_parameter.hpp" + +struct NutsHamiltonianMonteCarloWalk { + + template + < + typename NT, + typename OracleFunctor + > + struct parameters { + NT epsilon; // tolerance in mixing + NT eta; // step size + + parameters( + OracleFunctor const& F, + unsigned int dim, + NT epsilon_=2) + { + epsilon = epsilon_; + eta = F.params.L > 0 ? 10.0 / (dim * sqrt(F.params.L)) : 0.005; + } + }; + + template + < + typename Point, + typename Polytope, + typename RandomNumberGenerator, + typename NegativeGradientFunctor, + typename NegativeLogprobFunctor, + typename Solver + > + struct Walk { + + typedef std::vector pts; + typedef typename Point::FT NT; + typedef std::vector bounds; + + // Hyperparameters of the sampler + parameters ¶ms; + + // Numerical ODE solver + Solver *solver; + + // Dimension + unsigned int dim; + + // Discarded Samples + long num_runs = 0; + long total_acceptance = 0; + + // Average acceptance probability + NT average_acceptance = 0; + + // References to xs + Point x, v; + + // Helper points + Point v_pl, v_min, v_min_j, v_pl_j, X_pl, X_pl_j, X_min, X, X_rnd_j, X_min_j, x_pl_min; + + // Gradient function + NegativeGradientFunctor &F; + + bool accepted; + + // Burnin parameters + NT eps_step, mu, log_tilde_eps, H_tilde, alpha, na; + const NT delta = NT(0.65), Delta_max = NT(1000), gamma = NT(0.05), t0 = NT(10), kk = NT(0.85); + + // Density exponent + NegativeLogprobFunctor &f; + + Walk(Polytope *P, + Point &p, + NegativeGradientFunctor &neg_grad_f, + NegativeLogprobFunctor &neg_logprob_f, + parameters ¶m, + bool burn_in_phase = true) : + params(param), + F(neg_grad_f), + f(neg_logprob_f) + { + dim = p.dimension(); + + v_pl.set_dimension(dim); + v_min.set_dimension(dim); + v_min_j.set_dimension(dim); + v_pl_j.set_dimension(dim); + X_pl.set_dimension(dim); + X_pl_j.set_dimension(dim); + X_min.set_dimension(dim); + X.set_dimension(dim); + X_rnd_j.set_dimension(dim); + X_min_j.set_dimension(dim); + x_pl_min.set_dimension(dim); + + eps_step = params.eta; + mu = std::log(10*eps_step); + log_tilde_eps = NT(0); + H_tilde = NT(0); + alpha = NT(0); + na = NT(0); + + // Starting point is provided from outside + x = p; + + accepted = false; + + // Initialize solver + solver = new Solver(0, params.eta, pts{x, x}, F, bounds{P, NULL}); + disable_adaptive(); + + if (burn_in_phase) + { + RandomNumberGenerator rng(dim); + burnin(rng); + } + }; + + + inline void burnin(RandomNumberGenerator &rng, + unsigned int N = 1000, + unsigned int walk_length=1) + { + reset_num_runs(); + Point p = x; + NT L; + + if ((solver->get_bounds())[0] == NULL) + { + L = (NT(100) / NT(dim)) * (NT(100) / NT(dim)); + } + else + { + Polytope K = *(solver->get_bounds())[0]; + L = estimate_L_smooth(K, p, walk_length, F, rng); + } + + eps_step = NT(5) / (NT(dim) * std::sqrt(L)); + solver->set_eta(eps_step); + + for (int i = 0; i < N; i++) + { + apply(rng, walk_length, true); + solver->set_eta(eps_step); + } + reset_num_runs(); + } + + + inline void apply(RandomNumberGenerator &rng, + unsigned int walk_length=1, + bool burnin = false) + { + num_runs++; + + int x_counting_total = 0; + + // Pick a random velocity + v = GetDirection::apply(dim, rng, false); + + v_pl = v; + v_min = NT(-1) * v; + X_pl = x; + X_min = x; + + NT h1 = hamiltonian(x, v); + + NT uu = std::log(rng.sample_urdist()) - h1; + int j = -1; + bool s = true; + bool updated = false; + bool pos_state_single = false; + + if (burnin) + { + alpha = NT(0); + } + + while (s) + { + j++; + + if (burnin) + { + na = std::pow(NT(2), NT(j)); + } + + NT dir = rng.sample_urdist(); + + if (dir > 0.5) + { + v = v_pl; + X = X_pl; + } + else + { + v = v_min; + X = X_min; + } + X_rnd_j = X; + + int x_counting = 0; + int num_samples = int(std::pow(NT(2), NT(j))); + accepted = false; + + for (int k = 1; k <= num_samples; k++) + { + if (!accepted) + { + solver->set_state(0, X); + solver->set_state(1, v); + } + + // Get proposals + solver->steps(walk_length, accepted); + accepted = true; + + X = solver->get_state(0); + v = solver->get_state(1); + + NT hj = hamiltonian(X, v); + + if (burnin) + { + alpha += std::min(NT(1), std::exp(-hj + h1)); + } + + if (uu > Delta_max - hj) + { + s = false; + break; + } + + bool pos_state = false; + if (uu < -hj) + { + pos_state = true; + pos_state_single = true; + x_counting = x_counting + 1; + x_counting_total = x_counting_total + 1; + } + + if (k == 1) + { + if (dir > 0.5) + { + X_min_j = X; + v_min_j = v; + } + else + { + X_pl_j = X; + v_pl_j = v; + } + } + if (k == num_samples) + { + if (dir > 0.5) + { + x_pl_min = X - X_min_j; + if ((x_pl_min.dot(v) < 0) || (x_pl_min.dot(v_min_j) < 0)) + { + s = false; + } + } + else + { + x_pl_min = X_pl_j - X; + if ((x_pl_min.dot(v) < 0) || (x_pl_min.dot(v_pl_j) < 0)) + { + s = false; + } + } + } + if ((rng.sample_urdist() < (1/NT(x_counting))) && pos_state) + { + X_rnd_j = X; + } + } + + if (dir > 0.5) + { + X_pl = X; + v_pl = v; + } + else + { + X_min = X; + v_min = v; + } + + if (s && (rng.sample_urdist() < (NT(x_counting) / NT(x_counting_total)))) + { + x = X_rnd_j; + if (pos_state_single) + { + updated = true; + } + } + + if (s) + { + x_pl_min = X_pl - X_min; + if ((x_pl_min.dot(v_min) < 0) || (x_pl_min.dot(v_pl) < 0)) + { + s = false; + } + } + } + + if (updated) + { + total_acceptance++; + } + average_acceptance = NT(total_acceptance) / NT(num_runs); + + if (burnin) + { + H_tilde = (NT(1) - NT(1) / (NT(num_runs) + t0)) * H_tilde + (NT(1) / (NT(num_runs) + t0)) * (delta - alpha / na); + NT log_eps = mu - (std::sqrt(NT(num_runs)) / gamma) * H_tilde; + + // TODO: use the following to generalize Nesterov's algorithm + //log_tilde_eps = std::pow(mu,-kk) * log_eps + (NT(1) - std::pow(mu,-kk))*log_tilde_eps; + + eps_step = std::exp(log_eps); + } + } + + inline NT hamiltonian(Point &pos, Point &vel) const { + return f(pos) + 0.5 * vel.dot(vel); + } + + inline NT get_eta_solver() { + return solver->get_eta(); + } + + void disable_adaptive() { + solver->disable_adaptive(); + } + + void enable_adaptive() { + solver->enable_adaptive(); + } + + void reset_num_runs() { + num_runs = 0; + total_acceptance = 0; + } + + NT get_ratio_acceptance() { + return average_acceptance; + } + }; +}; + +#endif // HAMILTONIAN_MONTE_CARLO_WALK_HPP diff --git a/include/random_walks/random_walks.hpp b/include/random_walks/random_walks.hpp index 4affee74d..6c36457c1 100644 --- a/include/random_walks/random_walks.hpp +++ b/include/random_walks/random_walks.hpp @@ -28,6 +28,7 @@ #include "random_walks/exponential_hamiltonian_monte_carlo_exact_walk.hpp" #include "random_walks/uniform_accelerated_billiard_walk_parallel.hpp" #include "random_walks/hamiltonian_monte_carlo_walk.hpp" +#include "random_walks/nuts_hmc_walk.hpp" #include "random_walks/langevin_walk.hpp" #include "random_walks/crhmc/crhmc_walk.hpp" #endif // RANDOM_WALKS_RANDOM_WALKS_HPP diff --git a/include/sampling/random_point_generators.hpp b/include/sampling/random_point_generators.hpp index 86b10666c..a2a811dd1 100644 --- a/include/sampling/random_point_generators.hpp +++ b/include/sampling/random_point_generators.hpp @@ -231,26 +231,15 @@ struct LogconcaveRandomPointGenerator { template - < - typename Polytope, - typename Point, - typename PointList, - typename WalkPolicy, - typename RandomNumberGenerator, - typename NegativeGradientFunctor, - typename NegativeLogprobFunctor, - typename Parameters + < typename PointList, + typename WalkPolicy, + typename RandomNumberGenerator > - static void apply(Polytope &P, - Point &p, // a point to start - unsigned int const& rnum, + static void apply(unsigned int const& rnum, unsigned int const& walk_length, PointList &randPoints, WalkPolicy &policy, RandomNumberGenerator &rng, - NegativeGradientFunctor &F, - NegativeLogprobFunctor &f, - Parameters ¶meters, Walk &walk) { typedef double NT; diff --git a/include/sampling/sampling.hpp b/include/sampling/sampling.hpp index 4457b9cb6..0fdab8702 100644 --- a/include/sampling/sampling.hpp +++ b/include/sampling/sampling.hpp @@ -23,10 +23,10 @@ #define SAMPLE_ONLY_H template void uniform_sampling(PointList &randPoints, Polytope &P, @@ -232,14 +232,14 @@ template < typename Solver > void logconcave_sampling(PointList &randPoints, - Polytope &P, - RandomNumberGenerator &rng, - const unsigned int &walk_len, - const unsigned int &rnum, - const Point &starting_point, - unsigned int const& nburns, - NegativeGradientFunctor &F, - NegativeLogprobFunctor &f) + Polytope &P, + RandomNumberGenerator &rng, + const unsigned int &walk_len, + const unsigned int &rnum, + const Point &starting_point, + unsigned int const& nburns, + NegativeGradientFunctor &F, + NegativeLogprobFunctor &f) { typedef typename WalkTypePolicy::template Walk < @@ -272,16 +272,16 @@ void logconcave_sampling(PointList &randPoints, walk logconcave_walk(&P, p, F, f, params); typedef LogconcaveRandomPointGenerator RandomPointGenerator; - - RandomPointGenerator::apply(P, p, nburns, walk_len, randPoints, - push_back_policy, rng, F, f, params, logconcave_walk); - + + if (nburns > 0) { + RandomPointGenerator::apply(nburns, walk_len, randPoints, + push_back_policy, rng, logconcave_walk); + } logconcave_walk.disable_adaptive(); randPoints.clear(); - RandomPointGenerator::apply(P, p, rnum, walk_len, randPoints, - push_back_policy, rng, F, f, params, logconcave_walk); - + RandomPointGenerator::apply(rnum, walk_len, randPoints, + push_back_policy, rng, logconcave_walk); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ddd40e362..d95a49c7f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -318,6 +318,11 @@ else () COMMAND logconcave_sampling_test -tc=uld) add_test(NAME logconcave_sampling_test_exponential_biomass_sampling COMMAND logconcave_sampling_test -tc=exponential_biomass_sampling) + add_test(NAME logconcave_sampling_test_nuts_hmc_truncated + COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc_truncated) + add_test(NAME logconcave_sampling_test_nuts_hmc + COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc) + add_executable (crhmc_sampling_test crhmc_sampling_test.cpp $) add_test(NAME crhmc_sampling_test_crhmc diff --git a/test/logconcave_sampling_test.cpp b/test/logconcave_sampling_test.cpp index f8f6901cd..8e53f489b 100644 --- a/test/logconcave_sampling_test.cpp +++ b/test/logconcave_sampling_test.cpp @@ -39,6 +39,8 @@ #include "generators/h_polytopes_generator.h" #include "generators/convex_bodies_generator.h" +#include "diagnostics/univariate_psrf.hpp" + #include "preprocess/svd_rounding.hpp" #include "misc/misc.h" @@ -308,6 +310,80 @@ void benchmark_hmc(bool truncated) { } +template +void benchmark_nuts_hmc(bool truncated) { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef std::vector pts; + typedef HPolytope Hpolytope; + typedef BoostRandomNumberGenerator RandomNumberGenerator; + typedef CustomFunctor::GradientFunctor NegativeGradientFunctor; + typedef CustomFunctor::FunctionFunctor NegativeLogprobFunctor; + typedef LeapfrogODESolver Solver; + + typedef Eigen::Matrix MT; + typedef Eigen::Matrix VT; + + NegativeGradientFunctor F; + NegativeLogprobFunctor f; + RandomNumberGenerator rng(1); + unsigned int dim_min = 10; + unsigned int dim_max = 100; + int n_samples = 1000; + long ETA; + bool automatic_burnin = false; + std::chrono::time_point start, stop; + + for (unsigned int dim = dim_min; dim <= dim_max; dim+=10) + { + MT samples(dim, n_samples); + Point x0(dim); + NutsHamiltonianMonteCarloWalk::parameters hmc_params(F, dim); + if (truncated) + { + Hpolytope P = generate_cube(dim, false); + + std::cout << "eta0: " << hmc_params.eta << std::endl; + + NutsHamiltonianMonteCarloWalk::Walk + hmc(&P, x0, F, f, hmc_params, automatic_burnin); + + hmc.burnin(rng); + std::cout << "eta: " << hmc.get_eta_solver() << std::endl; + + start = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < n_samples; i++) { + hmc.apply(rng); + samples.col(i) = hmc.x.getCoefficients(); + } + stop = std::chrono::high_resolution_clock::now(); + std::cout << "proportion of sucussfull steps: " << hmc.get_ratio_acceptance() << std::endl; + } + else + { + NutsHamiltonianMonteCarloWalk::Walk + hmc(NULL, x0, F, f, hmc_params, automatic_burnin); + + hmc.burnin(rng); + std::cout << "eta: " << hmc.get_eta_solver() << std::endl; + + start = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < n_samples; i++) { + hmc.apply(rng); + samples.col(i) = hmc.x.getCoefficients(); + } + stop = std::chrono::high_resolution_clock::now(); + std::cout << "proportion of sucussfull steps: " << hmc.get_ratio_acceptance() << std::endl; + } + + std::cout << "PSRF: " << univariate_psrf(samples).maxCoeff() << std::endl; + + ETA = (long) std::chrono::duration_cast(stop - start).count(); + std::cout<< "time: " << ETA << "\n" << std::endl; + } + +} + template void test_hmc() { typedef Cartesian Kernel; @@ -878,6 +954,11 @@ void call_test_benchmark_hmc(bool truncated) { benchmark_hmc(truncated); } +template +void call_test_benchmark_nuts_hmc(bool truncated) { + benchmark_nuts_hmc(truncated); +} + template void call_test_benchmark_polytopes_grid_search() { typedef Cartesian Kernel; @@ -1196,6 +1277,14 @@ TEST_CASE("exponential_biomass_sampling") { call_test_exp_sampling(); } +TEST_CASE("benchmark_nuts_hmc_truncated") { + call_test_benchmark_nuts_hmc(true); +} + +TEST_CASE("benchmark_nuts_hmc") { + call_test_benchmark_nuts_hmc(false); +} + TEST_CASE("benchmark_hmc") { call_test_benchmark_hmc(false); } From c31e98bdc9b3fa1fe1b1b13e9a95a899d4f33eb9 Mon Sep 17 00:00:00 2001 From: iakoviid <44919975+iakoviid@users.noreply.github.com> Date: Thu, 2 Nov 2023 03:24:04 -0600 Subject: [PATCH 03/44] Use of SIMD computation in CRHMC walk [fixed] (#286) --- R-proj/examples/logconcave/simple_crhmc.R | 49 + R-proj/examples/logconcave/sparse_crhmc.R | 98 + R-proj/man/Rcpp_sparse_constraint_problem.Rd | 34 + R-proj/man/sample_points.Rd | 4 +- R-proj/man/sparse_constraint_problem.Rd | 26 + R-proj/src/Makevars | 9 +- R-proj/src/Makevars.win | 9 +- R-proj/src/oracle_functors_rcpp.h | 39 +- R-proj/src/polytopes_modules.cpp | 67 +- R-proj/src/sample_points.cpp | 107 +- R-proj/tests/testthat/test_sampling.R | 35 +- cran_gen/Makevars | 9 +- cran_gen/Makevars.win | 9 +- cran_gen/genCRANpkg.R | 16 +- examples/crhmc_prepare/CMakeLists.txt | 4 +- examples/crhmc_sampling/.gitignore | 4 + examples/crhmc_sampling/CMakeLists.txt | 9 +- examples/crhmc_sampling/README.md | 11 +- examples/crhmc_sampling/crhmc_sampling.cpp | 153 - examples/crhmc_sampling/data/afiro.mm | 112 + examples/crhmc_sampling/data/afiro_bounds.mm | 54 + examples/crhmc_sampling/data/cube2d.jpg | Bin 0 -> 31467 bytes examples/crhmc_sampling/data/simplex2d.jpg | Bin 0 -> 24408 bytes examples/crhmc_sampling/data/simplex3.mm | 7 + .../crhmc_sampling/data/simplex3_bounds.mm | 6 + examples/crhmc_sampling/helper_functions.hpp | 61 + .../crhmc_sampling/sampling_functions.cpp | 143 + examples/crhmc_sampling/simple_crhmc.cpp | 94 + .../readWriteSdpaFile.cpp | 66 - external/PackedCSparse/PackedChol.h | 2 +- external/PackedCSparse/qd/COPYING | 16 + external/PackedCSparse/qd/Makefile | 15 + external/PackedCSparse/qd/NEWS | 181 + external/PackedCSparse/qd/README | 437 ++ external/PackedCSparse/qd/bits.cc | 85 + external/PackedCSparse/qd/bits.h | 32 + external/PackedCSparse/qd/c_dd.cc | 314 ++ external/PackedCSparse/qd/c_dd.h | 98 + external/PackedCSparse/qd/c_qd.cc | 450 ++ external/PackedCSparse/qd/c_qd.h | 119 + external/PackedCSparse/qd/dd_const.cc | 40 + external/PackedCSparse/qd/dd_inline.h | 621 +++ external/PackedCSparse/qd/dd_real.cc | 1303 +++++ external/PackedCSparse/{ => qd}/dd_real.h | 44 +- external/PackedCSparse/qd/fpu.cc | 124 + external/PackedCSparse/qd/fpu.h | 39 + external/PackedCSparse/qd/inline.h | 143 + external/PackedCSparse/qd/qd.pdf | Bin 0 -> 194502 bytes external/PackedCSparse/qd/qd_config.h | 92 + external/PackedCSparse/qd/qd_const.cc | 62 + external/PackedCSparse/qd/qd_inline.h | 1047 ++++ external/PackedCSparse/qd/qd_real.cc | 2624 ++++++++++ external/PackedCSparse/qd/qd_real.h | 296 ++ external/PackedCSparse/qd/util.cc | 22 + external/PackedCSparse/qd/util.h | 4 + external/cmake-files/QD.cmake | 64 +- include/ode_solvers/implicit_midpoint.hpp | 47 +- include/ode_solvers/oracle_functors.hpp | 10 +- include/ode_solvers/oracle_functors_rcpp.hpp | 36 + include/preprocess/crhmc/analytic_center.h | 21 +- include/preprocess/crhmc/constraint_problem.h | 81 + include/preprocess/crhmc/crhmc_input.h | 75 +- include/preprocess/crhmc/crhmc_problem.h | 367 +- include/preprocess/crhmc/crhmc_utils.h | 135 +- include/preprocess/crhmc/lewis_center.h | 21 +- include/preprocess/crhmc/opts.h | 15 +- include/preprocess/crhmc/two_sided_barrier.h | 57 +- .../crhmc/weighted_two_sided_barrier.h | 40 +- .../crhmc/additional_units/auto_tuner.hpp | 15 +- .../additional_units/dynamic_regularizer.hpp | 23 +- .../additional_units/dynamic_step_size.hpp | 57 +- .../crhmc/additional_units/dynamic_weight.hpp | 32 +- include/random_walks/crhmc/crhmc_walk.hpp | 131 +- include/random_walks/crhmc/hamiltonian.hpp | 183 +- include/sampling/random_point_generators.hpp | 59 + include/sampling/sampling.hpp | 153 +- test/CMakeLists.txt | 16 +- test/benchmarks_crhmc.cpp | 3 +- test/benchmarks_crhmc_sampling.cpp | 130 +- test/crhmc_polytope_preparation_test.cpp | 10 + test/crhmc_sampling_test.cpp | 133 +- test/netlib/degen2.mm | 4447 +++++++++++++++++ test/netlib/degen2_bounds.mm | 760 +++ test/ode_solvers_test.cpp | 17 +- 84 files changed, 15594 insertions(+), 989 deletions(-) create mode 100644 R-proj/examples/logconcave/simple_crhmc.R create mode 100644 R-proj/examples/logconcave/sparse_crhmc.R create mode 100644 R-proj/man/Rcpp_sparse_constraint_problem.Rd create mode 100644 R-proj/man/sparse_constraint_problem.Rd delete mode 100644 examples/crhmc_sampling/crhmc_sampling.cpp create mode 100644 examples/crhmc_sampling/data/afiro.mm create mode 100644 examples/crhmc_sampling/data/afiro_bounds.mm create mode 100644 examples/crhmc_sampling/data/cube2d.jpg create mode 100644 examples/crhmc_sampling/data/simplex2d.jpg create mode 100644 examples/crhmc_sampling/data/simplex3.mm create mode 100644 examples/crhmc_sampling/data/simplex3_bounds.mm create mode 100644 examples/crhmc_sampling/helper_functions.hpp create mode 100644 examples/crhmc_sampling/sampling_functions.cpp create mode 100644 examples/crhmc_sampling/simple_crhmc.cpp delete mode 100644 examples/optimization_spectrahedra/readWriteSdpaFile.cpp create mode 100644 external/PackedCSparse/qd/COPYING create mode 100644 external/PackedCSparse/qd/Makefile create mode 100644 external/PackedCSparse/qd/NEWS create mode 100644 external/PackedCSparse/qd/README create mode 100644 external/PackedCSparse/qd/bits.cc create mode 100644 external/PackedCSparse/qd/bits.h create mode 100644 external/PackedCSparse/qd/c_dd.cc create mode 100644 external/PackedCSparse/qd/c_dd.h create mode 100644 external/PackedCSparse/qd/c_qd.cc create mode 100644 external/PackedCSparse/qd/c_qd.h create mode 100644 external/PackedCSparse/qd/dd_const.cc create mode 100644 external/PackedCSparse/qd/dd_inline.h create mode 100644 external/PackedCSparse/qd/dd_real.cc rename external/PackedCSparse/{ => qd}/dd_real.h (92%) create mode 100644 external/PackedCSparse/qd/fpu.cc create mode 100644 external/PackedCSparse/qd/fpu.h create mode 100644 external/PackedCSparse/qd/inline.h create mode 100644 external/PackedCSparse/qd/qd.pdf create mode 100644 external/PackedCSparse/qd/qd_config.h create mode 100644 external/PackedCSparse/qd/qd_const.cc create mode 100644 external/PackedCSparse/qd/qd_inline.h create mode 100644 external/PackedCSparse/qd/qd_real.cc create mode 100644 external/PackedCSparse/qd/qd_real.h create mode 100644 external/PackedCSparse/qd/util.cc create mode 100644 external/PackedCSparse/qd/util.h create mode 100644 include/preprocess/crhmc/constraint_problem.h create mode 100644 test/netlib/degen2.mm create mode 100644 test/netlib/degen2_bounds.mm diff --git a/R-proj/examples/logconcave/simple_crhmc.R b/R-proj/examples/logconcave/simple_crhmc.R new file mode 100644 index 000000000..5fee2b8b8 --- /dev/null +++ b/R-proj/examples/logconcave/simple_crhmc.R @@ -0,0 +1,49 @@ +# VolEsti (volume computation and sampling library) + +# Copyright (c) 2012-2020 Vissarion Fisikopoulos +# Copyright (c) 2018-2020 Apostolos Chalkis +# Copyright (c) 2020-2020 Marios Papachristou +# Copyright (c) 2022-2022 Ioannis Iakovidis + +# Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of Code 2022 program. + +# Licensed under GNU LGPL.3, see LICENCE file + +# Example script for using the logconcave sampling methods + +# Import required libraries +library(volesti) + +# Sampling from uniform density example + +logconcave_sample<- function(P,distribution, n_samples ,n_burns){ + if (distribution == "uniform"){ + f <- function(x) (0) + grad_f <- function(x) (0) + L=1 + m=1 + pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) + return(max(psrf_univariate(pts, "interval"))) + } + else if(distribution == "gaussian"){ + pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "variance"=8)) + return(max(psrf_univariate(pts, "interval"))) + } +} + +for (i in 1:2) { + + if (i==1) { + distribution = 'gaussian' + cat("Gaussian ") + } else { + distribution = 'uniform' + cat("Uniform ") + } + + P = gen_simplex(10, 'H') + psrf = logconcave_sample(P,distribution,5000,2000) + cat("psrf = ") + cat(psrf) + cat("\n") +} diff --git a/R-proj/examples/logconcave/sparse_crhmc.R b/R-proj/examples/logconcave/sparse_crhmc.R new file mode 100644 index 000000000..373371986 --- /dev/null +++ b/R-proj/examples/logconcave/sparse_crhmc.R @@ -0,0 +1,98 @@ +# VolEsti (volume computation and sampling library) + +# Copyright (c) 2012-2020 Vissarion Fisikopoulos +# Copyright (c) 2018-2020 Apostolos Chalkis +# Copyright (c) 2020-2020 Marios Papachristou +# Copyright (c) 2022-2022 Ioannis Iakovidis + +# Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of Code 2022 program. + +# Licensed under GNU LGPL.3, see LICENCE file + +# Example script for using the logconcave sampling methods + +# Import required libraries +library(ggplot2) +library(volesti) + +# Sampling from logconcave density example + +# Helper function +norm_vec <- function(x) sqrt(sum(x^2)) + +# Negative log-probability oracle +f <- function(x) (norm_vec(x)^2 + sum(x)) + +# Negative log-probability gradient oracle +grad_f <- function(x) (2 * x + 1) + +# Interval [-1, 1] +A = matrix(c(1, -1), ncol=1, nrow=2, byrow=TRUE) +b = c(2,1) + +# Create domain of truncation +P <- volesti::Hpolytope$new(A, b) + +# Mode of logconcave density +x_min <- c(-0.5) + +# Smoothness and strong-convexity +L <- 2 +m <- 2 + +# Sample points +n_samples <- 80000 +n_burns <- n_samples / 2 +cat("---Sampling without hessian\n") +pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) +jpeg("histogram_without_hessian.jpg") +# Plot histogram +hist(pts, probability=TRUE, breaks = 100) + +cat("Sample mean is: ") +sample_mean <- mean(pts) +cat(sample_mean) +cat("\n") +cat("Sample variance is: ") +sample_variance <- mean((pts - sample_mean)^2) +cat(sample_variance) +cat("\n") +invisible(capture.output(dev.off())) + +# Negative log-probability hessian oracle +hess_f <- function(x) (2) +cat("---Sampling with hessian\n") +pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f,"negative_logprob_hessian" = hess_f, "L_" = L, "m" = m)) +jpeg("histogram_with_hessian.jpg") +# Plot histogram +hist(pts, probability=TRUE, breaks = 100) + +cat("Sample mean is: ") +sample_mean <- mean(pts) +cat(sample_mean) +cat("\n") +cat("Sample variance is: ") +sample_variance <- mean((pts - sample_mean)^2) +cat(sample_variance) +cat("\n") +invisible(capture.output(dev.off())) + +walk="CRHMC" +library(Matrix) +bineq=matrix(c(10,10,10,10,10), nrow=5, ncol=1, byrow=TRUE) +Aineq = matrix(c(1,0,-0.25,-1,2.5,1,0.4,-1,-0.9,0.5), nrow=5, ncol=2, byrow = TRUE) +Aineq = as( Aineq, 'dgCMatrix' ) +beq=matrix(,nrow=0, ncol=1, byrow=TRUE) +Aeq = matrix(, nrow=0, ncol=2, byrow = TRUE) +Aeq=as( Aeq, 'dgCMatrix' ) +lb=-100000*c(1,1); +ub=100000*c(1,1); +cat("---Sampling the normal distribution in a pentagon\n") +P <- volesti::sparse_constraint_problem$new(Aineq, bineq,Aeq, beq, lb, ub) +points <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "variance" = 8)) +jpeg("pentagon.jpg") +plot(ggplot(data.frame( x=points[1,], y=points[2,] )) + +geom_point( aes(x=x, y=y, color=walk)) + coord_fixed(xlim = c(-15,15), +ylim = c(-15,15)) + ggtitle(sprintf("Sampling a random pentagon with walk %s", walk))) +invisible(capture.output(dev.off())) +write.table(points, file="pentagon.txt", row.names=FALSE, col.names=FALSE) diff --git a/R-proj/man/Rcpp_sparse_constraint_problem.Rd b/R-proj/man/Rcpp_sparse_constraint_problem.Rd new file mode 100644 index 000000000..82f81f6c9 --- /dev/null +++ b/R-proj/man/Rcpp_sparse_constraint_problem.Rd @@ -0,0 +1,34 @@ +\docType{class} +\name{Rcpp_sparse_constraint_problem} +\alias{Rcpp_sparse_constraint_problem-class} +\alias{[,Rcpp_sparse_constraint_problem-method} +\alias{[,Rcpp_sparse_constraint_problem,ANY,ANY,ANY-method} +\alias{$<-,Rcpp_sparse_constraint_problem-method} +\alias{$,Rcpp_sparse_constraint_problem-method} +\alias{filepaths<-,Rcpp_sparse_constraint_problem-method} +\title{ +An \code{Rcpp} class to represent sparse_constraint_problems, exposed to \code{R} via modules. +} +\description{ +A constraint problem is defined by a set of linear inequalities and equalities or equivalently a \eqn{d}-dimensional constraint problem is defined by a \eqn{mineq\times d} matrix Aineq and a \eqn{mineq}-dimensional vector bineq, s.t.: \eqn{Aineqx\leq bineq}, a \eqn{meq\times d} matrix Aeq and a \eqn{meq}-dimensional vector beq, s.t.: \eqn{Aeqx= beq} and two \eqn{d} vectors lb, ub such that \eqn{lb\leq x \leq ub}.} +\details{ +\describe{ +\item{\code{Aineq} }{\eqn{mineq\times d} sparse matrix Aineq} + +\item{\code{bineq} }{\eqn{mineq}-dimensional vector bineq} + +\item{\code{Aeq} }{\eqn{meq\times d} sparse matrix Aeq} + +\item{\code{beq} }{\eqn{meq}-dimensional vector beq} + +\item{\code{lb} }{\eqn{d}-dimensional vector bineq} + +\item{\code{ub} }{\eqn{d}-dimensional vector bineq} + +\item{\code{type} }{An integer that declares the representation of the polytope. For sparse_constraint_problem the default value is 5.} + +\item{\code{dimension} }{The dimension of the polytope.} + + } +} +\keyword{internal} diff --git a/R-proj/man/sample_points.Rd b/R-proj/man/sample_points.Rd index ca2ef87fa..e969e557d 100644 --- a/R-proj/man/sample_points.Rd +++ b/R-proj/man/sample_points.Rd @@ -7,13 +7,13 @@ sample_points(P, n, random_walk = NULL, distribution = NULL, seed = NULL) } \arguments{ -\item{P}{A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection.} +\item{P}{A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection or (e) sparse_constraint_problem.} \item{n}{The number of points that the function is going to sample from the convex polytope.} \item{random_walk}{Optional. A list that declares the random walk and some related parameters as follows: \itemize{ -\item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'NUTS'} for NUTS Hamiltonian Monte Carlo sampler (logconcave densities) xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities) xii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities) xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities.} +\item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR, x) \code{'NUTS'} for NUTS Hamiltonian Monte Carlo sampler (logconcave densities), xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities), xii) CRHMC for Riemannian HMC with H-polytope constraints (uniform and general logconcave densities), xiii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities), xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities and \code{'CRHMC'} for logconcave densities with H-polytope and sparse constrainted problems.} \item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} \item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} \item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} diff --git a/R-proj/man/sparse_constraint_problem.Rd b/R-proj/man/sparse_constraint_problem.Rd new file mode 100644 index 000000000..535dc8426 --- /dev/null +++ b/R-proj/man/sparse_constraint_problem.Rd @@ -0,0 +1,26 @@ +\name{sparse_constraint_problem} +\alias{sparse_constraint_problem} +\title{An \code{R} class to represent sparse constraint problems.} + +\description{ +A constraint problem is defined by a set of linear inequalities and equalities or equivalently a \eqn{d}-dimensional constraint problem is defined by a \eqn{mineq\times d} matrix Aineq and a \eqn{mineq}-dimensional vector bineq, s.t.: \eqn{Aineqx\leq bineq}, a \eqn{meq\times d} matrix Aeq and a \eqn{meq}-dimensional vector beq, s.t.: \eqn{Aeqx\eq beq} and two \eqn{d} vectors lb, ub such that \eqn{lb\leq x \leq ub}. +} +\section{Fields}{ +\itemize{ +\item{\code{Aineq} }{\eqn{mineq\times d} sparse matrix Aineq} + +\item{\code{bineq} }{\eqn{mineq}-dimensional vector bineq} + +\item{\code{Aeq} }{\eqn{meq\times d} sparse matrix Aeq} + +\item{\code{beq} }{\eqn{meq}-dimensional vector beq} + +\item{\code{lb} }{\eqn{d}-dimensional vector bineq} + +\item{\code{ub} }{\eqn{d}-dimensional vector bineq} + +\item{\code{type} }{An integer that declares the representation of the polytope. For sparse_constraint_problem the default value is 5.} + +\item{\code{dimension} }{The dimension of the polytope.} + +}} diff --git a/R-proj/src/Makevars b/R-proj/src/Makevars index 8f401249e..b642e2fbe 100644 --- a/R-proj/src/Makevars +++ b/R-proj/src/Makevars @@ -4,11 +4,16 @@ PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBO CXX_STD = CXX11 -PKG_LIBS=-LRproj_externals/lp_solve -llp_solve $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) +PKG_LIBS=-LRproj_externals/lp_solve -llp_solve -L../../external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -$(SHLIB): Rproj_externals/lp_solve/liblp_solve.a +$(SHLIB): Rproj_externals/lp_solve/liblp_solve.a ../../external/PackedCSparse/qd/libqd.a Rproj_externals/lp_solve/liblp_solve.a: @(cd Rproj_externals/lp_solve && $(MAKE) liblp_solve.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") + +../../external/PackedCSparse/qd/libqd.a: + @(cd ../../PackedCSparse/qd && $(MAKE) libqd.a \ + CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ + CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/R-proj/src/Makevars.win b/R-proj/src/Makevars.win index 867308b75..17d28e206 100644 --- a/R-proj/src/Makevars.win +++ b/R-proj/src/Makevars.win @@ -2,12 +2,17 @@ PKG_CPPFLAGS=-I../../external/boost -I../../external/LPsolve_src/run_headers -I. PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES CXX_STD = CXX11 -PKG_LIBS=-LRproj_externals/lp_solve -llp_solve $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) +PKG_LIBS=-LRproj_externals/lp_solve -llp_solve -L../../external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -$(SHLIB): Rproj_externals/lp_solve/liblp_solve.a +$(SHLIB): Rproj_externals/lp_solve/liblp_solve.a ../../external/PackedCSparse/qd/libqd.a Rproj_externals/lp_solve/liblp_solve.a: @(cd Rproj_externals/lp_solve && $(MAKE) liblp_solve.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS) -DUSRDLL -DINLINE=static" \ CFLAGS="$(CFLAGS)" CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" \ RANLIB="$(RANLIB)") + +../../external/PackedCSparse/qd/libqd.a: + @(cd ../../PackedCSparse/qd && $(MAKE) libqd.a \ + CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ + CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/R-proj/src/oracle_functors_rcpp.h b/R-proj/src/oracle_functors_rcpp.h index 558ac1b07..6929540ca 100644 --- a/R-proj/src/oracle_functors_rcpp.h +++ b/R-proj/src/oracle_functors_rcpp.h @@ -17,7 +17,8 @@ enum ode_solvers { euler, runge_kutta, richardson, - collocation + collocation, + implicit_midpoint }; // Holds Oracle Functor that wraps an R function via RCpp @@ -91,6 +92,17 @@ struct RcppFunctor { } } + Point operator() (Point const& x) const { + VT y = Rcpp::as(neg_grad_f(Rcpp::wrap(x.getCoefficients()))); + + Point z(y); + + if (negate) z = (-1.0) * z; + + // Return result as Point + return z; + } + }; // Negative log-probability functor @@ -118,6 +130,31 @@ struct RcppFunctor { }; + // Log-probability hessian functor + template + < + typename Point + > + struct HessianFunctor { + typedef typename Point::FT NT; + typedef typename Point::Coeff VT; + + parameters params; + Rcpp::Function hessian; // Negative hessian as an Rcpp::Function + + HessianFunctor( + parameters params_, + Rcpp::Function hessian_) : + params(params_), + hessian(hessian_) + {}; + + Point operator() (Point const& x) const { + VT y= Rcpp::as(hessian(Rcpp::wrap(x.getCoefficients()))); + return Point(y); + } + + }; }; #endif diff --git a/R-proj/src/polytopes_modules.cpp b/R-proj/src/polytopes_modules.cpp index 88c036988..443251fbb 100644 --- a/R-proj/src/polytopes_modules.cpp +++ b/R-proj/src/polytopes_modules.cpp @@ -11,11 +11,11 @@ class Hpolytope { Hpolytope() {} Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b) : A(_A), b(_b), Aeq(Rcpp::NumericMatrix(0,0)), beq(Rcpp::NumericVector(0)), vol(std::numeric_limits::signaling_NaN()), dimension(_A.ncol()), type(1) {} - Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, Rcpp::NumericMatrix _Aeq, Rcpp::NumericVector _beq) : + Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, Rcpp::NumericMatrix _Aeq, Rcpp::NumericVector _beq) : A(_A), b(_b), Aeq(_Aeq), beq(_beq), vol(std::numeric_limits::signaling_NaN()), dimension(_A.ncol()), type(1) {} Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, double volume) : A(_A), b(_b), Aeq(Rcpp::NumericMatrix(0,0)), beq(Rcpp::NumericVector(0)), vol(volume), dimension(_A.ncol()), type(1) {} - Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, Rcpp::NumericMatrix _Aeq, Rcpp::NumericVector _beq, + Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, Rcpp::NumericMatrix _Aeq, Rcpp::NumericVector _beq, double volume) : A(_A), b(_b), Aeq(_Aeq), beq(_beq), vol(volume), dimension(_A.ncol()), type(1) {} Rcpp::NumericMatrix A; Rcpp::NumericVector b; @@ -59,7 +59,27 @@ class VPinterVP { unsigned int dimension; int type; }; - +#include +using SpMat=Eigen::SparseMatrix ; +class sparse_constraint_problem { +public: + sparse_constraint_problem() {} + sparse_constraint_problem(SpMat _Aineq, Rcpp::NumericVector _bineq, SpMat _Aeq, Rcpp::NumericVector _beq) : Aineq(_Aineq), bineq(_bineq), Aeq(_Aeq), beq(_beq), + lb(Rcpp::NumericVector(_Aineq.cols(),-1e9)), ub(Rcpp::NumericMatrix(_Aineq.cols(),1e9)), dimension(_Aineq.cols()), type(5) {} + sparse_constraint_problem(SpMat _Aineq, Rcpp::NumericVector _bineq, SpMat _Aeq, Rcpp::NumericVector _beq, + Rcpp::NumericVector _lb, Rcpp::NumericVector _ub) : Aineq(_Aineq), bineq(_bineq), Aeq(_Aeq), beq(_beq), + lb(_lb), ub(_ub), dimension(_Aineq.cols()), type(5) {} + sparse_constraint_problem(SpMat _Aeq, Rcpp::NumericVector _beq) : Aineq(SpMat(0, _Aeq.cols())), bineq(Rcpp::NumericVector(0)), Aeq(_Aeq), beq(_beq), + lb(Rcpp::NumericVector(_Aeq.cols(),-1e9)), ub(Rcpp::NumericMatrix(_Aeq.cols(),1e9)), dimension(_Aeq.cols()), type(5) {} + SpMat Aineq; + Rcpp::NumericVector bineq; + SpMat Aeq; + Rcpp::NumericVector beq; + Rcpp::NumericVector lb; + Rcpp::NumericVector ub; + unsigned int dimension; + int type; +}; RCPP_MODULE(polytopes){ using namespace Rcpp ; @@ -174,6 +194,47 @@ RCPP_MODULE(polytopes){ .field( "volume", &VPinterVP::vol ) .field( "dimension", &VPinterVP::dimension ) .field( "type", &VPinterVP::type ); + + //' An exposed class to represent a sparse constraint problem + //' + //' @description A constraint problem is defined by a set of linear inequalities and equalities or equivalently a \eqn{d}-dimensional constraint problem is defined by a \eqn{mineq\times d} matrix Aineq and a \eqn{mineq}-dimensional vector bineq, s.t.: \eqn{Aineqx\leq bineq}, a \eqn{meq\times d} matrix Aeq and a \eqn{meq}-dimensional vector beq, s.t.: \eqn{Aeqx\eq beq} and two \eqn{d} vectors lb, ub such that \eqn{lb\leq x \leq ub}. + //' + //' @field Aineq \eqn{mineq\times d} sparse matrix Aineq + //' @field bineq \eqn{mineq}-dimensional vector bineq + //' @field Aeq \eqn{meq\times d} sparse matrix Aeq + //' @field beq \eqn{meq}-dimensional vector beq + //' @field lb \eqn{d}-dimensional vector lb + //' @field ub \eqn{d}-dimensional vector ub + //' @field dimension An integer that declares the dimension of the polytope. It has not be given to the constructor. + //' @field type An integer that declares the representation of the polytope. For sparse_constraint_problem the default value is 5. It has not be given to the constructor. + //' + //' @example + //' # create a 2-d unit simplex + //' Aineq = matrix(, nrow=0, ncol=2, byrow = TRUE) + //' Aineq = as( Aineq, 'dgCMatrix' ) + //' bineq= matrix(,nrow=0, ncol=1, byrow=TRUE) + //' Aeq = matrix(c(1,1), ncol=2, nrow=1, byrow=TRUE) + //' Aeq = as( Aeq, 'dgCMatrix' ) + //' beq = c(1) + //' lb = c(0,0) + //' ub = c(1,1) + //' P = sparse_constraint_problem$new(Aineq, bineq, Aeq, beq, lb, ub) + //' @export + class_("sparse_constraint_problem") + // expose the default constructor + .constructor() + .constructor() + .constructor() + .constructor() + + .field( "Aineq", &sparse_constraint_problem::Aineq ) + .field( "bineq", &sparse_constraint_problem::bineq ) + .field( "Aeq", &sparse_constraint_problem::Aeq ) + .field( "beq", &sparse_constraint_problem::beq ) + .field( "lb", &sparse_constraint_problem::lb ) + .field( "ub", &sparse_constraint_problem::ub ) + .field( "dimension", &sparse_constraint_problem::dimension ) + .field( "type", &sparse_constraint_problem::type ); } extern SEXP _rcpp_module_boot_polytopes(void); diff --git a/R-proj/src/sample_points.cpp b/R-proj/src/sample_points.cpp index 4756d0915..1014e74ea 100644 --- a/R-proj/src/sample_points.cpp +++ b/R-proj/src/sample_points.cpp @@ -23,7 +23,7 @@ #include "sampling/sampling.hpp" #include "ode_solvers/ode_solvers.hpp" #include "oracle_functors_rcpp.h" - +#include "preprocess/crhmc/constraint_problem.h" enum random_walks { ball_walk, rdhr, @@ -39,7 +39,8 @@ enum random_walks { nuts, gaussian_hmc, exponential_hmc, - uld + uld, + crhmc }; template < @@ -49,7 +50,8 @@ template < typename NT, typename Point, typename NegativeGradientFunctor, - typename NegativeLogprobFunctor + typename NegativeLogprobFunctor, + typename HessianFunctor > void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPoints, unsigned int const& walkL, unsigned int const& numpoints, @@ -57,7 +59,7 @@ void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPo Point const& StartingPoint, unsigned int const& nburns, bool const& set_L, NT const& eta, random_walks walk, NegativeGradientFunctor *F=NULL, NegativeLogprobFunctor *f=NULL, - ode_solvers solver_type = no_solver) + HessianFunctor *h=NULL, ode_solvers solver_type = no_solver) { switch (walk) { @@ -214,6 +216,10 @@ void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPo } break; + case crhmc:{ + execute_crhmc(P, rng, randPoints, walkL, numpoints, nburns, F, f, h); + break; + } case nuts: logconcave_sampling < @@ -266,15 +272,16 @@ void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPo //' @param random_walk Optional. A list that declares the random walk and some related parameters as follows: //' \itemize{ //' \item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, -//' ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, -//' iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, -//' vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or -//' ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'NUTS'} for -//' NUTS Hamiltonian Monte Carlo sampler (logconcave densities) xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities) -//' xii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities) +//' ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, +//' v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, +//' viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR, +//' x) \code{'NUTS'} for NUTS Hamiltonian Monte Carlo sampler (logconcave densities), xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities), +//' xii) CRHMC for Riemannian HMC with H-polytope constraints (uniform and general logconcave densities), +//' xiii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities), //' xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). -//' The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes -//' and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities.} +//' The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes and +//' \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities and \code{'CRHMC'} +//' for logconcave densities with H-polytope and sparse constrainted problems.} //' \item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} //' \item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} //' \item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} @@ -350,14 +357,19 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, typedef IntersectionOfVpoly InterVP; typedef Eigen::Matrix VT; typedef Eigen::Matrix MT; + typedef Eigen::SparseMatrix SpMat; + typedef constraint_problem sparse_problem; unsigned int type = Rcpp::as(P).field("type"), dim = Rcpp::as(P).field("dimension"), walkL = 1, numpoints, nburns = 0; RcppFunctor::GradientFunctor *F = NULL; RcppFunctor::FunctionFunctor *f = NULL; + RcppFunctor::HessianFunctor *h = NULL; + GaussianFunctor::GradientFunctor *G = NULL; GaussianFunctor::FunctionFunctor *g = NULL; + GaussianFunctor::HessianFunctor *hess_g = NULL; bool functor_defined = true; @@ -475,18 +487,22 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, solver = leapfrog; } else if (solver_str == "euler") { solver = euler; + } else if (solver_str == "implicit_midpoint"){ + solver = implicit_midpoint; } else { throw Rcpp::exception("Invalid ODE solver specified. Aborting."); } } else { solver = leapfrog; } - // Create functors RcppFunctor::parameters rcpp_functor_params(L_, m, eta, 2); F = new RcppFunctor::GradientFunctor(rcpp_functor_params, negative_logprob_gradient); f = new RcppFunctor::FunctionFunctor(rcpp_functor_params, negative_logprob); - + if(Rcpp::as(distribution).containsElementNamed("negative_logprob_hessian")){ + Rcpp::Function negative_logprob_hessian = Rcpp::as(distribution)["negative_logprob_hessian"]; + h = new RcppFunctor::HessianFunctor(rcpp_functor_params, negative_logprob_hessian); + } } else if (logconcave && !Rcpp::as(distribution).containsElementNamed("negative_logprob") && @@ -509,6 +525,8 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, solver = leapfrog; } else if (solver_str == "euler") { solver = euler; + } else if (solver_str == "implicit_midpoint"){ + solver = implicit_midpoint; } else { throw Rcpp::exception("Invalid ODE solver specified. Aborting."); } @@ -516,12 +534,11 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, Rcpp::warning("Solver set to leapfrog."); solver = leapfrog; } - // Create functors - GaussianFunctor::parameters gaussian_functor_params(mode, a, eta); - G = new GaussianFunctor::GradientFunctor(gaussian_functor_params); - g = new GaussianFunctor::FunctionFunctor(gaussian_functor_params); - + GaussianFunctor::parameters* gaussian_functor_params=new GaussianFunctor::parameters(mode, a, eta); + G = new GaussianFunctor::GradientFunctor(*gaussian_functor_params); + g = new GaussianFunctor::FunctionFunctor(*gaussian_functor_params); + hess_g = new GaussianFunctor::HessianFunctor(*gaussian_functor_params); } if (!random_walk.isNotNull() || !Rcpp::as(random_walk).containsElementNamed("walk")) { @@ -531,19 +548,11 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, } walk = exponential_hmc; } else if (logconcave) { - walk = nuts; + walk = (type == 5) ? crhmc : nuts; } else if (gaussian) { - if (type == 1) { - walk = cdhr; - } else { - walk = rdhr; - } + walk = (type == 1) ? cdhr : rdhr; } else { - if (type == 1) { - walk = accelarated_billiard; - } else { - walk = billiard; - } + walk = (type == 1) ? accelarated_billiard : billiard; } } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("CDHR")) == 0) { walk = cdhr; @@ -617,6 +626,16 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("ULD")) == 0) { if (!logconcave) throw Rcpp::exception("ULD is not supported for non first-order sampling"); walk = uld; + } else if(Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("CRHMC")) == 0){ + if (!logconcave) throw Rcpp::exception("CRHMC is used for logconcave sampling"); + if (type !=1 && type !=5 ) { + throw Rcpp::exception("CRHMC sampling is supported only for H-polytopes and Sparse Problems."); + } + walk =crhmc; + if(solver!=implicit_midpoint){ + Rcpp::warning("Solver set to implicit midpoint."); + } + solver = implicit_midpoint; } else { throw Rcpp::exception("Unknown walk type!"); } @@ -667,11 +686,11 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, } if (functor_defined) { sample_from_polytope(HP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, solver); + StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); } else { sample_from_polytope(HP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, G, g, solver); + StartingPoint, nburns, set_L, eta, walk, G, g, hess_g, solver); } break; } @@ -693,7 +712,7 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, VP.shift(mode.getCoefficients()); } sample_from_polytope(VP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, solver); + StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); break; } case 3: { @@ -714,7 +733,7 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, ZP.shift(mode.getCoefficients()); } sample_from_polytope(ZP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, solver); + StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); break; } case 4: { @@ -737,9 +756,27 @@ Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, VPcVP.shift(mode.getCoefficients()); } sample_from_polytope(VPcVP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, solver); + StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); break; } + case 5: { + // Sparse constraint_problem + SpMat Aeq = Rcpp::as(Rcpp::as(P).field("Aeq")); + VT beq= Rcpp::as(Rcpp::as(P).field("beq")); + SpMat Aineq = Rcpp::as(Rcpp::as(P).field("Aineq")); + VT bineq= Rcpp::as(Rcpp::as(P).field("bineq")); + VT lb= Rcpp::as(Rcpp::as(P).field("lb")); + VT ub= Rcpp::as(Rcpp::as(P).field("ub")); + sparse_problem problem(dim, Aeq, beq, Aineq, bineq, lb, ub); + if(walk!=crhmc){throw Rcpp::exception("Sparse problems are supported only by the CRHMC walk.");} + if (functor_defined) { + execute_crhmc, RcppFunctor::GradientFunctor,RcppFunctor::FunctionFunctor, RcppFunctor::HessianFunctor, CRHMCWalk, 8>(problem, rng, randPoints, walkL, numpoints, nburns, F, f, h); + } + else { + execute_crhmc, GaussianFunctor::GradientFunctor,GaussianFunctor::FunctionFunctor, GaussianFunctor::HessianFunctor, CRHMCWalk, 8>(problem, rng, randPoints, walkL, numpoints, nburns, G, g, hess_g); + } + break; + } } if (numpoints % 2 == 1 && (walk == brdhr || walk == bcdhr)) numpoints--; diff --git a/R-proj/tests/testthat/test_sampling.R b/R-proj/tests/testthat/test_sampling.R index 1950eda07..d051dc70e 100644 --- a/R-proj/tests/testthat/test_sampling.R +++ b/R-proj/tests/testthat/test_sampling.R @@ -14,59 +14,74 @@ runsample <- function(P, name_string, dist){ res = 1 } return(res) - + +} + +logconcave_sample<- function(P,distribution, n_samples ,n_burns){ + if (distribution == "uniform"){ + f <- function(x) (0) + grad_f <- function(x) (0) + L=1 + m=1 + pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) + return(max(psrf_univariate(pts, "interval"))) + } + else if(distribution == "gaussian"){ + pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "variance"=8)) + return(max(psrf_univariate(pts, "interval"))) + } } for (i in 1:2) { - + if (i==1) { distribution = 'gaussian' } else { distribution = 'uniform' } - + test_that("Sampling test", { P= gen_cube(10, 'H') res = runsample(P, 'H-cube10', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { P = gen_cross(10, 'H') res = runsample(P, 'H-cross10', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { P = gen_prod_simplex(5) res = runsample(P, 'H-prod_simplex_5_5', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { P = gen_prod_simplex(10) res = runsample(P, 'H-prod_simplex_10_10', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { P = gen_simplex(10, 'H') res = runsample(P, 'H-prod_simplex10', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { P = gen_skinny_cube(10) res = runsample(P, 'H-skinny_cube10', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { P = gen_skinny_cube(20) res = runsample(P, 'H-skinny_cube20', distribution) expect_equal(res, 1) }) - + test_that("Sampling test", { Z = gen_rand_zonotope(4, 8) res = runsample(Z, 'zonotope_4_8', distribution) diff --git a/cran_gen/Makevars b/cran_gen/Makevars index a609d3dac..28c42dcad 100644 --- a/cran_gen/Makevars +++ b/cran_gen/Makevars @@ -2,11 +2,16 @@ PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimu PKG_CXXFLAGS= -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES CXX_STD = CXX11 -PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) +PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a +$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a external/PackedCSparse/qd/libqd.a external/lpsolve/build/lp_solve/liblp_solve.a: @(cd external/lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") + +external/PackedCSparse/qd/libqd.a: + @(cd external/PackedCSparse/qd/ && $(MAKE) libqd.a \ + CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ + CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/cran_gen/Makevars.win b/cran_gen/Makevars.win index 70005148e..b93299131 100644 --- a/cran_gen/Makevars.win +++ b/cran_gen/Makevars.win @@ -2,12 +2,17 @@ PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimu PKG_CXXFLAGS= -lm -ldl -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES CXX_STD = CXX11 -PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) +PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a +$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a external/PackedCSparse/qd/libqd.a external/lpsolve/build/lp_solve/liblp_solve.a: @(cd external/lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS) -DUSRDLL -DINLINE=static" \ CFLAGS="$(CFLAGS)" CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" \ RANLIB="$(RANLIB)") + +external/PackedCSparse/qd/libqd.a: + @(cd external/PackedCSparse/qd/ && $(MAKE) libqd.a \ + CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ + CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/cran_gen/genCRANpkg.R b/cran_gen/genCRANpkg.R index e4f6008be..abf51d88a 100644 --- a/cran_gen/genCRANpkg.R +++ b/cran_gen/genCRANpkg.R @@ -17,17 +17,17 @@ file.copy(dir_lp, lp_dist, recursive=TRUE) # fix ftime deprecation, taken from: https://github.com/GeomScale/volesti/pull/89/files library(xfun) gsub_file( - paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), - "struct timeb buf;", "", + paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), + "struct timeb buf;", "", fixed=TRUE) gsub_file( - paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), - "ftime(&buf);", "", + paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), + "ftime(&buf);", "", fixed=TRUE) gsub_file( - paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), - "return((double)buf.time+((double) buf.millitm)/1000.0);", - "return((double)0);", + paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), + "return((double)buf.time+((double) buf.millitm)/1000.0);", + "return((double)0);", fixed=TRUE) # add lpsolve header files in external @@ -166,6 +166,8 @@ makefile_dir = paste0(path,'/cran_gen/Makefile') makefile_dist = paste0(path, '/cran_gen/cran_package/src/external/lpsolve/build/lp_solve') file.copy(makefile_dir, makefile_dist, recursive=TRUE) + + # set new cran package folder as wrking directory setwd(paste0(path,'/cran_gen/cran_package')) # enable devtools and Rcpp libraries diff --git a/examples/crhmc_prepare/CMakeLists.txt b/examples/crhmc_prepare/CMakeLists.txt index 6bdf831b2..35c31e9e1 100644 --- a/examples/crhmc_prepare/CMakeLists.txt +++ b/examples/crhmc_prepare/CMakeLists.txt @@ -121,7 +121,7 @@ else () add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") - add_executable (crhmc_prepare crhmc_prepare.cpp) - TARGET_LINK_LIBRARIES(crhmc_prepare ${QD_LIB} ${MKL_LINK} ${LP_SOLVE}) + add_executable (crhmc_prepare crhmc_prepare.cpp ) + TARGET_LINK_LIBRARIES(crhmc_prepare QD_LIB ${MKL_LINK} ${LP_SOLVE}) endif() diff --git a/examples/crhmc_sampling/.gitignore b/examples/crhmc_sampling/.gitignore index 5ba563ce6..60b43389a 100644 --- a/examples/crhmc_sampling/.gitignore +++ b/examples/crhmc_sampling/.gitignore @@ -1,3 +1,7 @@ crhmc_sampling +crhmc_sample_sparse samples.txt +CRHMC_SIMD_* +sampling_functions +simple_crhmc libQD_LIB.a diff --git a/examples/crhmc_sampling/CMakeLists.txt b/examples/crhmc_sampling/CMakeLists.txt index bb206ea49..91fe46a7f 100644 --- a/examples/crhmc_sampling/CMakeLists.txt +++ b/examples/crhmc_sampling/CMakeLists.txt @@ -114,15 +114,16 @@ else () add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard - #add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") - add_definitions(${CMAKE_CXX_FLAGS} "-O3 " ${ADDITIONAL_FLAGS}) # optimization of the compiler + add_definitions(${CMAKE_CXX_FLAGS} "-O3 -DTIME_KEEPING" ${ADDITIONAL_FLAGS}) # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") - add_executable (crhmc_sampling crhmc_sampling.cpp) - TARGET_LINK_LIBRARIES(crhmc_sampling ${QD_LIB} ${MKL_LINK} ${LP_SOLVE}) + add_executable (sampling_functions sampling_functions.cpp) + TARGET_LINK_LIBRARIES(sampling_functions QD_LIB ${MKL_LINK} ${LP_SOLVE}) + add_executable (simple_crhmc simple_crhmc.cpp) + TARGET_LINK_LIBRARIES(simple_crhmc QD_LIB ${MKL_LINK} ${LP_SOLVE}) endif() diff --git a/examples/crhmc_sampling/README.md b/examples/crhmc_sampling/README.md index 38070b2d3..e70ada760 100644 --- a/examples/crhmc_sampling/README.md +++ b/examples/crhmc_sampling/README.md @@ -11,11 +11,16 @@ Build the example by running the following commands in this directory. cmake . -DLP_SOLVE=_PATH_TO_LIB_FILE make ``` -You have to specify the path to liblpsolve55.so/dll/dylib. +You have to specify the path to liblpsolve55.so. For example: -DLP_SOLVE=/usr/lib/lpsolve/liblpsolve55.so ## Running: ```bash - ./crhmc_sampling >samples.txt - python3 ../python_utilities/plot_samples.py -#include -#include -#include -#include -#include -#include - -#include "Eigen/Eigen" -#include "cartesian_geom/cartesian_kernel.h" -#include "diagnostics/multivariate_psrf.hpp" -#include "ode_solvers/ode_solvers.hpp" -#include "preprocess/crhmc/crhmc_input.h" -#include "preprocess/crhmc/crhmc_problem.h" -#include "random.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_int.hpp" -#include "random/uniform_real_distribution.hpp" -#include "random_walks/random_walks.hpp" -#include "ode_solvers/oracle_functors.hpp" - -template -void run_main(int n_samples = 10000, int n_burns = -1, int dimension = 2, - int walk_length = 1, int burn_steps = 1) { - using Kernel = Cartesian; - using Point = typename Kernel::Point; - using MT = Eigen::Matrix; - using VT = Eigen::Matrix; - using RandomNumberGenerator = BoostRandomNumberGenerator; - using Func = GaussianFunctor::FunctionFunctor; - using Grad = GaussianFunctor::GradientFunctor; - using Hess = GaussianFunctor::HessianFunctor; - using func_params = GaussianFunctor::parameters; - using Input = crhmc_input; - using CrhmcProblem = crhmc_problem; - using Solver = ImplicitMidpointODESolver; - using Opts = opts; - using Hpolytope = HPolytope; - - func_params params = func_params(Point(dimension), 4, 1); - Func f(params); - Grad g(params); - Hess h(params); - if (n_burns == -1) { - n_burns = n_samples / 2; - } - RandomNumberGenerator rng(1); - unsigned int dim = dimension; - Opts options; - - CRHMCWalk::parameters crhmc_params(g, dim, options); - Input input = Input(dim, f, g, h); - input.lb = -VT::Ones(dim); - input.ub = VT::Ones(dim); - CrhmcProblem P = CrhmcProblem(input, options); - P.print(); - Point x0 = Point(P.center); - crhmc_params.eta = 0.2; - crhmc_params.momentum = 0.8; - CRHMCWalk::Walk - crhmc(P, x0, g, f, crhmc_params); - MT samples = MT(dim, n_samples - n_burns); -#ifdef TIME_KEEPING - std::chrono::time_point start, end; - start = std::chrono::high_resolution_clock::now(); -#endif -#ifdef TIME_KEEPING - std::chrono::time_point start_file, - end_file; - std::chrono::duration total_time_file = - std::chrono::duration::zero(); -#endif - int j = 0; - for (int i = 0; i < n_samples; i++) { - if (i % 1000 == 0) { - std::cerr << i << " out of " << n_samples << "\n"; - } - for (int k = 0; k < burn_steps; k++) { - crhmc.apply(rng, walk_length, true); - } -#ifdef TIME_KEEPING - start_file = std::chrono::high_resolution_clock::now(); -#endif - if (i >= n_burns) { - VT sample = crhmc.getPoint().getCoefficients(); - samples.col(j) = VT(sample); - j++; - } -#ifdef TIME_KEEPING - end_file = std::chrono::high_resolution_clock::now(); - total_time_file += end_file - start_file; -#endif - } - std::cerr << "\n"; -#ifdef TIME_KEEPING - end = std::chrono::high_resolution_clock::now(); - std::chrono::duration total_time = end - start; - std::cerr << "Total time: " << total_time.count() << "\n"; - crhmc.print_timing_information(); -#endif - - std::cerr << "Step size (final): " << crhmc.solver->eta << std::endl; - std::cerr << "Discard Ratio: " << crhmc.discard_ratio << std::endl; - std::cerr << "Average Acceptance Probability: " - << crhmc.average_acceptance_prob << std::endl; - std::cerr << "PSRF: " << multivariate_psrf(samples) << std::endl; -#ifdef TIME_KEEPING - start_file = std::chrono::high_resolution_clock::now(); -#endif - std::cerr << "Writing samples in a file \n"; - std::cout << samples.transpose() << std::endl; -#ifdef TIME_KEEPING - end_file = std::chrono::high_resolution_clock::now(); - total_time_file += end_file - start_file; - std::cerr << "Time for writing the file: " << total_time_file.count() << "\n"; -#endif -} - -int main(int argc, char *argv[]) { - std::cerr << "Example Usage: ./crhmc_sampling n_sample initial_burns " - "dimension ode_steps steps_bettween_samples\n"; - std::cerr << "Example Usage: ./crhmc_sampling 10000 5000 " - "2 1 1\n"; - if (argc == 1) - run_main(); - else if (argc == 2) - run_main(atoi(argv[1])); - else if (argc == 3) - run_main(atoi(argv[1]), atoi(argv[2])); - else if (argc == 4) - run_main(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); - else if (argc == 5) - run_main(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), - atoi(argv[4])); - return 0; -} diff --git a/examples/crhmc_sampling/data/afiro.mm b/examples/crhmc_sampling/data/afiro.mm new file mode 100644 index 000000000..28d2ef31c --- /dev/null +++ b/examples/crhmc_sampling/data/afiro.mm @@ -0,0 +1,112 @@ +%%MatrixMarket matrix coordinate real general +% Generated 25-Sep-2022 +27 52 109 +3 1 1 +4 2 1 +7 3 1 +8 4 1 +9 5 1 +10 6 1 +13 7 1 +14 8 1 +17 9 1 +18 10 1 +19 11 1 +20 12 1 +21 13 1 +22 14 1 +23 15 1 +24 16 1 +25 17 1 +26 18 1 +27 19 1 +1 20 -1 +2 20 -1.06 +3 20 1 +24 20 0.301 +1 21 1 +4 21 -1 +1 22 1 +22 22 -1 +2 23 1 +26 23 1 +5 24 -1 +6 24 -1.06 +7 24 1 +25 24 0.301 +5 25 -1 +6 25 -1.06 +8 25 1 +25 25 0.313 +5 26 -1 +6 26 -0.96 +9 26 1 +25 26 0.313 +5 27 -1 +6 27 -0.86 +10 27 1 +25 27 0.326 +7 28 -1 +21 28 2.364 +8 29 -1 +21 29 2.386 +9 30 -1 +21 30 2.408 +10 31 -1 +21 31 2.429 +4 32 1.4 +5 32 1 +5 33 1 +23 33 -1 +6 34 1 +27 34 1 +11 35 -1 +12 35 -0.43 +13 35 1 +22 35 0.109 +11 36 1 +14 36 -1 +11 37 1 +24 37 -1 +11 38 1 +21 38 -1 +12 39 1 +26 39 1 +15 40 -0.43 +16 40 1 +17 40 1 +23 40 0.109 +15 41 -0.43 +16 41 1 +18 41 1 +23 41 0.108 +15 42 -0.39 +16 42 1 +19 42 1 +23 42 0.108 +15 43 -0.37 +16 43 1 +20 43 1 +23 43 0.107 +17 44 -1 +21 44 2.191 +18 45 -1 +21 45 2.219 +19 46 -1 +21 46 2.249 +20 47 -1 +21 47 2.279 +14 48 1.4 +16 48 -1 +16 49 1 +25 49 -1 +15 50 1 +27 50 1 +16 51 1 +3 52 80 +7 52 80 +13 52 500 +16 52 44 +17 52 500 +26 52 310 +27 52 300 diff --git a/examples/crhmc_sampling/data/afiro_bounds.mm b/examples/crhmc_sampling/data/afiro_bounds.mm new file mode 100644 index 000000000..7041a15ef --- /dev/null +++ b/examples/crhmc_sampling/data/afiro_bounds.mm @@ -0,0 +1,54 @@ +%%MatrixMarket matrix coordinate real general +% Generated 25-Sep-2022 +51 2 51 +1 2 1000000000 +2 2 1000000000 +3 2 1000000000 +4 2 1000000000 +5 2 1000000000 +6 2 1000000000 +7 2 1000000000 +8 2 1000000000 +9 2 1000000000 +10 2 1000000000 +11 2 1000000000 +12 2 1000000000 +13 2 1000000000 +14 2 1000000000 +15 2 1000000000 +16 2 1000000000 +17 2 1000000000 +18 2 1000000000 +19 2 1000000000 +20 2 1000000000 +21 2 1000000000 +22 2 1000000000 +23 2 1000000000 +24 2 1000000000 +25 2 1000000000 +26 2 1000000000 +27 2 1000000000 +28 2 1000000000 +29 2 1000000000 +30 2 1000000000 +31 2 1000000000 +32 2 1000000000 +33 2 1000000000 +34 2 1000000000 +35 2 1000000000 +36 2 1000000000 +37 2 1000000000 +38 2 1000000000 +39 2 1000000000 +40 2 1000000000 +41 2 1000000000 +42 2 1000000000 +43 2 1000000000 +44 2 1000000000 +45 2 1000000000 +46 2 1000000000 +47 2 1000000000 +48 2 1000000000 +49 2 1000000000 +50 2 1000000000 +51 2 1000000000 diff --git a/examples/crhmc_sampling/data/cube2d.jpg b/examples/crhmc_sampling/data/cube2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63e7c2b7b7e6456104f19f55391e1cb497b4c428 GIT binary patch literal 31467 zcmeFZWmwbk+c!LHq*Ov$Y3UvfN=SpCB8(D73ZrYZ1=14Ip-2b{NR1kyz~~T!0i#oe z(GpVkcj*7R{`Ye{Z=ZM13lBL2x8J^To}W4iyQiZ{cA5S%1Og#bS5wx9K+Xh1AVkxb zE`Wa#|294k{*v-gG4#0aY~$f=;bsldw(xLqboOwxx4h|P?dERp>?A56Dj>pl)6T=g z#a&uZ5b-}hAmHp~D<~L#l?1#9v5T6KI|M>uLHI-TK_TBB0`WCeSHAPWCmlb5^nbAM zTVcJA{R->3E0^w2Dbo;Jm~ZFby`nOHTcx5p``N8wdJ|qfBSh@rC&EQnAlI&5z1m9W z1qlP+pCy$E2H#e84Pm-Xcmc^~@|)n>dg&Jb|9}7gWa(mUU%q_l^XF&2>o=9_@7$Mq zt2ZzVrGZC(3Y};&Ag7x#KlMz<`anSbbl-KOnPfuZ z;;wx!eAu;zHYkGaVH=MhsuZzGh!@rpefv~VLFKozawkLD^U9@jg|$-3$`7KXqMs{; zlC$vhlMxfo_#JN!>MG2DC(EpwlhkRSLa3{&t7&LlHiB|+oS&%mYzB|eU-*zWCogaI zXm_fu)^phfd`v$llKmK^Cgzo~N|JiN-Qr(1SFY+&8I@X|*O6LC`0RL)pB1Q>72yka zJ`U`|6`IyT!^6WP`^w77ge+TLxg||C1jyWtqJJsauy-abEX;1IL9SPFj?{6y`sxk; z^`}cauN(Ky^*@*P`~`tD;0!K#y;sUWZrWqE6VEF6z$U%?=xgLUx^^m2W}X@n*x!u; zlXKGMG7|W>!N{K+b;GdAKCcFpf;w{}3XQMa^p$@W)kcTej=FffI!4pDA25Ym)!qCf zw^QpcMshAVkzc>_c=b}~d({|A@Vx%jJ_7o`z87zMU8bOZx7LLFY}tA_CnqN%z-)4` zaZX3!$OHX**!UI?kD`SI%fP_Eded2ox5%xEf8w zKw{NI=3OV<&9Z=^qA;}znE60&)OZ8FrXr&RuUlp+Kd{7RSY~Z}w747KT&K{nygRbI zS$gvtixM{%2iro5m^0jJ2Ifr$#b0vRCAm9VqXT3S76 z(5NcuNx}^d?;iL#qUwE?6ik;KmhQ@Vlc6j7d>clxhUIZ{*cV&=q__80DQ_N5iQ-*z`Gcr%lb*Y|Fd}MKGqLg6IT!_;)ty z-nFVeK@3^W&hH@L>xa>8+rDeUi!mR39}^1htznl-$yBE$x;0h5ZO*vK^NXIK!5$%+wm}%R?pxst(y#B8%OLG+SKA z4D*TNs9M?alHACv30)4q5iFKxCY})a9WlSG!=SLg>yOD_$Q&o|y!x+Kzaqpfc~0xJ zM}eEHIwSBdr(jiyBbM2#LR);+R!T@J$Iso30S+UlbFjCrV6nl$e;_D&rZ>(+22&1~fz}2k@Sky&wVe z-h4Va@cF}NqX%KAm;9=A`UC22sCFc_LWI7=)xhk&pHICPtUDLOSs8)VcP#53 zpA8r5e~Ez6H&(6v_OmyZ7EFEM>6`mF`u^p%0)L+Cg4Xl5q`^-9_sKb3#lL$jbm2AF z<3H2g@w!ToryrtC3rKO-bYLcFh!wqR_`95GeAfURmY$4oe2q1+H``iKhZR)1EM>=| zF$>6=M~*R`fg2K;J4F*qn`7-hYWOjA)UH|1R)zr=sb(N< z?F)X1yqvMZ4c~^?dAfx+ycLusCwi{bR2r?+^cQUC62ONg+0+@%^H~Hu(waKwOysu@ zK6}o&puOfB{rS2#JXXi)0uFXszZcw}QD&77=Xt3M3Aj=qCS;~5rjA-Z$Ou=CP#V-P zP(uj^vEUsbyZZuGDKaU4l;VV+#nEutFsR!2;T=aO(@F&I7HP$ z&#e!P|9dsBe4dD}t8~E5&PE7gUS2o51hE_bM3*RF8vc73`>278%HZ_Cg^RbrA@zr) z{YAzS{yU?#d#iP85Quruk@)Z@qvs?7)i)VcRpnn5as_WK_B3~=h{h%*g?iz~X2Q5K zZ!h&`beZl98#}iyWd$*BBG)GCH~uV_oP{t4Z0qrvp+}OZ%58PK)1?MaFqBuXs-%4V zstA|n<|YQcnWc;DhCCwx8`ZPnyswj!UxDr~yEpy3`p>VAY(o#qsKl9?($g8Wl7)!o zFi}cL0;WQ?y^N#`P|~hMex>(!qZAW^_7{>|w|{&q`+4>v`QxTwqUyuVuBZjy-@jfG zQ*tI~Cwapi#yIj>u7*8n;BOpFd=*!EJGPhYhqxKW;nN$0pQB}YMY00F1nyBHqO>RF zhqypDbWw=irsU3kSBBmGYd`AMrRFupH_(do7c&Cq^IOaQq)?W!R!p&!G{z4VP-P%G zzNjTWb5Fk}sk0C-b;G>MduU#;fKALX$}qL3)<}9Vi?p+ z5>Rn-b5px01Qss}{ETrOIH0V(`C>x62A^(gbP9HS)ZKno$K0>NNhUZmpqirToQM=~VN<@ESP|){c zQ{3L+R-Zx}aw#JetmMqNdtd8W3fbTbWC?B5;C2idap>2)_(XA&gQN8aBvZ}RRrt)) z;0+^7OV+`r2XOE%e3y3ft;;<@RlJp>9Xb+v+nqymOxIj~JxOnL>`- z&x%SSA>%j(+3&V8Ewp8Vv1J%9LmkcctV!6ANW}deyMuD(XVfQ)10f!jeiIJi+0z!9 z2pr1#H+s|WlEexJr`)lhbn5-0cGO)Im5G(9$2S$9-$RdFe--2>k`eW#ihp$c9$lFA z;RnRG(q%@m0)d0hzl@!WDSVoB<57No{(I-C25a5(VEME4U+_MSWR{}`*pC$x#SnUU z=%16DI}^g-)KtGaX}k};XQ-lb@$;SM7u2-0lmi1BHjsgV^7{Ahn_~HSc)kwgYPwDZ z>=qo@Pokyh#q5H?W0n%?;kT}Qmg#T}b@eZEF$&RbH-gZc2RX08!)1fPz4_7q?yNzH zndy#^y*)ShBFbr^wx+nwaa4p+$}LB+Bzp}Y*^A_i)0!-Vo;8>~OMDYT$|OxSIy(Ae zq?AqCdo@zZeQ|nyrnwrN3?c}dYP51Zr}p}KGX=vkze)8KP}InfrE~r7l#)fPFALPI zhycuN*%r;@vs$y%pRGc&{cDKVvdy~LVJxmNnrUFbTDdj=l{@zg=is-(HpBe!iJy}r z{7h2LkVGCX{I~Vx3{N5Vpi#{BXrA=9fhN1$o%#KKRDQ0#RFt#73!_C}BBhH^sHY(F&r{nWv(;z8!!GAc$mM4gh_ znF!R&tFb}<`l7NV#Z8qPrue%Kp?v^c>mmMs>pxz{QpKLE{h%cEWyD`EV{UT z*e?p42SptA9cKrW>7_xTcA1>nD6*{|?N~-dyb0m15d~1T=XUl7EY9H$USB zjs;#MH?~=}ZR+CZ*wv|SrpY|U9064>teje2ubax9K6Hw)+LE#L%QCR1rzIzffA;_A z(5Gv0iUPSkWxXIDEuN5UQp*I(OJ-icIQ+Q)o~nZ#H$sOqq{BU6gN>(RY1K-}qJ{GJYC4qUwAyzJIGcz4Uf2|&4l^;&gMG8Su&@(Kg@s}tjj_>T zm1=YmU3;UL*)fdfSe|>?L}2yc_YushZ&X1=4f9w-;X`^_*7JWMD#mr1`wqfW%Sp50 zRP4AlOaNB?B>#b3Zz*_EFZMgnM28Jp233r(@HZw;?Kf2XKI&Gbxu%+v&Wm%%&8XXN zovKDXjM$HNoRi@gWlp)T*PCS3{TAUQN!P{!KX%*_8cSf8zIOde17&a^S{|A2l2k`mO(?(6%>!8V7 zeV8))H6Gh5wXhT@`7?9=mR4ScKFGmq4(uE)UARs=$QIG~5M~>vr0aIcfV@-#RiJG} ze_iSmSEzseI!=DnTnnzi7lsPhK9EV7`gA?OJq4R>uv`gm~ynEK- zUMLUI{R8y&kJbJI=mF$Tz7X;cojyK?jQSaW82z#|3LfwJ7*(n%V$kVzf+D=D%3%%@ zF8CDTSB~KsdZ0vBT zbIOtr07X;bg@52yj|6;Wr1T$emaqPm;H0LUy@vcDhN>BI+%0MSHL|!=#($Lqo_5$9 z{{dl+d09jfE?OQn7}wRc4~xv8Y3Ayv{@}@aw-$BW>qN-~|Ut$FQGuEW^qRTB9k zg{xF&U0Sz9iAp*Vl*ETX)eAdO?zTAaVhB+oJVUO+yZRworoq`HeMi`H`1Au6LW@9ryE}Bv5*~xy^$rn$oY3S{n({p!Xvj8EwsOeSoa&Cm; zsjs$@Wg573H6kTHc|o&nH+E=b93#mrF_Y0-)j(OR`v$=O;Gba@8(K>3l&Z_{W!;%j zE55#oII-Ow^|AoB6N#ZN(Y)(xV%Q`+#YAIGeX&6E)@{4gA#<@rTnm+7X?wXCnve=otDPxslqAYF*x?kd7R{mq+~SK01X7uVW-V>NO4a^7wr zM}1*e*P`uoncg_GhEuDl?=KLeced9;Zv-|KKK!`8*(DfSXFq@S-<{9bxXI1UefQ$M zEdZpm_1@pDUjItM+vpsA36MD}2BrL5na@!Z8!~dwX$EZ>%I%D8)HSca`_>zpl&pet zd!X<2MSYgCPK@6z$cftl@|aM|MWVvfvrO+!~u4hXoS~{C?X-UCs zxat867VbS2a2;#nPWI&c(s4sHv0V>sV87(}xl-d2SX;6R^J$IPLuf z_qj;v#V##lOB80x)*2231_lSC6o4uxlIY5Kk${7IcUHncXNI@GW*MpVbV!bQ1};r^ zGzEb@71;J=w)ga?007_Ya(lk&!%xWK{QTpuFNmvmC;du&HY_U~u;k4lWJ-a7$HZ8$ zbzgw`2HRP34mwB^4*IkG(+6C%jk>8L@-_4pxsLQtb^;$zINH8nO%V#-$3Hs%>BeTL zCG0!t06=miSo5HO(f13kbC?-`qzD*S$bWC$4NH9PjNN$k;h}Z(+~d{pn(C!Yzy2y` zb4XK57-eiqN*IO0;gzF<-4Yj^&V$Rny!@FhDCGnihdFO%g_2S=RPJKM77P3%dkwm0 zzkjv?lyP@RxfW)hQYDn^_%X4~snl=^8m)D}^lerfG1p&lEz%6`$}uX>Pw{q2IL2&t+p&a0 z&y$8)7ZL-mAVB}DqN3&h4d1y;NWs+=YW^buYQbTGrukBOLl zrisjVe|v5)pS$vzIlO<*R9c5}mFmKnOBggVpRCcYInZp-{oGb+p;F$p*si`u8XYek zbs3l2Ek(68or))fQqvQg-P`3ux--nu z9=FQM%fFSvRS9x|`(pPO!0KFqdU*zNH<~ewQ#*BfCiKPyh*pZodDA*Cl?WRCd-v`I zr-<6lHl7>_ULd1CH@zhB!nqC)MQ?WU+I`DDpDOMUa^2kjs=d9vwexubt>$Rk*kKJ# z;$fwt&dxhKQev*Kf~%qstlz%2xw-i|HufoGe!g3`nkaQ;pQ6#S z-%HGIFiCqfJv&d*pVuS!Q+%~{S%6XApB9dZymRLck?-~o!vB5?6nO)LLsGhd6MeE; z64@rbUrub>`!|V$mI%ke5l5Z1$68&RmT_7ttoKvetD#ZG2aa>%mDN0Si@lzAiS=T3)> zeZ%y3cB23+H zOpvCmnL8BtW`$$s7toHnL*;4@ThYOdM-}7aHzcn5bnw$?Mm�B$cX&M5_xl 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¬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 literal 0 HcmV?d00001 diff --git a/examples/crhmc_sampling/data/simplex2d.jpg b/examples/crhmc_sampling/data/simplex2d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bc2eaefb715d64f450a5556be960e177d130185 GIT binary patch literal 24408 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 + +inline bool exists_check(const std::string &name) { + std::ifstream f(name.c_str()); + return f.good(); +} +/*Problem on the form X=[A|b] bounds=[lb|ub] */ +template< typename SpMat, typename VT> +void load_crhmc_problem(SpMat &A, VT &b, VT &lb, VT &ub, int &dimension, + std::string problem_name) { + { + std::string fileName("./data/"); + fileName.append(problem_name); + fileName.append(".mm"); + if(!exists_check(fileName)){ + std::cerr<<"Problem does not exist.\n"; + exit(1);} + SpMat X; + loadMarket(X, fileName); + int m = X.rows(); + dimension = X.cols() - 1; + A = X.leftCols(dimension); + b = VT(X.col(dimension)); + } + { + std::string fileName("./data/"); + fileName.append(problem_name); + fileName.append("_bounds.mm"); + if(!exists_check(fileName)){ + std::cerr<<"Problem does not exist.\n"; + exit(1);} + SpMat bounds; + loadMarket(bounds, fileName); + lb = VT(bounds.col(0)); + ub = VT(bounds.col(1)); + } +} +template +NT max_interval_psrf(MT &samples) { + NT max_psrf = NT(0); + VT intv_psrf = interval_psrf(samples); + unsigned int d = intv_psrf.rows(); + for (unsigned int i = 0; i < d; i++) { + if (intv_psrf(i) > max_psrf) + max_psrf = intv_psrf(i); + } + return max_psrf; +} +template +void diagnose(MT &samples, StreamType &stream) { + unsigned int min_ess = 0; + print_diagnostics(samples, min_ess, stream); + NT max_psrf = max_interval_psrf(samples); + stream << "max_psrf: " << max_psrf << std::endl; + stream << "min ess " << min_ess << std::endl; +} + +#endif diff --git a/examples/crhmc_sampling/sampling_functions.cpp b/examples/crhmc_sampling/sampling_functions.cpp new file mode 100644 index 000000000..61242b253 --- /dev/null +++ b/examples/crhmc_sampling/sampling_functions.cpp @@ -0,0 +1,143 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2022-2022 Ioannis Iakovidis + +// Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of +// Code 2022 program. + +// Licensed under GNU LGPL.3, see LICENCE file + +// References +// Yunbum Kook, Yin Tat Lee, Ruoqi Shen, Santosh S. Vempala. "Sampling with +// Riemannian Hamiltonian +// Monte Carlo in a Constrained Space" +#include "Eigen/Eigen" +#include "cartesian_geom/cartesian_kernel.h" +#include "volume/sampling_policies.hpp" +#include "ode_solvers/ode_solvers.hpp" +#include "preprocess/crhmc/crhmc_input.h" +#include "preprocess/crhmc/crhmc_problem.h" +#include "sampling/random_point_generators.hpp" +#include "sampling/sampling.hpp" +#include "misc/misc.h" +#include "random.hpp" +#include +#include "random_walks/random_walks.hpp" +#include "generators/known_polytope_generators.h" +#include "helper_functions.hpp" +using NT = double; +using Kernel = Cartesian; +using Point = typename Kernel::Point; +using Func = GaussianFunctor::FunctionFunctor; +using Grad = GaussianFunctor::GradientFunctor; +using Hess = GaussianFunctor::HessianFunctor; +using PolytopeType = HPolytope; +using MT = PolytopeType::MT; +using VT = Eigen::Matrix; +using func_params = GaussianFunctor::parameters; +using RNG = BoostRandomNumberGenerator; +template +void sample_hpoly(int n_samples = 80000, + int n_burns = 20000) { + std::string problem_name("simplex"); + std::cerr << "CRHMC on " << problem_name << "\n"; + using Input = crhmc_input; + using CrhmcProblem = crhmc_problem; + using Solver = + ImplicitMidpointODESolver; + RNG rng(1); + PolytopeType HP=generate_simplex(2,false); + int dimension = HP.dimension(); + func_params params = func_params(Point(dimension), 0.5, 1); + Func f(params); + Grad g(params); + Hess h(params); + std::list PointList; + crhmc_sampling, PolytopeType, RNG, CRHMCWalk, NT, Point, Grad, Func, Hess, Solver>( + PointList, HP, rng, 1, n_samples, n_burns, g, f, h, simdLen); + MT samples = MT(dimension, PointList.size()); + int i=0; + for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ + samples.col(i) = (*it).getCoefficients(); + i++; + } + std::ofstream diagnostics_stream; + diagnostics_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_diagnostics.txt"); + diagnose(samples, diagnostics_stream); + std::ofstream samples_stream; + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_samples.txt"); + samples_stream << samples.transpose() << std::endl; +} + +template +void sample_sparse_problem(int n_samples = 80000, + int n_burns = 20000){ + using SpMat = Eigen::SparseMatrix; + using ConstraintProblem =constraint_problem; + std::string problem_name("simplex3"); + std::cerr << "CRHMC on " << problem_name << "\n"; + using Input = crhmc_input; + using CrhmcProblem = crhmc_problem; + using Solver = + ImplicitMidpointODESolver; + + RNG rng(1); + SpMat A; + VT b, lb, ub; + int dimension; + load_crhmc_problem(A, b, lb, ub, dimension, problem_name); + ConstraintProblem problem = ConstraintProblem(dimension); + problem.set_equality_constraints(A, b); + problem.set_bounds(lb, ub); + func_params params = func_params(Point(dimension), 0.5, 1); + Func f(params); + Grad g(params); + Hess h(params); + std::list PointList; + crhmc_sampling, ConstraintProblem, RNG, CRHMCWalk, NT, Point, Grad, Func, Hess, Solver>( + PointList, problem, rng, 1, n_samples, n_burns, g, f, h, simdLen); + MT samples = MT(dimension, PointList.size()); + int i=0; + for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ + samples.col(i) = (*it).getCoefficients(); + i++; + } + std::ofstream diagnostics_stream; + diagnostics_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_diagnostics.txt"); + diagnose(samples, diagnostics_stream); + std::ofstream samples_stream; + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_samples.txt"); + samples_stream << samples.transpose() << std::endl; +} +template +void run_main(int n_samples = 80000, + int n_burns = 20000){ + std::cerr<<"Sampling HPolytope\n"; + sample_hpoly(n_samples, n_burns); + std::cerr<<"Sampling Sparse Problem\n"; + sample_sparse_problem(n_samples, n_burns); +} +int main(int argc, char *argv[]) { + if (argc != 4) { + std::cerr << "Example Usage: ./crhmc_sample_sparse " + "[simdLen] [n_samples] [n_burns]\n"; + std::cerr << "i.e.: ./crhmc_sample_ 4 1000 500\n"; + exit(1); + } + if (atoi(argv[1]) == 1) { + run_main<1>(atoi(argv[2]), atoi(argv[3])); + } else if (atoi(argv[1]) == 4) { + run_main<4>(atoi(argv[2]), atoi(argv[3])); + } else if (atoi(argv[1]) == 8) { + run_main<8>(atoi(argv[2]), atoi(argv[3])); + } else if (atoi(argv[1]) == 16) { + run_main<16>(atoi(argv[2]), atoi(argv[3])); + } + return 0; +} diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp new file mode 100644 index 000000000..8f07065b0 --- /dev/null +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -0,0 +1,94 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2022-2022 Ioannis Iakovidis + +// Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of +// Code 2022 program. + +// Licensed under GNU LGPL.3, see LICENCE file + +// References +// Yunbum Kook, Yin Tat Lee, Ruoqi Shen, Santosh S. Vempala. "Sampling with +// Riemannian Hamiltonian +// Monte Carlo in a Constrained Space" +#include "Eigen/Eigen" +#include "cartesian_geom/cartesian_kernel.h" +#include "volume/sampling_policies.hpp" +#include "ode_solvers/ode_solvers.hpp" +#include "preprocess/crhmc/crhmc_input.h" +#include "preprocess/crhmc/crhmc_problem.h" +#include "sampling/random_point_generators.hpp" +#include "sampling/sampling.hpp" +#include "misc/misc.h" +#include "random.hpp" +#include +#include "random_walks/random_walks.hpp" +#include "generators/known_polytope_generators.h" +#include "helper_functions.hpp" + +template +void sample_hpoly(int n_samples = 80000, + int n_burns = 20000, int dim = 2) { + using NT = double; + using Kernel = Cartesian; + using Point = typename Kernel::Point; + using Func = ZeroScalarFunctor; + using Grad = ZeroFunctor; + using Hess = ZeroFunctor; + using PolytopeType = HPolytope; + using VT = Eigen::Matrix; + using MT = PolytopeType::MT; + using RNG = BoostRandomNumberGenerator; + std::string problem_name("simplex"); + std::cerr << "CRHMC on " << problem_name << "\n"; + RNG rng(1); + PolytopeType HP=generate_simplex(dim,false); + int dimension = HP.dimension(); + Func * f = new Func; + Grad * g = new Grad; + std::list PointList; + execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( + HP, rng, PointList, 1, n_samples, n_burns, g, f); + MT samples = MT(dimension, PointList.size()); + int i=0; + for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ + samples.col(i) = (*it).getCoefficients(); + i++; + } + std::cerr<<"max_psrf: "<< max_interval_psrf(samples)<<"\n"; + std::ofstream samples_stream; + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_samples.txt"); + samples_stream << samples.transpose() << std::endl; + delete f; + delete g; +} + +template +void run_main(int n_samples = 80000, + int n_burns = 20000, + int dimension = 2){ + std::cerr<<"Sampling HPolytope\n"; + sample_hpoly(n_samples, n_burns, dimension); +} +int main(int argc, char *argv[]) { + if (argc != 5) { + std::cerr << "Example Usage: ./simple_crhmc " + "[simdLen] [n_samples] [n_burns] [dimension]\n"; + std::cerr << "i.e.: ./simple_crhmc 4 1000 500 2\n"; + exit(1); + } + std::cerr << "To plot: python3 ../python_utilities/plot_samples.py (atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + } else if (atoi(argv[1]) == 4) { + run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + } else if (atoi(argv[1]) == 8) { + run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + } else if (atoi(argv[1]) == 16) { + run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + } + return 0; +} diff --git a/examples/optimization_spectrahedra/readWriteSdpaFile.cpp b/examples/optimization_spectrahedra/readWriteSdpaFile.cpp deleted file mode 100644 index c734ccac5..000000000 --- a/examples/optimization_spectrahedra/readWriteSdpaFile.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -//Contributed and/or modified by Repouskos Panagiotis, as part of Google Summer of Code 2019 program. - -// Licensed under GNU LGPL.3, see LICENCE file - -// This examples illustrates how to read and write SDPA format files. -// It will read a semidefinite program from data/sdp_n2m3.txt, print it and then write it to a new file - -#define VOLESTI_DEBUG -#include "Eigen/Eigen" -#include "vector" -#include -#include "cartesian_geom/cartesian_kernel.h" -#include "random.hpp" -#include "spectrahedron.h" -#include "SDPAFormatManager.h" -#include "string" -#include "iostream" - -typedef double NT; -typedef Eigen::Matrix VT; -typedef Eigen::Matrix MT; -typedef Cartesian Kernel; -typedef typename Kernel::Point Point; -typedef Spectrahedron SPECTRAHEDRON; - - -int main(int argc, char* argv[]) { - std::string fileName("data/sdp_n2m3.txt"); - std::string outputFile("new_sdp_n2m3.txt"); - - SPECTRAHEDRON spectrahedron; - Point objFunction; - - // read the semidefinite program - // and create a vector (objective function) and a spectrahedron - - // open a stream to read the input file - std::ifstream in; - in.open(fileName, std::ifstream::in); - - // read the file - SdpaFormatManager sdpaFormatManager; - sdpaFormatManager.loadSDPAFormatFile(in, spectrahedron, objFunction); - - // print the contents - std::cout << "The objective Function:\n\n"; - objFunction.print(); - std::cout << "\n\nThe matrices of the spectrahedron:\n\n"; - spectrahedron.getLMI().print(); - - // open a stream to an output file - std::filebuf fb; - fb.open(outputFile, std::ios::out); - std::ostream os(&fb); - - // write a SDPA format file using the data we read before - sdpaFormatManager.writeSDPAFormatFile(os, spectrahedron, objFunction); - - return 0; -} - diff --git a/external/PackedCSparse/PackedChol.h b/external/PackedCSparse/PackedChol.h index 57a2b9232..97d102206 100644 --- a/external/PackedCSparse/PackedChol.h +++ b/external/PackedCSparse/PackedChol.h @@ -14,7 +14,7 @@ #include "leverage.h" #include "leverageJL.h" #include "multiply.h" -#include "dd_real.h" +#include "qd/dd_real.h" #include #include using namespace PackedCSparse; diff --git a/external/PackedCSparse/qd/COPYING b/external/PackedCSparse/qd/COPYING new file mode 100644 index 000000000..a20ad70eb --- /dev/null +++ b/external/PackedCSparse/qd/COPYING @@ -0,0 +1,16 @@ +This work was supported by the Director, Office of Science, Division +of Mathematical, Information, and Computational Sciences of the +U.S. Department of Energy under contract numbers DE-AC03-76SF00098 and +DE-AC02-05CH11231. + +Copyright (c) 2003-2009, The Regents of the University of California, +through Lawrence Berkeley National Laboratory (subject to receipt of +any required approvals from U.S. Dept. of Energy) All rights reserved. + +By downloading or using this software you are agreeing to the modified +BSD license that is in file "BSD-LBNL-License.doc" in the main ARPREC +directory. If you wish to use the software for commercial purposes +please contact the Technology Transfer Department at TTD@lbl.gov or +call 510-286-6457." + + diff --git a/external/PackedCSparse/qd/Makefile b/external/PackedCSparse/qd/Makefile new file mode 100644 index 000000000..791e92b99 --- /dev/null +++ b/external/PackedCSparse/qd/Makefile @@ -0,0 +1,15 @@ +QD_CPPFLAGS=$(CPPFLAGS) -I$(R_INCLUDE_DIR) -march=native + +QD_SOURCES= bits.cc c_dd.cc c_qd.cc dd_const.cc dd_real.cc fpu.cc \ + qd_const.cc qd_real.cc util.cc + +QD_OBJECTS=$(QD_SOURCES:.cc=.o) + +libqd.a: $(QD_OBJECTS) + $(AR) rc libqd.a $(QD_OBJECTS) + +.cc.o: + $(CC) $(CFLAGS) $(CPICFLAGS) $(QD_CPPFLAGS) -c $< -o $@ + +clean: + rm -rf $(QD_OBJECTS) libqd.a diff --git a/external/PackedCSparse/qd/NEWS b/external/PackedCSparse/qd/NEWS new file mode 100644 index 000000000..f32a75751 --- /dev/null +++ b/external/PackedCSparse/qd/NEWS @@ -0,0 +1,181 @@ +Changes for 2.3.22 + Made changes suggested by Vasiliy Sotnikov + +Changes for 2.3.21 + Changed renorm in include/qd/qd_inline.h + +Changes for 2.3.20 + added #include to quadt_test.cpp + changed references to 2.3.20 from 2.3.18 + +Changes for 2.3.19 + - Updated qd_real.cpp and dd_real.cpp to fix a buffer overflow problem. + +Changes for 2.3.18 + - Updated qd_real.cpp and dd_real.cpp to fix a problem in output. + +Changes for 2.3.17 + - updated qd_real.cpp, to fix a problem with improper treatment of + negative arguments in nroot. + +Changes for 2.3.16 + - Updated dd_real.cpp, to fix a problem with inaccurate values of + tanh for small arguments. + +Changes for 2.3.15 + - Updated qd_real.cpp, to fix a problem with static definitions. + +Changes for 2.3.14 + - Updated autoconfig (replaced config.sub and config.guess) + +Changes for 2.3.7 + - Fixed bug in to_digits where digits larger than 10 + where output occasionally. + +Changes for 2.3.6 + - Added fmod (C++) and mod (Fortran) functions. + +Changes for 2.3.5 + - Fixed bug in division of qd_real by dd_real. + - Fixed bug in ddoutc (Fortran ddmod.f). + - Now compiles with g++ 4.3. + - Distribute tests/coeff.dat. + +Changes for 2.3.4 + - Fixed bug in Makefile for cygwin / mingw systems. + +Changes for 2.3.3 + - Fixed bug in atan2. + +Changes for 2.3.2 + - Fixed bug in sin / cos / sincos where too much accuracy was + lost for (moderately) large angles. + - Use fused-multiply add intrinsics on IA-64 platforms if + compiled by Intel compiler. + - Fixed bug in c_dd_write and c_qd_write. + - Fixed bug were qdext.mod was not being installed. + +Changes for 2.3.1 + - Fixed bug in sincos and cos_taylor. This affected the result + of trigonometric functions in some cases. + +Changes for 2.3.0 + This is a fairly significant change, breaking API compatibility. + - Moved C++ main entry in libqdmod.a to libqd_f_main.a. + This allows to link Fortran code using QD with custom + C++ main function. Pure Fortran code will need to be linked + with qd_f_main library in addition to qdmod and qd library. + - Constructors accepting pointers made explicit. + - Fortran routines labeled as elemental or pure, where appropriate. + - Write() is now to_string(), and now takes a single fmtflag. + - dd_real addition and multiplication made commutative. + - dd_real now represented as array of two doubles, instead of + two discrete scalars. + - New Fortran generic routines to read / write, operations with + complex and integers. + - Improved exp, sin, and cos functions. + - Removed unused constants and obscure constants only used internally + from public interface. + +Changes for 2.2.6 + - Fixed bug in mixed precision multiplication: qd_real * dd_real. + +Changes for 2.2.5 + - Bug fix in qd_real addition when --enable-ieee-add is specified. + - Debugging routines dump and dump_bits updated; + dump_components removed (just use dump). + - Fortran support for Fortran strings. Use character arrays instead. + - Return NaN under error conditions. + - Added _inf constant; exp now returns Inf when argument is too large. + - Output formatting fixes for Inf and NaNs. + - Added more real-complex mixed arithmetic routines in Fortran + interface. + +Changes for 2.2.4 + - Added random_number interface for Fortran modules. + - Use slightly more conservative values for eps. + - Avoid unnecessary overflow near overflow threshold. + - Added radix, digits, min/maxexponent, range, and precision + intrinsics to Fortran interface. + - Added safe_max (C++) and safe_huge (Fortran). + +Changes for 2.2.3 + - Fix sign function bug in Fortran modules. + +Changes for 2.2.2 + - Do not bother setting uninitialized dd_real and qd_reals to zero. + - Use clock_gettime if available for timing. + - Fortran I/O should be more consistent with C++ version. + - fpu.h is now included with dd_real.h. + +Changes for 2.2.1 + - Minor fixes when printing in scientific format. + - Change search order of C++ compilers in Apple systems to avoid + case insensitive filesystems. + +Changes for 2.2.0 + - Added F95 interface for complex types. + - Renamed dd.h and qd.h to dd_real.h and qd_real.h, respectively. + This will break older C++ code using 2.1.x library, but it was + conflicting with QuickDraw libraries on Macs. (Hence the version + bump to 2.2). + - Removed overloaded typecast operators for int and double. These + permitted *automatic* conversion of dd_real/qd_real to double or + int, which is somewhat dangerous. Instead to_int and to_double + routines are added. + +Changes for 2.1.214 + - Updated pslq_test. + - Implmented numeric_limits<>. + - Better polyroot. + - Added isnan, isfinite, isinf functions. + - Fix / improve input output functions. + - Drop Microsoft Visual C++ 6.0 support. + - More efficient dd_real::sin. + +Changes for 2.1.213 + - Support for x86_64 platforms. + - Drop libtool support for now. + +Changes for 2.1.212 + - Support for pathCC compiler. + - Added accurate and sloppy versions of add / sub / mul / div avaialble. + - Added autodetection of fma functions. + +Changes for 2.1 (2003-12-30) + - added automake scripts. + - use libtool to compile / link and build libraries. + - supports standard installation targets (make install). + - support for Intel C++ compilers (icc / ecc). + - Fortran programs are now linked by C++ compiler. + - support for building shared library. + - minor bug fixes. + +Changes for 2.0 (2003-12-08) + - all header files are in "include/qd" directory. + - added autoconf scripts. + - added config.h and qd_config.h to store configuration information. + - renamed x86_* routines to fpu_* routines. + - added separate Fortran interface (f_* routines). + - options for sloppy multiply and sloppy divison separated. + - fixed C interface to be actually in C syntax. + - updated / added README, AUTHORS, NEWS, and LICENSE files. + - minor bug fixes. + +Changes for 1.2 (2003-12-04) + - added "dist-clean" target in Makefile + - initialize dd and qd variables to zero + - increases tolerance for qd / dd tests + - changed .cc extension to .cpp + - updated README, COPYING, and NEWS files + - added ChangeLog file + - fixed bug in '-all' flag in qd_test + - minor bug fixes + +Changes for 1.1 (2002-10-22) + - added "Changes" file (this file) + - fixed to + - fixed constant (3/4) * pi + - fixed exp(x) to return zero if x is a large negative number + - removed "docs" target in Makefile + diff --git a/external/PackedCSparse/qd/README b/external/PackedCSparse/qd/README new file mode 100644 index 000000000..8a085d72c --- /dev/null +++ b/external/PackedCSparse/qd/README @@ -0,0 +1,437 @@ +Quad Double computation package +Copyright (C) 2003-2019 +================================================ + +Revision date: 26 February 2019 + +Authors: +Yozo Hida U.C. Berkeley yozo@cs.berkeley.edu +Xiaoye S. Li Lawrence Berkeley Natl Lab xiaoye@nersc.gov +David H. Bailey Lawrence Berkeley Natl Lab dhbailey@lbl.gov + +C++ usage guide: +Alex Kaiser Lawrence Berkeley Natl Lab adkaiser@lbl.gov + +This work was supported by the Director, Office of Science, Division of Mathematical, +Information, and Computational Sciences of the U.S. Department of Energy under contract +number DE-AC02-05CH11231. + +This work was supported by the Director, Office of Science, Division of Mathematical, +Information, and Computational Sciences of the U.S. Department of Energy under contract +numbers DE-AC03-76SF00098 and DE-AC02-05CH11231. + +*** IMPORTANT NOTES: + +See the file COPYING for modified BSD license information. +See the file INSTALL for installation instructions. +See the file NEWS for recent revisions. +See the file docs/qd.pdf for additional information. + +Outline: + +I. Introduction +II. Installation of package, and linking and executing user files +III. C++ Usage +IV. Fortran Usage +V. Note on x86-Based Processors (MOST systems in use today) + + +I. Introduction + +This package provides numeric types of twice the precision of IEEE double (106 mantissa +bits, or approximately 32 decimal digits) and four times the precision of IEEE double (212 +mantissa bits, or approximately 64 decimal digits). Due to features such as operator and +function overloading, these facilities can be utilized with only minor modifications to +conventional C++ and Fortran-90 programs. + +In addition to the basic arithmetic operations (add, subtract, multiply, divide, square root), +common transcendental functions such as the exponential, logarithm, trigonometric and +hyperbolic functions are also included. A detailed description of the algorithms used is +available in the docs subdirectory (see docs/qd.pdf). An abridged version of this paper, +which was presented at the ARITH-15 conference, is also available at: + +Yozo Hida, Xiaoye S. Li and David H. Bailey, "Algorithms for quad-double precision + floating point arithmetic," 15th IEEE Symposium on Computer Arithmetic, IEEE Computer + Society, 2001, pg. 155-162, available at + https://www.davidhbailey.com/dhbpapers/arith15.pdf. + + +II. Installation of package, and linking and executing user files + +A. Directories + +There are six directories and several files in the main directory of this distribution, +described below + +src This contains the source code of the quad-double and double-double + library. This source code does not include inline functions, + which are found in the header files in the include directory. + +include This directory contains the header files. + +fortran This directory contains Fortran-90 files. + +tests This directory contains some simple (not comprehensive) tests. + +docs This directory contains a technical paper describing the algorithms. + +config This directory contains various scripts used by the configure + script and the Makefile. + +Please note that all commands refer to a Unix-type environment such as Mac OSX or Ubuntu +Linux using the bash shell. + +B. Installing and building + +To build the library, first run the included configure script by typing + + ./configure + +This script automatically generates makefiles for building the library and selects compilers +and necessary flags and libraries to include. If the user wishes to specify compilers or flags +they may use the following options. + + CXX C++ compiler to use + CXXFLAGS C++ compiler flags to use + CC C compiler to use (for C demo program) + CFLAGS C compiler flags to use (for C demo program) + FC Fortran 90 compiler + FCFLAGS Fortran 90 compiler flags to use + FCLIBS Fortran 90 libraries needed to link with C++ code. + +For example, if one is using GNU compilers, configure with: + + ./configure CXX=g++ FC=gfortran + +The Fortran and C++ compilers must produce compatible binaries. On some systems +additional flags must be included to ensure that portions of the +library are not built with 32 and 64 bit object files. For example, on +64-Bit Mac OSX 10.6 (Snow Leopard) and 10.7 (Lion) the correct +configure line using GNU compilers is: + + ./configure CXX=g++ FC=gfortran FCFLAGS=-m64 + +To build the library, simply type + + make + +and the automatically generated makefiles will build the library including archive files. + +To allow for easy linking to the library, the user may also wish to +install the archive files to a standard place. To do this type: + + make install + +This will also build the library if it has not already been built. Many systems, including Mac +and Ubuntu Linux systems, require administrator privileges to install the library at such +standard places. On such systems, one may type: + + sudo make install + +instead if one has sufficient access. + +The directory "tests" contains programs for high precision quadrature and integer-relation +detection. To build such programs, type: + + make demo + +in the "tests" directory. + +C. Linking and executing user programs + +C++ source files: + +The simplest way to link to the library is to install it to a standard place as described above, and use the -l option. For example + + g++ compileExample.cpp -o compileExample -l qd + +One can also use this method to build with make. A file called "compileExample.cpp" and the +associated makefile "makeCompileExample" illustrate the process. + +A third alternative is to use a link script. If one types "make demo" in the test +directory, the output produced gives guidance as to how to build the files. By +following the structure of the compiling commands one may copy the appropriate portions, +perhaps replacing the filename with an argument that the user can include at link time. +An example of such a script is as follows: + +g++ -DHAVE_CONFIG_H -I.. -I../include -I../include -O2 -MT $1.o -MD -MP -MF +.deps/qd_test.Tpo -c -o $1.o $1.cpp +mv -f .deps/$1.Tpo .deps/$1.Po +g++ -O2 -o $1 $1.o ../src/libqd.a -lm + +To use the link script, make it executable (by typing "chmod +x link.scr) and then type: + +./link.scr compileExample + +Note that the file extension is not included because the script handles all extensions, +expecting the source file to have the extension ".cpp". + +Fortran-90 source files: + +Similarly, a script for compiling fortran programs may be constructed as follows. +In the fortran directory, type "make quadtsq". This compiles the Fortran program +tquadts.f, links with all necessary library files, and produces the executable +"quadts". As this is being done, all flags and linked libraries are displayed. +For instance, on a 2019-era Apple Macintosh system, where the library was installed +as above with g++ for C++ and gfortran for Fortran-90, the following is output: + +gfortran -m64 -ffree-form -c -o tquadtsq.o tquadtsq.f +/bin/sh ../libtool --tag=CXX --mode=link g++ -O2 -o quadtsq tquadtsq.o second.o +libqdmod.la libqd_f_main.la ../src/libqd.la +-L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0 +-L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0/../../.. +-lgfortran -lquadmath -lm -lm + +Thus a general compile-link script is the following: + +gfortran -m64 -ffree-form -c -o $1.o $1.f90 +/bin/sh ../libtool --tag=CXX --mode=link g++ -O2 -o $1 $1.o second.o \ + libqdmod.la libqd_f_main.la ../src/libqd.la \ + -L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0 \ + -L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0/../../.. \ + -lgfortran -lquadmath -lm -lm + +Note that if the .f90 suffix is used for Fortran-90 source files, the +-ffree-form flag may be omitted, but the first line above should end with +"$1.f90" (as shown above). After forming the script, name file, "complink.scr", +and then type "chmod +x complink.scr". To use this script compile and link a +program named "prog.f90", type "./complink.scr prog". + + +III. C++ usage + +As much as possible, operator overloading is included to make basic programming as much +like using standard typed floating-point arithmetic. Changing many codes should be as +simple as changing type statements and a few other lines. + +i. Constructors + +To create dd_real and qd_real variables calculated to the proper precision, one must use +care to use the included constructors properly. Many computations in which variables are +not explicitly typed to multiple-precision may be evaluated with double-precision +arithmetic. The user must take care to ensure that this does not cause errors. In particular, +an expression such as 1.0/3.0 will be evaluated to double precision before assignment or +further arithmetic. Upon assignment to a multi-precision variable, the value will be zero +padded. This problem is serious and potentially difficult to debug. To avoid this, use the +included constructors to force arithmetic to be performed in the full precision requested. + +For a table with descriptions, please see the documentation file qd.pdf in the docs directory. + +ii. Included functions and Constants + +Supported functions include assignment operators, comparisons, arithmetic and +assignment operators, and increments for integer types. Standard C math functions such as +exponentiation, trigonometric, logarithmic, hyperbolic, exponential and rounding functions +are included. As in assignment statements, one must be careful with implied typing of +constants when using these functions. Many codes need particular conversion for the power +function, which is frequently used with constants that must be explicitly typed for multi- +precision codes. + +Many constants are included, which are global and calculated upon initialization. The +following list of constants is calculated for both the dd_real and qd_real classes separately. +Use care to select the correct value. + +For a table with descriptions, please see the included file README.pdf + +ii. Conversion of types + +Static casts may be used to convert constants between types. One may also use constructors +to return temporary multi-precision types within expressions, but should be careful, as this +will waste memory if done repeatedly. For example: + + qd_real y ; + y = sin( qd_real(4.0) / 3.0 ) ; + +C-style casts may be used, but are not recommended. Dynamic and reinterpret casts are +not supported and should be considered unreliable. Casting between multi-precision and +standard precision types can be dangerous, and care must be taken to ensure that programs +are working properly and accuracy has not degraded by use of a misplaced type-conversion. + +D. Available precision, Control of Precision Levels, + +The library provides greatly extended accuracy when compared to standard double +precision. The type dd_real provides for 106 mantissa bits, or about 32 decimal digits. The +type qd_real provides for 212 mantissa bits, or about 64 decimal digits. + +Both the dd_real and qd_real values use the exponent from the highest double-precision +word for arithmetic, and as such do not extend the total range of values available. That +means that the maximum absolute value for either data type is the same as that of double- +precision, or approximately 10^308. The precision near this range, however, is greatly +increased. + +E. I/O + +The standard I/O stream routines have been overloaded to be fully compatible with all +included data types. One may need to manually reset the precision of the stream to obtain +full output. For example, if 60 digits are desired, use: + +cout.precision(60) ; + +When reading values using cin, each input numerical value must start on a separate +line. Two formats are acceptable: + + 1. Write the full constant + 3. Mantissa e exponent + +Here are three valid examples: + + 1.1 + 3.14159 26535 89793 + 123.123123e50 + +When read using cin, these constants will be converted using full multi-precision accuracy. + + +IV. Fortran-90 Usage + +NEW (2007-01-10): The Fortran translation modules now support the complex datatypes +"dd_complex" and "qd_complex". + +Since the quad-double library is written in C++, it must be linked in with a C++ compiler (so +that C++ specific things such as static initializations are correctly handled). Thus the main +program must be written in C/C++ and call the Fortran 90 subroutine. The Fortran 90 +subroutine should be called f_main. + +Here is a sample Fortran-90 program, equivalent to the above C++ program: + + subroutine f_main + use qdmodule + implicit none + type (qd_real) a, b + a = 1.d0 + b = cos(a)**2 + sin(a)**2 - 1.d0 + call qdwrite(6, b) + stop + end subroutine + +This verifies that cos^2(1) + sin^2(1) = 1 to 64 digit accuracy. + +Most operators and generic function references, including many mixed-mode type +combinations with double-precision (ie real*8), have been overloaded (extended) to work +with double-double and quad-double data. It is important, however, that users keep in +mind the fact that expressions are evaluated strictly according to conventional Fortran +operator precedence rules. Thus some subexpressions may be evaluated only to 15-digit +accuracy. For example, with the code + + real*8 d1 + type (dd_real) t1, t2 + ... + t1 = cos (t2) + d1/3.d0 + +the expression d1/3.d0 is computed to real*8 accuracy only (about 15 digits), since both d1 +and 3.d0 have type real*8. This result is then converted to dd_real by zero extension before +being added to cos(t2). So, for example, if d1 held the value 1.d0, then the quotient d1/3.d0 +would only be accurate to 15 digits. If a fully accurate double-double quotient is required, +this should be written: + + real*8 d1 + type (dd_real) t1, t2 + ... + t1 = cos (t2) + ddreal (d1) / 3.d0 + +which forces all operations to be performed with double-double arithmetic. + +Along this line, a constant such as 1.1 appearing in an expression is evaluated only to real*4 +accuracy, and a constant such as 1.1d0 is evaluated only to real*8 accuracy (this is +according to standard Fortran conventions). If full quad-double accuracy is required, for +instance, one should write + + type (qd_real) t1 + ... + t1 = '1.1' + +The quotes enclosing 1.1 specify to the compiler that the constant is to be converted to +binary using quad-double arithmetic, before assignment to t1. Quoted constants may only +appear in assignment statements such as this. + +To link a Fortran-90 program with the C++ qd library, it is recommended to link with the +C++ compiler used to generate the library. The Fortran 90 interface (along with a C-style +main function calling f_main) is found in qdmod library. The qd-config script installed +during "make install" can be used to determine which flags to pass to compile and link your +programs: + + "qd-config --fcflags" displays compiler flags needed to compile your Fortran files. + "qd-config --fclibs" displays linker flags needed by the C++ linker to link in all the +necessary libraries. + +A sample Makefile that can be used as a template for compiling Fortran programs using +quad-double library is found in fortran/Makefile.sample. + +F90 functions defined with dd_real arguments: + Arithmetic: + - * / ** + Comparison tests: == < > <= >= /= + Others: abs, acos, aint, anint, asin, atan, atan2, cos, cosh, dble, erf, + erfc, exp, int, log, log10, max, min, mod, ddcsshf (cosh and sinh), + ddcssnf (cos and sin), ddranf (random number generator in (0,1)), + ddnrtf (n-th root), sign, sin, sinh, sqr, sqrt, tan, tanh + +Similar functions are provided for qd_real arguments with function names qdcsshf, +qdcssnf, qdranf and qdnrtf instead of the names in the list above. + +Input and output of double-double and quad-double data is done using the special +subroutines ddread, ddwrite, qdread and qdwrite. The first argument of these subroutines +is the Fortran I/O unit number, while additional arguments (as many as needed, up to 9 +arguments) are scalar variables or array elements of the appropriate type. Example: + + integer n + type (qd_real) qda, qdb, qdc(n) + ... + call qdwrite (6, qda, qdb) + do j = 1, n + call qdwrite (6, qdc(j)) + enddo + +Each input values must be on a separate line, and may include D or E exponents. Double- +double and quad-double constants may also be specified in assignment statements by +enclosing them in quotes, as in + + ... + type (qd_real) pi + ... + pi = +"3.14159265358979323846264338327950288419716939937510582097494459230" + ... + +Sample Fortran-90 programs illustrating some of these features are provided in the f90 +subdirectory. + + +V. Note on x86-Based Processors (MOST systems in use today) + +The algorithms in this library assume IEEE double precision floating point arithmetic. Since +Intel x86 processors have extended (80-bit) floating point registers, some compilers, +albeit a declining number, may generate commands for the 80-bit instructions. The QD +library does NOT work correctly with 80-bit instructions, so if one's code does not operate +correctly, this may be the reason. To avoid such problems, the round-to-double flag must be +enabled in the control word of the FPU for this library to function properly. The following +functions contains appropriate code to facilitate manipulation of this flag. For non-x86 +systems these functions do nothing (but still exist). + +fpu_fix_start This turns on the round-to-double bit in the control word. +fpu_fix_end This restores the control flag. + +These functions must be called by the main program, as follows: + + int main() { + unsigned int old_cw; + fpu_fix_start(&old_cw); + + ... user code using quad-double library ... + + fpu_fix_end(&old_cw); + } + +A Fortran-90 example is the following: + + subroutine f_main + use qdmodule + implicit none + integer*4 old_cw + + call f_fpu_fix_start(old_cw) + + ... user code using quad-double library ... + + call f_fpu_fix_end(old_cw) + end subroutine + diff --git a/external/PackedCSparse/qd/bits.cc b/external/PackedCSparse/qd/bits.cc new file mode 100644 index 000000000..4eaf9a265 --- /dev/null +++ b/external/PackedCSparse/qd/bits.cc @@ -0,0 +1,85 @@ +/* + * src/bits.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Defines various routines to get / set bits of a IEEE floating point + * number. This used by the library for debugging purposes. + */ + +#include +#include +#include +#include + +#include "qd_config.h" +#include "inline.h" +#include "bits.h" + +#ifdef HAVE_IEEEFP_H +#include +#endif + +using std::setw; + +int get_double_expn(double x) { + if (x == 0.0) + return INT_MIN; + if (QD_ISINF(x) || QD_ISNAN(x)) + return INT_MAX; + + double y = std::abs(x); + int i = 0; + if (y < 1.0) { + while (y < 1.0) { + y *= 2.0; + i++; + } + return -i; + } else if (y >= 2.0) { + while (y >= 2.0) { + y *= 0.5; + i++; + } + return i; + } + return 0; +} + +void print_double_info(std::ostream &os, double x) { + std::streamsize old_prec = os.precision(19); + std::ios_base::fmtflags old_flags = os.flags(); + os << std::scientific; + + os << setw(27) << x << ' '; + if (QD_ISNAN(x) || QD_ISINF(x) || (x == 0.0)) { + os << " "; + } else { + + x = std::abs(x); + int expn = get_double_expn(x); + double d = std::ldexp(1.0, expn); + os << setw(5) << expn << " "; + for (int i = 0; i < 53; i++) { + if (x >= d) { + x -= d; + os << '1'; + } else + os << '0'; + d *= 0.5; + } + + if (x != 0.0) { + // should not happen + os << " +trailing stuff"; + } + } + + os.precision(old_prec); + os.flags(old_flags); +} + diff --git a/external/PackedCSparse/qd/bits.h b/external/PackedCSparse/qd/bits.h new file mode 100644 index 000000000..58570aac5 --- /dev/null +++ b/external/PackedCSparse/qd/bits.h @@ -0,0 +1,32 @@ +/* + * include/bits.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * This file defines various routines to get / set bits of a IEEE floating + * point number. This is used by the library for debugging purposes. + */ + +#ifndef _QD_BITS_H +#define _QD_BITS_H + +#include +#include "qd_config.h" + +/* Returns the exponent of the double precision number. + Returns INT_MIN is x is zero, and INT_MAX if x is INF or NaN. */ +int get_double_expn(double x); + +/* Prints + SIGN EXPN MANTISSA + of the given double. If x is NaN, INF, or Zero, this + prints out the strings NaN, +/- INF, and 0. */ +void print_double_info(std::ostream &os, double x); + + +#endif /* _QD_BITS_H */ + diff --git a/external/PackedCSparse/qd/c_dd.cc b/external/PackedCSparse/qd/c_dd.cc new file mode 100644 index 000000000..0a7c12ac2 --- /dev/null +++ b/external/PackedCSparse/qd/c_dd.cc @@ -0,0 +1,314 @@ +/* + * src/c_dd.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains the C wrapper functions for double-double precision arithmetic. + * This can be used from Fortran code. + */ +#include + +#include "qd_config.h" +#include "dd_real.h" +#include "c_dd.h" + +#define TO_DOUBLE_PTR(a, ptr) ptr[0] = a.x[0]; ptr[1] = a.x[1]; + +extern "C" { + +/* add */ +void c_dd_add(const double *a, const double *b, double *c) { + dd_real cc; + cc = dd_real(a) + dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_dd_add_dd_d(const double *a, double b, double *c) { + dd_real cc; + cc = dd_real(a) + b; + TO_DOUBLE_PTR(cc, c); +} +void c_dd_add_d_dd(double a, const double *b, double *c) { + dd_real cc; + cc = a + dd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + +/* sub */ +void c_dd_sub(const double *a, const double *b, double *c) { + dd_real cc; + cc = dd_real(a) - dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_dd_sub_dd_d(const double *a, double b, double *c) { + dd_real cc; + cc = dd_real(a) - b; + TO_DOUBLE_PTR(cc, c); +} +void c_dd_sub_d_dd(double a, const double *b, double *c) { + dd_real cc; + cc = a - dd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + +/* mul */ +void c_dd_mul(const double *a, const double *b, double *c) { + dd_real cc; + cc = dd_real(a) * dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_dd_mul_dd_d(const double *a, double b, double *c) { + dd_real cc; + cc = dd_real(a) * b; + TO_DOUBLE_PTR(cc, c); +} +void c_dd_mul_d_dd(double a, const double *b, double *c) { + dd_real cc; + cc = a * dd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + +/* div */ +void c_dd_div(const double *a, const double *b, double *c) { + dd_real cc; + cc = dd_real(a) / dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_dd_div_dd_d(const double *a, double b, double *c) { + dd_real cc; + cc = dd_real(a) / b; + TO_DOUBLE_PTR(cc, c); +} +void c_dd_div_d_dd(double a, const double *b, double *c) { + dd_real cc; + cc = a / dd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + +/* copy */ +void c_dd_copy(const double *a, double *b) { + b[0] = a[0]; + b[1] = a[1]; +} +void c_dd_copy_d(double a, double *b) { + b[0] = a; + b[1] = 0.0; +} + + +void c_dd_sqrt(const double *a, double *b) { + dd_real bb; + bb = sqrt(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_sqr(const double *a, double *b) { + dd_real bb; + bb = sqr(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_abs(const double *a, double *b) { + dd_real bb; + bb = abs(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_npwr(const double *a, int n, double *b) { + dd_real bb; + bb = npwr(dd_real(a), n); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_nroot(const double *a, int n, double *b) { + dd_real bb; + bb = nroot(dd_real(a), n); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_nint(const double *a, double *b) { + dd_real bb; + bb = nint(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_aint(const double *a, double *b) { + dd_real bb; + bb = aint(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_floor(const double *a, double *b) { + dd_real bb; + bb = floor(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_ceil(const double *a, double *b) { + dd_real bb; + bb = ceil(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_log(const double *a, double *b) { + dd_real bb; + bb = log(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_log10(const double *a, double *b) { + dd_real bb; + bb = log10(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_exp(const double *a, double *b) { + dd_real bb; + bb = exp(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_sin(const double *a, double *b) { + dd_real bb; + bb = sin(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_cos(const double *a, double *b) { + dd_real bb; + bb = cos(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_tan(const double *a, double *b) { + dd_real bb; + bb = tan(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_asin(const double *a, double *b) { + dd_real bb; + bb = asin(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_acos(const double *a, double *b) { + dd_real bb; + bb = acos(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_atan(const double *a, double *b) { + dd_real bb; + bb = atan(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_atan2(const double *a, const double *b, double *c) { + dd_real cc; + cc = atan2(dd_real(a), dd_real(b)); + TO_DOUBLE_PTR(cc, c); +} + +void c_dd_sinh(const double *a, double *b) { + dd_real bb; + bb = sinh(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_cosh(const double *a, double *b) { + dd_real bb; + bb = cosh(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_tanh(const double *a, double *b) { + dd_real bb; + bb = tanh(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_asinh(const double *a, double *b) { + dd_real bb; + bb = asinh(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_acosh(const double *a, double *b) { + dd_real bb; + bb = acosh(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_dd_atanh(const double *a, double *b) { + dd_real bb; + bb = atanh(dd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_dd_sincos(const double *a, double *s, double *c) { + dd_real ss, cc; + sincos(dd_real(a), ss, cc); + TO_DOUBLE_PTR(ss, s); + TO_DOUBLE_PTR(cc, c); +} + +void c_dd_sincosh(const double *a, double *s, double *c) { + dd_real ss, cc; + sincosh(dd_real(a), ss, cc); + TO_DOUBLE_PTR(ss, s); + TO_DOUBLE_PTR(cc, c); +} + +void c_dd_read(const char *s, double *a) { + dd_real aa(s); + TO_DOUBLE_PTR(aa, a); +} + +void c_dd_swrite(const double *a, int precision, char *s, int len) { + dd_real(a).write(s, len, precision); +} + +void c_dd_write(const double *a) { + std::cout << dd_real(a).to_string(dd_real::_ndigits) << std::endl; +} + +void c_dd_neg(const double *a, double *b) { + b[0] = -a[0]; + b[1] = -a[1]; +} + +void c_dd_rand(double *a) { + dd_real aa; + aa = ddrand(); + TO_DOUBLE_PTR(aa, a); +} + +void c_dd_comp(const double *a, const double *b, int *result) { + dd_real aa(a), bb(b); + if (aa < bb) + *result = -1; + else if (aa > bb) + *result = 1; + else + *result = 0; +} + +void c_dd_comp_dd_d(const double *a, double b, int *result) { + dd_real aa(a), bb(b); + if (aa < bb) + *result = -1; + else if (aa > bb) + *result = 1; + else + *result = 0; +} + +void c_dd_comp_d_dd(double a, const double *b, int *result) { + dd_real aa(a), bb(b); + if (aa < bb) + *result = -1; + else if (aa > bb) + *result = 1; + else + *result = 0; +} + +void c_dd_pi(double *a) { + TO_DOUBLE_PTR(dd_real::_pi, a); +} + +} diff --git a/external/PackedCSparse/qd/c_dd.h b/external/PackedCSparse/qd/c_dd.h new file mode 100644 index 000000000..310162edc --- /dev/null +++ b/external/PackedCSparse/qd/c_dd.h @@ -0,0 +1,98 @@ +/* + * include/c_dd.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains C wrapper function prototypes for double-double precision + * arithmetic. This can also be used from fortran code. + */ +#ifndef _QD_C_DD_H +#define _QD_C_DD_H + +#include "qd_config.h" +#include "fpu.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* add */ +void c_dd_add(const double *a, const double *b, double *c); +void c_dd_add_d_dd(double a, const double *b, double *c); +void c_dd_add_dd_d(const double *a, double b, double *c); + +/* sub */ +void c_dd_sub(const double *a, const double *b, double *c); +void c_dd_sub_d_dd(double a, const double *b, double *c); +void c_dd_sub_dd_d(const double *a, double b, double *c); + +/* mul */ +void c_dd_mul(const double *a, const double *b, double *c); +void c_dd_mul_d_dd(double a, const double *b, double *c); +void c_dd_mul_dd_d(const double *a, double b, double *c); + +/* div */ +void c_dd_div(const double *a, const double *b, double *c); +void c_dd_div_d_dd(double a, const double *b, double *c); +void c_dd_div_dd_d(const double *a, double b, double *c); + +/* copy */ +void c_dd_copy(const double *a, double *b); +void c_dd_copy_d(double a, double *b); + +void c_dd_sqrt(const double *a, double *b); +void c_dd_sqr(const double *a, double *b); + +void c_dd_abs(const double *a, double *b); + +void c_dd_npwr(const double *a, int b, double *c); +void c_dd_nroot(const double *a, int b, double *c); + +void c_dd_nint(const double *a, double *b); +void c_dd_aint(const double *a, double *b); +void c_dd_floor(const double *a, double *b); +void c_dd_ceil(const double *a, double *b); + +void c_dd_exp(const double *a, double *b); +void c_dd_log(const double *a, double *b); +void c_dd_log10(const double *a, double *b); + +void c_dd_sin(const double *a, double *b); +void c_dd_cos(const double *a, double *b); +void c_dd_tan(const double *a, double *b); + +void c_dd_asin(const double *a, double *b); +void c_dd_acos(const double *a, double *b); +void c_dd_atan(const double *a, double *b); +void c_dd_atan2(const double *a, const double *b, double *c); + +void c_dd_sinh(const double *a, double *b); +void c_dd_cosh(const double *a, double *b); +void c_dd_tanh(const double *a, double *b); + +void c_dd_asinh(const double *a, double *b); +void c_dd_acosh(const double *a, double *b); +void c_dd_atanh(const double *a, double *b); + +void c_dd_sincos(const double *a, double *s, double *c); +void c_dd_sincosh(const double *a, double *s, double *c); + +void c_dd_read(const char *s, double *a); +void c_dd_swrite(const double *a, int precision, char *s, int len); +void c_dd_write(const double *a); +void c_dd_neg(const double *a, double *b); +void c_dd_rand(double *a); +void c_dd_comp(const double *a, const double *b, int *result); +void c_dd_comp_dd_d(const double *a, double b, int *result); +void c_dd_comp_d_dd(double a, const double *b, int *result); +void c_dd_pi(double *a); + +#ifdef __cplusplus +} +#endif + +#endif /* _QD_C_DD_H */ diff --git a/external/PackedCSparse/qd/c_qd.cc b/external/PackedCSparse/qd/c_qd.cc new file mode 100644 index 000000000..fd50e9228 --- /dev/null +++ b/external/PackedCSparse/qd/c_qd.cc @@ -0,0 +1,450 @@ +/* + * src/c_qd.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains C wrapper function for quad-double precision arithmetic. + * This can be used from fortran code. + */ +#include + +#include "qd_config.h" +#include "qd_real.h" +#include "c_qd.h" + +#define TO_DOUBLE_PTR(a, ptr) ptr[0] = a.x[0]; ptr[1] = a.x[1]; \ + ptr[2] = a.x[2]; ptr[3] = a.x[3]; + +extern "C" { + + + +/* add */ +void c_qd_add(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) + qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_add_qd_dd(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) + dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_add_dd_qd(const double *a, const double *b, double *c) { + qd_real cc; + cc = dd_real(a) + qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_add_qd_d(const double *a, double b, double *c) { + qd_real cc; + cc = qd_real(a) + b; + TO_DOUBLE_PTR(cc, c); +} +void c_qd_add_d_qd(double a, const double *b, double *c) { + qd_real cc; + cc = a + qd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + + +/* sub */ +void c_qd_sub(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) - qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_sub_qd_dd(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) - dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_sub_dd_qd(const double *a, const double *b, double *c) { + qd_real cc; + cc = dd_real(a) - qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_sub_qd_d(const double *a, double b, double *c) { + qd_real cc; + cc = qd_real(a) - b; + TO_DOUBLE_PTR(cc, c); +} +void c_qd_sub_d_qd(double a, const double *b, double *c) { + qd_real cc; + cc = a - qd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + + +/* mul */ +void c_qd_mul(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) * qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_mul_qd_dd(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) * dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_mul_dd_qd(const double *a, const double *b, double *c) { + qd_real cc; + cc = dd_real(a) * qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_mul_qd_d(const double *a, double b, double *c) { + qd_real cc; + cc = qd_real(a) * b; + TO_DOUBLE_PTR(cc, c); +} +void c_qd_mul_d_qd(double a, const double *b, double *c) { + qd_real cc; + cc = a * qd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + + +/* div */ +void c_qd_div(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) / qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_div_qd_dd(const double *a, const double *b, double *c) { + qd_real cc; + cc = qd_real(a) / dd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_div_dd_qd(const double *a, const double *b, double *c) { + qd_real cc; + cc = dd_real(a) / qd_real(b); + TO_DOUBLE_PTR(cc, c); +} +void c_qd_div_qd_d(const double *a, double b, double *c) { + qd_real cc; + cc = qd_real(a) / b; + TO_DOUBLE_PTR(cc, c); +} +void c_qd_div_d_qd(double a, const double *b, double *c) { + qd_real cc; + cc = a / qd_real(b); + TO_DOUBLE_PTR(cc, c); +} + + + + +/* selfadd */ +void c_qd_selfadd(const double *a, double *b) { + qd_real bb(b); + bb += qd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfadd_dd(const double *a, double *b) { + qd_real bb(b); + bb += dd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfadd_d(double a, double *b) { + qd_real bb(b); + bb += a; + TO_DOUBLE_PTR(bb, b); +} + + + +/* selfsub */ +void c_qd_selfsub(const double *a, double *b) { + qd_real bb(b); + bb -= qd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfsub_dd(const double *a, double *b) { + qd_real bb(b); + bb -= dd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfsub_d(double a, double *b) { + qd_real bb(b); + bb -= a; + TO_DOUBLE_PTR(bb, b); +} + + + +/* selfmul */ +void c_qd_selfmul(const double *a, double *b) { + qd_real bb(b); + bb *= qd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfmul_dd(const double *a, double *b) { + qd_real bb(b); + bb *= dd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfmul_d(double a, double *b) { + qd_real bb(b); + bb *= a; + TO_DOUBLE_PTR(bb, b); +} + + + +/* selfdiv */ +void c_qd_selfdiv(const double *a, double *b) { + qd_real bb(b); + bb /= qd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfdiv_dd(const double *a, double *b) { + qd_real bb(b); + bb /= dd_real(a); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_selfdiv_d(double a, double *b) { + qd_real bb(b); + bb /= a; + TO_DOUBLE_PTR(bb, b); +} + + + +/* copy */ +void c_qd_copy(const double *a, double *b) { + b[0] = a[0]; + b[1] = a[1]; + b[2] = a[2]; + b[3] = a[3]; +} +void c_qd_copy_dd(const double *a, double *b) { + b[0] = a[0]; + b[1] = a[1]; + b[2] = 0.0; + b[3] = 0.0; +} +void c_qd_copy_d(double a, double *b) { + b[0] = a; + b[1] = 0.0; + b[2] = 0.0; + b[3] = 0.0; +} + + +void c_qd_sqrt(const double *a, double *b) { + qd_real bb; + bb = sqrt(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_sqr(const double *a, double *b) { + qd_real bb; + bb = sqr(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_abs(const double *a, double *b) { + qd_real bb; + bb = abs(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_npwr(const double *a, int n, double *b) { + qd_real bb; + bb = npwr(qd_real(a), n); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_nroot(const double *a, int n, double *b) { + qd_real bb; + bb = nroot(qd_real(a), n); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_nint(const double *a, double *b) { + qd_real bb; + bb = nint(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_aint(const double *a, double *b) { + qd_real bb; + bb = aint(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_floor(const double *a, double *b) { + qd_real bb; + bb = floor(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_ceil(const double *a, double *b) { + qd_real bb; + bb = ceil(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_log(const double *a, double *b) { + qd_real bb; + bb = log(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_log10(const double *a, double *b) { + qd_real bb; + bb = log10(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_exp(const double *a, double *b) { + qd_real bb; + bb = exp(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_sin(const double *a, double *b) { + qd_real bb; + bb = sin(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_cos(const double *a, double *b) { + qd_real bb; + bb = cos(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_tan(const double *a, double *b) { + qd_real bb; + bb = tan(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_asin(const double *a, double *b) { + qd_real bb; + bb = asin(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_acos(const double *a, double *b) { + qd_real bb; + bb = acos(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_atan(const double *a, double *b) { + qd_real bb; + bb = atan(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_atan2(const double *a, const double *b, double *c) { + qd_real cc; + cc = atan2(qd_real(a), qd_real(b)); + TO_DOUBLE_PTR(cc, c); +} + +void c_qd_sinh(const double *a, double *b) { + qd_real bb; + bb = sinh(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_cosh(const double *a, double *b) { + qd_real bb; + bb = cosh(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_tanh(const double *a, double *b) { + qd_real bb; + bb = tanh(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_asinh(const double *a, double *b) { + qd_real bb; + bb = asinh(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_acosh(const double *a, double *b) { + qd_real bb; + bb = acosh(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} +void c_qd_atanh(const double *a, double *b) { + qd_real bb; + bb = atanh(qd_real(a)); + TO_DOUBLE_PTR(bb, b); +} + +void c_qd_sincos(const double *a, double *s, double *c) { + qd_real ss, cc; + sincos(qd_real(a), ss, cc); + TO_DOUBLE_PTR(cc, c); + TO_DOUBLE_PTR(ss, s); +} + +void c_qd_sincosh(const double *a, double *s, double *c) { + qd_real ss, cc; + sincosh(qd_real(a), ss, cc); + TO_DOUBLE_PTR(cc, c); + TO_DOUBLE_PTR(ss, s); +} + +void c_qd_read(const char *s, double *a) { + qd_real aa(s); + TO_DOUBLE_PTR(aa, a); +} + +void c_qd_swrite(const double *a, int precision, char *s, int len) { + qd_real(a).write(s, len, precision); +} + +void c_qd_write(const double *a) { + std::cout << qd_real(a).to_string(qd_real::_ndigits) << std::endl; +} + +void c_qd_neg(const double *a, double *b) { + b[0] = -a[0]; + b[1] = -a[1]; + b[2] = -a[2]; + b[3] = -a[3]; +} + +void c_qd_rand(double *a) { + qd_real aa; + aa = qdrand(); + TO_DOUBLE_PTR(aa, a); +} + +void c_qd_comp(const double *a, const double *b, int *result) { + qd_real aa(a), bb(b); + if (aa < bb) + *result = -1; + else if (aa > bb) + *result = 1; + else + *result = 0; +} + +void c_qd_comp_qd_d(const double *a, double b, int *result) { + qd_real aa(a); + if (aa < b) + *result = -1; + else if (aa > b) + *result = 1; + else + *result = 0; +} + +void c_qd_comp_d_qd(double a, const double *b, int *result) { + qd_real bb(b); + if (a < bb) + *result = -1; + else if (a > bb) + *result = 1; + else + *result = 0; +} + +void c_qd_pi(double *a) { + TO_DOUBLE_PTR(qd_real::_pi, a); +} + +} diff --git a/external/PackedCSparse/qd/c_qd.h b/external/PackedCSparse/qd/c_qd.h new file mode 100644 index 000000000..d11a7ff17 --- /dev/null +++ b/external/PackedCSparse/qd/c_qd.h @@ -0,0 +1,119 @@ +/* + * include/c_qd.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains C wrapper function prototypes for quad-double precision + * arithmetic. This can also be used from fortran code. + */ +#ifndef _QD_C_QD_H +#define _QD_C_QD_H + +#include "c_dd.h" +#include "qd_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* add */ +void c_qd_add(const double *a, const double *b, double *c); +void c_qd_add_dd_qd(const double *a, const double *b, double *c); +void c_qd_add_qd_dd(const double *a, const double *b, double *c); +void c_qd_add_d_qd(double a, const double *b, double *c); +void c_qd_add_qd_d(const double *a, double b, double *c); +void c_qd_selfadd(const double *a, double *b); +void c_qd_selfadd_dd(const double *a, double *b); +void c_qd_selfadd_d(double a, double *b); + +/* sub */ +void c_qd_sub(const double *a, const double *b, double *c); +void c_qd_sub_dd_qd(const double *a, const double *b, double *c); +void c_qd_sub_qd_dd(const double *a, const double *b, double *c); +void c_qd_sub_d_qd(double a, const double *b, double *c); +void c_qd_sub_qd_d(const double *a, double b, double *c); +void c_qd_selfsub(const double *a, double *b); +void c_qd_selfsub_dd(const double *a, double *b); +void c_qd_selfsub_d(double a, double *b); + +/* mul */ +void c_qd_mul(const double *a, const double *b, double *c); +void c_qd_mul_dd_qd(const double *a, const double *b, double *c); +void c_qd_mul_qd_dd(const double *a, const double *b, double *c); +void c_qd_mul_d_qd(double a, const double *b, double *c); +void c_qd_mul_qd_d(const double *a, double b, double *c); +void c_qd_selfmul(const double *a, double *b); +void c_qd_selfmul_dd(const double *a, double *b); +void c_qd_selfmul_d(double a, double *b); + +/* div */ +void c_qd_div(const double *a, const double *b, double *c); +void c_qd_div_dd_qd(const double *a, const double *b, double *c); +void c_qd_div_qd_dd(const double *a, const double *b, double *c); +void c_qd_div_d_qd(double a, const double *b, double *c); +void c_qd_div_qd_d(const double *a, double b, double *c); +void c_qd_selfdiv(const double *a, double *b); +void c_qd_selfdiv_dd(const double *a, double *b); +void c_qd_selfdiv_d(double a, double *b); + +/* copy */ +void c_qd_copy(const double *a, double *b); +void c_qd_copy_dd(const double *a, double *b); +void c_qd_copy_d(double a, double *b); + +void c_qd_sqrt(const double *a, double *b); +void c_qd_sqr(const double *a, double *b); + +void c_qd_abs(const double *a, double *b); + +void c_qd_npwr(const double *a, int b, double *c); +void c_qd_nroot(const double *a, int b, double *c); + +void c_qd_nint(const double *a, double *b); +void c_qd_aint(const double *a, double *b); +void c_qd_floor(const double *a, double *b); +void c_qd_ceil(const double *a, double *b); + +void c_qd_exp(const double *a, double *b); +void c_qd_log(const double *a, double *b); +void c_qd_log10(const double *a, double *b); + +void c_qd_sin(const double *a, double *b); +void c_qd_cos(const double *a, double *b); +void c_qd_tan(const double *a, double *b); + +void c_qd_asin(const double *a, double *b); +void c_qd_acos(const double *a, double *b); +void c_qd_atan(const double *a, double *b); +void c_qd_atan2(const double *a, const double *b, double *c); + +void c_qd_sinh(const double *a, double *b); +void c_qd_cosh(const double *a, double *b); +void c_qd_tanh(const double *a, double *b); + +void c_qd_asinh(const double *a, double *b); +void c_qd_acosh(const double *a, double *b); +void c_qd_atanh(const double *a, double *b); + +void c_qd_sincos(const double *a, double *s, double *c); +void c_qd_sincosh(const double *a, double *s, double *c); + +void c_qd_read(const char *s, double *a); +void c_qd_swrite(const double *a, int precision, char *s, int len); +void c_qd_write(const double *a); +void c_qd_neg(const double *a, double *b); +void c_qd_rand(double *a); +void c_qd_comp(const double *a, const double *b, int *result); +void c_qd_comp_qd_d(const double *a, double b, int *result); +void c_qd_comp_d_qd(double a, const double *b, int *result); +void c_qd_pi(double *a); + +#ifdef __cplusplus +} +#endif + +#endif /* _QD_C_QD_H */ diff --git a/external/PackedCSparse/qd/dd_const.cc b/external/PackedCSparse/qd/dd_const.cc new file mode 100644 index 000000000..38b7b5ae6 --- /dev/null +++ b/external/PackedCSparse/qd/dd_const.cc @@ -0,0 +1,40 @@ +/* + * src/dd_const.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2007 + */ +#include "qd_config.h" +#include "dd_real.h" + +const dd_real dd_real::_2pi = dd_real(6.283185307179586232e+00, + 2.449293598294706414e-16); +const dd_real dd_real::_pi = dd_real(3.141592653589793116e+00, + 1.224646799147353207e-16); +const dd_real dd_real::_pi2 = dd_real(1.570796326794896558e+00, + 6.123233995736766036e-17); +const dd_real dd_real::_pi4 = dd_real(7.853981633974482790e-01, + 3.061616997868383018e-17); +const dd_real dd_real::_3pi4 = dd_real(2.356194490192344837e+00, + 9.1848509936051484375e-17); +const dd_real dd_real::_e = dd_real(2.718281828459045091e+00, + 1.445646891729250158e-16); +const dd_real dd_real::_log2 = dd_real(6.931471805599452862e-01, + 2.319046813846299558e-17); +const dd_real dd_real::_log10 = dd_real(2.302585092994045901e+00, + -2.170756223382249351e-16); +const dd_real dd_real::_nan = dd_real(qd::_d_nan, qd::_d_nan); +const dd_real dd_real::_inf = dd_real(qd::_d_inf, qd::_d_inf); + +const double dd_real::_eps = 4.93038065763132e-32; // 2^-104 +const double dd_real::_min_normalized = 2.0041683600089728e-292; // = 2^(-1022 + 53) +const dd_real dd_real::_max = + dd_real(1.79769313486231570815e+308, 9.97920154767359795037e+291); +const dd_real dd_real::_safe_max = + dd_real(1.7976931080746007281e+308, 9.97920154767359795037e+291); +const int dd_real::_ndigits = 31; + + diff --git a/external/PackedCSparse/qd/dd_inline.h b/external/PackedCSparse/qd/dd_inline.h new file mode 100644 index 000000000..89bc24f2a --- /dev/null +++ b/external/PackedCSparse/qd/dd_inline.h @@ -0,0 +1,621 @@ +/* + * include/dd_inline.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains small functions (suitable for inlining) in the double-double + * arithmetic package. + */ +#ifndef _QD_DD_INLINE_H +#define _QD_DD_INLINE_H + +#include +#include "inline.h" + +#ifndef QD_INLINE +#define inline +#endif + + +/*********** Additions ************/ +/* double-double = double + double */ +inline dd_real dd_real::add(double a, double b) { + double s, e; + s = qd::two_sum(a, b, e); + return dd_real(s, e); +} + +/* double-double + double */ +inline dd_real operator+(const dd_real &a, double b) { + double s1, s2; + s1 = qd::two_sum(a.x[0], b, s2); + s2 += a.x[1]; + s1 = qd::quick_two_sum(s1, s2, s2); + return dd_real(s1, s2); +} + +/* double-double + double-double */ +inline dd_real dd_real::ieee_add(const dd_real &a, const dd_real &b) { + /* This one satisfies IEEE style error bound, + due to K. Briggs and W. Kahan. */ + double s1, s2, t1, t2; + + s1 = qd::two_sum(a.x[0], b.x[0], s2); + t1 = qd::two_sum(a.x[1], b.x[1], t2); + s2 += t1; + s1 = qd::quick_two_sum(s1, s2, s2); + s2 += t2; + s1 = qd::quick_two_sum(s1, s2, s2); + return dd_real(s1, s2); +} + +inline dd_real dd_real::sloppy_add(const dd_real &a, const dd_real &b) { + /* This is the less accurate version ... obeys Cray-style + error bound. */ + double s, e; + + s = qd::two_sum(a.x[0], b.x[0], e); + e += (a.x[1] + b.x[1]); + s = qd::quick_two_sum(s, e, e); + return dd_real(s, e); +} + +inline dd_real operator+(const dd_real &a, const dd_real &b) { +#ifndef QD_IEEE_ADD + return dd_real::sloppy_add(a, b); +#else + return dd_real::ieee_add(a, b); +#endif +} + +/* double + double-double */ +inline dd_real operator+(double a, const dd_real &b) { + return (b + a); +} + + +/*********** Self-Additions ************/ +/* double-double += double */ +inline dd_real &dd_real::operator+=(double a) { + double s1, s2; + s1 = qd::two_sum(x[0], a, s2); + s2 += x[1]; + x[0] = qd::quick_two_sum(s1, s2, x[1]); + return *this; +} + +/* double-double += double-double */ +inline dd_real &dd_real::operator+=(const dd_real &a) { +#ifndef QD_IEEE_ADD + double s, e; + s = qd::two_sum(x[0], a.x[0], e); + e += x[1]; + e += a.x[1]; + x[0] = qd::quick_two_sum(s, e, x[1]); + return *this; +#else + double s1, s2, t1, t2; + s1 = qd::two_sum(x[0], a.x[0], s2); + t1 = qd::two_sum(x[1], a.x[1], t2); + s2 += t1; + s1 = qd::quick_two_sum(s1, s2, s2); + s2 += t2; + x[0] = qd::quick_two_sum(s1, s2, x[1]); + return *this; +#endif +} + +/*********** Subtractions ************/ +/* double-double = double - double */ +inline dd_real dd_real::sub(double a, double b) { + double s, e; + s = qd::two_diff(a, b, e); + return dd_real(s, e); +} + +/* double-double - double */ +inline dd_real operator-(const dd_real &a, double b) { + double s1, s2; + s1 = qd::two_diff(a.x[0], b, s2); + s2 += a.x[1]; + s1 = qd::quick_two_sum(s1, s2, s2); + return dd_real(s1, s2); +} + +/* double-double - double-double */ +inline dd_real operator-(const dd_real &a, const dd_real &b) { +#ifndef QD_IEEE_ADD + double s, e; + s = qd::two_diff(a.x[0], b.x[0], e); + e += a.x[1]; + e -= b.x[1]; + s = qd::quick_two_sum(s, e, e); + return dd_real(s, e); +#else + double s1, s2, t1, t2; + s1 = qd::two_diff(a.x[0], b.x[0], s2); + t1 = qd::two_diff(a.x[1], b.x[1], t2); + s2 += t1; + s1 = qd::quick_two_sum(s1, s2, s2); + s2 += t2; + s1 = qd::quick_two_sum(s1, s2, s2); + return dd_real(s1, s2); +#endif +} + +/* double - double-double */ +inline dd_real operator-(double a, const dd_real &b) { + double s1, s2; + s1 = qd::two_diff(a, b.x[0], s2); + s2 -= b.x[1]; + s1 = qd::quick_two_sum(s1, s2, s2); + return dd_real(s1, s2); +} + +/*********** Self-Subtractions ************/ +/* double-double -= double */ +inline dd_real &dd_real::operator-=(double a) { + double s1, s2; + s1 = qd::two_diff(x[0], a, s2); + s2 += x[1]; + x[0] = qd::quick_two_sum(s1, s2, x[1]); + return *this; +} + +/* double-double -= double-double */ +inline dd_real &dd_real::operator-=(const dd_real &a) { +#ifndef QD_IEEE_ADD + double s, e; + s = qd::two_diff(x[0], a.x[0], e); + e += x[1]; + e -= a.x[1]; + x[0] = qd::quick_two_sum(s, e, x[1]); + return *this; +#else + double s1, s2, t1, t2; + s1 = qd::two_diff(x[0], a.x[0], s2); + t1 = qd::two_diff(x[1], a.x[1], t2); + s2 += t1; + s1 = qd::quick_two_sum(s1, s2, s2); + s2 += t2; + x[0] = qd::quick_two_sum(s1, s2, x[1]); + return *this; +#endif +} + +/*********** Unary Minus ***********/ +inline dd_real dd_real::operator-() const { + return dd_real(-x[0], -x[1]); +} + +/*********** Multiplications ************/ +/* double-double = double * double */ +inline dd_real dd_real::mul(double a, double b) { + double p, e; + p = qd::two_prod(a, b, e); + return dd_real(p, e); +} + +/* double-double * (2.0 ^ exp) */ +inline dd_real ldexp(const dd_real &a, int exp) { + return dd_real(std::ldexp(a.x[0], exp), std::ldexp(a.x[1], exp)); +} + +/* double-double * double, where double is a power of 2. */ +inline dd_real mul_pwr2(const dd_real &a, double b) { + return dd_real(a.x[0] * b, a.x[1] * b); +} + +/* double-double * double */ +inline dd_real operator*(const dd_real &a, double b) { + double p1, p2; + + p1 = qd::two_prod(a.x[0], b, p2); + p2 += (a.x[1] * b); + p1 = qd::quick_two_sum(p1, p2, p2); + return dd_real(p1, p2); +} + +/* double-double * double-double */ +inline dd_real operator*(const dd_real &a, const dd_real &b) { + double p1, p2; + + p1 = qd::two_prod(a.x[0], b.x[0], p2); + p2 += (a.x[0] * b.x[1] + a.x[1] * b.x[0]); + p1 = qd::quick_two_sum(p1, p2, p2); + return dd_real(p1, p2); +} + +/* double * double-double */ +inline dd_real operator*(double a, const dd_real &b) { + return (b * a); +} + +/*********** Self-Multiplications ************/ +/* double-double *= double */ +inline dd_real &dd_real::operator*=(double a) { + double p1, p2; + p1 = qd::two_prod(x[0], a, p2); + p2 += x[1] * a; + x[0] = qd::quick_two_sum(p1, p2, x[1]); + return *this; +} + +/* double-double *= double-double */ +inline dd_real &dd_real::operator*=(const dd_real &a) { + double p1, p2; + p1 = qd::two_prod(x[0], a.x[0], p2); + p2 += a.x[1] * x[0]; + p2 += a.x[0] * x[1]; + x[0] = qd::quick_two_sum(p1, p2, x[1]); + return *this; +} + +/*********** Divisions ************/ +inline dd_real dd_real::div(double a, double b) { + double q1, q2; + double p1, p2; + double s, e; + + q1 = a / b; + + /* Compute a - q1 * b */ + p1 = qd::two_prod(q1, b, p2); + s = qd::two_diff(a, p1, e); + e -= p2; + + /* get next approximation */ + q2 = (s + e) / b; + + s = qd::quick_two_sum(q1, q2, e); + + return dd_real(s, e); +} + +/* double-double / double */ +inline dd_real operator/(const dd_real &a, double b) { + + double q1, q2; + double p1, p2; + double s, e; + dd_real r; + + q1 = a.x[0] / b; /* approximate quotient. */ + + /* Compute this - q1 * d */ + p1 = qd::two_prod(q1, b, p2); + s = qd::two_diff(a.x[0], p1, e); + e += a.x[1]; + e -= p2; + + /* get next approximation. */ + q2 = (s + e) / b; + + /* renormalize */ + r.x[0] = qd::quick_two_sum(q1, q2, r.x[1]); + + return r; +} + +inline dd_real dd_real::sloppy_div(const dd_real &a, const dd_real &b) { + double s1, s2; + double q1, q2; + dd_real r; + + q1 = a.x[0] / b.x[0]; /* approximate quotient */ + + /* compute this - q1 * dd */ + r = b * q1; + s1 = qd::two_diff(a.x[0], r.x[0], s2); + s2 -= r.x[1]; + s2 += a.x[1]; + + /* get next approximation */ + q2 = (s1 + s2) / b.x[0]; + + /* renormalize */ + r.x[0] = qd::quick_two_sum(q1, q2, r.x[1]); + return r; +} + +inline dd_real dd_real::accurate_div(const dd_real &a, const dd_real &b) { + double q1, q2, q3; + dd_real r; + + q1 = a.x[0] / b.x[0]; /* approximate quotient */ + + r = a - q1 * b; + + q2 = r.x[0] / b.x[0]; + r -= (q2 * b); + + q3 = r.x[0] / b.x[0]; + + q1 = qd::quick_two_sum(q1, q2, q2); + r = dd_real(q1, q2) + q3; + return r; +} + +/* double-double / double-double */ +inline dd_real operator/(const dd_real &a, const dd_real &b) { +#ifdef QD_SLOPPY_DIV + return dd_real::sloppy_div(a, b); +#else + return dd_real::accurate_div(a, b); +#endif +} + +/* double / double-double */ +inline dd_real operator/(double a, const dd_real &b) { + return dd_real(a) / b; +} + +inline dd_real inv(const dd_real &a) { + return 1.0 / a; +} + +/*********** Self-Divisions ************/ +/* double-double /= double */ +inline dd_real &dd_real::operator/=(double a) { + *this = *this / a; + return *this; +} + +/* double-double /= double-double */ +inline dd_real &dd_real::operator/=(const dd_real &a) { + *this = *this / a; + return *this; +} + +/********** Remainder **********/ +inline dd_real drem(const dd_real &a, const dd_real &b) { + dd_real n = nint(a / b); + return (a - n * b); +} + +inline dd_real divrem(const dd_real &a, const dd_real &b, dd_real &r) { + dd_real n = nint(a / b); + r = a - n * b; + return n; +} + +/*********** Squaring **********/ +inline dd_real sqr(const dd_real &a) { + double p1, p2; + double s1, s2; + p1 = qd::two_sqr(a.x[0], p2); + p2 += 2.0 * a.x[0] * a.x[1]; + p2 += a.x[1] * a.x[1]; + s1 = qd::quick_two_sum(p1, p2, s2); + return dd_real(s1, s2); +} + +inline dd_real dd_real::sqr(double a) { + double p1, p2; + p1 = qd::two_sqr(a, p2); + return dd_real(p1, p2); +} + + +/********** Exponentiation **********/ +inline dd_real dd_real::operator^(int n) { + return npwr(*this, n); +} + + +/*********** Assignments ************/ +/* double-double = double */ +inline dd_real &dd_real::operator=(double a) { + x[0] = a; + x[1] = 0.0; + return *this; +} + +/*********** Equality Comparisons ************/ +/* double-double == double */ +inline bool operator==(const dd_real &a, double b) { + return (a.x[0] == b && a.x[1] == 0.0); +} + +/* double-double == double-double */ +inline bool operator==(const dd_real &a, const dd_real &b) { + return (a.x[0] == b.x[0] && a.x[1] == b.x[1]); +} + +/* double == double-double */ +inline bool operator==(double a, const dd_real &b) { + return (a == b.x[0] && b.x[1] == 0.0); +} + +/*********** Greater-Than Comparisons ************/ +/* double-double > double */ +inline bool operator>(const dd_real &a, double b) { + return (a.x[0] > b || (a.x[0] == b && a.x[1] > 0.0)); +} + +/* double-double > double-double */ +inline bool operator>(const dd_real &a, const dd_real &b) { + return (a.x[0] > b.x[0] || (a.x[0] == b.x[0] && a.x[1] > b.x[1])); +} + +/* double > double-double */ +inline bool operator>(double a, const dd_real &b) { + return (a > b.x[0] || (a == b.x[0] && b.x[1] < 0.0)); +} + +/*********** Less-Than Comparisons ************/ +/* double-double < double */ +inline bool operator<(const dd_real &a, double b) { + return (a.x[0] < b || (a.x[0] == b && a.x[1] < 0.0)); +} + +/* double-double < double-double */ +inline bool operator<(const dd_real &a, const dd_real &b) { + return (a.x[0] < b.x[0] || (a.x[0] == b.x[0] && a.x[1] < b.x[1])); +} + +/* double < double-double */ +inline bool operator<(double a, const dd_real &b) { + return (a < b.x[0] || (a == b.x[0] && b.x[1] > 0.0)); +} + +/*********** Greater-Than-Or-Equal-To Comparisons ************/ +/* double-double >= double */ +inline bool operator>=(const dd_real &a, double b) { + return (a.x[0] > b || (a.x[0] == b && a.x[1] >= 0.0)); +} + +/* double-double >= double-double */ +inline bool operator>=(const dd_real &a, const dd_real &b) { + return (a.x[0] > b.x[0] || (a.x[0] == b.x[0] && a.x[1] >= b.x[1])); +} + +/* double >= double-double */ +inline bool operator>=(double a, const dd_real &b) { + return (b <= a); +} + +/*********** Less-Than-Or-Equal-To Comparisons ************/ +/* double-double <= double */ +inline bool operator<=(const dd_real &a, double b) { + return (a.x[0] < b || (a.x[0] == b && a.x[1] <= 0.0)); +} + +/* double-double <= double-double */ +inline bool operator<=(const dd_real &a, const dd_real &b) { + return (a.x[0] < b.x[0] || (a.x[0] == b.x[0] && a.x[1] <= b.x[1])); +} + +/* double <= double-double */ +inline bool operator<=(double a, const dd_real &b) { + return (b >= a); +} + +/*********** Not-Equal-To Comparisons ************/ +/* double-double != double */ +inline bool operator!=(const dd_real &a, double b) { + return (a.x[0] != b || a.x[1] != 0.0); +} + +/* double-double != double-double */ +inline bool operator!=(const dd_real &a, const dd_real &b) { + return (a.x[0] != b.x[0] || a.x[1] != b.x[1]); +} + +/* double != double-double */ +inline bool operator!=(double a, const dd_real &b) { + return (a != b.x[0] || b.x[1] != 0.0); +} + +/*********** Micellaneous ************/ +/* this == 0 */ +inline bool dd_real::is_zero() const { + return (x[0] == 0.0); +} + +/* this == 1 */ +inline bool dd_real::is_one() const { + return (x[0] == 1.0 && x[1] == 0.0); +} + +/* this > 0 */ +inline bool dd_real::is_positive() const { + return (x[0] > 0.0); +} + +/* this < 0 */ +inline bool dd_real::is_negative() const { + return (x[0] < 0.0); +} + +inline dd_real::operator bool() const { + return (x[0] != 0.0); +} + +inline dd_real::operator double() const { + return to_double(*this); +} + +/* Absolute value */ +inline dd_real abs(const dd_real &a) { + return (a.x[0] < 0.0) ? -a : a; +} + +inline dd_real fabs(const dd_real &a) { + return abs(a); +} + +/* Round to Nearest integer */ +inline dd_real nint(const dd_real &a) { + double hi = qd::nint(a.x[0]); + double lo; + + if (hi == a.x[0]) { + /* High word is an integer already. Round the low word.*/ + lo = qd::nint(a.x[1]); + + /* Renormalize. This is needed if x[0] = some integer, x[1] = 1/2.*/ + hi = qd::quick_two_sum(hi, lo, lo); + } else { + /* High word is not an integer. */ + lo = 0.0; + if (std::abs(hi-a.x[0]) == 0.5 && a.x[1] < 0.0) { + /* There is a tie in the high word, consult the low word + to break the tie. */ + hi -= 1.0; /* NOTE: This does not cause INEXACT. */ + } + } + + return dd_real(hi, lo); +} + +inline dd_real floor(const dd_real &a) { + double hi = std::floor(a.x[0]); + double lo = 0.0; + + if (hi == a.x[0]) { + /* High word is integer already. Round the low word. */ + lo = std::floor(a.x[1]); + hi = qd::quick_two_sum(hi, lo, lo); + } + + return dd_real(hi, lo); +} + +inline dd_real ceil(const dd_real &a) { + double hi = std::ceil(a.x[0]); + double lo = 0.0; + + if (hi == a.x[0]) { + /* High word is integer already. Round the low word. */ + lo = std::ceil(a.x[1]); + hi = qd::quick_two_sum(hi, lo, lo); + } + + return dd_real(hi, lo); +} + +inline dd_real aint(const dd_real &a) { + return (a.x[0] >= 0.0) ? floor(a) : ceil(a); +} + +/* Cast to double. */ +inline double to_double(const dd_real &a) { + return a.x[0]; +} + +/* Cast to int. */ +inline int to_int(const dd_real &a) { + return static_cast(a.x[0]); +} + +/* Random number generator */ +inline dd_real dd_real::rand() { + return ddrand(); +} + +#endif /* _QD_DD_INLINE_H */ diff --git a/external/PackedCSparse/qd/dd_real.cc b/external/PackedCSparse/qd/dd_real.cc new file mode 100644 index 000000000..ff4d52231 --- /dev/null +++ b/external/PackedCSparse/qd/dd_real.cc @@ -0,0 +1,1303 @@ +/* + * src/dd_real.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2007 + * + * Contains implementation of non-inlined functions of double-double + * package. Inlined functions are found in dd_inline.h (in include directory). + */ +#include +#include +#include +#include +#include +#include +#include + +#include "qd_config.h" +#include "dd_real.h" +#include "util.h" + +#include "bits.h" + +#ifndef QD_INLINE +#include "dd_inline.h" +#endif + +using std::cout; +using std::cerr; +using std::endl; +using std::ostream; +using std::istream; +using std::ios_base; +using std::string; +using std::setw; + +/* This routine is called whenever a fatal error occurs. */ +void dd_real::error(const char *msg) { + //if (msg) { cerr << "ERROR " << msg << endl; } +} + +/* Computes the square root of the double-double number dd. + NOTE: dd must be a non-negative number. */ +QD_API dd_real sqrt(const dd_real &a) { + /* Strategy: Use Karp's trick: if x is an approximation + to sqrt(a), then + + sqrt(a) = a*x + [a - (a*x)^2] * x / 2 (approx) + + The approximation is accurate to twice the accuracy of x. + Also, the multiplication (a*x) and [-]*x can be done with + only half the precision. + */ + + if (a.is_zero()) + return 0.0; + + if (a.is_negative()) { + dd_real::error("(dd_real::sqrt): Negative argument."); + return dd_real::_nan; + } + + double x = 1.0 / std::sqrt(a.x[0]); + double ax = a.x[0] * x; + return dd_real::add(ax, (a - dd_real::sqr(ax)).x[0] * (x * 0.5)); +} + +/* Computes the square root of a double in double-double precision. + NOTE: d must not be negative. */ +dd_real dd_real::sqrt(double d) { + return ::sqrt(dd_real(d)); +} + +/* Computes the n-th root of the double-double number a. + NOTE: n must be a positive integer. + NOTE: If n is even, then a must not be negative. */ +dd_real nroot(const dd_real &a, int n) { + /* Strategy: Use Newton iteration for the function + + f(x) = x^(-n) - a + + to find its root a^{-1/n}. The iteration is thus + + x' = x + x * (1 - a * x^n) / n + + which converges quadratically. We can then find + a^{1/n} by taking the reciprocal. + */ + + if (n <= 0) { + dd_real::error("(dd_real::nroot): N must be positive."); + return dd_real::_nan; + } + + if (n%2 == 0 && a.is_negative()) { + dd_real::error("(dd_real::nroot): Negative argument."); + return dd_real::_nan; + } + + if (n == 1) { + return a; + } + if (n == 2) { + return sqrt(a); + } + + if (a.is_zero()) + return 0.0; + + /* Note a^{-1/n} = exp(-log(a)/n) */ + dd_real r = abs(a); + dd_real x = std::exp(-std::log(r.x[0]) / n); + + /* Perform Newton's iteration. */ + x += x * (1.0 - r * npwr(x, n)) / static_cast(n); + if (a.x[0] < 0.0) + x = -x; + return 1.0/x; +} + +/* Computes the n-th power of a double-double number. + NOTE: 0^0 causes an error. */ +dd_real npwr(const dd_real &a, int n) { + + if (n == 0) { + if (a.is_zero()) { + dd_real::error("(dd_real::npwr): Invalid argument."); + return dd_real::_nan; + } + return 1.0; + } + + dd_real r = a; + dd_real s = 1.0; + int N = std::abs(n); + + if (N > 1) { + /* Use binary exponentiation */ + while (N > 0) { + if (N % 2 == 1) { + s *= r; + } + N /= 2; + if (N > 0) + r = sqr(r); + } + } else { + s = r; + } + + /* Compute the reciprocal if n is negative. */ + if (n < 0) + return (1.0 / s); + + return s; +} + +dd_real pow(const dd_real &a, int n) { + return npwr(a, n); +} + +dd_real pow(const dd_real &a, const dd_real &b) { + return exp(b * log(a)); +} + +static const int n_inv_fact = 15; +static const double inv_fact[n_inv_fact][2] = { + { 1.66666666666666657e-01, 9.25185853854297066e-18}, + { 4.16666666666666644e-02, 2.31296463463574266e-18}, + { 8.33333333333333322e-03, 1.15648231731787138e-19}, + { 1.38888888888888894e-03, -5.30054395437357706e-20}, + { 1.98412698412698413e-04, 1.72095582934207053e-22}, + { 2.48015873015873016e-05, 2.15119478667758816e-23}, + { 2.75573192239858925e-06, -1.85839327404647208e-22}, + { 2.75573192239858883e-07, 2.37677146222502973e-23}, + { 2.50521083854417202e-08, -1.44881407093591197e-24}, + { 2.08767569878681002e-09, -1.20734505911325997e-25}, + { 1.60590438368216133e-10, 1.25852945887520981e-26}, + { 1.14707455977297245e-11, 2.06555127528307454e-28}, + { 7.64716373181981641e-13, 7.03872877733453001e-30}, + { 4.77947733238738525e-14, 4.39920548583408126e-31}, + { 2.81145725434552060e-15, 1.65088427308614326e-31} +}; + +/* Exponential. Computes exp(x) in double-double precision. */ +dd_real exp(const dd_real &a) { + /* Strategy: We first reduce the size of x by noting that + + exp(kr + m * log(2)) = 2^m * exp(r)^k + + where m and k are integers. By choosing m appropriately + we can make |kr| <= log(2) / 2 = 0.347. Then exp(r) is + evaluated using the familiar Taylor series. Reducing the + argument substantially speeds up the convergence. */ + + const double k = 512.0; + const double inv_k = 1.0 / k; + + if (a.x[0] <= -709.0) + return 0.0; + + if (a.x[0] >= 709.0) + return dd_real::_inf; + + if (a.is_zero()) + return 1.0; + + if (a.is_one()) + return dd_real::_e; + + double m = std::floor(a.x[0] / dd_real::_log2.x[0] + 0.5); + dd_real r = mul_pwr2(a - dd_real::_log2 * m, inv_k); + dd_real s, t, p; + + p = sqr(r); + s = r + mul_pwr2(p, 0.5); + p *= r; + t = p * dd_real(inv_fact[0][0], inv_fact[0][1]); + int i = 0; + do { + s += t; + p *= r; + ++i; + t = p * dd_real(inv_fact[i][0], inv_fact[i][1]); + } while (std::abs(to_double(t)) > inv_k * dd_real::_eps && i < 5); + + s += t; + + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s += 1.0; + + return ldexp(s, static_cast(m)); +} + +/* Logarithm. Computes log(x) in double-double precision. + This is a natural logarithm (i.e., base e). */ +dd_real log(const dd_real &a) { + /* Strategy. The Taylor series for log converges much more + slowly than that of exp, due to the lack of the factorial + term in the denominator. Hence this routine instead tries + to determine the root of the function + + f(x) = exp(x) - a + + using Newton iteration. The iteration is given by + + x' = x - f(x)/f'(x) + = x - (1 - a * exp(-x)) + = x + a * exp(-x) - 1. + + Only one iteration is needed, since Newton's iteration + approximately doubles the number of digits per iteration. */ + + if (a.is_one()) { + return 0.0; + } + + if (a.x[0] <= 0.0) { + dd_real::error("(dd_real::log): Non-positive argument."); + return dd_real::_nan; + } + + dd_real x = std::log(a.x[0]); /* Initial approximation */ + + x = x + a * exp(-x) - 1.0; + return x; +} + +dd_real log10(const dd_real &a) { + return log(a) / dd_real::_log10; +} + +static const dd_real _pi16 = dd_real(1.963495408493620697e-01, + 7.654042494670957545e-18); + +/* Table of sin(k * pi/16) and cos(k * pi/16). */ +static const double sin_table [4][2] = { + {1.950903220161282758e-01, -7.991079068461731263e-18}, + {3.826834323650897818e-01, -1.005077269646158761e-17}, + {5.555702330196021776e-01, 4.709410940561676821e-17}, + {7.071067811865475727e-01, -4.833646656726456726e-17} +}; + +static const double cos_table [4][2] = { + {9.807852804032304306e-01, 1.854693999782500573e-17}, + {9.238795325112867385e-01, 1.764504708433667706e-17}, + {8.314696123025452357e-01, 1.407385698472802389e-18}, + {7.071067811865475727e-01, -4.833646656726456726e-17} +}; + +/* Computes sin(a) using Taylor series. + Assumes |a| <= pi/32. */ +static dd_real sin_taylor(const dd_real &a) { + const double thresh = 0.5 * std::abs(to_double(a)) * dd_real::_eps; + dd_real r, s, t, x; + + if (a.is_zero()) { + return 0.0; + } + + int i = 0; + x = -sqr(a); + s = a; + r = a; + do { + r *= x; + t = r * dd_real(inv_fact[i][0], inv_fact[i][1]); + s += t; + i += 2; + } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); + + return s; +} + +static dd_real cos_taylor(const dd_real &a) { + const double thresh = 0.5 * dd_real::_eps; + dd_real r, s, t, x; + + if (a.is_zero()) { + return 1.0; + } + + x = -sqr(a); + r = x; + s = 1.0 + mul_pwr2(r, 0.5); + int i = 1; + do { + r *= x; + t = r * dd_real(inv_fact[i][0], inv_fact[i][1]); + s += t; + i += 2; + } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); + + return s; +} + +static void sincos_taylor(const dd_real &a, + dd_real &sin_a, dd_real &cos_a) { + if (a.is_zero()) { + sin_a = 0.0; + cos_a = 1.0; + return; + } + + sin_a = sin_taylor(a); + cos_a = sqrt(1.0 - sqr(sin_a)); +} + + +dd_real sin(const dd_real &a) { + + /* Strategy. To compute sin(x), we choose integers a, b so that + + x = s + a * (pi/2) + b * (pi/16) + + and |s| <= pi/32. Using the fact that + + sin(pi/16) = 0.5 * sqrt(2 - sqrt(2 + sqrt(2))) + + we can compute sin(x) from sin(s), cos(s). This greatly + increases the convergence of the sine Taylor series. */ + + if (a.is_zero()) { + return 0.0; + } + + // approximately reduce modulo 2*pi + dd_real z = nint(a / dd_real::_2pi); + dd_real r = a - dd_real::_2pi * z; + + // approximately reduce modulo pi/2 and then modulo pi/16. + dd_real t; + double q = std::floor(r.x[0] / dd_real::_pi2.x[0] + 0.5); + t = r - dd_real::_pi2 * q; + int j = static_cast(q); + q = std::floor(t.x[0] / _pi16.x[0] + 0.5); + t -= _pi16 * q; + int k = static_cast(q); + int abs_k = std::abs(k); + + if (j < -2 || j > 2) { + dd_real::error("(dd_real::sin): Cannot reduce modulo pi/2."); + return dd_real::_nan; + } + + if (abs_k > 4) { + dd_real::error("(dd_real::sin): Cannot reduce modulo pi/16."); + return dd_real::_nan; + } + + if (k == 0) { + switch (j) { + case 0: + return sin_taylor(t); + case 1: + return cos_taylor(t); + case -1: + return -cos_taylor(t); + default: + return -sin_taylor(t); + } + } + + dd_real u(cos_table[abs_k-1][0], cos_table[abs_k-1][1]); + dd_real v(sin_table[abs_k-1][0], sin_table[abs_k-1][1]); + dd_real sin_t, cos_t; + sincos_taylor(t, sin_t, cos_t); + if (j == 0) { + if (k > 0) { + r = u * sin_t + v * cos_t; + } else { + r = u * sin_t - v * cos_t; + } + } else if (j == 1) { + if (k > 0) { + r = u * cos_t - v * sin_t; + } else { + r = u * cos_t + v * sin_t; + } + } else if (j == -1) { + if (k > 0) { + r = v * sin_t - u * cos_t; + } else if (k < 0) { + r = -u * cos_t - v * sin_t; + } + } else { + if (k > 0) { + r = -u * sin_t - v * cos_t; + } else { + r = v * cos_t - u * sin_t; + } + } + + return r; +} + +dd_real cos(const dd_real &a) { + + if (a.is_zero()) { + return 1.0; + } + + // approximately reduce modulo 2*pi + dd_real z = nint(a / dd_real::_2pi); + dd_real r = a - z * dd_real::_2pi; + + // approximately reduce modulo pi/2 and then modulo pi/16 + dd_real t; + double q = std::floor(r.x[0] / dd_real::_pi2.x[0] + 0.5); + t = r - dd_real::_pi2 * q; + int j = static_cast(q); + q = std::floor(t.x[0] / _pi16.x[0] + 0.5); + t -= _pi16 * q; + int k = static_cast(q); + int abs_k = std::abs(k); + + if (j < -2 || j > 2) { + dd_real::error("(dd_real::cos): Cannot reduce modulo pi/2."); + return dd_real::_nan; + } + + if (abs_k > 4) { + dd_real::error("(dd_real::cos): Cannot reduce modulo pi/16."); + return dd_real::_nan; + } + + if (k == 0) { + switch (j) { + case 0: + return cos_taylor(t); + case 1: + return -sin_taylor(t); + case -1: + return sin_taylor(t); + default: + return -cos_taylor(t); + } + } + + dd_real sin_t, cos_t; + sincos_taylor(t, sin_t, cos_t); + dd_real u(cos_table[abs_k-1][0], cos_table[abs_k-1][1]); + dd_real v(sin_table[abs_k-1][0], sin_table[abs_k-1][1]); + + if (j == 0) { + if (k > 0) { + r = u * cos_t - v * sin_t; + } else { + r = u * cos_t + v * sin_t; + } + } else if (j == 1) { + if (k > 0) { + r = - u * sin_t - v * cos_t; + } else { + r = v * cos_t - u * sin_t; + } + } else if (j == -1) { + if (k > 0) { + r = u * sin_t + v * cos_t; + } else { + r = u * sin_t - v * cos_t; + } + } else { + if (k > 0) { + r = v * sin_t - u * cos_t; + } else { + r = - u * cos_t - v * sin_t; + } + } + + return r; +} + +void sincos(const dd_real &a, dd_real &sin_a, dd_real &cos_a) { + + if (a.is_zero()) { + sin_a = 0.0; + cos_a = 1.0; + return; + } + + // approximately reduce modulo 2*pi + dd_real z = nint(a / dd_real::_2pi); + dd_real r = a - dd_real::_2pi * z; + + // approximately reduce module pi/2 and pi/16 + dd_real t; + double q = std::floor(r.x[0] / dd_real::_pi2.x[0] + 0.5); + t = r - dd_real::_pi2 * q; + int j = static_cast(q); + int abs_j = std::abs(j); + q = std::floor(t.x[0] / _pi16.x[0] + 0.5); + t -= _pi16 * q; + int k = static_cast(q); + int abs_k = std::abs(k); + + if (abs_j > 2) { + dd_real::error("(dd_real::sincos): Cannot reduce modulo pi/2."); + cos_a = sin_a = dd_real::_nan; + return; + } + + if (abs_k > 4) { + dd_real::error("(dd_real::sincos): Cannot reduce modulo pi/16."); + cos_a = sin_a = dd_real::_nan; + return; + } + + dd_real sin_t, cos_t; + dd_real s, c; + + sincos_taylor(t, sin_t, cos_t); + + if (abs_k == 0) { + s = sin_t; + c = cos_t; + } else { + dd_real u(cos_table[abs_k-1][0], cos_table[abs_k-1][1]); + dd_real v(sin_table[abs_k-1][0], sin_table[abs_k-1][1]); + + if (k > 0) { + s = u * sin_t + v * cos_t; + c = u * cos_t - v * sin_t; + } else { + s = u * sin_t - v * cos_t; + c = u * cos_t + v * sin_t; + } + } + + if (abs_j == 0) { + sin_a = s; + cos_a = c; + } else if (j == 1) { + sin_a = c; + cos_a = -s; + } else if (j == -1) { + sin_a = -c; + cos_a = s; + } else { + sin_a = -s; + cos_a = -c; + } + +} + +dd_real atan(const dd_real &a) { + return atan2(a, dd_real(1.0)); +} + +dd_real atan2(const dd_real &y, const dd_real &x) { + /* Strategy: Instead of using Taylor series to compute + arctan, we instead use Newton's iteration to solve + the equation + + sin(z) = y/r or cos(z) = x/r + + where r = sqrt(x^2 + y^2). + The iteration is given by + + z' = z + (y - sin(z)) / cos(z) (for equation 1) + z' = z - (x - cos(z)) / sin(z) (for equation 2) + + Here, x and y are normalized so that x^2 + y^2 = 1. + If |x| > |y|, then first iteration is used since the + denominator is larger. Otherwise, the second is used. + */ + + if (x.is_zero()) { + + if (y.is_zero()) { + /* Both x and y is zero. */ + dd_real::error("(dd_real::atan2): Both arguments zero."); + return dd_real::_nan; + } + + return (y.is_positive()) ? dd_real::_pi2 : -dd_real::_pi2; + } else if (y.is_zero()) { + return (x.is_positive()) ? dd_real(0.0) : dd_real::_pi; + } + + if (x == y) { + return (y.is_positive()) ? dd_real::_pi4 : -dd_real::_3pi4; + } + + if (x == -y) { + return (y.is_positive()) ? dd_real::_3pi4 : -dd_real::_pi4; + } + + dd_real r = sqrt(sqr(x) + sqr(y)); + dd_real xx = x / r; + dd_real yy = y / r; + + /* Compute double precision approximation to atan. */ + dd_real z = std::atan2(to_double(y), to_double(x)); + dd_real sin_z, cos_z; + + if (std::abs(xx.x[0]) > std::abs(yy.x[0])) { + /* Use Newton iteration 1. z' = z + (y - sin(z)) / cos(z) */ + sincos(z, sin_z, cos_z); + z += (yy - sin_z) / cos_z; + } else { + /* Use Newton iteration 2. z' = z - (x - cos(z)) / sin(z) */ + sincos(z, sin_z, cos_z); + z -= (xx - cos_z) / sin_z; + } + + return z; +} + +dd_real tan(const dd_real &a) { + dd_real s, c; + sincos(a, s, c); + return s/c; +} + +dd_real asin(const dd_real &a) { + dd_real abs_a = abs(a); + + if (abs_a > 1.0) { + dd_real::error("(dd_real::asin): Argument out of domain."); + return dd_real::_nan; + } + + if (abs_a.is_one()) { + return (a.is_positive()) ? dd_real::_pi2 : -dd_real::_pi2; + } + + return atan2(a, sqrt(1.0 - sqr(a))); +} + +dd_real acos(const dd_real &a) { + dd_real abs_a = abs(a); + + if (abs_a > 1.0) { + dd_real::error("(dd_real::acos): Argument out of domain."); + return dd_real::_nan; + } + + if (abs_a.is_one()) { + return (a.is_positive()) ? dd_real(0.0) : dd_real::_pi; + } + + return atan2(sqrt(1.0 - sqr(a)), a); +} + +dd_real sinh(const dd_real &a) { + if (a.is_zero()) { + return 0.0; + } + + if (abs(a) > 0.05) { + dd_real ea = exp(a); + return mul_pwr2(ea - inv(ea), 0.5); + } + + /* since a is small, using the above formula gives + a lot of cancellation. So use Taylor series. */ + dd_real s = a; + dd_real t = a; + dd_real r = sqr(t); + double m = 1.0; + double thresh = std::abs((to_double(a)) * dd_real::_eps); + + do { + m += 2.0; + t *= r; + t /= (m-1) * m; + + s += t; + } while (abs(t) > thresh); + + return s; + +} + +dd_real cosh(const dd_real &a) { + if (a.is_zero()) { + return 1.0; + } + + dd_real ea = exp(a); + return mul_pwr2(ea + inv(ea), 0.5); +} + +dd_real tanh(const dd_real &a) { + if (a.is_zero()) { + return 0.0; + } + + if (std::abs(to_double(a)) > 0.05) { + dd_real ea = exp(a); + dd_real inv_ea = inv(ea); + return (ea - inv_ea) / (ea + inv_ea); + } else { + dd_real s, c; + s = sinh(a); + c = sqrt(1.0 + sqr(s)); + return s / c; + } +} + +void sincosh(const dd_real &a, dd_real &s, dd_real &c) { + if (std::abs(to_double(a)) <= 0.05) { + s = sinh(a); + c = sqrt(1.0 + sqr(s)); + } else { + dd_real ea = exp(a); + dd_real inv_ea = inv(ea); + s = mul_pwr2(ea - inv_ea, 0.5); + c = mul_pwr2(ea + inv_ea, 0.5); + } +} + +dd_real asinh(const dd_real &a) { + return log(a + sqrt(sqr(a) + 1.0)); +} + +dd_real acosh(const dd_real &a) { + if (a < 1.0) { + dd_real::error("(dd_real::acosh): Argument out of domain."); + return dd_real::_nan; + } + + return log(a + sqrt(sqr(a) - 1.0)); +} + +dd_real atanh(const dd_real &a) { + if (abs(a) >= 1.0) { + dd_real::error("(dd_real::atanh): Argument out of domain."); + return dd_real::_nan; + } + + return mul_pwr2(log((1.0 + a) / (1.0 - a)), 0.5); +} + +QD_API dd_real fmod(const dd_real &a, const dd_real &b) { + dd_real n = aint(a / b); + return (a - b * n); +} + +QD_API dd_real ddrand() { + static const double m_const = 4.6566128730773926e-10; /* = 2^{-31} */ + double m = m_const; + dd_real r = 0.0; + double d; + + /* Strategy: Generate 31 bits at a time, using lrand48 + random number generator. Shift the bits, and reapeat + 4 times. */ + + for (int i = 0; i < 4; i++, m *= m_const) { +// d = lrand48() * m; + d = std::rand() * m; + r += d; + } + + return r; +} + +/* polyeval(c, n, x) + Evaluates the given n-th degree polynomial at x. + The polynomial is given by the array of (n+1) coefficients. */ +dd_real polyeval(const dd_real *c, int n, const dd_real &x) { + /* Just use Horner's method of polynomial evaluation. */ + dd_real r = c[n]; + + for (int i = n-1; i >= 0; i--) { + r *= x; + r += c[i]; + } + + return r; +} + +/* polyroot(c, n, x0) + Given an n-th degree polynomial, finds a root close to + the given guess x0. Note that this uses simple Newton + iteration scheme, and does not work for multiple roots. */ +QD_API dd_real polyroot(const dd_real *c, int n, + const dd_real &x0, int max_iter, double thresh) { + dd_real x = x0; + dd_real f; + dd_real *d = new dd_real[n]; + bool conv = false; + int i; + double max_c = std::abs(to_double(c[0])); + double v; + + if (thresh == 0.0) thresh = dd_real::_eps; + + /* Compute the coefficients of the derivatives. */ + for (i = 1; i <= n; i++) { + v = std::abs(to_double(c[i])); + if (v > max_c) max_c = v; + d[i-1] = c[i] * static_cast(i); + } + thresh *= max_c; + + /* Newton iteration. */ + for (i = 0; i < max_iter; i++) { + f = polyeval(c, n, x); + + if (abs(f) < thresh) { + conv = true; + break; + } + x -= (f / polyeval(d, n-1, x)); + } + delete [] d; + + if (!conv) { + dd_real::error("(dd_real::polyroot): Failed to converge."); + return dd_real::_nan; + } + + return x; +} + + +/* Constructor. Reads a double-double number from the string s + and constructs a double-double number. */ +dd_real::dd_real(const char *s) { + if (dd_real::read(s, *this)) { + dd_real::error("(dd_real::dd_real): INPUT ERROR."); + *this = dd_real::_nan; + } +} + +dd_real &dd_real::operator=(const char *s) { + if (dd_real::read(s, *this)) { + dd_real::error("(dd_real::operator=): INPUT ERROR."); + *this = dd_real::_nan; + } + return *this; +} + +/* Outputs the double-double number dd. */ +ostream &operator<<(ostream &os, const dd_real &dd) { + bool showpos = (os.flags() & ios_base::showpos) != 0; + bool uppercase = (os.flags() & ios_base::uppercase) != 0; + return os << dd.to_string((int)os.precision(), (int)os.width(), os.flags(), + showpos, uppercase, os.fill()); +} + +/* Reads in the double-double number a. */ +istream &operator>>(istream &s, dd_real &a) { + char str[255]; + s >> str; + a = dd_real(str); + return s; +} + +void dd_real::to_digits(char *s, int &expn, int precision) const { + int D = precision + 1; /* number of digits to compute */ + + dd_real r = abs(*this); + int e; /* exponent */ + int i, d; + + if (x[0] == 0.0) { + /* this == 0.0 */ + expn = 0; + for (i = 0; i < precision; i++) s[i] = '0'; + return; + } + + /* First determine the (approximate) exponent. */ + e = to_int(std::floor(std::log10(std::abs(x[0])))); + + if (e < -300) { + r *= dd_real(10.0) ^ 300; + r /= dd_real(10.0) ^ (e + 300); + } else if (e > 300) { + r = ldexp(r, -53); + r /= dd_real(10.0) ^ e; + r = ldexp(r, 53); + } else { + r /= dd_real(10.0) ^ e; + } + + /* Fix exponent if we are off by one */ + if (r >= 10.0) { + r /= 10.0; + e++; + } else if (r < 1.0) { + r *= 10.0; + e--; + } + + if (r >= 10.0 || r < 1.0) { + dd_real::error("(dd_real::to_digits): can't compute exponent."); + return; + } + + /* Extract the digits */ + for (i = 0; i < D; i++) { + d = static_cast(r.x[0]); + r -= d; + r *= 10.0; + + s[i] = static_cast(d + '0'); + } + + /* Fix out of range digits. */ + for (i = D-1; i > 0; i--) { + if (s[i] < '0') { + s[i-1]--; + s[i] += 10; + } else if (s[i] > '9') { + s[i-1]++; + s[i] -= 10; + } + } + + if (s[0] <= '0') { + dd_real::error("(dd_real::to_digits): non-positive leading digit."); + return; + } + + /* Round, handle carry */ + if (s[D-1] >= '5') { + s[D-2]++; + + i = D-2; + while (i > 0 && s[i] > '9') { + s[i] -= 10; + s[--i]++; + } + } + + /* If first digit is 10, shift everything. */ + if (s[0] > '9') { + e++; + for (i = precision; i >= 2; i--) s[i] = s[i-1]; + s[0] = '1'; + s[1] = '0'; + } + + s[precision] = 0; + expn = e; +} + +/* Writes the double-double number into the character array s of length len. + The integer d specifies how many significant digits to write. + The string s must be able to hold at least (d+8) characters. + showpos indicates whether to use the + sign, and uppercase indicates + whether the E or e is to be used for the exponent. */ +void dd_real::write(char *s, int len, int precision, + bool showpos, bool uppercase) const { + string str = to_string(precision, 0, ios_base::scientific, showpos, uppercase); + std::strncpy(s, str.c_str(), len-1); + s[len-1] = 0; +} + + +void round_string(char *s, int precision, int *offset){ + /* + Input string must be all digits or errors will occur. + */ + + int i; + int D = precision ; + + /* Round, handle carry */ + if (D>0 && s[D] >= '5') { + s[D-1]++; + + i = D-1; + while (i > 0 && s[i] > '9') { + s[i] -= 10; + s[--i]++; + } + } + + /* If first digit is 10, shift everything. */ + if (s[0] > '9') { + // e++; // don't modify exponent here + for (i = precision; i >= 1; i--) s[i+1] = s[i]; + s[0] = '1'; + s[1] = '0'; + + (*offset)++ ; // now offset needs to be increased by one + precision++ ; + } + + s[precision] = 0; // add terminator for array +} + +string dd_real::to_string(int precision, int width, ios_base::fmtflags fmt, + bool showpos, bool uppercase, char fill) const { + string s; + bool fixed = (fmt & ios_base::fixed) != 0; + bool sgn = true; + int i, e = 0; + + if (isnan()) { + s = uppercase ? "NAN" : "nan"; + sgn = false; + } else { + if (*this < 0.0) + s += '-'; + else if (showpos) + s += '+'; + else + sgn = false; + + if (isinf()) { + s += uppercase ? "INF" : "inf"; + } else if (*this == 0.0) { + /* Zero case */ + s += '0'; + if (precision > 0) { + s += '.'; + s.append(precision, '0'); + } + } else { + /* Non-zero case */ + int off = (fixed ? (1 + to_int(floor(log10(abs(*this))))) : 1); + int d = precision + off; + + int d_with_extra = d; + if(fixed) + d_with_extra = std::max(60, d); // longer than the max accuracy for DD + + // highly special case - fixed mode, precision is zero, abs(*this) < 1.0 + // without this trap a number like 0.9 printed fixed with 0 precision prints as 0 + // should be rounded to 1. + if(fixed && (precision == 0) && (abs(*this) < 1.0)){ + if(abs(*this) >= 0.5) + s += '1'; + else + s += '0'; + + return s; + } + + // handle near zero to working precision (but not exactly zero) + if (fixed && d <= 0) { + s += '0'; + if (precision > 0) { + s += '.'; + s.append(precision, '0'); + } + } else { // default + + char *t; // = new char[d+1]; + int j; + + if(fixed){ + t = new char[d_with_extra+1]; + to_digits(t, e, d_with_extra); + } + else{ + t = new char[d+1]; + to_digits(t, e, d); + } + + off = e + 1; + + if (fixed) { + // fix the string if it's been computed incorrectly + // round here in the decimal string if required + round_string(t, d, &off); + + if (off > 0) { + for (i = 0; i < off; i++) s += t[i]; + if (precision > 0) { + s += '.'; + for (j = 0; j < precision; j++, i++) s += t[i]; + } + } else { + s += "0."; + if (off < 0) s.append(-off, '0'); + for (i = 0; i < d; i++) s += t[i]; + } + } else { + s += t[0]; + if (precision > 0) s += '.'; + + for (i = 1; i <= precision; i++) + s += t[i]; + + } + delete [] t; + } + } + + // trap for improper offset with large values + // without this trap, output of values of the for 10^j - 1 fail for j > 28 + // and are output with the point in the wrong place, leading to a dramatically off value + if(fixed && (precision > 0)){ + // make sure that the value isn't dramatically larger + double from_string = atof(s.c_str()); + + // if this ratio is large, then we've got problems + if( fabs( from_string / this->x[0] ) > 3.0 ){ + + // loop on the string, find the point, move it up one + // don't act on the first character + for(i=1; i < (int)s.length(); i++){ + if(s[i] == '.'){ + s[i] = s[i-1] ; + s[i-1] = '.' ; + break; + } + } + + from_string = atof(s.c_str()); + // if this ratio is large, then the string has not been fixed + if( fabs( from_string / this->x[0] ) > 3.0 ){ + dd_real::error("Re-rounding unsuccessful in large number fixed point trap.") ; + } + } + } + + + if (!fixed && !isinf()) { + /* Fill in exponent part */ + s += uppercase ? 'E' : 'e'; + append_expn(s, e); + } + } + + /* Fill in the blanks */ + int len = s.length(); + if (len < width) { + int delta = width - len; + if (fmt & ios_base::internal) { + if (sgn) + s.insert(static_cast(1), delta, fill); + else + s.insert(static_cast(0), delta, fill); + } else if (fmt & ios_base::left) { + s.append(delta, fill); + } else { + s.insert(static_cast(0), delta, fill); + } + } + + return s; +} + +/* Reads in a double-double number from the string s. */ +int dd_real::read(const char *s, dd_real &a) { + const char *p = s; + char ch; + int sign = 0; + int point = -1; + int nd = 0; + int e = 0; + bool done = false; + dd_real r = 0.0; + int nread; + + /* Skip any leading spaces */ + while (*p == ' ') + p++; + + while (!done && (ch = *p) != '\0') { + if (ch >= '0' && ch <= '9') { + int d = ch - '0'; + r *= 10.0; + r += static_cast(d); + nd++; + } else { + + switch (ch) { + + case '.': + if (point >= 0) + return -1; + point = nd; + break; + + case '-': + case '+': + if (sign != 0 || nd > 0) + return -1; + sign = (ch == '-') ? -1 : 1; + break; + + case 'E': + case 'e': + nread = std::sscanf(p+1, "%d", &e); + done = true; + if (nread != 1) + return -1; + break; + + default: + return -1; + } + } + + p++; + } + + if (point >= 0) { + e -= (nd - point); + } + + if (e != 0) { + r *= (dd_real(10.0) ^ e); + } + + a = (sign == -1) ? -r : r; + return 0; +} + +/* Debugging routines */ +void dd_real::dump(const string &name, std::ostream &os) const { + std::ios_base::fmtflags old_flags = os.flags(); + std::streamsize old_prec = os.precision(19); + os << std::scientific; + + if (name.length() > 0) os << name << " = "; + os << "[ " << setw(27) << x[0] << ", " << setw(27) << x[1] << " ]" << endl; + + os.precision(old_prec); + os.flags(old_flags); +} + +void dd_real::dump_bits(const string &name, std::ostream &os) const { + string::size_type len = name.length(); + if (len > 0) { + os << name << " = "; + len +=3; + } + os << "[ "; + len += 2; + print_double_info(os, x[0]); + os << endl; + for (string::size_type i = 0; i < len; i++) os << ' '; + print_double_info(os, x[1]); + os << " ]" << endl; +} + +dd_real dd_real::debug_rand() { + + if (std::rand() % 2 == 0) + return ddrand(); + + int expn = 0; + dd_real a = 0.0; + double d; + for (int i = 0; i < 2; i++) { + d = std::ldexp(static_cast(std::rand()) / RAND_MAX, -expn); + a += d; + expn = expn + 54 + std::rand() % 200; + } + return a; +} diff --git a/external/PackedCSparse/dd_real.h b/external/PackedCSparse/qd/dd_real.h similarity index 92% rename from external/PackedCSparse/dd_real.h rename to external/PackedCSparse/qd/dd_real.h index 5fe3491e5..e16438aa0 100644 --- a/external/PackedCSparse/dd_real.h +++ b/external/PackedCSparse/qd/dd_real.h @@ -1,12 +1,3 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from QD library -//(https://www.davidhbailey.com/dhbsoftware) by Ioannis Iakovidis - /* * include/dd_real.h * @@ -18,14 +9,14 @@ * * Double-double precision (>= 106-bit significand) floating point * arithmetic package based on David Bailey's Fortran-90 double-double - * package, with some changes. See + * package, with some changes. See * * http://www.nersc.gov/~dhbailey/mpdist/mpdist.html - * + * * for the original Fortran-90 version. * * Overall structure is similar to that of Keith Brigg's C++ double-double - * package. See + * package. See * * http://www-epidem.plansci.cam.ac.uk/~kbriggs/doubledouble.html * @@ -42,8 +33,8 @@ #include #include #include -#include "qd/qd_config.h" -#include "qd/fpu.h" +#include "qd_config.h" +#include "fpu.h" // Some compilers define isnan, isfinite, and isinf as macros, even for // C++ codes, which cause havoc when overloading these functions. We undef @@ -70,11 +61,7 @@ struct QD_API dd_real { double x[2]; - inline operator bool() const // new - { - return (x[0] != 0.0); - } dd_real(double hi, double lo) { x[0] = hi; x[1] = lo; } dd_real() {x[0] = 0.0; x[1] = 0.0; } dd_real(double h) { x[0] = h; x[1] = 0.0; } @@ -136,7 +123,7 @@ struct QD_API dd_real { static dd_real div(double a, double b); static dd_real sloppy_div(const dd_real &a, const dd_real &b); static dd_real accurate_div(const dd_real &a, const dd_real &b); - + dd_real &operator/=(double a); dd_real &operator/=(const dd_real &a); @@ -147,26 +134,28 @@ struct QD_API dd_real { static dd_real sqr(double d); static dd_real sqrt(double a); - + bool is_zero() const; bool is_one() const; bool is_positive() const; bool is_negative() const; + explicit operator bool() const; // new + explicit operator double() const; // new static dd_real rand(void); void to_digits(char *s, int &expn, int precision = _ndigits) const; - void write(char *s, int len, int precision = _ndigits, + void write(char *s, int len, int precision = _ndigits, bool showpos = false, bool uppercase = false) const; - std::string to_string(int precision = _ndigits, int width = 0, - std::ios_base::fmtflags fmt = static_cast(0), + std::string to_string(int precision = _ndigits, int width = 0, + std::ios_base::fmtflags fmt = static_cast(0), bool showpos = false, bool uppercase = false, char fill = ' ') const; int read(const char *s, dd_real &a); /* Debugging Methods */ void dump(const std::string &name, std::ostream &os = std::cerr) const; - void dump_bits(const std::string &name, + void dump_bits(const std::string &name, std::ostream &os = std::cerr) const; static dd_real debug_rand(); @@ -190,7 +179,7 @@ QD_API dd_real ddrand(void); QD_API dd_real sqrt(const dd_real &a); QD_API dd_real polyeval(const dd_real *c, int n, const dd_real &x); -QD_API dd_real polyroot(const dd_real *c, int n, +QD_API dd_real polyroot(const dd_real *c, int n, const dd_real &x0, int max_iter = 32, double thresh = 0.0); QD_API inline bool isnan(const dd_real &a) { return a.isnan(); } @@ -282,7 +271,7 @@ QD_API dd_real atan2(const dd_real &y, const dd_real &x); QD_API dd_real sinh(const dd_real &a); QD_API dd_real cosh(const dd_real &a); QD_API dd_real tanh(const dd_real &a); -QD_API void sincosh(const dd_real &a, +QD_API void sincosh(const dd_real &a, dd_real &sinh_a, dd_real &cosh_a); QD_API dd_real asinh(const dd_real &a); @@ -297,7 +286,8 @@ QD_API dd_real fmod(const dd_real &a, const dd_real &b); QD_API std::ostream& operator<<(std::ostream &s, const dd_real &a); QD_API std::istream& operator>>(std::istream &s, dd_real &a); #ifdef QD_INLINE -#include "qd/dd_inline.h" +#include "dd_inline.h" #endif #endif /* _QD_DD_REAL_H */ + diff --git a/external/PackedCSparse/qd/fpu.cc b/external/PackedCSparse/qd/fpu.cc new file mode 100644 index 000000000..96ddc488f --- /dev/null +++ b/external/PackedCSparse/qd/fpu.cc @@ -0,0 +1,124 @@ +/* + * src/fpu.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains functions to set and restore the round-to-double flag in the + * control word of a x86 FPU. + */ + +#include "qd_config.h" +#include "fpu.h" + +#ifdef X86 +#ifdef _WIN32 +#include +#else + +#ifdef HAVE_FPU_CONTROL_H +#include +#endif + +#ifndef _FPU_GETCW +#define _FPU_GETCW(x) asm volatile ("fnstcw %0":"=m" (x)); +#endif + +#ifndef _FPU_SETCW +#define _FPU_SETCW(x) asm volatile ("fldcw %0": :"m" (x)); +#endif + +#ifndef _FPU_EXTENDED +#define _FPU_EXTENDED 0x0300 +#endif + +#ifndef _FPU_DOUBLE +#define _FPU_DOUBLE 0x0200 +#endif + +#endif +#endif /* X86 */ + +extern "C" { + +void fpu_fix_start(unsigned int *old_cw) { +#ifdef X86 +#ifdef _WIN32 +#ifdef __BORLANDC__ + /* Win 32 Borland C */ + unsigned short cw = _control87(0, 0); + _control87(0x0200, 0x0300); + if (old_cw) { + *old_cw = cw; + } +#else + /* Win 32 MSVC */ + unsigned int cw = _control87(0, 0); + _control87(0x00010000, 0x00030000); + if (old_cw) { + *old_cw = cw; + } +#endif +#else + /* Linux */ + volatile unsigned short cw, new_cw; + _FPU_GETCW(cw); + + new_cw = (cw & ~_FPU_EXTENDED) | _FPU_DOUBLE; + _FPU_SETCW(new_cw); + + if (old_cw) { + *old_cw = cw; + } +#endif +#endif +} + +void fpu_fix_end(unsigned int *old_cw) { +#ifdef X86 +#ifdef _WIN32 + +#ifdef __BORLANDC__ + /* Win 32 Borland C */ + if (old_cw) { + unsigned short cw = (unsigned short) *old_cw; + _control87(cw, 0xFFFF); + } +#else + /* Win 32 MSVC */ + if (old_cw) { + _control87(*old_cw, 0xFFFFFFFF); + } +#endif + +#else + /* Linux */ + if (old_cw) { + int cw; + cw = *old_cw; + _FPU_SETCW(cw); + } +#endif +#endif +} + +#ifdef HAVE_FORTRAN + +#define f_fpu_fix_start FC_FUNC_(f_fpu_fix_start, F_FPU_FIX_START) +#define f_fpu_fix_end FC_FUNC_(f_fpu_fix_end, F_FPU_FIX_END) + +void f_fpu_fix_start(unsigned int *old_cw) { + fpu_fix_start(old_cw); +} + +void f_fpu_fix_end(unsigned int *old_cw) { + fpu_fix_end(old_cw); +} + +#endif + +} + diff --git a/external/PackedCSparse/qd/fpu.h b/external/PackedCSparse/qd/fpu.h new file mode 100644 index 000000000..35eab18cf --- /dev/null +++ b/external/PackedCSparse/qd/fpu.h @@ -0,0 +1,39 @@ +/* + * include/fpu.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2001 + * + * Contains functions to set and restore the round-to-double flag in the + * control word of a x86 FPU. The algorithms in the double-double and + * quad-double package does not function with the extended mode found in + * these FPU. + */ +#ifndef _QD_FPU_H +#define _QD_FPU_H + +#include "qd_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Set the round-to-double flag, and save the old control word in old_cw. + * If old_cw is NULL, the old control word is not saved. + */ +QD_API void fpu_fix_start(unsigned int *old_cw); + +/* + * Restore the control word. + */ +QD_API void fpu_fix_end(unsigned int *old_cw); + +#ifdef __cplusplus +} +#endif + +#endif /* _QD_FPU_H */ diff --git a/external/PackedCSparse/qd/inline.h b/external/PackedCSparse/qd/inline.h new file mode 100644 index 000000000..52425545b --- /dev/null +++ b/external/PackedCSparse/qd/inline.h @@ -0,0 +1,143 @@ +/* + * include/inline.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * This file contains the basic functions used both by double-double + * and quad-double package. These are declared as inline functions as + * they are the smallest building blocks of the double-double and + * quad-double arithmetic. + */ +#ifndef _QD_INLINE_H +#define _QD_INLINE_H + +#define _QD_SPLITTER 134217729.0 // = 2^27 + 1 +#define _QD_SPLIT_THRESH 6.69692879491417e+299 // = 2^996 + +#ifdef QD_VACPP_BUILTINS_H +/* For VisualAge C++ __fmadd */ +#include +#endif + +#include +#include + +namespace qd { + +static const double _d_nan = std::numeric_limits::quiet_NaN(); +static const double _d_inf = std::numeric_limits::infinity(); + +/*********** Basic Functions ************/ +/* Computes fl(a+b) and err(a+b). Assumes |a| >= |b|. */ +inline double quick_two_sum(double a, double b, double &err) { + double s = a + b; + err = b - (s - a); + return s; +} + +/* Computes fl(a-b) and err(a-b). Assumes |a| >= |b| */ +inline double quick_two_diff(double a, double b, double &err) { + double s = a - b; + err = (a - s) - b; + return s; +} + +/* Computes fl(a+b) and err(a+b). */ +inline double two_sum(double a, double b, double &err) { + double s = a + b; + double bb = s - a; + err = (a - (s - bb)) + (b - bb); + return s; +} + +/* Computes fl(a-b) and err(a-b). */ +inline double two_diff(double a, double b, double &err) { + double s = a - b; + double bb = s - a; + err = (a - (s - bb)) - (b + bb); + return s; +} + +#ifndef QD_FMS +/* Computes high word and lo word of a */ +inline void split(double a, double &hi, double &lo) { + double temp; + if (a > _QD_SPLIT_THRESH || a < -_QD_SPLIT_THRESH) { + a *= 3.7252902984619140625e-09; // 2^-28 + temp = _QD_SPLITTER * a; + hi = temp - (temp - a); + lo = a - hi; + hi *= 268435456.0; // 2^28 + lo *= 268435456.0; // 2^28 + } else { + temp = _QD_SPLITTER * a; + hi = temp - (temp - a); + lo = a - hi; + } +} +#endif + +/* Computes fl(a*b) and err(a*b). */ +inline double two_prod(double a, double b, double &err) { +#ifdef QD_FMS + double p = a * b; + err = QD_FMS(a, b, p); + return p; +#else + double a_hi, a_lo, b_hi, b_lo; + double p = a * b; + split(a, a_hi, a_lo); + split(b, b_hi, b_lo); + err = ((a_hi * b_hi - p) + a_hi * b_lo + a_lo * b_hi) + a_lo * b_lo; + return p; +#endif +} + +/* Computes fl(a*a) and err(a*a). Faster than the above method. */ +inline double two_sqr(double a, double &err) { +#ifdef QD_FMS + double p = a * a; + err = QD_FMS(a, a, p); + return p; +#else + double hi, lo; + double q = a * a; + split(a, hi, lo); + err = ((hi * hi - q) + 2.0 * hi * lo) + lo * lo; + return q; +#endif +} + +/* Computes the nearest integer to d. */ +inline double nint(double d) { + if (d == std::floor(d)) + return d; + return std::floor(d + 0.5); +} + +/* Computes the truncated integer. */ +inline double aint(double d) { + return (d >= 0.0) ? std::floor(d) : std::ceil(d); +} + +/* These are provided to give consistent + interface for double with double-double and quad-double. */ +inline void sincosh(double t, double &sinh_t, double &cosh_t) { + sinh_t = std::sinh(t); + cosh_t = std::cosh(t); +} + +inline double sqr(double t) { + return t * t; +} + +inline double to_double(double a) { return a; } +inline int to_int(double a) { return static_cast(a); } + +} + +#endif /* _QD_INLINE_H */ diff --git a/external/PackedCSparse/qd/qd.pdf b/external/PackedCSparse/qd/qd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9525b8cac490f4c3229bc7074e37075cebe7eae0 GIT binary patch literal 194502 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 SmE72tYykD$gkxvSUpTr@w^W=dn^OhAde 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 +#include + +/* include/qd/qd_config.h. Generated from qd_config.h.in by configure. */ +#ifndef _QD_QD_CONFIG_H +#define _QD_QD_CONFIG_H 1 + +#ifndef QD_API +#define QD_API /**/ +#endif + +/* Set to 1 if using VisualAge C++ compiler for __fmadd builtin. */ +#ifndef QD_VACPP_BUILTINS_H +/* #undef QD_VACPP_BUILTINS_H */ +#endif + +/* If fused multiply-add is available, define to correct macro for + using it. It is invoked as QD_FMA(a, b, c) to compute fl(a * b + c). + If correctly rounded multiply-add is not available (or if unsure), + keep it undefined.*/ +#ifndef QD_FMA +/* #undef QD_FMA */ +#endif + +/* If fused multiply-subtract is available, define to correct macro for + using it. It is invoked as QD_FMS(a, b, c) to compute fl(a * b - c). + If correctly rounded multiply-add is not available (or if unsure), + keep it undefined.*/ +#ifndef QD_FMS +#define QD_FMS(a, b, c) std::fma(a,b,-c) +/* #undef QD_FMS */ +#endif + +/* Set the following to 1 to define commonly used function + to be inlined. This should be set to 1 unless the compiler + does not support the "inline" keyword, or if building for + debugging purposes. */ +#ifndef QD_INLINE +#define QD_INLINE 1 +#endif + +/* Set the following to 1 to use ANSI C++ standard header files + such as cmath, iostream, etc. If set to zero, it will try to + include math.h, iostream.h, etc, instead. */ +#ifndef QD_HAVE_STD +#define QD_HAVE_STD 1 +#endif + +/* Set the following to 1 to make the addition and subtraction + to satisfy the IEEE-style error bound + + fl(a + b) = (1 + d) * (a + b) + + where |d| <= eps. If set to 0, the addition and subtraction + will satisfy the weaker Cray-style error bound + + fl(a + b) = (1 + d1) * a + (1 + d2) * b + + where |d1| <= eps and |d2| eps. */ +#ifndef QD_IEEE_ADD +/* #undef QD_IEEE_ADD */ +#endif + +/* Set the following to 1 to use slightly inaccurate but faster + version of multiplication. */ +#ifndef QD_SLOPPY_MUL +#define QD_SLOPPY_MUL 1 +#endif + +/* Set the following to 1 to use slightly inaccurate but faster + version of division. */ +#ifndef QD_SLOPPY_DIV +#define QD_SLOPPY_DIV 1 +#endif + +/* Define this macro to be the isfinite(x) function. */ +#ifndef QD_ISFINITE +#define QD_ISFINITE(x) std::isfinite(x) +#endif + +/* Define this macro to be the isinf(x) function. */ +#ifndef QD_ISINF +#define QD_ISINF(x) std::isinf(x) +#endif + +/* Define this macro to be the isnan(x) function. */ +#ifndef QD_ISNAN +#define QD_ISNAN(x) std::isnan(x) +#endif + + +#endif /* _QD_QD_CONFIG_H */ diff --git a/external/PackedCSparse/qd/qd_const.cc b/external/PackedCSparse/qd/qd_const.cc new file mode 100644 index 000000000..6f4e01d2a --- /dev/null +++ b/external/PackedCSparse/qd/qd_const.cc @@ -0,0 +1,62 @@ +/* + * src/qd_const.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Defines constants used in quad-double package. + */ +#include "qd_config.h" +#include "qd_real.h" + +/* Some useful constants. */ +const qd_real qd_real::_2pi = qd_real(6.283185307179586232e+00, + 2.449293598294706414e-16, + -5.989539619436679332e-33, + 2.224908441726730563e-49); +const qd_real qd_real::_pi = qd_real(3.141592653589793116e+00, + 1.224646799147353207e-16, + -2.994769809718339666e-33, + 1.112454220863365282e-49); +const qd_real qd_real::_pi2 = qd_real(1.570796326794896558e+00, + 6.123233995736766036e-17, + -1.497384904859169833e-33, + 5.562271104316826408e-50); +const qd_real qd_real::_pi4 = qd_real(7.853981633974482790e-01, + 3.061616997868383018e-17, + -7.486924524295849165e-34, + 2.781135552158413204e-50); +const qd_real qd_real::_3pi4 = qd_real(2.356194490192344837e+00, + 9.1848509936051484375e-17, + 3.9168984647504003225e-33, + -2.5867981632704860386e-49); +const qd_real qd_real::_e = qd_real(2.718281828459045091e+00, + 1.445646891729250158e-16, + -2.127717108038176765e-33, + 1.515630159841218954e-49); +const qd_real qd_real::_log2 = qd_real(6.931471805599452862e-01, + 2.319046813846299558e-17, + 5.707708438416212066e-34, + -3.582432210601811423e-50); +const qd_real qd_real::_log10 = qd_real(2.302585092994045901e+00, + -2.170756223382249351e-16, + -9.984262454465776570e-33, + -4.023357454450206379e-49); +const qd_real qd_real::_nan = qd_real(qd::_d_nan, qd::_d_nan, + qd::_d_nan, qd::_d_nan); +const qd_real qd_real::_inf = qd_real(qd::_d_inf, qd::_d_inf, + qd::_d_inf, qd::_d_inf); + +const double qd_real::_eps = 1.21543267145725e-63; // = 2^-209 +const double qd_real::_min_normalized = 1.6259745436952323e-260; // = 2^(-1022 + 3*53) +const qd_real qd_real::_max = qd_real( + 1.79769313486231570815e+308, 9.97920154767359795037e+291, + 5.53956966280111259858e+275, 3.07507889307840487279e+259); +const qd_real qd_real::_safe_max = qd_real( + 1.7976931080746007281e+308, 9.97920154767359795037e+291, + 5.53956966280111259858e+275, 3.07507889307840487279e+259); +const int qd_real::_ndigits = 62; + diff --git a/external/PackedCSparse/qd/qd_inline.h b/external/PackedCSparse/qd/qd_inline.h new file mode 100644 index 000000000..89ba275b5 --- /dev/null +++ b/external/PackedCSparse/qd/qd_inline.h @@ -0,0 +1,1047 @@ +/* + * include/qd_inline.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2001 + * + * Contains small functions (suitable for inlining) in the quad-double + * arithmetic package. + */ +#ifndef _QD_QD_INLINE_H +#define _QD_QD_INLINE_H + +#include +#include "inline.h" + +#ifndef QD_INLINE +#define inline +#endif + +/********** Constructors **********/ +inline qd_real::qd_real(double x0, double x1, double x2, double x3) { + x[0] = x0; + x[1] = x1; + x[2] = x2; + x[3] = x3; +} + +inline qd_real::qd_real(const double *xx) { + x[0] = xx[0]; + x[1] = xx[1]; + x[2] = xx[2]; + x[3] = xx[3]; +} + +inline qd_real::qd_real(double x0) { + x[0] = x0; + x[1] = x[2] = x[3] = 0.0; +} + +inline qd_real::qd_real() { + x[0] = 0.0; + x[1] = 0.0; + x[2] = 0.0; + x[3] = 0.0; +} + +inline qd_real::qd_real(const dd_real &a) { + x[0] = a._hi(); + x[1] = a._lo(); + x[2] = x[3] = 0.0; +} + +inline qd_real::qd_real(int i) { + x[0] = static_cast(i); + x[1] = x[2] = x[3] = 0.0; +} + +/********** Accessors **********/ +inline double qd_real::operator[](int i) const { + return x[i]; +} + +inline double &qd_real::operator[](int i) { + return x[i]; +} + +inline bool qd_real::isnan() const { + return QD_ISNAN(x[0]) || QD_ISNAN(x[1]) || QD_ISNAN(x[2]) || QD_ISNAN(x[3]); +} + +/********** Renormalization **********/ +namespace qd { +inline void quick_renorm(double &c0, double &c1, + double &c2, double &c3, double &c4) { + double t0, t1, t2, t3; + double s; + s = qd::quick_two_sum(c3, c4, t3); + s = qd::quick_two_sum(c2, s , t2); + s = qd::quick_two_sum(c1, s , t1); + c0 = qd::quick_two_sum(c0, s , t0); + + s = qd::quick_two_sum(t2, t3, t2); + s = qd::quick_two_sum(t1, s , t1); + c1 = qd::quick_two_sum(t0, s , t0); + + s = qd::quick_two_sum(t1, t2, t1); + c2 = qd::quick_two_sum(t0, s , t0); + + c3 = t0 + t1; +} + +inline void renorm(double &c0, double &c1, + double &c2, double &c3) { + double s0, s1, s2 = 0.0, s3 = 0.0; + + if (QD_ISINF(c0)) return; + + s0 = qd::quick_two_sum(c2, c3, c3); + s0 = qd::quick_two_sum(c1, s0, c2); + c0 = qd::quick_two_sum(c0, s0, c1); + + s0 = c0; + s1 = c1; + if (s1 != 0.0) { + s1 = qd::quick_two_sum(s1, c2, s2); + if (s2 != 0.0) + s2 = qd::quick_two_sum(s2, c3, s3); + else + s1 = qd::quick_two_sum(s1, c3, s2); + } else { + s0 = qd::quick_two_sum(s0, c2, s1); + if (s1 != 0.0) + s1 = qd::quick_two_sum(s1, c3, s2); + else + s0 = qd::quick_two_sum(s0, c3, s1); + } + + c0 = s0; + c1 = s1; + c2 = s2; + c3 = s3; +} + +inline void renorm(double &c0, double &c1, + double &c2, double &c3, double &c4) { + double s0, s1, s2 = 0.0, s3 = 0.0; + + if (QD_ISINF(c0)) return; + + s0 = qd::quick_two_sum(c3, c4, c4); + s0 = qd::quick_two_sum(c2, s0, c3); + s0 = qd::quick_two_sum(c1, s0, c2); + c0 = qd::quick_two_sum(c0, s0, c1); + + s0 = c0; + s1 = c1; + + if (s1 != 0.0) { + s1 = qd::quick_two_sum(s1, c2, s2); + if (s2 != 0.0) { + s2 = qd::quick_two_sum(s2, c3, s3); + if (s3 != 0.0) + s3 += c4; + else + s2 = qd::quick_two_sum(s2, c4, s3); + } else { + s1 = qd::quick_two_sum(s1, c3, s2); + if (s2 != 0.0) + s2 = qd::quick_two_sum(s2, c4, s3); + else + s1 = qd::quick_two_sum(s1, c4, s2); + } + } else { + s0 = qd::quick_two_sum(s0, c2, s1); + if (s1 != 0.0) { + s1 = qd::quick_two_sum(s1, c3, s2); + if (s2 != 0.0) + s2 = qd::quick_two_sum(s2, c4, s3); + else + s1 = qd::quick_two_sum(s1, c4, s2); + } else { + s0 = qd::quick_two_sum(s0, c3, s1); + if (s1 != 0.0) + s1 = qd::quick_two_sum(s1, c4, s2); + else + s0 = qd::quick_two_sum(s0, c4, s1); + } + } + + c0 = s0; + c1 = s1; + c2 = s2; + c3 = s3; +} +} + +inline void qd_real::renorm() { + qd::renorm(x[0], x[1], x[2], x[3]); +} + +inline void qd_real::renorm(double &e) { + qd::renorm(x[0], x[1], x[2], x[3], e); +} + + +/********** Additions ************/ +namespace qd { + +inline void three_sum(double &a, double &b, double &c) { + double t1, t2, t3; + t1 = qd::two_sum(a, b, t2); + a = qd::two_sum(c, t1, t3); + b = qd::two_sum(t2, t3, c); +} + +inline void three_sum2(double &a, double &b, double &c) { + double t1, t2, t3; + t1 = qd::two_sum(a, b, t2); + a = qd::two_sum(c, t1, t3); + b = t2 + t3; +} + +} + +/* quad-double + double */ +inline qd_real operator+(const qd_real &a, double b) { + double c0, c1, c2, c3; + double e; + + c0 = qd::two_sum(a[0], b, e); + c1 = qd::two_sum(a[1], e, e); + c2 = qd::two_sum(a[2], e, e); + c3 = qd::two_sum(a[3], e, e); + + qd::renorm(c0, c1, c2, c3, e); + + return qd_real(c0, c1, c2, c3); +} + +/* quad-double + double-double */ +inline qd_real operator+(const qd_real &a, const dd_real &b) { + + double s0, s1, s2, s3; + double t0, t1; + + s0 = qd::two_sum(a[0], b._hi(), t0); + s1 = qd::two_sum(a[1], b._lo(), t1); + + s1 = qd::two_sum(s1, t0, t0); + + s2 = a[2]; + qd::three_sum(s2, t0, t1); + + s3 = qd::two_sum(t0, a[3], t0); + t0 += t1; + + qd::renorm(s0, s1, s2, s3, t0); + return qd_real(s0, s1, s2, s3); +} + + +/* double + quad-double */ +inline qd_real operator+(double a, const qd_real &b) { + return (b + a); +} + +/* double-double + quad-double */ +inline qd_real operator+(const dd_real &a, const qd_real &b) { + return (b + a); +} + +namespace qd { + +/* s = quick_three_accum(a, b, c) adds c to the dd-pair (a, b). + * If the result does not fit in two doubles, then the sum is + * output into s and (a,b) contains the remainder. Otherwise + * s is zero and (a,b) contains the sum. */ +inline double quick_three_accum(double &a, double &b, double c) { + double s; + bool za, zb; + + s = qd::two_sum(b, c, b); + s = qd::two_sum(a, s, a); + + za = (a != 0.0); + zb = (b != 0.0); + + if (za && zb) + return s; + + if (!zb) { + b = a; + a = s; + } else { + a = s; + } + + return 0.0; +} + +} + +inline qd_real qd_real::ieee_add(const qd_real &a, const qd_real &b) { + int i, j, k; + double s, t; + double u, v; /* double-length accumulator */ + double x[4] = {0.0, 0.0, 0.0, 0.0}; + + i = j = k = 0; + if (std::abs(a[i]) > std::abs(b[j])) + u = a[i++]; + else + u = b[j++]; + if (std::abs(a[i]) > std::abs(b[j])) + v = a[i++]; + else + v = b[j++]; + + u = qd::quick_two_sum(u, v, v); + + while (k < 4) { + if (i >= 4 && j >= 4) { + x[k] = u; + if (k < 3) + x[++k] = v; + break; + } + + if (i >= 4) + t = b[j++]; + else if (j >= 4) + t = a[i++]; + else if (std::abs(a[i]) > std::abs(b[j])) { + t = a[i++]; + } else + t = b[j++]; + + s = qd::quick_three_accum(u, v, t); + + if (s != 0.0) { + x[k++] = s; + } + } + + /* add the rest. */ + for (k = i; k < 4; k++) + x[3] += a[k]; + for (k = j; k < 4; k++) + x[3] += b[k]; + + qd::renorm(x[0], x[1], x[2], x[3]); + return qd_real(x[0], x[1], x[2], x[3]); +} + +inline qd_real qd_real::sloppy_add(const qd_real &a, const qd_real &b) { + /* + double s0, s1, s2, s3; + double t0, t1, t2, t3; + + s0 = qd::two_sum(a[0], b[0], t0); + s1 = qd::two_sum(a[1], b[1], t1); + s2 = qd::two_sum(a[2], b[2], t2); + s3 = qd::two_sum(a[3], b[3], t3); + + s1 = qd::two_sum(s1, t0, t0); + qd::three_sum(s2, t0, t1); + qd::three_sum2(s3, t0, t2); + t0 = t0 + t1 + t3; + + qd::renorm(s0, s1, s2, s3, t0); + return qd_real(s0, s1, s2, s3, t0); + */ + + /* Same as above, but addition re-organized to minimize + data dependency ... unfortunately some compilers are + not very smart to do this automatically */ + double s0, s1, s2, s3; + double t0, t1, t2, t3; + + double v0, v1, v2, v3; + double u0, u1, u2, u3; + double w0, w1, w2, w3; + + s0 = a[0] + b[0]; + s1 = a[1] + b[1]; + s2 = a[2] + b[2]; + s3 = a[3] + b[3]; + + v0 = s0 - a[0]; + v1 = s1 - a[1]; + v2 = s2 - a[2]; + v3 = s3 - a[3]; + + u0 = s0 - v0; + u1 = s1 - v1; + u2 = s2 - v2; + u3 = s3 - v3; + + w0 = a[0] - u0; + w1 = a[1] - u1; + w2 = a[2] - u2; + w3 = a[3] - u3; + + u0 = b[0] - v0; + u1 = b[1] - v1; + u2 = b[2] - v2; + u3 = b[3] - v3; + + t0 = w0 + u0; + t1 = w1 + u1; + t2 = w2 + u2; + t3 = w3 + u3; + + s1 = qd::two_sum(s1, t0, t0); + qd::three_sum(s2, t0, t1); + qd::three_sum2(s3, t0, t2); + t0 = t0 + t1 + t3; + + /* renormalize */ + qd::renorm(s0, s1, s2, s3, t0); + return qd_real(s0, s1, s2, s3); +} + +/* quad-double + quad-double */ +inline qd_real operator+(const qd_real &a, const qd_real &b) { +#ifndef QD_IEEE_ADD + return qd_real::sloppy_add(a, b); +#else + return qd_real::ieee_add(a, b); +#endif +} + + + +/********** Self-Additions ************/ +/* quad-double += double */ +inline qd_real &qd_real::operator+=(double a) { + *this = *this + a; + return *this; +} + +/* quad-double += double-double */ +inline qd_real &qd_real::operator+=(const dd_real &a) { + *this = *this + a; + return *this; +} + +/* quad-double += quad-double */ +inline qd_real &qd_real::operator+=(const qd_real &a) { + *this = *this + a; + return *this; +} + +/********** Unary Minus **********/ +inline qd_real qd_real::operator-() const { + return qd_real(-x[0], -x[1], -x[2], -x[3]); +} + +/********** Subtractions **********/ +inline qd_real operator-(const qd_real &a, double b) { + return (a + (-b)); +} + +inline qd_real operator-(double a, const qd_real &b) { + return (a + (-b)); +} + +inline qd_real operator-(const qd_real &a, const dd_real &b) { + return (a + (-b)); +} + +inline qd_real operator-(const dd_real &a, const qd_real &b) { + return (a + (-b)); +} + +inline qd_real operator-(const qd_real &a, const qd_real &b) { + return (a + (-b)); +} + +/********** Self-Subtractions **********/ +inline qd_real &qd_real::operator-=(double a) { + return ((*this) += (-a)); +} + +inline qd_real &qd_real::operator-=(const dd_real &a) { + return ((*this) += (-a)); +} + +inline qd_real &qd_real::operator-=(const qd_real &a) { + return ((*this) += (-a)); +} + + +inline qd_real operator*(double a, const qd_real &b) { + return (b * a); +} + +inline qd_real operator*(const dd_real &a, const qd_real &b) { + return (b * a); +} + +inline qd_real mul_pwr2(const qd_real &a, double b) { + return qd_real(a[0] * b, a[1] * b, a[2] * b, a[3] * b); +} + +/********** Multiplications **********/ +inline qd_real operator*(const qd_real &a, double b) { + double p0, p1, p2, p3; + double q0, q1, q2; + double s0, s1, s2, s3, s4; + + p0 = qd::two_prod(a[0], b, q0); + p1 = qd::two_prod(a[1], b, q1); + p2 = qd::two_prod(a[2], b, q2); + p3 = a[3] * b; + + s0 = p0; + + s1 = qd::two_sum(q0, p1, s2); + + qd::three_sum(s2, q1, p2); + + qd::three_sum2(q1, q2, p3); + s3 = q1; + + s4 = q2 + p2; + + qd::renorm(s0, s1, s2, s3, s4); + return qd_real(s0, s1, s2, s3); + +} + +/* quad-double * double-double */ +/* a0 * b0 0 + a0 * b1 1 + a1 * b0 2 + a1 * b1 3 + a2 * b0 4 + a2 * b1 5 + a3 * b0 6 + a3 * b1 7 */ +inline qd_real operator*(const qd_real &a, const dd_real &b) { + double p0, p1, p2, p3, p4; + double q0, q1, q2, q3, q4; + double s0, s1, s2; + double t0, t1; + + p0 = qd::two_prod(a[0], b._hi(), q0); + p1 = qd::two_prod(a[0], b._lo(), q1); + p2 = qd::two_prod(a[1], b._hi(), q2); + p3 = qd::two_prod(a[1], b._lo(), q3); + p4 = qd::two_prod(a[2], b._hi(), q4); + + qd::three_sum(p1, p2, q0); + + /* Five-Three-Sum */ + qd::three_sum(p2, p3, p4); + q1 = qd::two_sum(q1, q2, q2); + s0 = qd::two_sum(p2, q1, t0); + s1 = qd::two_sum(p3, q2, t1); + s1 = qd::two_sum(s1, t0, t0); + s2 = t0 + t1 + p4; + p2 = s0; + + p3 = a[2] * b._hi() + a[3] * b._lo() + q3 + q4; + qd::three_sum2(p3, q0, s1); + p4 = q0 + s2; + + qd::renorm(p0, p1, p2, p3, p4); + return qd_real(p0, p1, p2, p3); +} + +/* quad-double * quad-double */ +/* a0 * b0 0 + a0 * b1 1 + a1 * b0 2 + a0 * b2 3 + a1 * b1 4 + a2 * b0 5 + a0 * b3 6 + a1 * b2 7 + a2 * b1 8 + a3 * b0 9 */ +inline qd_real qd_real::sloppy_mul(const qd_real &a, const qd_real &b) { + double p0, p1, p2, p3, p4, p5; + double q0, q1, q2, q3, q4, q5; + double t0, t1; + double s0, s1, s2; + + p0 = qd::two_prod(a[0], b[0], q0); + + p1 = qd::two_prod(a[0], b[1], q1); + p2 = qd::two_prod(a[1], b[0], q2); + + p3 = qd::two_prod(a[0], b[2], q3); + p4 = qd::two_prod(a[1], b[1], q4); + p5 = qd::two_prod(a[2], b[0], q5); + + /* Start Accumulation */ + qd::three_sum(p1, p2, q0); + + /* Six-Three Sum of p2, q1, q2, p3, p4, p5. */ + qd::three_sum(p2, q1, q2); + qd::three_sum(p3, p4, p5); + /* compute (s0, s1, s2) = (p2, q1, q2) + (p3, p4, p5). */ + s0 = qd::two_sum(p2, p3, t0); + s1 = qd::two_sum(q1, p4, t1); + s2 = q2 + p5; + s1 = qd::two_sum(s1, t0, t0); + s2 += (t0 + t1); + + /* O(eps^3) order terms */ + s1 += a[0]*b[3] + a[1]*b[2] + a[2]*b[1] + a[3]*b[0] + q0 + q3 + q4 + q5; + qd::renorm(p0, p1, s0, s1, s2); + return qd_real(p0, p1, s0, s1); +} + +inline qd_real qd_real::accurate_mul(const qd_real &a, const qd_real &b) { + double p0, p1, p2, p3, p4, p5; + double q0, q1, q2, q3, q4, q5; + double p6, p7, p8, p9; + double q6, q7, q8, q9; + double r0, r1; + double t0, t1; + double s0, s1, s2; + + p0 = qd::two_prod(a[0], b[0], q0); + + p1 = qd::two_prod(a[0], b[1], q1); + p2 = qd::two_prod(a[1], b[0], q2); + + p3 = qd::two_prod(a[0], b[2], q3); + p4 = qd::two_prod(a[1], b[1], q4); + p5 = qd::two_prod(a[2], b[0], q5); + + /* Start Accumulation */ + qd::three_sum(p1, p2, q0); + + /* Six-Three Sum of p2, q1, q2, p3, p4, p5. */ + qd::three_sum(p2, q1, q2); + qd::three_sum(p3, p4, p5); + /* compute (s0, s1, s2) = (p2, q1, q2) + (p3, p4, p5). */ + s0 = qd::two_sum(p2, p3, t0); + s1 = qd::two_sum(q1, p4, t1); + s2 = q2 + p5; + s1 = qd::two_sum(s1, t0, t0); + s2 += (t0 + t1); + + /* O(eps^3) order terms */ + p6 = qd::two_prod(a[0], b[3], q6); + p7 = qd::two_prod(a[1], b[2], q7); + p8 = qd::two_prod(a[2], b[1], q8); + p9 = qd::two_prod(a[3], b[0], q9); + + /* Nine-Two-Sum of q0, s1, q3, q4, q5, p6, p7, p8, p9. */ + q0 = qd::two_sum(q0, q3, q3); + q4 = qd::two_sum(q4, q5, q5); + p6 = qd::two_sum(p6, p7, p7); + p8 = qd::two_sum(p8, p9, p9); + /* Compute (t0, t1) = (q0, q3) + (q4, q5). */ + t0 = qd::two_sum(q0, q4, t1); + t1 += (q3 + q5); + /* Compute (r0, r1) = (p6, p7) + (p8, p9). */ + r0 = qd::two_sum(p6, p8, r1); + r1 += (p7 + p9); + /* Compute (q3, q4) = (t0, t1) + (r0, r1). */ + q3 = qd::two_sum(t0, r0, q4); + q4 += (t1 + r1); + /* Compute (t0, t1) = (q3, q4) + s1. */ + t0 = qd::two_sum(q3, s1, t1); + t1 += q4; + + /* O(eps^4) terms -- Nine-One-Sum */ + t1 += a[1] * b[3] + a[2] * b[2] + a[3] * b[1] + q6 + q7 + q8 + q9 + s2; + + qd::renorm(p0, p1, s0, t0, t1); + return qd_real(p0, p1, s0, t0); +} + +inline qd_real operator*(const qd_real &a, const qd_real &b) { +#ifdef QD_SLOPPY_MUL + return qd_real::sloppy_mul(a, b); +#else + return qd_real::accurate_mul(a, b); +#endif +} + +/* quad-double ^ 2 = (x0 + x1 + x2 + x3) ^ 2 + = x0 ^ 2 + 2 x0 * x1 + (2 x0 * x2 + x1 ^ 2) + + (2 x0 * x3 + 2 x1 * x2) */ +inline qd_real sqr(const qd_real &a) { + double p0, p1, p2, p3, p4, p5; + double q0, q1, q2, q3; + double s0, s1; + double t0, t1; + + p0 = qd::two_sqr(a[0], q0); + p1 = qd::two_prod(2.0 * a[0], a[1], q1); + p2 = qd::two_prod(2.0 * a[0], a[2], q2); + p3 = qd::two_sqr(a[1], q3); + + p1 = qd::two_sum(q0, p1, q0); + + q0 = qd::two_sum(q0, q1, q1); + p2 = qd::two_sum(p2, p3, p3); + + s0 = qd::two_sum(q0, p2, t0); + s1 = qd::two_sum(q1, p3, t1); + + s1 = qd::two_sum(s1, t0, t0); + t0 += t1; + + s1 = qd::quick_two_sum(s1, t0, t0); + p2 = qd::quick_two_sum(s0, s1, t1); + p3 = qd::quick_two_sum(t1, t0, q0); + + p4 = 2.0 * a[0] * a[3]; + p5 = 2.0 * a[1] * a[2]; + + p4 = qd::two_sum(p4, p5, p5); + q2 = qd::two_sum(q2, q3, q3); + + t0 = qd::two_sum(p4, q2, t1); + t1 = t1 + p5 + q3; + + p3 = qd::two_sum(p3, t0, p4); + p4 = p4 + q0 + t1; + + qd::renorm(p0, p1, p2, p3, p4); + return qd_real(p0, p1, p2, p3); + +} + +/********** Self-Multiplication **********/ +/* quad-double *= double */ +inline qd_real &qd_real::operator*=(double a) { + *this = (*this * a); + return *this; +} + +/* quad-double *= double-double */ +inline qd_real &qd_real::operator*=(const dd_real &a) { + *this = (*this * a); + return *this; +} + +/* quad-double *= quad-double */ +inline qd_real &qd_real::operator*=(const qd_real &a) { + *this = *this * a; + return *this; +} + +inline qd_real operator/ (const qd_real &a, const dd_real &b) { +#ifdef QD_SLOPPY_DIV + return qd_real::sloppy_div(a, b); +#else + return qd_real::accurate_div(a, b); +#endif +} + +inline qd_real operator/(const qd_real &a, const qd_real &b) { +#ifdef QD_SLOPPY_DIV + return qd_real::sloppy_div(a, b); +#else + return qd_real::accurate_div(a, b); +#endif +} + +/* double / quad-double */ +inline qd_real operator/(double a, const qd_real &b) { + return qd_real(a) / b; +} + +/* double-double / quad-double */ +inline qd_real operator/(const dd_real &a, const qd_real &b) { + return qd_real(a) / b; +} + +/********** Self-Divisions **********/ +/* quad-double /= double */ +inline qd_real &qd_real::operator/=(double a) { + *this = (*this / a); + return *this; +} + +/* quad-double /= double-double */ +inline qd_real &qd_real::operator/=(const dd_real &a) { + *this = (*this / a); + return *this; +} + +/* quad-double /= quad-double */ +inline qd_real &qd_real::operator/=(const qd_real &a) { + *this = (*this / a); + return *this; +} + + +/********** Exponentiation **********/ +inline qd_real qd_real::operator^(int n) const { + return pow(*this, n); +} + +/********** Miscellaneous **********/ +inline qd_real abs(const qd_real &a) { + return (a[0] < 0.0) ? -a : a; +} + +inline qd_real fabs(const qd_real &a) { + return abs(a); +} + +/* Quick version. May be off by one when qd is very close + to the middle of two integers. */ +inline qd_real quick_nint(const qd_real &a) { + qd_real r = qd_real(qd::nint(a[0]), qd::nint(a[1]), + qd::nint(a[2]), qd::nint(a[3])); + r.renorm(); + return r; +} + +/*********** Assignments ************/ +/* quad-double = double */ +inline qd_real &qd_real::operator=(double a) { + x[0] = a; + x[1] = x[2] = x[3] = 0.0; + return *this; +} + +/* quad-double = double-double */ +inline qd_real &qd_real::operator=(const dd_real &a) { + x[0] = a._hi(); + x[1] = a._lo(); + x[2] = x[3] = 0.0; + return *this; +} + +/********** Equality Comparison **********/ +inline bool operator==(const qd_real &a, double b) { + return (a[0] == b && a[1] == 0.0 && a[2] == 0.0 && a[3] == 0.0); +} + +inline bool operator==(double a, const qd_real &b) { + return (b == a); +} + +inline bool operator==(const qd_real &a, const dd_real &b) { + return (a[0] == b._hi() && a[1] == b._lo() && + a[2] == 0.0 && a[3] == 0.0); +} + +inline bool operator==(const dd_real &a, const qd_real &b) { + return (b == a); +} + +inline bool operator==(const qd_real &a, const qd_real &b) { + return (a[0] == b[0] && a[1] == b[1] && + a[2] == b[2] && a[3] == b[3]); +} + + +/********** Less-Than Comparison ***********/ +inline bool operator<(const qd_real &a, double b) { + return (a[0] < b || (a[0] == b && a[1] < 0.0)); +} + +inline bool operator<(double a, const qd_real &b) { + return (b > a); +} + +inline bool operator<(const qd_real &a, const dd_real &b) { + return (a[0] < b._hi() || + (a[0] == b._hi() && (a[1] < b._lo() || + (a[1] == b._lo() && a[2] < 0.0)))); +} + +inline bool operator<(const dd_real &a, const qd_real &b) { + return (b > a); +} + +inline bool operator<(const qd_real &a, const qd_real &b) { + return (a[0] < b[0] || + (a[0] == b[0] && (a[1] < b[1] || + (a[1] == b[1] && (a[2] < b[2] || + (a[2] == b[2] && a[3] < b[3])))))); +} + +/********** Greater-Than Comparison ***********/ +inline bool operator>(const qd_real &a, double b) { + return (a[0] > b || (a[0] == b && a[1] > 0.0)); +} + +inline bool operator>(double a, const qd_real &b) { + return (b < a); +} + +inline bool operator>(const qd_real &a, const dd_real &b) { + return (a[0] > b._hi() || + (a[0] == b._hi() && (a[1] > b._lo() || + (a[1] == b._lo() && a[2] > 0.0)))); +} + +inline bool operator>(const dd_real &a, const qd_real &b) { + return (b < a); +} + +inline bool operator>(const qd_real &a, const qd_real &b) { + return (a[0] > b[0] || + (a[0] == b[0] && (a[1] > b[1] || + (a[1] == b[1] && (a[2] > b[2] || + (a[2] == b[2] && a[3] > b[3])))))); +} + + +/********** Less-Than-Or-Equal-To Comparison **********/ +inline bool operator<=(const qd_real &a, double b) { + return (a[0] < b || (a[0] == b && a[1] <= 0.0)); +} + +inline bool operator<=(double a, const qd_real &b) { + return (b >= a); +} + +inline bool operator<=(const qd_real &a, const dd_real &b) { + return (a[0] < b._hi() || + (a[0] == b._hi() && (a[1] < b._lo() || + (a[1] == b._lo() && a[2] <= 0.0)))); +} + +inline bool operator<=(const dd_real &a, const qd_real &b) { + return (b >= a); +} + +inline bool operator<=(const qd_real &a, const qd_real &b) { + return (a[0] < b[0] || + (a[0] == b[0] && (a[1] < b[1] || + (a[1] == b[1] && (a[2] < b[2] || + (a[2] == b[2] && a[3] <= b[3])))))); +} + +/********** Greater-Than-Or-Equal-To Comparison **********/ +inline bool operator>=(const qd_real &a, double b) { + return (a[0] > b || (a[0] == b && a[1] >= 0.0)); +} + +inline bool operator>=(double a, const qd_real &b) { + return (b <= a); +} + +inline bool operator>=(const qd_real &a, const dd_real &b) { + return (a[0] > b._hi() || + (a[0] == b._hi() && (a[1] > b._lo() || + (a[1] == b._lo() && a[2] >= 0.0)))); +} + +inline bool operator>=(const dd_real &a, const qd_real &b) { + return (b <= a); +} + +inline bool operator>=(const qd_real &a, const qd_real &b) { + return (a[0] > b[0] || + (a[0] == b[0] && (a[1] > b[1] || + (a[1] == b[1] && (a[2] > b[2] || + (a[2] == b[2] && a[3] >= b[3])))))); +} + + + +/********** Not-Equal-To Comparison **********/ +inline bool operator!=(const qd_real &a, double b) { + return !(a == b); +} + +inline bool operator!=(double a, const qd_real &b) { + return !(a == b); +} + +inline bool operator!=(const qd_real &a, const dd_real &b) { + return !(a == b); +} + +inline bool operator!=(const dd_real &a, const qd_real &b) { + return !(a == b); +} + +inline bool operator!=(const qd_real &a, const qd_real &b) { + return !(a == b); +} + + + +inline qd_real aint(const qd_real &a) { + return (a[0] >= 0) ? floor(a) : ceil(a); +} + +inline bool qd_real::is_zero() const { + return (x[0] == 0.0); +} + +inline bool qd_real::is_one() const { + return (x[0] == 1.0 && x[1] == 0.0 && x[2] == 0.0 && x[3] == 0.0); +} + +inline bool qd_real::is_positive() const { + return (x[0] > 0.0); +} + +inline bool qd_real::is_negative() const { + return (x[0] < 0.0); +} + +inline qd_real::operator bool() const { + return (x[0] != 0.0); +} + +inline qd_real::operator double() const { + return to_double(*this); +} + +inline dd_real to_dd_real(const qd_real &a) { + return dd_real(a[0], a[1]); +} + +inline double to_double(const qd_real &a) { + return a[0]; +} + +inline int to_int(const qd_real &a) { + return static_cast(a[0]); +} + +inline qd_real inv(const qd_real &qd) { + return 1.0 / qd; +} + +inline qd_real max(const qd_real &a, const qd_real &b) { + return (a > b) ? a : b; +} + +inline qd_real max(const qd_real &a, const qd_real &b, + const qd_real &c) { + return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c); +} + +inline qd_real min(const qd_real &a, const qd_real &b) { + return (a < b) ? a : b; +} + +inline qd_real min(const qd_real &a, const qd_real &b, + const qd_real &c) { + return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c); +} + +/* Random number generator */ +inline qd_real qd_real::rand() { + return qdrand(); +} + +inline qd_real ldexp(const qd_real &a, int n) { + return qd_real(std::ldexp(a[0], n), std::ldexp(a[1], n), + std::ldexp(a[2], n), std::ldexp(a[3], n)); +} + +#endif /* _QD_QD_INLINE_H */ diff --git a/external/PackedCSparse/qd/qd_real.cc b/external/PackedCSparse/qd/qd_real.cc new file mode 100644 index 000000000..02cb7aa3b --- /dev/null +++ b/external/PackedCSparse/qd/qd_real.cc @@ -0,0 +1,2624 @@ +/* + * src/qd_real.cc + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2007 + * + * Contains implementation of non-inlined functions of quad-double + * package. Inlined functions are found in qd_inline.h (in include directory). + */ +#include +#include +#include +#include +#include +#include +#include + +#include "qd_config.h" +#include "qd_real.h" +#include "util.h" + +#include "bits.h" + +#ifndef QD_INLINE +#include "qd_inline.h" +#endif + +using std::cout; +using std::cerr; +using std::endl; +using std::istream; +using std::ostream; +using std::ios_base; +using std::string; +using std::setw; + +using namespace qd; + +void qd_real::error(const char *msg) { + //if (msg) { cerr << "ERROR " << msg << endl; } +} + +/********** Multiplications **********/ + +qd_real nint(const qd_real &a) { + double x0, x1, x2, x3; + + x0 = nint(a[0]); + x1 = x2 = x3 = 0.0; + + if (x0 == a[0]) { + /* First double is already an integer. */ + x1 = nint(a[1]); + + if (x1 == a[1]) { + /* Second double is already an integer. */ + x2 = nint(a[2]); + + if (x2 == a[2]) { + /* Third double is already an integer. */ + x3 = nint(a[3]); + } else { + if (std::abs(x2 - a[2]) == 0.5 && a[3] < 0.0) { + x2 -= 1.0; + } + } + + } else { + if (std::abs(x1 - a[1]) == 0.5 && a[2] < 0.0) { + x1 -= 1.0; + } + } + + } else { + /* First double is not an integer. */ + if (std::abs(x0 - a[0]) == 0.5 && a[1] < 0.0) { + x0 -= 1.0; + } + } + + renorm(x0, x1, x2, x3); + return qd_real(x0, x1, x2, x3); +} + +qd_real floor(const qd_real &a) { + double x0, x1, x2, x3; + x1 = x2 = x3 = 0.0; + x0 = std::floor(a[0]); + + if (x0 == a[0]) { + x1 = std::floor(a[1]); + + if (x1 == a[1]) { + x2 = std::floor(a[2]); + + if (x2 == a[2]) { + x3 = std::floor(a[3]); + } + } + + renorm(x0, x1, x2, x3); + return qd_real(x0, x1, x2, x3); + } + + return qd_real(x0, x1, x2, x3); +} + +qd_real ceil(const qd_real &a) { + double x0, x1, x2, x3; + x1 = x2 = x3 = 0.0; + x0 = std::ceil(a[0]); + + if (x0 == a[0]) { + x1 = std::ceil(a[1]); + + if (x1 == a[1]) { + x2 = std::ceil(a[2]); + + if (x2 == a[2]) { + x3 = std::ceil(a[3]); + } + } + + renorm(x0, x1, x2, x3); + return qd_real(x0, x1, x2, x3); + } + + return qd_real(x0, x1, x2, x3); +} + + + +/********** Divisions **********/ +/* quad-double / double */ +qd_real operator/(const qd_real &a, double b) { + /* Strategy: compute approximate quotient using high order + doubles, and then correct it 3 times using the remainder. + (Analogous to long division.) */ + double t0, t1; + double q0, q1, q2, q3; + qd_real r; + + q0 = a[0] / b; /* approximate quotient */ + + /* Compute the remainder a - q0 * b */ + t0 = two_prod(q0, b, t1); + r = a - dd_real(t0, t1); + + /* Compute the first correction */ + q1 = r[0] / b; + t0 = two_prod(q1, b, t1); + r -= dd_real(t0, t1); + + /* Second correction to the quotient. */ + q2 = r[0] / b; + t0 = two_prod(q2, b, t1); + r -= dd_real(t0, t1); + + /* Final correction to the quotient. */ + q3 = r[0] / b; + + renorm(q0, q1, q2, q3); + return qd_real(q0, q1, q2, q3); +} + +qd_real::qd_real(const char *s) { + if (qd_real::read(s, *this)) { + qd_real::error("(qd_real::qd_real): INPUT ERROR."); + *this = qd_real::_nan; + } +} + +qd_real &qd_real::operator=(const char *s) { + if (qd_real::read(s, *this)) { + qd_real::error("(qd_real::operator=): INPUT ERROR."); + *this = qd_real::_nan; + } + return *this; +} + +istream &operator>>(istream &s, qd_real &qd) { + char str[255]; + s >> str; + qd = qd_real(str); + return s; +} + +ostream &operator<<(ostream &os, const qd_real &qd) { + bool showpos = (os.flags() & ios_base::showpos) != 0; + bool uppercase = (os.flags() & ios_base::uppercase) != 0; + return os << qd.to_string((int)os.precision(), (int)os.width(), os.flags(), + showpos, uppercase, os.fill()); +} + +/* Read a quad-double from s. */ +int qd_real::read(const char *s, qd_real &qd) { + const char *p = s; + char ch; + int sign = 0; + int point = -1; /* location of decimal point */ + int nd = 0; /* number of digits read */ + int e = 0; /* exponent. */ + bool done = false; + qd_real r = 0.0; /* number being read */ + + /* Skip any leading spaces */ + while (*p == ' ') p++; + + while (!done && (ch = *p) != '\0') { + if (ch >= '0' && ch <= '9') { + /* It's a digit */ + int d = ch - '0'; + r *= 10.0; + r += static_cast(d); + nd++; + } else { + /* Non-digit */ + switch (ch) { + case '.': + if (point >= 0) + return -1; /* we've already encountered a decimal point. */ + point = nd; + break; + case '-': + case '+': + if (sign != 0 || nd > 0) + return -1; /* we've already encountered a sign, or if its + not at first position. */ + sign = (ch == '-') ? -1 : 1; + break; + case 'E': + case 'e': + int nread; + nread = std::sscanf(p+1, "%d", &e); + done = true; + if (nread != 1) + return -1; /* read of exponent failed. */ + break; + case ' ': + done = true; + break; + default: + return -1; + + } + } + + p++; + } + + + + /* Adjust exponent to account for decimal point */ + if (point >= 0) { + e -= (nd - point); + } + + /* Multiply the the exponent */ + if (e != 0) { + r *= (qd_real(10.0) ^ e); + } + + qd = (sign < 0) ? -r : r; + return 0; +} + +void qd_real::to_digits(char *s, int &expn, int precision) const { + int D = precision + 1; /* number of digits to compute */ + + qd_real r = abs(*this); + int e; /* exponent */ + int i, d; + + if (x[0] == 0.0) { + /* this == 0.0 */ + expn = 0; + for (i = 0; i < precision; i++) s[i] = '0'; + return; + } + + /* First determine the (approximate) exponent. */ + e = static_cast(std::floor(std::log10(std::abs(x[0])))); + + if (e < -300) { + r *= qd_real(10.0) ^ 300; + r /= qd_real(10.0) ^ (e + 300); + } else if (e > 300) { + r = ldexp(r, -53); + r /= qd_real(10.0) ^ e; + r = ldexp(r, 53); + } else { + r /= qd_real(10.0) ^ e; + } + + /* Fix exponent if we are off by one */ + if (r >= 10.0) { + r /= 10.0; + e++; + } else if (r < 1.0) { + r *= 10.0; + e--; + } + + if (r >= 10.0 || r < 1.0) { + qd_real::error("(qd_real::to_digits): can't compute exponent."); + return; + } + + /* Extract the digits */ + for (i = 0; i < D; i++) { + d = static_cast(r[0]); + r -= d; + r *= 10.0; + + s[i] = static_cast(d + '0'); + } + + /* Fix out of range digits. */ + for (i = D-1; i > 0; i--) { + if (s[i] < '0') { + s[i-1]--; + s[i] += 10; + } else if (s[i] > '9') { + s[i-1]++; + s[i] -= 10; + } + } + + if (s[0] <= '0') { + qd_real::error("(qd_real::to_digits): non-positive leading digit."); + return; + } + + /* Round, handle carry */ + if (s[D-1] >= '5') { + s[D-2]++; + + i = D-2; + while (i > 0 && s[i] > '9') { + s[i] -= 10; + s[--i]++; + } + } + + /* If first digit is 10, shift everything. */ + if (s[0] > '9') { + e++; + for (i = precision; i >= 2; i--) s[i] = s[i-1]; + s[0] = '1'; + s[1] = '0'; + } + + s[precision] = 0; + expn = e; +} + +/* Writes the quad-double number into the character array s of length len. + The integer d specifies how many significant digits to write. + The string s must be able to hold at least (d+8) characters. + showpos indicates whether to use the + sign, and uppercase indicates + whether the E or e is to be used for the exponent. */ +void qd_real::write(char *s, int len, int precision, + bool showpos, bool uppercase) const { + string str = to_string(precision, 0, ios_base::scientific, showpos, uppercase); + strncpy(s, str.c_str(), len-1); + s[len-1] = 0; +} + +void round_string_qd(char *s, int precision, int *offset){ + /* + Input string must be all digits or errors will occur. + */ + + int i; + int D = precision ; + + /* Round, handle carry */ + if (D>0 && s[D] >= '5') { + s[D-1]++; + + i = D-1; + while (i > 0 && s[i] > '9') { + s[i] -= 10; + s[--i]++; + } + } + + /* If first digit is 10, shift everything. */ + if (s[0] > '9') { + // e++; // don't modify exponent here + for (i = precision; i >= 1; i--) s[i+1] = s[i]; + s[0] = '1'; + s[1] = '0'; + + (*offset)++ ; // now offset needs to be increased by one + precision++ ; + } + + s[precision] = 0; // add terminator for array +} + + +string qd_real::to_string(int precision, int width, ios_base::fmtflags fmt, + bool showpos, bool uppercase, char fill) const { + string s; + bool fixed = (fmt & ios_base::fixed) != 0; + bool sgn = true; + int i, e = 0; + + if (isinf()) { + if (*this < 0.0) + s += '-'; + else if (showpos) + s += '+'; + else + sgn = false; + s += uppercase ? "INF" : "inf"; + } else if (isnan()) { + s = uppercase ? "NAN" : "nan"; + sgn = false; + } else { + if (*this < 0.0) + s += '-'; + else if (showpos) + s += '+'; + else + sgn = false; + + if (*this == 0.0) { + /* Zero case */ + s += '0'; + if (precision > 0) { + s += '.'; + s.append(precision, '0'); + } + } else { + /* Non-zero case */ + int off = (fixed ? (1 + to_int(floor(log10(abs(*this))))) : 1); + int d = precision + off; + + int d_with_extra = d; + if(fixed) + d_with_extra = std::max(120, d); // longer than the max accuracy for DD + + // highly special case - fixed mode, precision is zero, abs(*this) < 1.0 + // without this trap a number like 0.9 printed fixed with 0 precision prints as 0 + // should be rounded to 1. + if(fixed && (precision == 0) && (abs(*this) < 1.0)){ + if(abs(*this) >= 0.5) + s += '1'; + else + s += '0'; + + return s; + } + + // handle near zero to working precision (but not exactly zero) + if (fixed && d <= 0) { + s += '0'; + if (precision > 0) { + s += '.'; + s.append(precision, '0'); + } + } else { // default + + char *t ; // = new char[d+1]; + int j; + + if(fixed){ + t = new char[d_with_extra+1]; + to_digits(t, e, d_with_extra); + } + else{ + t = new char[d+1]; + to_digits(t, e, d); + } + + off = e + 1; + + if (fixed) { + // fix the string if it's been computed incorrectly + // round here in the decimal string if required + round_string_qd(t, d, &off); + + if (off > 0) { + for (i = 0; i < off; i++) s += t[i]; + if (precision > 0) { + s += '.'; + for (j = 0; j < precision; j++, i++) s += t[i]; + } + } else { + s += "0."; + if (off < 0) s.append(-off, '0'); + for (i = 0; i < d; i++) s += t[i]; + } + } else { + s += t[0]; + if (precision > 0) s += '.'; + + for (i = 1; i <= precision; i++) + s += t[i]; + + } + delete [] t; + } + } + + // trap for improper offset with large values + // without this trap, output of values of the for 10^j - 1 fail for j > 28 + // and are output with the point in the wrong place, leading to a dramatically off value + if(fixed && (precision > 0)){ + // make sure that the value isn't dramatically larger + double from_string = atof(s.c_str()); + + // if this ratio is large, then we've got problems + if( fabs( from_string / this->x[0] ) > 3.0 ){ + + // loop on the string, find the point, move it up one + // don't act on the first character + for(i=1; i < (int)s.length(); i++){ + if(s[i] == '.'){ + s[i] = s[i-1] ; + s[i-1] = '.' ; + break; + } + } + + from_string = atof(s.c_str()); + // if this ratio is large, then the string has not been fixed + if( fabs( from_string / this->x[0] ) > 3.0 ){ + dd_real::error("Re-rounding unsuccessful in large number fixed point trap.") ; + } + } + } + + if (!fixed) { + /* Fill in exponent part */ + s += uppercase ? 'E' : 'e'; + append_expn(s, e); + } + } + + /* Fill in the blanks */ + size_t len = s.length(); + if (len < width) { + int delta = width - len; + if (fmt & ios_base::internal) { + if (sgn) + s.insert(static_cast(1), delta, fill); + else + s.insert(static_cast(0), delta, fill); + } else if (fmt & ios_base::left) { + s.append(delta, fill); + } else { + s.insert(static_cast(0), delta, fill); + } + } + + return s; +} + +/* Computes qd^n, where n is an integer. */ +qd_real pow(const qd_real &a, int n) { + if (n == 0) + return 1.0; + + qd_real r = a; /* odd-case multiplier */ + qd_real s = 1.0; /* current answer */ + int N = std::abs(n); + + if (N > 1) { + + /* Use binary exponentiation. */ + while (N > 0) { + if (N % 2 == 1) { + /* If odd, multiply by r. Note eventually N = 1, so this + eventually executes. */ + s *= r; + } + N /= 2; + if (N > 0) + r = sqr(r); + } + + } else { + s = r; + } + + if (n < 0) + return (1.0 / s); + + return s; +} + +qd_real pow(const qd_real &a, const qd_real &b) { + return exp(b * log(a)); +} + +qd_real npwr(const qd_real &a, int n) { + return pow(a, n); +} + +/* Debugging routines */ +void qd_real::dump_bits(const string &name, std::ostream &os) const { + string::size_type len = name.length(); + if (len > 0) { + os << name << " = "; + len += 3; + } + os << "[ "; + len += 2; + for (int j = 0; j < 4; j++) { + if (j > 0) for (string::size_type i = 0; i < len; i++) os << ' '; + print_double_info(os, x[j]); + if (j < 3) + os << endl; + else + os << " ]" << endl; + } +} + +void qd_real::dump(const string &name, std::ostream &os) const { + std::ios_base::fmtflags old_flags = os.flags(); + std::streamsize old_prec = os.precision(19); + os << std::scientific; + + string::size_type len = name.length(); + if (len > 0) { + os << name << " = "; + len += 3; + } + os << "[ "; + len += 2; + os << setw(27) << x[0] << ", " << setw(26) << x[1] << "," << endl; + for (string::size_type i = 0; i < len; i++) os << ' '; + os << setw(27) << x[2] << ", " << setw(26) << x[3] << " ]" << endl; + + os.precision(old_prec); + os.flags(old_flags); +} + +/* Divisions */ +/* quad-double / double-double */ +qd_real qd_real::sloppy_div(const qd_real &a, const dd_real &b) { + double q0, q1, q2, q3; + qd_real r; + qd_real qd_b(b); + + q0 = a[0] / b._hi(); + r = a - q0 * qd_b; + + q1 = r[0] / b._hi(); + r -= (q1 * qd_b); + + q2 = r[0] / b._hi(); + r -= (q2 * qd_b); + + q3 = r[0] / b._hi(); + + ::renorm(q0, q1, q2, q3); + return qd_real(q0, q1, q2, q3); +} + +qd_real qd_real::accurate_div(const qd_real &a, const dd_real &b) { + double q0, q1, q2, q3, q4; + qd_real r; + qd_real qd_b(b); + + q0 = a[0] / b._hi(); + r = a - q0 * qd_b; + + q1 = r[0] / b._hi(); + r -= (q1 * qd_b); + + q2 = r[0] / b._hi(); + r -= (q2 * qd_b); + + q3 = r[0] / b._hi(); + r -= (q3 * qd_b); + + q4 = r[0] / b._hi(); + + ::renorm(q0, q1, q2, q3, q4); + return qd_real(q0, q1, q2, q3); +} + +/* quad-double / quad-double */ +qd_real qd_real::sloppy_div(const qd_real &a, const qd_real &b) { + double q0, q1, q2, q3; + + qd_real r; + + q0 = a[0] / b[0]; + r = a - (b * q0); + + q1 = r[0] / b[0]; + r -= (b * q1); + + q2 = r[0] / b[0]; + r -= (b * q2); + + q3 = r[0] / b[0]; + + ::renorm(q0, q1, q2, q3); + + return qd_real(q0, q1, q2, q3); +} + +qd_real qd_real::accurate_div(const qd_real &a, const qd_real &b) { + double q0, q1, q2, q3; + + qd_real r; + + q0 = a[0] / b[0]; + r = a - (b * q0); + + q1 = r[0] / b[0]; + r -= (b * q1); + + q2 = r[0] / b[0]; + r -= (b * q2); + + q3 = r[0] / b[0]; + + r -= (b * q3); + double q4 = r[0] / b[0]; + + ::renorm(q0, q1, q2, q3, q4); + + return qd_real(q0, q1, q2, q3); +} + +QD_API qd_real sqrt(const qd_real &a) { + /* Strategy: + + Perform the following Newton iteration: + + x' = x + (1 - a * x^2) * x / 2; + + which converges to 1/sqrt(a), starting with the + double precision approximation to 1/sqrt(a). + Since Newton's iteration more or less doubles the + number of correct digits, we only need to perform it + twice. + */ + + if (a.is_zero()) + return 0.0; + + if (a.is_negative()) { + qd_real::error("(qd_real::sqrt): Negative argument."); + return qd_real::_nan; + } + + qd_real r = (1.0 / std::sqrt(a[0])); + qd_real h = mul_pwr2(a, 0.5); + + r += ((0.5 - h * sqr(r)) * r); + r += ((0.5 - h * sqr(r)) * r); + r += ((0.5 - h * sqr(r)) * r); + + r *= a; + return r; +} + + +/* Computes the n-th root of a */ +qd_real nroot(const qd_real &a, int n) { + /* Strategy: Use Newton's iteration to solve + + 1/(x^n) - a = 0 + + Newton iteration becomes + + x' = x + x * (1 - a * x^n) / n + + Since Newton's iteration converges quadratically, + we only need to perform it twice. + + */ + if (n <= 0) { + qd_real::error("(qd_real::nroot): N must be positive."); + return qd_real::_nan; + } + + if (n % 2 == 0 && a.is_negative()) { + qd_real::error("(qd_real::nroot): Negative argument."); + return qd_real::_nan; + } + + if (n == 1) { + return a; + } + if (n == 2) { + return sqrt(a); + } + if (a.is_zero()) { + return qd_real(0.0); + } + + + /* Note a^{-1/n} = exp(-log(a)/n) */ + qd_real r = abs(a); + qd_real x = std::exp(-std::log(r.x[0]) / n); + + /* Perform Newton's iteration. */ + double dbl_n = static_cast(n); + x += x * (1.0 - r * npwr(x, n)) / dbl_n; + x += x * (1.0 - r * npwr(x, n)) / dbl_n; + x += x * (1.0 - r * npwr(x, n)) / dbl_n; + if (a[0] < 0.0){ + x = -x; + } + return 1.0 / x; +} + +static const int n_inv_fact = 15; +static const qd_real inv_fact[n_inv_fact] = { + qd_real( 1.66666666666666657e-01, 9.25185853854297066e-18, + 5.13581318503262866e-34, 2.85094902409834186e-50), + qd_real( 4.16666666666666644e-02, 2.31296463463574266e-18, + 1.28395329625815716e-34, 7.12737256024585466e-51), + qd_real( 8.33333333333333322e-03, 1.15648231731787138e-19, + 1.60494162032269652e-36, 2.22730392507682967e-53), + qd_real( 1.38888888888888894e-03, -5.30054395437357706e-20, + -1.73868675534958776e-36, -1.63335621172300840e-52), + qd_real( 1.98412698412698413e-04, 1.72095582934207053e-22, + 1.49269123913941271e-40, 1.29470326746002471e-58), + qd_real( 2.48015873015873016e-05, 2.15119478667758816e-23, + 1.86586404892426588e-41, 1.61837908432503088e-59), + qd_real( 2.75573192239858925e-06, -1.85839327404647208e-22, + 8.49175460488199287e-39, -5.72661640789429621e-55), + qd_real( 2.75573192239858883e-07, 2.37677146222502973e-23, + -3.26318890334088294e-40, 1.61435111860404415e-56), + qd_real( 2.50521083854417202e-08, -1.44881407093591197e-24, + 2.04267351467144546e-41, -8.49632672007163175e-58), + qd_real( 2.08767569878681002e-09, -1.20734505911325997e-25, + 1.70222792889287100e-42, 1.41609532150396700e-58), + qd_real( 1.60590438368216133e-10, 1.25852945887520981e-26, + -5.31334602762985031e-43, 3.54021472597605528e-59), + qd_real( 1.14707455977297245e-11, 2.06555127528307454e-28, + 6.88907923246664603e-45, 5.72920002655109095e-61), + qd_real( 7.64716373181981641e-13, 7.03872877733453001e-30, + -7.82753927716258345e-48, 1.92138649443790242e-64), + qd_real( 4.77947733238738525e-14, 4.39920548583408126e-31, + -4.89221204822661465e-49, 1.20086655902368901e-65), + qd_real( 2.81145725434552060e-15, 1.65088427308614326e-31, + -2.87777179307447918e-50, 4.27110689256293549e-67) +}; + +qd_real exp(const qd_real &a) { + /* Strategy: We first reduce the size of x by noting that + + exp(kr + m * log(2)) = 2^m * exp(r)^k + + where m and k are integers. By choosing m appropriately + we can make |kr| <= log(2) / 2 = 0.347. Then exp(r) is + evaluated using the familiar Taylor series. Reducing the + argument substantially speeds up the convergence. */ + + const double k = ldexp(1.0, 16); + const double inv_k = 1.0 / k; + + if (a[0] <= -709.0) + return 0.0; + + if (a[0] >= 709.0) + return qd_real::_inf; + + if (a.is_zero()) + return 1.0; + + if (a.is_one()) + return qd_real::_e; + + double m = std::floor(a.x[0] / qd_real::_log2.x[0] + 0.5); + qd_real r = mul_pwr2(a - qd_real::_log2 * m, inv_k); + qd_real s, p, t; + double thresh = inv_k * qd_real::_eps; + + p = sqr(r); + s = r + mul_pwr2(p, 0.5); + int i = 0; + do { + p *= r; + t = p * inv_fact[i++]; + s += t; + } while (std::abs(to_double(t)) > thresh && i < 9); + + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s = mul_pwr2(s, 2.0) + sqr(s); + s += 1.0; + return ldexp(s, static_cast(m)); +} + +/* Logarithm. Computes log(x) in quad-double precision. + This is a natural logarithm (i.e., base e). */ +qd_real log(const qd_real &a) { + /* Strategy. The Taylor series for log converges much more + slowly than that of exp, due to the lack of the factorial + term in the denominator. Hence this routine instead tries + to determine the root of the function + + f(x) = exp(x) - a + + using Newton iteration. The iteration is given by + + x' = x - f(x)/f'(x) + = x - (1 - a * exp(-x)) + = x + a * exp(-x) - 1. + + Two iteration is needed, since Newton's iteration + approximately doubles the number of digits per iteration. */ + + if (a.is_one()) { + return 0.0; + } + + if (a[0] <= 0.0) { + qd_real::error("(qd_real::log): Non-positive argument."); + return qd_real::_nan; + } + + if (a[0] == 0.0) { + return -qd_real::_inf; + } + + qd_real x = std::log(a[0]); /* Initial approximation */ + + x = x + a * exp(-x) - 1.0; + x = x + a * exp(-x) - 1.0; + x = x + a * exp(-x) - 1.0; + + return x; +} + +qd_real log10(const qd_real &a) { + return log(a) / qd_real::_log10; +} + +static const qd_real _pi1024 = qd_real( + 3.067961575771282340e-03, 1.195944139792337116e-19, + -2.924579892303066080e-36, 1.086381075061880158e-52); + +/* Table of sin(k * pi/1024) and cos(k * pi/1024). */ +static const qd_real sin_table [] = { + qd_real( 3.0679567629659761e-03, 1.2690279085455925e-19, + 5.2879464245328389e-36, -1.7820334081955298e-52), + qd_real( 6.1358846491544753e-03, 9.0545257482474933e-20, + 1.6260113133745320e-37, -9.7492001208767410e-55), + qd_real( 9.2037547820598194e-03, -1.2136591693535934e-19, + 5.5696903949425567e-36, 1.2505635791936951e-52), + qd_real( 1.2271538285719925e-02, 6.9197907640283170e-19, + -4.0203726713435555e-36, -2.0688703606952816e-52), + qd_real( 1.5339206284988102e-02, -8.4462578865401696e-19, + 4.6535897505058629e-35, -1.3923682978570467e-51), + qd_real( 1.8406729905804820e-02, 7.4195533812833160e-19, + 3.9068476486787607e-35, 3.6393321292898614e-52), + qd_real( 2.1474080275469508e-02, -4.5407960207688566e-19, + -2.2031770119723005e-35, 1.2709814654833741e-51), + qd_real( 2.4541228522912288e-02, -9.1868490125778782e-20, + 4.8706148704467061e-36, -2.8153947855469224e-52), + qd_real( 2.7608145778965743e-02, -1.5932358831389269e-18, + -7.0475416242776030e-35, -2.7518494176602744e-51), + qd_real( 3.0674803176636626e-02, -1.6936054844107918e-20, + -2.0039543064442544e-36, -1.6267505108658196e-52), + qd_real( 3.3741171851377587e-02, -2.0096074292368340e-18, + -1.3548237016537134e-34, 6.5554881875899973e-51), + qd_real( 3.6807222941358832e-02, 6.1060088803529842e-19, + -4.0448721259852727e-35, -2.1111056765671495e-51), + qd_real( 3.9872927587739811e-02, 4.6657453481183289e-19, + 3.4119333562288684e-35, 2.4007534726187511e-51), + qd_real( 4.2938256934940820e-02, 2.8351940588660907e-18, + 1.6991309601186475e-34, 6.8026536098672629e-51), + qd_real( 4.6003182130914630e-02, -1.1182813940157788e-18, + 7.5235020270378946e-35, 4.1187304955493722e-52), + qd_real( 4.9067674327418015e-02, -6.7961037205182801e-19, + -4.4318868124718325e-35, -9.9376628132525316e-52), + qd_real( 5.2131704680283324e-02, -2.4243695291953779e-18, + -1.3675405320092298e-34, -8.3938137621145070e-51), + qd_real( 5.5195244349689941e-02, -1.3340299860891103e-18, + -3.4359574125665608e-35, 1.1911462755409369e-51), + qd_real( 5.8258264500435759e-02, 2.3299905496077492e-19, + 1.9376108990628660e-36, -5.1273775710095301e-53), + qd_real( 6.1320736302208578e-02, -5.1181134064638108e-19, + -4.2726335866706313e-35, 2.6368495557440691e-51), + qd_real( 6.4382630929857465e-02, -4.2325997000052705e-18, + 3.3260117711855937e-35, 1.4736267706718352e-51), + qd_real( 6.7443919563664065e-02, -6.9221796556983636e-18, + 1.5909286358911040e-34, -7.8828946891835218e-51), + qd_real( 7.0504573389613870e-02, -6.8552791107342883e-18, + -1.9961177630841580e-34, 2.0127129580485300e-50), + qd_real( 7.3564563599667426e-02, -2.7784941506273593e-18, + -9.1240375489852821e-35, -1.9589752023546795e-51), + qd_real( 7.6623861392031492e-02, 2.3253700287958801e-19, + -1.3186083921213440e-36, -4.9927872608099673e-53), + qd_real( 7.9682437971430126e-02, -4.4867664311373041e-18, + 2.8540789143650264e-34, 2.8491348583262741e-51), + qd_real( 8.2740264549375692e-02, 1.4735983530877760e-18, + 3.7284093452233713e-35, 2.9024430036724088e-52), + qd_real( 8.5797312344439894e-02, -3.3881893830684029e-18, + -1.6135529531508258e-34, 7.7294651620588049e-51), + qd_real( 8.8853552582524600e-02, -3.7501775830290691e-18, + 3.7543606373911573e-34, 2.2233701854451859e-50), + qd_real( 9.1908956497132724e-02, 4.7631594854274564e-18, + 1.5722874642939344e-34, -4.8464145447831456e-51), + qd_real( 9.4963495329639006e-02, -6.5885886400417564e-18, + -2.1371116991641965e-34, 1.3819370559249300e-50), + qd_real( 9.8017140329560604e-02, -1.6345823622442560e-18, + -1.3209238810006454e-35, -3.5691060049117942e-52), + qd_real( 1.0106986275482782e-01, 3.3164325719308656e-18, + -1.2004224885132282e-34, 7.2028828495418631e-51), + qd_real( 1.0412163387205457e-01, 6.5760254085385100e-18, + 1.7066246171219214e-34, -4.9499340996893514e-51), + qd_real( 1.0717242495680884e-01, 6.4424044279026198e-18, + -8.3956976499698139e-35, -4.0667730213318321e-51), + qd_real( 1.1022220729388306e-01, -5.6789503537823233e-19, + 1.0380274792383233e-35, 1.5213997918456695e-52), + qd_real( 1.1327095217756435e-01, 2.7100481012132900e-18, + 1.5323292999491619e-35, 4.9564432810360879e-52), + qd_real( 1.1631863091190477e-01, 1.0294914877509705e-18, + -9.3975734948993038e-35, 1.3534827323719708e-52), + qd_real( 1.1936521481099137e-01, -3.9500089391898506e-18, + 3.5317349978227311e-34, 1.8856046807012275e-51), + qd_real( 1.2241067519921620e-01, 2.8354501489965335e-18, + 1.8151655751493305e-34, -2.8716592177915192e-51), + qd_real( 1.2545498341154623e-01, 4.8686751763148235e-18, + 5.9878105258097936e-35, -3.3534629098722107e-51), + qd_real( 1.2849811079379317e-01, 3.8198603954988802e-18, + -1.8627501455947798e-34, -2.4308161133527791e-51), + qd_real( 1.3154002870288312e-01, -5.0039708262213813e-18, + -1.2983004159245552e-34, -4.6872034915794122e-51), + qd_real( 1.3458070850712620e-01, -9.1670359171480699e-18, + 1.5916493007073973e-34, 4.0237002484366833e-51), + qd_real( 1.3762012158648604e-01, 6.6253255866774482e-18, + -2.3746583031401459e-34, -9.3703876173093250e-52), + qd_real( 1.4065823933284924e-01, -7.9193932965524741e-18, + 6.0972464202108397e-34, 2.4566623241035797e-50), + qd_real( 1.4369503315029444e-01, 1.1472723016618666e-17, + -5.1884954557576435e-35, -4.2220684832186607e-51), + qd_real( 1.4673047445536175e-01, 3.7269471470465677e-18, + 3.7352398151250827e-34, -4.0881822289508634e-51), + qd_real( 1.4976453467732151e-01, 8.0812114131285151e-18, + 1.2979142554917325e-34, 9.9380667487736254e-51), + qd_real( 1.5279718525844344e-01, -7.6313573938416838e-18, + 5.7714690450284125e-34, -3.7731132582986687e-50), + qd_real( 1.5582839765426523e-01, 3.0351307187678221e-18, + -1.0976942315176184e-34, 7.8734647685257867e-51), + qd_real( 1.5885814333386145e-01, -4.0163200573859079e-18, + -9.2840580257628812e-35, -2.8567420029274875e-51), + qd_real( 1.6188639378011183e-01, 1.1850519643573528e-17, + -5.0440990519162957e-34, 3.0510028707928009e-50), + qd_real( 1.6491312048996992e-01, -7.0405288319166738e-19, + 3.3211107491245527e-35, 8.6663299254686031e-52), + qd_real( 1.6793829497473117e-01, 5.4284533721558139e-18, + -3.3263339336181369e-34, -1.8536367335123848e-50), + qd_real( 1.7096188876030122e-01, 9.1919980181759094e-18, + -6.7688743940982606e-34, -1.0377711384318389e-50), + qd_real( 1.7398387338746382e-01, 5.8151994618107928e-18, + -1.6751014298301606e-34, -6.6982259797164963e-51), + qd_real( 1.7700422041214875e-01, 6.7329300635408167e-18, + 2.8042736644246623e-34, 3.6786888232793599e-51), + qd_real( 1.8002290140569951e-01, 7.9701826047392143e-18, + -7.0765920110524977e-34, 1.9622512608461784e-50), + qd_real( 1.8303988795514095e-01, 7.7349918688637383e-18, + -4.4803769968145083e-34, 1.1201148793328890e-50), + qd_real( 1.8605515166344666e-01, -1.2564893007679552e-17, + 7.5953844248530810e-34, -3.8471695132415039e-51), + qd_real( 1.8906866414980622e-01, -7.6208955803527778e-18, + -4.4792298656662981e-34, -4.4136824096645007e-50), + qd_real( 1.9208039704989244e-01, 4.3348343941174903e-18, + -2.3404121848139937e-34, 1.5789970962611856e-50), + qd_real( 1.9509032201612828e-01, -7.9910790684617313e-18, + 6.1846270024220713e-34, -3.5840270918032937e-50), + qd_real( 1.9809841071795359e-01, -1.8434411800689445e-18, + 1.4139031318237285e-34, 1.0542811125343809e-50), + qd_real( 2.0110463484209190e-01, 1.1010032669300739e-17, + -3.9123576757413791e-34, 2.4084852500063531e-51), + qd_real( 2.0410896609281687e-01, 6.0941297773957752e-18, + -2.8275409970449641e-34, 4.6101008563532989e-51), + qd_real( 2.0711137619221856e-01, -1.0613362528971356e-17, + 2.2456805112690884e-34, 1.3483736125280904e-50), + qd_real( 2.1011183688046961e-01, 1.1561548476512844e-17, + 6.0355905610401254e-34, 3.3329909618405675e-50), + qd_real( 2.1311031991609136e-01, 1.2031873821063860e-17, + -3.4142699719695635e-34, -1.2436262780241778e-50), + qd_real( 2.1610679707621952e-01, -1.0111196082609117e-17, + 7.2789545335189643e-34, -2.9347540365258610e-50), + qd_real( 2.1910124015686980e-01, -3.6513812299150776e-19, + -2.3359499418606442e-35, 3.1785298198458653e-52), + qd_real( 2.2209362097320354e-01, -3.0337210995812162e-18, + 6.6654668033632998e-35, 2.0110862322656942e-51), + qd_real( 2.2508391135979283e-01, 3.9507040822556510e-18, + 2.4287993958305375e-35, 5.6662797513020322e-52), + qd_real( 2.2807208317088573e-01, 8.2361837339258012e-18, + 6.9786781316397937e-34, -6.4122962482639504e-51), + qd_real( 2.3105810828067111e-01, 1.0129787149761869e-17, + -6.9359234615816044e-34, -2.8877355604883782e-50), + qd_real( 2.3404195858354343e-01, -6.9922402696101173e-18, + -5.7323031922750280e-34, 5.3092579966872727e-51), + qd_real( 2.3702360599436720e-01, 8.8544852285039918e-18, + 1.3588480826354134e-34, 1.0381022520213867e-50), + qd_real( 2.4000302244874150e-01, -1.2137758975632164e-17, + -2.6448807731703891e-34, -1.9929733800670473e-51), + qd_real( 2.4298017990326390e-01, -8.7514315297196632e-18, + -6.5723260373079431e-34, -1.0333158083172177e-50), + qd_real( 2.4595505033579462e-01, -1.1129044052741832e-17, + 4.3805998202883397e-34, 1.2219399554686291e-50), + qd_real( 2.4892760574572018e-01, -8.1783436100020990e-18, + 5.5666875261111840e-34, 3.8080473058748167e-50), + qd_real( 2.5189781815421697e-01, -1.7591436032517039e-17, + -1.0959681232525285e-33, 5.6209426020232456e-50), + qd_real( 2.5486565960451457e-01, -1.3602299806901461e-19, + -6.0073844642762535e-36, -3.0072751311893878e-52), + qd_real( 2.5783110216215899e-01, 1.8480038630879957e-17, + 3.3201664714047599e-34, -5.5547819290576764e-51), + qd_real( 2.6079411791527551e-01, 4.2721420983550075e-18, + 5.6782126934777920e-35, 3.1428338084365397e-51), + qd_real( 2.6375467897483140e-01, -1.8837947680038700e-17, + 1.3720129045754794e-33, -8.2763406665966033e-50), + qd_real( 2.6671275747489837e-01, 2.0941222578826688e-17, + -1.1303466524727989e-33, 1.9954224050508963e-50), + qd_real( 2.6966832557291509e-01, 1.5765657618133259e-17, + -6.9696142173370086e-34, -4.0455346879146776e-50), + qd_real( 2.7262135544994898e-01, 7.8697166076387850e-18, + 6.6179388602933372e-35, -2.7642903696386267e-51), + qd_real( 2.7557181931095814e-01, 1.9320328962556582e-17, + 1.3932094180100280e-33, 1.3617253920018116e-50), + qd_real( 2.7851968938505312e-01, -1.0030273719543544e-17, + 7.2592115325689254e-34, -1.0068516296655851e-50), + qd_real( 2.8146493792575800e-01, -1.2322299641274009e-17, + -1.0564788706386435e-34, 7.5137424251265885e-51), + qd_real( 2.8440753721127182e-01, 2.2209268510661475e-17, + -9.1823095629523708e-34, -5.2192875308892218e-50), + qd_real( 2.8734745954472951e-01, 1.5461117367645717e-17, + -6.3263973663444076e-34, -2.2982538416476214e-50), + qd_real( 2.9028467725446239e-01, -1.8927978707774251e-17, + 1.1522953157142315e-33, 7.4738655654716596e-50), + qd_real( 2.9321916269425863e-01, 2.2385430811901833e-17, + 1.3662484646539680e-33, -4.2451325253996938e-50), + qd_real( 2.9615088824362384e-01, -2.0220736360876938e-17, + -7.9252212533920413e-35, -2.8990577729572470e-51), + qd_real( 2.9907982630804048e-01, 1.6701181609219447e-18, + 8.6091151117316292e-35, 3.9931286230012102e-52), + qd_real( 3.0200594931922808e-01, -1.7167666235262474e-17, + 2.3336182149008069e-34, 8.3025334555220004e-51), + qd_real( 3.0492922973540243e-01, -2.2989033898191262e-17, + -1.4598901099661133e-34, 3.7760487693121827e-51), + qd_real( 3.0784964004153487e-01, 2.7074088527245185e-17, + 1.2568858206899284e-33, 7.2931815105901645e-50), + qd_real( 3.1076715274961147e-01, 2.0887076364048513e-17, + -3.0130590791065942e-34, 1.3876739009935179e-51), + qd_real( 3.1368174039889146e-01, 1.4560447299968912e-17, + 3.6564186898011595e-34, 1.1654264734999375e-50), + qd_real( 3.1659337555616585e-01, 2.1435292512726283e-17, + 1.2338169231377316e-33, 3.3963542100989293e-50), + qd_real( 3.1950203081601569e-01, -1.3981562491096626e-17, + 8.1730000697411350e-34, -7.7671096270210952e-50), + qd_real( 3.2240767880106985e-01, -4.0519039937959398e-18, + 3.7438302780296796e-34, 8.7936731046639195e-51), + qd_real( 3.2531029216226293e-01, 7.9171249463765892e-18, + -6.7576622068146391e-35, 2.3021655066929538e-51), + qd_real( 3.2820984357909255e-01, -2.6693140719641896e-17, + 7.8928851447534788e-34, 2.5525163821987809e-51), + qd_real( 3.3110630575987643e-01, -2.7469465474778694e-17, + -1.3401245916610206e-33, 6.5531762489976163e-50), + qd_real( 3.3399965144200938e-01, 2.2598986806288142e-17, + 7.8063057192586115e-34, 2.0427600895486683e-50), + qd_real( 3.3688985339222005e-01, -4.2000940033475092e-19, + -2.9178652969985438e-36, -1.1597376437036749e-52), + qd_real( 3.3977688440682685e-01, 6.6028679499418282e-18, + 1.2575009988669683e-34, 2.5569067699008304e-51), + qd_real( 3.4266071731199438e-01, 1.9261518449306319e-17, + -9.2754189135990867e-34, 8.5439996687390166e-50), + qd_real( 3.4554132496398904e-01, 2.7251143672916123e-17, + 7.0138163601941737e-34, -1.4176292197454015e-50), + qd_real( 3.4841868024943456e-01, 3.6974420514204918e-18, + 3.5532146878499996e-34, 1.9565462544501322e-50), + qd_real( 3.5129275608556715e-01, -2.2670712098795844e-17, + -1.6994216673139631e-34, -1.2271556077284517e-50), + qd_real( 3.5416352542049040e-01, -1.6951763305764860e-17, + 1.2772331777814617e-33, -3.3703785435843310e-50), + qd_real( 3.5703096123343003e-01, -4.8218191137919166e-19, + -4.1672436994492361e-35, -7.1531167149364352e-52), + qd_real( 3.5989503653498817e-01, -1.7601687123839282e-17, + 1.3375125473046791e-33, 7.9467815593584340e-50), + qd_real( 3.6275572436739723e-01, -9.1668352663749849e-18, + -7.4317843956936735e-34, -2.0199582511804564e-50), + qd_real( 3.6561299780477385e-01, 1.6217898770457546e-17, + 1.1286970151961055e-33, -7.1825287318139010e-50), + qd_real( 3.6846682995337232e-01, 1.0463640796159268e-17, + 2.0554984738517304e-35, 1.0441861305618769e-51), + qd_real( 3.7131719395183754e-01, 3.4749239648238266e-19, + -7.5151053042866671e-37, -2.8153468438650851e-53), + qd_real( 3.7416406297145799e-01, 8.0114103761962118e-18, + 5.3429599813406052e-34, 1.0351378796539210e-50), + qd_real( 3.7700741021641826e-01, -2.7255302041956930e-18, + 6.3646586445018137e-35, 8.3048657176503559e-52), + qd_real( 3.7984720892405116e-01, 9.9151305855172370e-18, + 4.8761409697224886e-34, 1.4025084000776705e-50), + qd_real( 3.8268343236508978e-01, -1.0050772696461588e-17, + -2.0605316302806695e-34, -1.2717724698085205e-50), + qd_real( 3.8551605384391885e-01, 1.5177665396472313e-17, + 1.4198230518016535e-33, 5.8955167159904235e-50), + qd_real( 3.8834504669882630e-01, -1.0053770598398717e-17, + 7.5942999255057131e-34, -3.1967974046654219e-50), + qd_real( 3.9117038430225387e-01, 1.7997787858243995e-17, + -1.0613482402609856e-33, -5.4582148817791032e-50), + qd_real( 3.9399204006104810e-01, 9.7649241641239336e-18, + -2.1233599441284617e-34, -5.5529836795340819e-51), + qd_real( 3.9680998741671031e-01, 2.0545063670840126e-17, + 6.1347058801922842e-34, 1.0733788150636430e-50), + qd_real( 3.9962419984564684e-01, -1.5065497476189372e-17, + -9.9653258881867298e-34, -5.7524323712725355e-50), + qd_real( 4.0243465085941843e-01, 1.0902619339328270e-17, + 7.3998528125989765e-34, 2.2745784806823499e-50), + qd_real( 4.0524131400498986e-01, 9.9111401942899884e-18, + -2.5169070895434648e-34, 9.2772984818436573e-53), + qd_real( 4.0804416286497869e-01, -7.0006015137351311e-18, + -1.4108207334268228e-34, 1.5175546997577136e-52), + qd_real( 4.1084317105790397e-01, -2.4219835190355499e-17, + -1.1418902925313314e-33, -2.0996843165093468e-50), + qd_real( 4.1363831223843456e-01, -1.0393984940597871e-17, + -1.1481681174503880e-34, -2.0281052851028680e-51), + qd_real( 4.1642956009763721e-01, -2.5475580413131732e-17, + -3.4482678506112824e-34, 7.1788619351865480e-51), + qd_real( 4.1921688836322396e-01, -4.2232463750110590e-18, + -3.6053023045255790e-34, -2.2209673210025631e-50), + qd_real( 4.2200027079979968e-01, 4.3543266994128527e-18, + 3.1734310272251190e-34, -1.3573247980738668e-50), + qd_real( 4.2477968120910881e-01, 2.7462312204277281e-17, + -4.6552847802111948e-34, 6.5961781099193122e-51), + qd_real( 4.2755509343028208e-01, 9.4111898162954726e-18, + -1.7446682426598801e-34, -2.2054492626480169e-51), + qd_real( 4.3032648134008261e-01, 2.2259686974092690e-17, + 8.5972591314085075e-34, -2.9420897889003020e-50), + qd_real( 4.3309381885315196e-01, 1.1224283329847517e-17, + 5.3223748041075651e-35, 5.3926192627014212e-51), + qd_real( 4.3585707992225547e-01, 1.6230515450644527e-17, + -6.4371449063579431e-35, -6.9102436481386757e-51), + qd_real( 4.3861623853852766e-01, -2.0883315831075090e-17, + -1.4259583540891877e-34, 6.3864763590657077e-52), + qd_real( 4.4137126873171667e-01, 2.2360783886964969e-17, + 1.1864769603515770e-34, -3.8087003266189232e-51), + qd_real( 4.4412214457042926e-01, -2.4218874422178315e-17, + 2.2205230838703907e-34, 9.2133035911356258e-51), + qd_real( 4.4686884016237421e-01, -1.9222136142309382e-17, + -4.4425678589732049e-35, -1.3673609292149535e-51), + qd_real( 4.4961132965460660e-01, 4.8831924232035243e-18, + 2.7151084498191381e-34, -1.5653993171613154e-50), + qd_real( 4.5234958723377089e-01, -1.4827977472196122e-17, + -7.6947501088972324e-34, 1.7656856882031319e-50), + qd_real( 4.5508358712634384e-01, -1.2379906758116472e-17, + 5.5289688955542643e-34, -8.5382312840209386e-51), + qd_real( 4.5781330359887723e-01, -8.4554254922295949e-18, + -6.3770394246764263e-34, 3.1778253575564249e-50), + qd_real( 4.6053871095824001e-01, 1.8488777492177872e-17, + -1.0527732154209725e-33, 3.3235593490947102e-50), + qd_real( 4.6325978355186020e-01, -7.3514924533231707e-18, + 6.7175396881707035e-34, 3.9594127612123379e-50), + qd_real( 4.6597649576796618e-01, -3.3023547778235135e-18, + 3.4904677050476886e-35, 3.4483855263874246e-51), + qd_real( 4.6868882203582796e-01, -2.2949251681845054e-17, + -1.1364757641823658e-33, 6.8840522501918612e-50), + qd_real( 4.7139673682599764e-01, 6.5166781360690130e-18, + 2.9457546966235984e-34, -6.2159717738836630e-51), + qd_real( 4.7410021465055002e-01, -8.1451601548978075e-18, + -3.4789448555614422e-34, -1.1681943974658508e-50), + qd_real( 4.7679923006332214e-01, -1.0293515338305794e-17, + -3.6582045008369952e-34, 1.7424131479176475e-50), + qd_real( 4.7949375766015301e-01, 1.8419999662684771e-17, + -1.3040838621273312e-33, 1.0977131822246471e-50), + qd_real( 4.8218377207912277e-01, -2.5861500925520442e-17, + -6.2913197606500007e-36, 4.0802359808684726e-52), + qd_real( 4.8486924800079112e-01, -1.8034004203262245e-17, + -3.5244276906958044e-34, -1.7138318654749246e-50), + qd_real( 4.8755016014843594e-01, 1.4231090931273653e-17, + -1.8277733073262697e-34, -1.5208291790429557e-51), + qd_real( 4.9022648328829116e-01, -5.1496145643440404e-18, + -3.6903027405284104e-34, 1.5172940095151304e-50), + qd_real( 4.9289819222978404e-01, -1.0257831676562186e-18, + 6.9520817760885069e-35, -2.4260961214090389e-51), + qd_real( 4.9556526182577254e-01, -9.4323241942365362e-18, + 3.1212918657699143e-35, 4.2009072375242736e-52), + qd_real( 4.9822766697278187e-01, -1.6126383830540798e-17, + -1.5092897319298871e-33, 1.1049298890895917e-50), + qd_real( 5.0088538261124083e-01, -3.9604015147074639e-17, + -2.2208395201898007e-33, 1.3648202735839417e-49), + qd_real( 5.0353838372571758e-01, -1.6731308204967497e-17, + -1.0140233644074786e-33, 4.0953071937671477e-50), + qd_real( 5.0618664534515534e-01, -4.8321592986493711e-17, + 9.2858107226642252e-34, 4.2699802401037005e-50), + qd_real( 5.0883014254310699e-01, 4.7836968268014130e-17, + -1.0727022928806035e-33, 2.7309374513672757e-50), + qd_real( 5.1146885043797041e-01, -1.3088001221007579e-17, + 4.0929033363366899e-34, -3.7952190153477926e-50), + qd_real( 5.1410274419322177e-01, -4.5712707523615624e-17, + 1.5488279442238283e-33, -2.5853959305521130e-50), + qd_real( 5.1673179901764987e-01, 8.3018617233836515e-18, + 5.8251027467695202e-34, -2.2812397190535076e-50), + qd_real( 5.1935599016558964e-01, -5.5331248144171145e-17, + -3.1628375609769026e-35, -2.4091972051188571e-51), + qd_real( 5.2197529293715439e-01, -4.6555795692088883e-17, + 4.6378980936850430e-34, -3.3470542934689532e-51), + qd_real( 5.2458968267846895e-01, -4.3068869040082345e-17, + -4.2013155291932055e-34, -1.5096069926700274e-50), + qd_real( 5.2719913478190139e-01, -4.2202983480560619e-17, + 8.5585916184867295e-34, 7.9974339336732307e-50), + qd_real( 5.2980362468629472e-01, -4.8067841706482342e-17, + 5.8309721046630296e-34, -8.9740761521756660e-51), + qd_real( 5.3240312787719801e-01, -4.1020306135800895e-17, + -1.9239996374230821e-33, -1.5326987913812184e-49), + qd_real( 5.3499761988709726e-01, -5.3683132708358134e-17, + -1.3900569918838112e-33, 2.7154084726474092e-50), + qd_real( 5.3758707629564551e-01, -2.2617365388403054e-17, + -5.9787279033447075e-34, 3.1204419729043625e-51), + qd_real( 5.4017147272989285e-01, 2.7072447965935839e-17, + 1.1698799709213829e-33, -5.9094668515881500e-50), + qd_real( 5.4275078486451589e-01, 1.7148261004757101e-17, + -1.3525905925200870e-33, 4.9724411290727323e-50), + qd_real( 5.4532498842204646e-01, -4.1517817538384258e-17, + -1.5318930219385941e-33, 6.3629921101413974e-50), + qd_real( 5.4789405917310019e-01, -2.4065878297113363e-17, + -3.5639213669362606e-36, -2.6013270854271645e-52), + qd_real( 5.5045797293660481e-01, -8.3319903015807663e-18, + -2.3058454035767633e-34, -2.1611290432369010e-50), + qd_real( 5.5301670558002758e-01, -4.7061536623798204e-17, + -1.0617111545918056e-33, -1.6196316144407379e-50), + qd_real( 5.5557023301960218e-01, 4.7094109405616768e-17, + -2.0640520383682921e-33, 1.2290163188567138e-49), + qd_real( 5.5811853122055610e-01, 1.3481176324765226e-17, + -5.5016743873011438e-34, -2.3484822739335416e-50), + qd_real( 5.6066157619733603e-01, -7.3956418153476152e-18, + 3.9680620611731193e-34, 3.1995952200836223e-50), + qd_real( 5.6319934401383409e-01, 2.3835775146854829e-17, + 1.3511793173769814e-34, 9.3201311581248143e-51), + qd_real( 5.6573181078361323e-01, -3.4096079596590466e-17, + -1.7073289744303546e-33, 8.9147089975404507e-50), + qd_real( 5.6825895267013160e-01, -5.0935673642769248e-17, + -1.6274356351028249e-33, 9.8183151561702966e-51), + qd_real( 5.7078074588696726e-01, 2.4568151455566208e-17, + -1.2844481247560350e-33, -1.8037634376936261e-50), + qd_real( 5.7329716669804220e-01, 8.5176611669306400e-18, + -6.4443208788026766e-34, 2.2546105543273003e-50), + qd_real( 5.7580819141784534e-01, -3.7909495458942734e-17, + -2.7433738046854309e-33, 1.1130841524216795e-49), + qd_real( 5.7831379641165559e-01, -2.6237691512372831e-17, + 1.3679051680738167e-33, -3.1409808935335900e-50), + qd_real( 5.8081395809576453e-01, 1.8585338586613408e-17, + 2.7673843114549181e-34, 1.9605349619836937e-50), + qd_real( 5.8330865293769829e-01, 3.4516601079044858e-18, + 1.8065977478946306e-34, -6.3953958038544646e-51), + qd_real( 5.8579785745643886e-01, -3.7485501964311294e-18, + 2.7965403775536614e-34, -7.1816936024157202e-51), + qd_real( 5.8828154822264533e-01, -2.9292166725006846e-17, + -2.3744954603693934e-33, -1.1571631191512480e-50), + qd_real( 5.9075970185887428e-01, -4.7013584170659542e-17, + 2.4808417611768356e-33, 1.2598907673643198e-50), + qd_real( 5.9323229503979980e-01, 1.2892320944189053e-17, + 5.3058364776359583e-34, 4.1141674699390052e-50), + qd_real( 5.9569930449243336e-01, -1.3438641936579467e-17, + -6.7877687907721049e-35, -5.6046937531684890e-51), + qd_real( 5.9816070699634227e-01, 3.8801885783000657e-17, + -1.2084165858094663e-33, -4.0456610843430061e-50), + qd_real( 6.0061647938386897e-01, -4.6398198229461932e-17, + -1.6673493003710801e-33, 5.1982824378491445e-50), + qd_real( 6.0306659854034816e-01, 3.7323357680559650e-17, + 2.7771920866974305e-33, -1.6194229649742458e-49), + qd_real( 6.0551104140432555e-01, -3.1202672493305677e-17, + 1.2761267338680916e-33, -4.0859368598379647e-50), + qd_real( 6.0794978496777363e-01, 3.5160832362096660e-17, + -2.5546242776778394e-34, -1.4085313551220694e-50), + qd_real( 6.1038280627630948e-01, -2.2563265648229169e-17, + 1.3185575011226730e-33, 8.2316691420063460e-50), + qd_real( 6.1281008242940971e-01, -4.2693476568409685e-18, + 2.5839965886650320e-34, 1.6884412005622537e-50), + qd_real( 6.1523159058062682e-01, 2.6231417767266950e-17, + -1.4095366621106716e-33, 7.2058690491304558e-50), + qd_real( 6.1764730793780398e-01, -4.7478594510902452e-17, + -7.2986558263123996e-34, -3.0152327517439154e-50), + qd_real( 6.2005721176328921e-01, -2.7983410837681118e-17, + 1.1649951056138923e-33, -5.4539089117135207e-50), + qd_real( 6.2246127937414997e-01, 5.2940728606573002e-18, + -4.8486411215945827e-35, 1.2696527641980109e-52), + qd_real( 6.2485948814238634e-01, 3.3671846037243900e-17, + -2.7846053391012096e-33, 5.6102718120012104e-50), + qd_real( 6.2725181549514408e-01, 3.0763585181253225e-17, + 2.7068930273498138e-34, -1.1172240309286484e-50), + qd_real( 6.2963823891492698e-01, 4.1115334049626806e-17, + -1.9167473580230747e-33, 1.1118424028161730e-49), + qd_real( 6.3201873593980906e-01, -4.0164942296463612e-17, + -7.2208643641736723e-34, 3.7828920470544344e-50), + qd_real( 6.3439328416364549e-01, 1.0420901929280035e-17, + 4.1174558929280492e-34, -1.4464152986630705e-51), + qd_real( 6.3676186123628420e-01, 3.1419048711901611e-17, + -2.2693738415126449e-33, -1.6023584204297388e-49), + qd_real( 6.3912444486377573e-01, 1.2416796312271043e-17, + -6.2095419626356605e-34, 2.7762065999506603e-50), + qd_real( 6.4148101280858316e-01, -9.9883430115943310e-18, + 4.1969230376730128e-34, 5.6980543799257597e-51), + qd_real( 6.4383154288979150e-01, -3.2084798795046886e-17, + -1.2595311907053305e-33, -4.0205885230841536e-50), + qd_real( 6.4617601298331639e-01, -2.9756137382280815e-17, + -1.0275370077518259e-33, 8.0852478665893014e-51), + qd_real( 6.4851440102211244e-01, 3.9870270313386831e-18, + 1.9408388509540788e-34, -5.1798420636193190e-51), + qd_real( 6.5084668499638088e-01, 3.9714670710500257e-17, + 2.9178546787002963e-34, 3.8140635508293278e-51), + qd_real( 6.5317284295377676e-01, 8.5695642060026238e-18, + -6.9165322305070633e-34, 2.3873751224185395e-50), + qd_real( 6.5549285299961535e-01, 3.5638734426385005e-17, + 1.2695365790889811e-33, 4.3984952865412050e-50), + qd_real( 6.5780669329707864e-01, 1.9580943058468545e-17, + -1.1944272256627192e-33, 2.8556402616436858e-50), + qd_real( 6.6011434206742048e-01, -1.3960054386823638e-19, + 6.1515777931494047e-36, 5.3510498875622660e-52), + qd_real( 6.6241577759017178e-01, -2.2615508885764591e-17, + 5.0177050318126862e-34, 2.9162532399530762e-50), + qd_real( 6.6471097820334490e-01, -3.6227793598034367e-17, + -9.0607934765540427e-34, 3.0917036342380213e-50), + qd_real( 6.6699992230363747e-01, 3.5284364997428166e-17, + -1.0382057232458238e-33, 7.3812756550167626e-50), + qd_real( 6.6928258834663612e-01, -5.4592652417447913e-17, + -2.5181014709695152e-33, -1.6867875999437174e-49), + qd_real( 6.7155895484701844e-01, -4.0489037749296692e-17, + 3.1995835625355681e-34, -1.4044414655670960e-50), + qd_real( 6.7382900037875604e-01, 2.3091901236161086e-17, + 5.7428037192881319e-34, 1.1240668354625977e-50), + qd_real( 6.7609270357531592e-01, 3.7256902248049466e-17, + 1.7059417895764375e-33, 9.7326347795300652e-50), + qd_real( 6.7835004312986147e-01, 1.8302093041863122e-17, + 9.5241675746813072e-34, 5.0328101116133503e-50), + qd_real( 6.8060099779545302e-01, 2.8473293354522047e-17, + 4.1331805977270903e-34, 4.2579030510748576e-50), + qd_real( 6.8284554638524808e-01, -1.2958058061524531e-17, + 1.8292386959330698e-34, 3.4536209116044487e-51), + qd_real( 6.8508366777270036e-01, 2.5948135194645137e-17, + -8.5030743129500702e-34, -6.9572086141009930e-50), + qd_real( 6.8731534089175916e-01, -5.5156158714917168e-17, + 1.1896489854266829e-33, -7.8505896218220662e-51), + qd_real( 6.8954054473706694e-01, -1.5889323294806790e-17, + 9.1242356240205712e-34, 3.8315454152267638e-50), + qd_real( 6.9175925836415775e-01, 2.7406078472410668e-17, + 1.3286508943202092e-33, 1.0651869129580079e-51), + qd_real( 6.9397146088965400e-01, 7.4345076956280137e-18, + 7.5061528388197460e-34, -1.5928000240686583e-50), + qd_real( 6.9617713149146299e-01, -4.1224081213582889e-17, + -3.1838716762083291e-35, -3.9625587412119131e-51), + qd_real( 6.9837624940897280e-01, 4.8988282435667768e-17, + 1.9134010413244152e-33, 2.6161153243793989e-50), + qd_real( 7.0056879394324834e-01, 3.1027960192992922e-17, + 9.5638250509179997e-34, 4.5896916138107048e-51), + qd_real( 7.0275474445722530e-01, 2.5278294383629822e-18, + -8.6985561210674942e-35, -5.6899862307812990e-51), + qd_real( 7.0493408037590488e-01, 2.7608725585748502e-17, + 2.9816599471629137e-34, 1.1533044185111206e-50), + qd_real( 7.0710678118654757e-01, -4.8336466567264567e-17, + 2.0693376543497068e-33, 2.4677734957341755e-50) +}; + +static const qd_real cos_table [] = { + qd_real( 9.9999529380957619e-01, -1.9668064285322189e-17, + -6.3053955095883481e-34, 5.3266110855726731e-52), + qd_real( 9.9998117528260111e-01, 3.3568103522895585e-17, + -1.4740132559368063e-35, 9.8603097594755596e-52), + qd_real( 9.9995764455196390e-01, -3.1527836866647287e-17, + 2.6363251186638437e-33, 1.0007504815488399e-49), + qd_real( 9.9992470183914450e-01, 3.7931082512668012e-17, + -8.5099918660501484e-35, -4.9956973223295153e-51), + qd_real( 9.9988234745421256e-01, -3.5477814872408538e-17, + 1.7102001035303974e-33, -1.0725388519026542e-49), + qd_real( 9.9983058179582340e-01, 1.8825140517551119e-17, + -5.1383513457616937e-34, -3.8378827995403787e-50), + qd_real( 9.9976940535121528e-01, 4.2681177032289012e-17, + 1.9062302359737099e-33, -6.0221153262881160e-50), + qd_real( 9.9969881869620425e-01, -2.9851486403799753e-17, + -1.9084787370733737e-33, 5.5980260344029202e-51), + qd_real( 9.9961882249517864e-01, -4.1181965521424734e-17, + 2.0915365593699916e-33, 8.1403390920903734e-50), + qd_real( 9.9952941750109314e-01, 2.0517917823755591e-17, + -4.7673802585706520e-34, -2.9443604198656772e-50), + qd_real( 9.9943060455546173e-01, 3.9644497752257798e-17, + -2.3757223716722428e-34, -1.2856759011361726e-51), + qd_real( 9.9932238458834954e-01, -4.2858538440845682e-17, + 3.3235101605146565e-34, -8.3554272377057543e-51), + qd_real( 9.9920475861836389e-01, 9.1796317110385693e-18, + 5.5416208185868570e-34, 8.0267046717615311e-52), + qd_real( 9.9907772775264536e-01, 2.1419007653587032e-17, + -7.9048203318529618e-34, -5.3166296181112712e-50), + qd_real( 9.9894129318685687e-01, -2.0610641910058638e-17, + -1.2546525485913485e-33, -7.5175888806157064e-50), + qd_real( 9.9879545620517241e-01, -1.2291693337075465e-17, + 2.4468446786491271e-34, 1.0723891085210268e-50), + qd_real( 9.9864021818026527e-01, -4.8690254312923302e-17, + -2.9470881967909147e-34, -1.3000650761346907e-50), + qd_real( 9.9847558057329477e-01, -2.2002931182778795e-17, + -1.2371509454944992e-33, -2.4911225131232065e-50), + qd_real( 9.9830154493389289e-01, -5.1869402702792278e-17, + 1.0480195493633452e-33, -2.8995649143155511e-50), + qd_real( 9.9811811290014918e-01, 2.7935487558113833e-17, + 2.4423341255830345e-33, -6.7646699175334417e-50), + qd_real( 9.9792528619859600e-01, 1.7143659778886362e-17, + 5.7885840902887460e-34, -9.2601432603894597e-51), + qd_real( 9.9772306664419164e-01, -2.6394475274898721e-17, + -1.6176223087661783e-34, -9.9924942889362281e-51), + qd_real( 9.9751145614030345e-01, 5.6007205919806937e-18, + -5.9477673514685690e-35, -1.4166807162743627e-54), + qd_real( 9.9729045667869021e-01, 9.1647695371101735e-18, + 6.7824134309739296e-34, -8.6191392795543357e-52), + qd_real( 9.9706007033948296e-01, 1.6734093546241963e-17, + -1.3169951440780028e-33, 1.0311048767952477e-50), + qd_real( 9.9682029929116567e-01, 4.7062820708615655e-17, + 2.8412041076474937e-33, -8.0006155670263622e-50), + qd_real( 9.9657114579055484e-01, 1.1707179088390986e-17, + -7.5934413263024663e-34, 2.8474848436926008e-50), + qd_real( 9.9631261218277800e-01, 1.1336497891624735e-17, + 3.4002458674414360e-34, 7.7419075921544901e-52), + qd_real( 9.9604470090125197e-01, 2.2870031707670695e-17, + -3.9184839405013148e-34, -3.7081260416246375e-50), + qd_real( 9.9576741446765982e-01, -2.3151908323094359e-17, + -1.6306512931944591e-34, -1.5925420783863192e-51), + qd_real( 9.9548075549192694e-01, 3.2084621412226554e-18, + -4.9501292146013023e-36, -2.7811428850878516e-52), + qd_real( 9.9518472667219693e-01, -4.2486913678304410e-17, + 1.3315510772504614e-33, 6.7927987417051888e-50), + qd_real( 9.9487933079480562e-01, 4.2130813284943662e-18, + -4.2062597488288452e-35, 2.5157064556087620e-51), + qd_real( 9.9456457073425542e-01, 3.6745069641528058e-17, + -3.0603304105471010e-33, 1.0397872280487526e-49), + qd_real( 9.9424044945318790e-01, 4.4129423472462673e-17, + -3.0107231708238066e-33, 7.4201582906861892e-50), + qd_real( 9.9390697000235606e-01, -1.8964849471123746e-17, + -1.5980853777937752e-35, -8.5374807150597082e-52), + qd_real( 9.9356413552059530e-01, 2.9752309927797428e-17, + -4.5066707331134233e-34, -3.3548191633805036e-50), + qd_real( 9.9321194923479450e-01, 3.3096906261272262e-17, + 1.5592811973249567e-33, 1.4373977733253592e-50), + qd_real( 9.9285041445986510e-01, -1.4094517733693302e-17, + -1.1954558131616916e-33, 1.8761873742867983e-50), + qd_real( 9.9247953459870997e-01, 3.1093055095428906e-17, + -1.8379594757818019e-33, -3.9885758559381314e-51), + qd_real( 9.9209931314219180e-01, -3.9431926149588778e-17, + -6.2758062911047230e-34, -1.2960929559212390e-50), + qd_real( 9.9170975366909953e-01, -2.3372891311883661e-18, + 2.7073298824968591e-35, -1.2569459441802872e-51), + qd_real( 9.9131085984611544e-01, -2.5192111583372105e-17, + -1.2852471567380887e-33, 5.2385212584310483e-50), + qd_real( 9.9090263542778001e-01, 1.5394565094566704e-17, + -1.0799984133184567e-33, 2.7451115960133595e-51), + qd_real( 9.9048508425645709e-01, -5.5411437553780867e-17, + -1.4614017210753585e-33, -3.8339374397387620e-50), + qd_real( 9.9005821026229712e-01, -1.7055485906233963e-17, + 1.3454939685758777e-33, 7.3117589137300036e-50), + qd_real( 9.8962201746320089e-01, -5.2398217968132530e-17, + 1.3463189211456219e-33, 5.8021640554894872e-50), + qd_real( 9.8917650996478101e-01, -4.0987309937047111e-17, + -4.4857560552048437e-34, -3.9414504502871125e-50), + qd_real( 9.8872169196032378e-01, -1.0976227206656125e-17, + 3.2311342577653764e-34, 9.6367946583575041e-51), + qd_real( 9.8825756773074946e-01, 2.7030607784372632e-17, + 7.7514866488601377e-35, 2.1019644956864938e-51), + qd_real( 9.8778414164457218e-01, -2.3600693397159021e-17, + -1.2323283769707861e-33, 3.0130900716803339e-50), + qd_real( 9.8730141815785843e-01, -5.2332261255715652e-17, + -2.7937644333152473e-33, 1.2074160567958408e-49), + qd_real( 9.8680940181418553e-01, -5.0287214351061075e-17, + -2.2681526238144461e-33, 4.4003694320169133e-50), + qd_real( 9.8630809724459867e-01, -2.1520877103013341e-17, + 1.1866528054187716e-33, -7.8532199199813836e-50), + qd_real( 9.8579750916756748e-01, -5.1439452979953012e-17, + 2.6276439309996725e-33, 7.5423552783286347e-50), + qd_real( 9.8527764238894122e-01, 2.3155637027900207e-17, + -7.5275971545764833e-34, 1.0582231660456094e-50), + qd_real( 9.8474850180190421e-01, 1.0548144061829957e-17, + 2.8786145266267306e-34, -3.6782210081466112e-51), + qd_real( 9.8421009238692903e-01, 4.7983922627050691e-17, + 2.2597419645070588e-34, 1.7573875814863400e-50), + qd_real( 9.8366241921173025e-01, 1.9864948201635255e-17, + -1.0743046281211033e-35, 1.7975662796558100e-52), + qd_real( 9.8310548743121629e-01, 4.2170007522888628e-17, + 8.2396265656440904e-34, -8.0803700139096561e-50), + qd_real( 9.8253930228744124e-01, 1.5149580813777224e-17, + -4.1802771422186237e-34, -2.2150174326226160e-50), + qd_real( 9.8196386910955524e-01, 2.1108443711513084e-17, + -1.5253013442896054e-33, -6.8388082079337969e-50), + qd_real( 9.8137919331375456e-01, 1.3428163260355633e-17, + -6.5294290469962986e-34, 2.7965412287456268e-51), + qd_real( 9.8078528040323043e-01, 1.8546939997825006e-17, + -1.0696564445530757e-33, 6.6668174475264961e-50), + qd_real( 9.8018213596811743e-01, -3.6801786963856159e-17, + 6.3245171387992842e-34, 1.8600176137175971e-50), + qd_real( 9.7956976568544052e-01, 1.5573991584990420e-17, + -1.3401066029782990e-33, -1.7263702199862149e-50), + qd_real( 9.7894817531906220e-01, -2.3817727961148053e-18, + -1.0694750370381661e-34, -8.2293047196087462e-51), + qd_real( 9.7831737071962765e-01, -2.1623082233344895e-17, + 1.0970403012028032e-33, 7.7091923099369339e-50), + qd_real( 9.7767735782450993e-01, 5.0514136167059628e-17, + -1.3254751701428788e-33, 7.0161254312124538e-50), + qd_real( 9.7702814265775439e-01, -4.3353875751555997e-17, + 5.4948839831535478e-34, -9.2755263105377306e-51), + qd_real( 9.7636973133002114e-01, 9.3093931526213780e-18, + -4.1184949155685665e-34, -3.1913926031393690e-50), + qd_real( 9.7570213003852857e-01, -2.5572556081259686e-17, + -9.3174244508942223e-34, -8.3675863211646863e-51), + qd_real( 9.7502534506699412e-01, 2.6642660651899135e-17, + 1.7819392739353853e-34, -3.3159625385648947e-51), + qd_real( 9.7433938278557586e-01, 2.3041221476151512e-18, + 1.0758686005031430e-34, 5.1074116432809478e-51), + qd_real( 9.7364424965081198e-01, -5.1729808691005871e-17, + -1.5508473005989887e-33, -1.6505125917675401e-49), + qd_real( 9.7293995220556018e-01, -3.1311211122281800e-17, + -2.6874087789006141e-33, -2.1652434818822145e-51), + qd_real( 9.7222649707893627e-01, 3.6461169785938221e-17, + 3.0309636883883133e-33, -1.2702716907967306e-51), + qd_real( 9.7150389098625178e-01, -7.9865421122289046e-18, + -4.3628417211263380e-34, 3.4307517798759352e-51), + qd_real( 9.7077214072895035e-01, -4.7992163325114922e-17, + 3.0347528910975783e-33, 8.5989199506479701e-50), + qd_real( 9.7003125319454397e-01, 1.8365300348428844e-17, + -1.4311097571944918e-33, 8.5846781998740697e-51), + qd_real( 9.6928123535654853e-01, -4.5663660261927896e-17, + 9.6147526917239387e-34, 8.1267605207871330e-51), + qd_real( 9.6852209427441727e-01, 4.9475074918244771e-17, + 2.8558738351911241e-33, 6.2948422316507461e-50), + qd_real( 9.6775383709347551e-01, -4.5512132825515820e-17, + -1.4127617988719093e-33, -8.4620609089704578e-50), + qd_real( 9.6697647104485207e-01, 3.8496228837337864e-17, + -5.3881631542745647e-34, -3.5221863171458959e-50), + qd_real( 9.6619000344541250e-01, 5.1298840401665493e-17, + 1.4564075904769808e-34, 1.0095973971377432e-50), + qd_real( 9.6539444169768940e-01, -2.3745389918392156e-17, + 5.9221515590053862e-34, -3.8811192556231094e-50), + qd_real( 9.6458979328981276e-01, -3.4189470735959786e-17, + 2.2982074155463522e-33, -4.5128791045607634e-50), + qd_real( 9.6377606579543984e-01, 2.6463950561220029e-17, + -2.9073234590199323e-36, -1.2938328629395601e-52), + qd_real( 9.6295326687368388e-01, 8.9341960404313634e-18, + -3.9071244661020126e-34, 1.6212091116847394e-50), + qd_real( 9.6212140426904158e-01, 1.5236770453846305e-17, + -1.3050173525597142e-33, 7.9016122394092666e-50), + qd_real( 9.6128048581132064e-01, 2.0933955216674039e-18, + 1.0768607469015692e-34, -5.9453639304361774e-51), + qd_real( 9.6043051941556579e-01, 2.4653904815317185e-17, + -1.3792169410906322e-33, -4.7726598378506903e-51), + qd_real( 9.5957151308198452e-01, 1.1000640085000957e-17, + -4.2036030828223975e-34, 4.0023704842606573e-51), + qd_real( 9.5870347489587160e-01, -4.3685014392372053e-17, + 2.2001800662729131e-33, -1.0553721324358075e-49), + qd_real( 9.5782641302753291e-01, -1.7696710075371263e-17, + 1.9164034110382190e-34, 8.1489235071754813e-51), + qd_real( 9.5694033573220882e-01, 4.0553869861875701e-17, + -1.7147013364302149e-33, 2.5736745295329455e-50), + qd_real( 9.5604525134999641e-01, 3.7705045279589067e-17, + 1.9678699997347571e-33, 8.5093177731230180e-50), + qd_real( 9.5514116830577067e-01, 5.0088652955014668e-17, + -2.6983181838059211e-33, 1.0102323575596493e-49), + qd_real( 9.5422809510910567e-01, -3.7545901690626874e-17, + 1.4951619241257764e-33, -8.2717333151394973e-50), + qd_real( 9.5330604035419386e-01, -2.5190738779919934e-17, + -1.4272239821134379e-33, -4.6717286809283155e-50), + qd_real( 9.5237501271976588e-01, -2.0269300462299272e-17, + -1.0635956887246246e-33, -3.5514537666487619e-50), + qd_real( 9.5143502096900834e-01, 3.1350584123266695e-17, + -2.4824833452737813e-33, 9.5450335525380613e-51), + qd_real( 9.5048607394948170e-01, 1.9410097562630436e-17, + -8.1559393949816789e-34, -1.0501209720164562e-50), + qd_real( 9.4952818059303667e-01, -7.5544151928043298e-18, + -5.1260245024046686e-34, 1.8093643389040406e-50), + qd_real( 9.4856134991573027e-01, 2.0668262262333232e-17, + -5.9440730243667306e-34, 1.4268853111554300e-50), + qd_real( 9.4758559101774109e-01, 4.3417993852125991e-17, + -2.7728667889840373e-34, 5.5709160196519968e-51), + qd_real( 9.4660091308328353e-01, 3.5056800210680730e-17, + 9.8578536940318117e-34, 6.6035911064585197e-50), + qd_real( 9.4560732538052128e-01, 4.6019102478523738e-17, + -6.2534384769452059e-34, 1.5758941215779961e-50), + qd_real( 9.4460483726148026e-01, 8.8100545476641165e-18, + 5.2291695602757842e-34, -3.3487256018407123e-50), + qd_real( 9.4359345816196039e-01, -2.4093127844404214e-17, + 1.0283279856803939e-34, -2.3398232614531355e-51), + qd_real( 9.4257319760144687e-01, 1.3235564806436886e-17, + -5.7048262885386911e-35, 3.9947050442753744e-51), + qd_real( 9.4154406518302081e-01, -2.7896379547698341e-17, + 1.6273236356733898e-33, -5.3075944708471203e-51), + qd_real( 9.4050607059326830e-01, 2.8610421567116268e-17, + 2.9261501147538827e-33, -2.6849867690896925e-50), + qd_real( 9.3945922360218992e-01, -7.0152867943098655e-18, + -5.6395693818011210e-34, 3.5568142678987651e-50), + qd_real( 9.3840353406310806e-01, 5.4242545044795490e-17, + -1.9039966607859759e-33, -1.5627792988341215e-49), + qd_real( 9.3733901191257496e-01, -3.6570926284362776e-17, + -1.1902940071273247e-33, -1.1215082331583223e-50), + qd_real( 9.3626566717027826e-01, -1.3013766145497654e-17, + 5.2229870061990595e-34, -3.3972777075634108e-51), + qd_real( 9.3518350993894761e-01, -3.2609395302485065e-17, + -8.1813015218875245e-34, 5.5642140024928139e-50), + qd_real( 9.3409255040425887e-01, 4.4662824360767511e-17, + -2.5903243047396916e-33, 8.1505209004343043e-50), + qd_real( 9.3299279883473885e-01, 4.2041415555384355e-17, + 9.0285896495521276e-34, 5.3019984977661259e-50), + qd_real( 9.3188426558166815e-01, -4.0785944377318095e-17, + 1.7631450298754169e-33, 2.5776403305507453e-50), + qd_real( 9.3076696107898371e-01, 1.9703775102838329e-17, + 6.5657908718278205e-34, -1.9480347966259524e-51), + qd_real( 9.2964089584318121e-01, 5.1282530016864107e-17, + 2.3719739891916261e-34, -1.7230065426917127e-50), + qd_real( 9.2850608047321559e-01, -2.3306639848485943e-17, + -7.7799084333208503e-34, -5.8597558009300305e-50), + qd_real( 9.2736252565040111e-01, -2.7677111692155437e-17, + 2.2110293450199576e-34, 2.0349190819680613e-50), + qd_real( 9.2621024213831138e-01, -3.7303754586099054e-17, + 2.0464457809993405e-33, 1.3831799631231817e-49), + qd_real( 9.2504924078267758e-01, 6.0529447412576159e-18, + -8.8256517760278541e-35, 1.8285462122388328e-51), + qd_real( 9.2387953251128674e-01, 1.7645047084336677e-17, + -5.0442537321586818e-34, -4.0478677716823890e-50), + qd_real( 9.2270112833387852e-01, 5.2963798918539814e-17, + -5.7135699628876685e-34, 3.0163671797219087e-50), + qd_real( 9.2151403934204190e-01, 4.1639843390684644e-17, + 1.1891485604702356e-33, 2.0862437594380324e-50), + qd_real( 9.2031827670911059e-01, -2.7806888779036837e-17, + 2.7011013677071274e-33, 1.1998578792455499e-49), + qd_real( 9.1911385169005777e-01, -2.6496484622344718e-17, + 6.5403604763461920e-34, -2.8997180201186078e-50), + qd_real( 9.1790077562139050e-01, -3.9074579680849515e-17, + 2.3004636541490264e-33, 3.9851762744443107e-50), + qd_real( 9.1667905992104270e-01, -4.1733978698287568e-17, + 1.2094444804381172e-33, 4.9356916826097816e-50), + qd_real( 9.1544871608826783e-01, -1.3591056692900894e-17, + 5.9923027475594735e-34, 2.1403295925962879e-50), + qd_real( 9.1420975570353069e-01, -3.6316182527814423e-17, + -1.9438819777122554e-33, 2.8340679287728316e-50), + qd_real( 9.1296219042839821e-01, -4.7932505228039469e-17, + -1.7753551889428638e-33, 4.0607782903868160e-51), + qd_real( 9.1170603200542988e-01, -2.6913273175034130e-17, + -5.1928101916162528e-35, 1.1338175936090630e-51), + qd_real( 9.1044129225806725e-01, -5.0433041673313820e-17, + 1.0938746257404305e-33, 9.5378272084170731e-51), + qd_real( 9.0916798309052238e-01, -3.6878564091359894e-18, + 2.9951330310507693e-34, -1.2225666136919926e-50), + qd_real( 9.0788611648766626e-01, -4.9459964301225840e-17, + -1.6599682707075313e-33, -5.1925202712634716e-50), + qd_real( 9.0659570451491533e-01, 3.0506718955442023e-17, + -1.4478836557141204e-33, 1.8906373784448725e-50), + qd_real( 9.0529675931811882e-01, -4.1153099826889901e-17, + 2.9859368705184223e-33, 5.1145293917439211e-50), + qd_real( 9.0398929312344334e-01, -6.6097544687484308e-18, + 1.2728013034680357e-34, -4.3026097234014823e-51), + qd_real( 9.0267331823725883e-01, -1.9250787033961483e-17, + 1.3242128993244527e-33, -5.2971030688703665e-50), + qd_real( 9.0134884704602203e-01, -1.3524789367698682e-17, + 6.3605353115880091e-34, 3.6227400654573828e-50), + qd_real( 9.0001589201616028e-01, -5.0639618050802273e-17, + 1.0783525384031576e-33, 2.8130016326515111e-50), + qd_real( 8.9867446569395382e-01, 2.6316906461033013e-17, + 3.7003137047796840e-35, -2.3447719900465938e-51), + qd_real( 8.9732458070541832e-01, -3.6396283314867290e-17, + -2.3611649895474815e-33, 1.1837247047900082e-49), + qd_real( 8.9596624975618511e-01, 4.9025099114811813e-17, + -1.9440489814795326e-33, -1.7070486667767033e-49), + qd_real( 8.9459948563138270e-01, -1.7516226396814919e-17, + -1.3200670047246923e-33, -1.5953009884324695e-50), + qd_real( 8.9322430119551532e-01, -4.1161239151908913e-18, + 2.5380253805715999e-34, 4.2849455510516192e-51), + qd_real( 8.9184070939234272e-01, 4.6690228137124547e-18, + 1.6150254286841982e-34, -3.9617448820725012e-51), + qd_real( 8.9044872324475788e-01, 1.1781931459051803e-17, + -1.3346142209571930e-34, -9.4982373530733431e-51), + qd_real( 8.8904835585466457e-01, -1.1164514966766675e-17, + -3.4797636107798736e-34, -1.5605079997040631e-50), + qd_real( 8.8763962040285393e-01, 1.2805091918587960e-17, + 3.9948742059584459e-35, 3.8940716325338136e-51), + qd_real( 8.8622253014888064e-01, -6.7307369600274315e-18, + 1.2385593432917413e-34, 2.0364014759133320e-51), + qd_real( 8.8479709843093779e-01, -9.4331469628972690e-18, + -5.7106541478701439e-34, 1.8260134111907397e-50), + qd_real( 8.8336333866573158e-01, 1.5822643380255127e-17, + -7.8921320007588250e-34, -1.4782321016179836e-50), + qd_real( 8.8192126434835505e-01, -1.9843248405890562e-17, + -7.0412114007673834e-34, -1.0636770169389104e-50), + qd_real( 8.8047088905216075e-01, 1.6311096602996350e-17, + -5.7541360594724172e-34, -4.0128611862170021e-50), + qd_real( 8.7901222642863353e-01, -4.7356837291118011e-17, + 1.4388771297975192e-33, -2.9085554304479134e-50), + qd_real( 8.7754529020726124e-01, 5.0113311846499550e-17, + 2.8382769008739543e-34, 1.5550640393164140e-50), + qd_real( 8.7607009419540660e-01, 5.8729024235147677e-18, + 2.7941144391738458e-34, -1.8536073846509828e-50), + qd_real( 8.7458665227817611e-01, -5.7216617730397065e-19, + -2.9705811503689596e-35, 8.7389593969796752e-52), + qd_real( 8.7309497841829009e-01, 7.8424672990129903e-18, + -4.8685015839797165e-34, -2.2815570587477527e-50), + qd_real( 8.7159508665595109e-01, -5.5272998038551050e-17, + -2.2104090204984907e-33, -9.7749763187643172e-50), + qd_real( 8.7008699110871146e-01, -4.1888510868549968e-17, + 7.0900185861878415e-34, 3.7600251115157260e-50), + qd_real( 8.6857070597134090e-01, 2.7192781689782903e-19, + -1.6710140396932428e-35, -1.2625514734637969e-51), + qd_real( 8.6704624551569265e-01, 3.0267859550930567e-18, + -1.1559438782171572e-34, -5.3580556397808012e-52), + qd_real( 8.6551362409056909e-01, -6.3723113549628899e-18, + 2.3725520321746832e-34, 1.5911880348395175e-50), + qd_real( 8.6397285612158670e-01, 4.1486355957361607e-17, + 2.2709976932210266e-33, -8.1228385659479984e-50), + qd_real( 8.6242395611104050e-01, 3.7008992527383130e-17, + 5.2128411542701573e-34, 2.6945600081026861e-50), + qd_real( 8.6086693863776731e-01, -3.0050048898573656e-17, + -8.8706183090892111e-34, 1.5005320558097301e-50), + qd_real( 8.5930181835700836e-01, 4.2435655816850687e-17, + 7.6181814059912025e-34, -3.9592127850658708e-50), + qd_real( 8.5772861000027212e-01, -4.8183447936336620e-17, + -1.1044130517687532e-33, -8.7400233444645562e-50), + qd_real( 8.5614732837519447e-01, 9.1806925616606261e-18, + 5.6328649785951470e-34, 2.3326646113217378e-51), + qd_real( 8.5455798836540053e-01, -1.2991124236396092e-17, + 1.2893407722948080e-34, -3.6506925747583053e-52), + qd_real( 8.5296060493036363e-01, 2.7152984251981370e-17, + 7.4336483283120719e-34, 4.2162417622350668e-50), + qd_real( 8.5135519310526520e-01, -5.3279874446016209e-17, + 2.2281156380919942e-33, -4.0281886404138477e-50), + qd_real( 8.4974176800085244e-01, 5.1812347659974015e-17, + 3.0810626087331275e-33, -2.5931308201994965e-50), + qd_real( 8.4812034480329723e-01, 1.8762563415239981e-17, + 1.4048773307919617e-33, -2.4915221509958691e-50), + qd_real( 8.4649093877405213e-01, -4.7969419958569345e-17, + -2.7518267097886703e-33, -7.3518959727313350e-50), + qd_real( 8.4485356524970712e-01, -4.3631360296879637e-17, + -2.0307726853367547e-33, 4.3097229819851761e-50), + qd_real( 8.4320823964184544e-01, 9.6536707005959077e-19, + 2.8995142431556364e-36, 9.6715076811480284e-53), + qd_real( 8.4155497743689844e-01, -3.4095465391321557e-17, + -8.4130208607579595e-34, -4.9447283960568686e-50), + qd_real( 8.3989379419599952e-01, -1.6673694881511411e-17, + -1.4759184141750289e-33, -7.5795098161914058e-50), + qd_real( 8.3822470555483808e-01, -3.5560085052855026e-17, + 1.1689791577022643e-33, -5.8627347359723411e-50), + qd_real( 8.3654772722351201e-01, -2.0899059027066533e-17, + -9.8104097821002585e-35, -3.1609177868229853e-51), + qd_real( 8.3486287498638001e-01, 4.6048430609159657e-17, + -5.1827423265239912e-34, -7.0505343435504109e-51), + qd_real( 8.3317016470191319e-01, 1.3275129507229764e-18, + 4.8589164115370863e-35, 4.5422281300506859e-51), + qd_real( 8.3146961230254524e-01, 1.4073856984728024e-18, + 4.6951315383980830e-35, 5.1431906049905658e-51), + qd_real( 8.2976123379452305e-01, -2.9349109376485597e-18, + 1.1496917934149818e-34, 3.5186665544980233e-51), + qd_real( 8.2804504525775580e-01, -4.4196593225871532e-17, + 2.7967864855211251e-33, 1.0030777287393502e-49), + qd_real( 8.2632106284566353e-01, -5.3957485453612902e-17, + 6.8976896130138550e-34, 3.8106164274199196e-50), + qd_real( 8.2458930278502529e-01, -2.6512360488868275e-17, + 1.6916964350914386e-34, 6.7693974813562649e-51), + qd_real( 8.2284978137582632e-01, 1.5193019034505495e-17, + 9.6890547246521685e-34, 5.6994562923653264e-50), + qd_real( 8.2110251499110465e-01, 3.0715131609697682e-17, + -1.7037168325855879e-33, -1.1149862443283853e-49), + qd_real( 8.1934752007679701e-01, -4.8200736995191133e-17, + -1.5574489646672781e-35, -9.5647853614522216e-53), + qd_real( 8.1758481315158371e-01, -1.4883149812426772e-17, + -7.8273262771298917e-34, 4.1332149161031594e-50), + qd_real( 8.1581441080673378e-01, 8.2652693782130871e-18, + -2.3028778135179471e-34, 1.5102071387249843e-50), + qd_real( 8.1403632970594841e-01, -5.2127351877042624e-17, + -1.9047670611316360e-33, -1.6937269585941507e-49), + qd_real( 8.1225058658520388e-01, 3.1054545609214803e-17, + 2.2649541922707251e-34, -7.4221684154649405e-51), + qd_real( 8.1045719825259477e-01, 2.3520367349840499e-17, + -7.7530070904846341e-34, -7.2792616357197140e-50), + qd_real( 8.0865618158817498e-01, 9.3251597879721674e-18, + -7.1823301933068394e-34, 2.3925440846132106e-50), + qd_real( 8.0684755354379922e-01, 4.9220603766095546e-17, + 2.9796016899903487e-33, 1.5220754223615788e-49), + qd_real( 8.0503133114296355e-01, 5.1368289568212149e-17, + 6.3082807402256524e-34, 7.3277646085129827e-51), + qd_real( 8.0320753148064494e-01, -3.3060609804814910e-17, + -1.2242726252420433e-33, 2.8413673268630117e-50), + qd_real( 8.0137617172314024e-01, -2.0958013413495834e-17, + -4.3798162198006931e-34, 2.0235690497752515e-50), + qd_real( 7.9953726910790501e-01, 2.0356723822005431e-17, + -9.7448513696896360e-34, 5.3608109599696008e-52), + qd_real( 7.9769084094339116e-01, -4.6730759884788944e-17, + 2.3075897077191757e-33, 3.1605567774640253e-51), + qd_real( 7.9583690460888357e-01, -3.0062724851910721e-17, + -2.2496210832042235e-33, -6.5881774117183040e-50), + qd_real( 7.9397547755433717e-01, -7.4194631759921416e-18, + 2.4124341304631069e-34, -4.9956808616244972e-51), + qd_real( 7.9210657730021239e-01, -3.7087850202326467e-17, + -1.4874457267228264e-33, 2.9323097289153505e-50), + qd_real( 7.9023022143731003e-01, 2.3056905954954492e-17, + 1.4481080533260193e-33, -7.6725237057203488e-50), + qd_real( 7.8834642762660623e-01, 3.4396993154059708e-17, + 1.7710623746737170e-33, 1.7084159098417402e-49), + qd_real( 7.8645521359908577e-01, -9.7841429939305265e-18, + 3.3906063272445472e-34, 5.7269505320382577e-51), + qd_real( 7.8455659715557524e-01, -8.5627965423173476e-18, + -2.1106834459001849e-34, -1.6890322182469603e-50), + qd_real( 7.8265059616657573e-01, 9.0745866975808825e-18, + 6.7623847404278666e-34, -1.7173237731987271e-50), + qd_real( 7.8073722857209449e-01, -9.9198782066678806e-18, + -2.1265794012162715e-36, 3.0772165598957647e-54), + qd_real( 7.7881651238147598e-01, -2.4891385579973807e-17, + 6.7665497024807980e-35, -6.5218594281701332e-52), + qd_real( 7.7688846567323244e-01, 7.7418602570672864e-18, + -5.9986517872157897e-34, 3.0566548232958972e-50), + qd_real( 7.7495310659487393e-01, -5.2209083189826433e-17, + -9.6653593393686612e-34, 3.7027750076562569e-50), + qd_real( 7.7301045336273699e-01, -3.2565907033649772e-17, + 1.3860807251523929e-33, -3.9971329917586022e-50), + qd_real( 7.7106052426181382e-01, -4.4558442347769265e-17, + -2.9863565614083783e-33, -6.8795262083596236e-50), + qd_real( 7.6910333764557959e-01, 5.1546455184564817e-17, + 2.6142829553524292e-33, -1.6199023632773298e-49), + qd_real( 7.6713891193582040e-01, -1.8885903683750782e-17, + -1.3659359331495433e-33, -2.2538834962921934e-50), + qd_real( 7.6516726562245896e-01, -3.2707225612534598e-17, + 1.1177117747079528e-33, -3.7005182280175715e-50), + qd_real( 7.6318841726338127e-01, 2.6314748416750748e-18, + 1.4048039063095910e-34, 8.9601886626630321e-52), + qd_real( 7.6120238548426178e-01, 3.5315510881690551e-17, + 1.2833566381864357e-33, 8.6221435180890613e-50), + qd_real( 7.5920918897838807e-01, -3.8558842175523123e-17, + 2.9720241208332759e-34, -1.2521388928220163e-50), + qd_real( 7.5720884650648457e-01, -1.9909098777335502e-17, + 3.9409283266158482e-34, 2.0744254207802976e-50), + qd_real( 7.5520137689653655e-01, -1.9402238001823017e-17, + -3.7756206444727573e-34, -2.1212242308178287e-50), + qd_real( 7.5318679904361252e-01, -3.7937789838736540e-17, + -6.7009539920231559e-34, -6.7128562115050214e-51), + qd_real( 7.5116513190968637e-01, 4.3499761158645868e-17, + 2.5227718971102212e-33, -6.5969709212757102e-50), + qd_real( 7.4913639452345937e-01, -4.4729078447011889e-17, + -2.4206025249983768e-33, 1.1336681351116422e-49), + qd_real( 7.4710060598018013e-01, 1.1874824875965430e-17, + 2.1992523849833518e-34, 1.1025018564644483e-50), + qd_real( 7.4505778544146595e-01, 1.5078686911877863e-17, + 8.0898987212942471e-34, 8.2677958765323532e-50), + qd_real( 7.4300795213512172e-01, -2.5144629669719265e-17, + 7.1128989512526157e-34, 3.0181629077821220e-50), + qd_real( 7.4095112535495911e-01, -1.4708616952297345e-17, + -4.9550433827142032e-34, 3.1434132533735671e-50), + qd_real( 7.3888732446061511e-01, 3.4324874808225091e-17, + -1.3706639444717610e-33, -3.3520827530718938e-51), + qd_real( 7.3681656887736990e-01, -2.8932468101656295e-17, + -3.4649887126202378e-34, -1.8484474476291476e-50), + qd_real( 7.3473887809596350e-01, -3.4507595976263941e-17, + -2.3718000676666409e-33, -3.9696090387165402e-50), + qd_real( 7.3265427167241282e-01, 1.8918673481573520e-17, + -1.5123719544119886e-33, -9.7922152011625728e-51), + qd_real( 7.3056276922782759e-01, -2.9689959904476928e-17, + -1.1276871244239744e-33, -3.0531520961539007e-50), + qd_real( 7.2846439044822520e-01, 1.1924642323370718e-19, + 5.9001892316611011e-36, 1.2178089069502704e-52), + qd_real( 7.2635915508434601e-01, -3.1917502443460542e-17, + 7.7047912412039396e-34, 4.1455880160182123e-50), + qd_real( 7.2424708295146689e-01, 2.9198471334403004e-17, + 2.3027324968739464e-33, -1.2928820533892183e-51), + qd_real( 7.2212819392921535e-01, -2.3871262053452047e-17, + 1.0636125432862273e-33, -4.4598638837802517e-50), + qd_real( 7.2000250796138165e-01, -2.5689658854462333e-17, + -9.1492566948567925e-34, 4.4403780801267786e-50), + qd_real( 7.1787004505573171e-01, 2.7006476062511453e-17, + -2.2854956580215348e-34, 9.1726903890287867e-51), + qd_real( 7.1573082528381871e-01, -5.1581018476410262e-17, + -1.3736271349300259e-34, -1.2734611344111297e-50), + qd_real( 7.1358486878079364e-01, -4.2342504403133584e-17, + -4.2690366101617268e-34, -2.6352370883066522e-50), + qd_real( 7.1143219574521643e-01, 7.9643298613856813e-18, + 2.9488239510721469e-34, 1.6985236437666356e-50), + qd_real( 7.0927282643886569e-01, -3.7597359110245730e-17, + 1.0613125954645119e-34, 8.9465480185486032e-51), + qd_real( 7.0710678118654757e-01, -4.8336466567264567e-17, + 2.0693376543497068e-33, 2.4677734957341755e-50) +}; + +/* Computes sin(a) and cos(a) using Taylor series. + Assumes |a| <= pi/2048. */ +static void sincos_taylor(const qd_real &a, + qd_real &sin_a, qd_real &cos_a) { + const double thresh = 0.5 * qd_real::_eps * std::abs(to_double(a)); + qd_real p, s, t, x; + + if (a.is_zero()) { + sin_a = 0.0; + cos_a = 1.0; + return; + } + + x = -sqr(a); + s = a; + p = a; + int i = 0; + do { + p *= x; + t = p * inv_fact[i]; + s += t; + i += 2; + } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); + + sin_a = s; + cos_a = sqrt(1.0 - sqr(s)); +} + +static qd_real sin_taylor(const qd_real &a) { + const double thresh = 0.5 * qd_real::_eps * std::abs(to_double(a)); + qd_real p, s, t, x; + + if (a.is_zero()) { + return 0.0; + } + + x = -sqr(a); + s = a; + p = a; + int i = 0; + do { + p *= x; + t = p * inv_fact[i]; + s += t; + i += 2; + } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); + + return s; +} + +static qd_real cos_taylor(const qd_real &a) { + const double thresh = 0.5 * qd_real::_eps; + qd_real p, s, t, x; + + if (a.is_zero()) { + return 1.0; + } + + x = -sqr(a); + s = 1.0 + mul_pwr2(x, 0.5); + p = x; + int i = 1; + do { + p *= x; + t = p * inv_fact[i]; + s += t; + i += 2; + } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); + + return s; +} + +qd_real sin(const qd_real &a) { + + /* Strategy. To compute sin(x), we choose integers a, b so that + + x = s + a * (pi/2) + b * (pi/1024) + + and |s| <= pi/2048. Using a precomputed table of + sin(k pi / 1024) and cos(k pi / 1024), we can compute + sin(x) from sin(s) and cos(s). This greatly increases the + convergence of the sine Taylor series. */ + + if (a.is_zero()) { + return 0.0; + } + + // approximately reduce modulo 2*pi + qd_real z = nint(a / qd_real::_2pi); + qd_real r = a - qd_real::_2pi * z; + + // approximately reduce modulo pi/2 and then modulo pi/1024 + double q = std::floor(r.x[0] / qd_real::_pi2[0] + 0.5); + qd_real t = r - qd_real::_pi2 * q; + int j = static_cast(q); + q = std::floor(t.x[0] / _pi1024[0] + 0.5); + t -= _pi1024 * q; + int k = static_cast(q); + int abs_k = std::abs(k); + + if (j < -2 || j > 2) { + qd_real::error("(qd_real::sin): Cannot reduce modulo pi/2."); + return qd_real::_nan; + } + + if (abs_k > 256) { + qd_real::error("(qd_real::sin): Cannot reduce modulo pi/1024."); + return qd_real::_nan; + } + + if (k == 0) { + switch (j) { + case 0: + return sin_taylor(t); + case 1: + return cos_taylor(t); + case -1: + return -cos_taylor(t); + default: + return -sin_taylor(t); + } + } + + qd_real sin_t, cos_t; + qd_real u = cos_table[abs_k-1]; + qd_real v = sin_table[abs_k-1]; + sincos_taylor(t, sin_t, cos_t); + + if (j == 0) { + if (k > 0) { + r = u * sin_t + v * cos_t; + } else { + r = u * sin_t - v * cos_t; + } + } else if (j == 1) { + if (k > 0) { + r = u * cos_t - v * sin_t; + } else { + r = u * cos_t + v * sin_t; + } + } else if (j == -1) { + if (k > 0) { + r = v * sin_t - u * cos_t; + } else { + r = - u * cos_t - v * sin_t; + } + } else { + if (k > 0) { + r = - u * sin_t - v * cos_t; + } else { + r = v * cos_t - u * sin_t; + } + } + + return r; +} + +qd_real cos(const qd_real &a) { + + if (a.is_zero()) { + return 1.0; + } + + // approximately reduce modulo 2*pi + qd_real z = nint(a / qd_real::_2pi); + qd_real r = a - qd_real::_2pi * z; + + // approximately reduce modulo pi/2 and then modulo pi/1024 + double q = std::floor(r.x[0] / qd_real::_pi2.x[0] + 0.5); + qd_real t = r - qd_real::_pi2 * q; + int j = static_cast(q); + q = std::floor(t.x[0] / _pi1024.x[0] + 0.5); + t -= _pi1024 * q; + int k = static_cast(q); + int abs_k = std::abs(k); + + if (j < -2 || j > 2) { + qd_real::error("(qd_real::cos): Cannot reduce modulo pi/2."); + return qd_real::_nan; + } + + if (abs_k > 256) { + qd_real::error("(qd_real::cos): Cannot reduce modulo pi/1024."); + return qd_real::_nan; + } + + if (k == 0) { + switch (j) { + case 0: + return cos_taylor(t); + case 1: + return -sin_taylor(t); + case -1: + return sin_taylor(t); + default: + return -cos_taylor(t); + } + } + + qd_real sin_t, cos_t; + sincos_taylor(t, sin_t, cos_t); + + qd_real u = cos_table[abs_k-1]; + qd_real v = sin_table[abs_k-1]; + + if (j == 0) { + if (k > 0) { + r = u * cos_t - v * sin_t; + } else { + r = u * cos_t + v * sin_t; + } + } else if (j == 1) { + if (k > 0) { + r = - u * sin_t - v * cos_t; + } else { + r = v * cos_t - u * sin_t; + } + } else if (j == -1) { + if (k > 0) { + r = u * sin_t + v * cos_t; + } else { + r = u * sin_t - v * cos_t; + } + } else { + if (k > 0) { + r = v * sin_t - u * cos_t; + } else { + r = - u * cos_t - v * sin_t; + } + } + + return r; +} + +void sincos(const qd_real &a, qd_real &sin_a, qd_real &cos_a) { + + if (a.is_zero()) { + sin_a = 0.0; + cos_a = 1.0; + return; + } + + // approximately reduce by 2*pi + qd_real z = nint(a / qd_real::_2pi); + qd_real t = a - qd_real::_2pi * z; + + // approximately reduce by pi/2 and then by pi/1024. + double q = std::floor(t.x[0] / qd_real::_pi2.x[0] + 0.5); + t -= qd_real::_pi2 * q; + int j = static_cast(q); + q = std::floor(t.x[0] / _pi1024.x[0] + 0.5); + t -= _pi1024 * q; + int k = static_cast(q); + int abs_k = std::abs(k); + + if (j < -2 || j > 2) { + qd_real::error("(qd_real::sincos): Cannot reduce modulo pi/2."); + cos_a = sin_a = qd_real::_nan; + return; + } + + if (abs_k > 256) { + qd_real::error("(qd_real::sincos): Cannot reduce modulo pi/1024."); + cos_a = sin_a = qd_real::_nan; + return; + } + + qd_real sin_t, cos_t; + sincos_taylor(t, sin_t, cos_t); + + if (k == 0) { + if (j == 0) { + sin_a = sin_t; + cos_a = cos_t; + } else if (j == 1) { + sin_a = cos_t; + cos_a = -sin_t; + } else if (j == -1) { + sin_a = -cos_t; + cos_a = sin_t; + } else { + sin_a = -sin_t; + cos_a = -cos_t; + } + return; + } + + qd_real u = cos_table[abs_k-1]; + qd_real v = sin_table[abs_k-1]; + + if (j == 0) { + if (k > 0) { + sin_a = u * sin_t + v * cos_t; + cos_a = u * cos_t - v * sin_t; + } else { + sin_a = u * sin_t - v * cos_t; + cos_a = u * cos_t + v * sin_t; + } + } else if (j == 1) { + if (k > 0) { + cos_a = - u * sin_t - v * cos_t; + sin_a = u * cos_t - v * sin_t; + } else { + cos_a = v * cos_t - u * sin_t; + sin_a = u * cos_t + v * sin_t; + } + } else if (j == -1) { + if (k > 0) { + cos_a = u * sin_t + v * cos_t; + sin_a = v * sin_t - u * cos_t; + } else { + cos_a = u * sin_t - v * cos_t; + sin_a = - u * cos_t - v * sin_t; + } + } else { + if (k > 0) { + sin_a = - u * sin_t - v * cos_t; + cos_a = v * sin_t - u * cos_t; + } else { + sin_a = v * cos_t - u * sin_t; + cos_a = - u * cos_t - v * sin_t; + } + } +} + +qd_real atan(const qd_real &a) { + return atan2(a, qd_real(1.0)); +} + +qd_real atan2(const qd_real &y, const qd_real &x) { + /* Strategy: Instead of using Taylor series to compute + arctan, we instead use Newton's iteration to solve + the equation + + sin(z) = y/r or cos(z) = x/r + + where r = sqrt(x^2 + y^2). + The iteration is given by + + z' = z + (y - sin(z)) / cos(z) (for equation 1) + z' = z - (x - cos(z)) / sin(z) (for equation 2) + + Here, x and y are normalized so that x^2 + y^2 = 1. + If |x| > |y|, then first iteration is used since the + denominator is larger. Otherwise, the second is used. + */ + + if (x.is_zero()) { + + if (y.is_zero()) { + /* Both x and y is zero. */ + qd_real::error("(qd_real::atan2): Both arguments zero."); + return qd_real::_nan; + } + + return (y.is_positive()) ? qd_real::_pi2 : -qd_real::_pi2; + } else if (y.is_zero()) { + return (x.is_positive()) ? qd_real(0.0) : qd_real::_pi; + } + + if (x == y) { + return (y.is_positive()) ? qd_real::_pi4 : -qd_real::_3pi4; + } + + if (x == -y) { + return (y.is_positive()) ? qd_real::_3pi4 : -qd_real::_pi4; + } + + qd_real r = sqrt(sqr(x) + sqr(y)); + qd_real xx = x / r; + qd_real yy = y / r; + + /* Compute double precision approximation to atan. */ + qd_real z = std::atan2(to_double(y), to_double(x)); + qd_real sin_z, cos_z; + + if (std::abs(xx.x[0]) > std::abs(yy.x[0])) { + /* Use Newton iteration 1. z' = z + (y - sin(z)) / cos(z) */ + sincos(z, sin_z, cos_z); + z += (yy - sin_z) / cos_z; + sincos(z, sin_z, cos_z); + z += (yy - sin_z) / cos_z; + sincos(z, sin_z, cos_z); + z += (yy - sin_z) / cos_z; + } else { + /* Use Newton iteration 2. z' = z - (x - cos(z)) / sin(z) */ + sincos(z, sin_z, cos_z); + z -= (xx - cos_z) / sin_z; + sincos(z, sin_z, cos_z); + z -= (xx - cos_z) / sin_z; + sincos(z, sin_z, cos_z); + z -= (xx - cos_z) / sin_z; + } + + return z; +} + + +qd_real drem(const qd_real &a, const qd_real &b) { + qd_real n = nint(a/b); + return (a - n * b); +} + +qd_real divrem(const qd_real &a, const qd_real &b, qd_real &r) { + qd_real n = nint(a/b); + r = a - n * b; + return n; +} + +qd_real tan(const qd_real &a) { + qd_real s, c; + sincos(a, s, c); + return s/c; +} + +qd_real asin(const qd_real &a) { + qd_real abs_a = abs(a); + + if (abs_a > 1.0) { + qd_real::error("(qd_real::asin): Argument out of domain."); + return qd_real::_nan; + } + + if (abs_a.is_one()) { + return (a.is_positive()) ? qd_real::_pi2 : -qd_real::_pi2; + } + + return atan2(a, sqrt(1.0 - sqr(a))); +} + +qd_real acos(const qd_real &a) { + qd_real abs_a = abs(a); + + if (abs_a > 1.0) { + qd_real::error("(qd_real::acos): Argument out of domain."); + return qd_real::_nan; + } + + if (abs_a.is_one()) { + return (a.is_positive()) ? qd_real(0.0) : qd_real::_pi; + } + + return atan2(sqrt(1.0 - sqr(a)), a); +} + +qd_real sinh(const qd_real &a) { + if (a.is_zero()) { + return 0.0; + } + + if (abs(a) > 0.05) { + qd_real ea = exp(a); + return mul_pwr2(ea - inv(ea), 0.5); + } + + /* Since a is small, using the above formula gives + a lot of cancellation. So use Taylor series. */ + qd_real s = a; + qd_real t = a; + qd_real r = sqr(t); + double m = 1.0; + double thresh = std::abs(to_double(a) * qd_real::_eps); + + do { + m += 2.0; + t *= r; + t /= (m-1) * m; + + s += t; + } while (abs(t) > thresh); + + return s; +} + +qd_real cosh(const qd_real &a) { + if (a.is_zero()) { + return 1.0; + } + + qd_real ea = exp(a); + return mul_pwr2(ea + inv(ea), 0.5); +} + +qd_real tanh(const qd_real &a) { + if (a.is_zero()) { + return 0.0; + } + + if (std::abs(to_double(a)) > 0.05) { + qd_real ea = exp(a); + qd_real inv_ea = inv(ea); + return (ea - inv_ea) / (ea + inv_ea); + } else { + qd_real s, c; + s = sinh(a); + c = sqrt(1.0 + sqr(s)); + return s / c; + } +} + +void sincosh(const qd_real &a, qd_real &s, qd_real &c) { + if (std::abs(to_double(a)) <= 0.05) { + s = sinh(a); + c = sqrt(1.0 + sqr(s)); + } else { + qd_real ea = exp(a); + qd_real inv_ea = inv(ea); + s = mul_pwr2(ea - inv_ea, 0.5); + c = mul_pwr2(ea + inv_ea, 0.5); + } +} + +qd_real asinh(const qd_real &a) { + return log(a + sqrt(sqr(a) + 1.0)); +} + +qd_real acosh(const qd_real &a) { + if (a < 1.0) { + qd_real::error("(qd_real::acosh): Argument out of domain."); + return qd_real::_nan; + } + + return log(a + sqrt(sqr(a) - 1.0)); +} + +qd_real atanh(const qd_real &a) { + if (abs(a) >= 1.0) { + qd_real::error("(qd_real::atanh): Argument out of domain."); + return qd_real::_nan; + } + + return mul_pwr2(log((1.0 + a) / (1.0 - a)), 0.5); +} + +QD_API qd_real fmod(const qd_real &a, const qd_real &b) { + qd_real n = aint(a / b); + return (a - b * n); +} + +QD_API qd_real qdrand() { + static const double m_const = 4.6566128730773926e-10; /* = 2^{-31} */ + double m = m_const; + qd_real r = 0.0; + double d; + + /* Strategy: Generate 31 bits at a time, using lrand48 + random number generator. Shift the bits, and repeat + 7 times. */ + + for (int i = 0; i < 7; i++, m *= m_const) { + d = std::rand() * m; + r += d; + } + + return r; +} + + +/* polyeval(c, n, x) + Evaluates the given n-th degree polynomial at x. + The polynomial is given by the array of (n+1) coefficients. */ +qd_real polyeval(const qd_real *c, int n, const qd_real &x) { + /* Just use Horner's method of polynomial evaluation. */ + qd_real r = c[n]; + + for (int i = n-1; i >= 0; i--) { + r *= x; + r += c[i]; + } + + return r; +} + +/* polyroot(c, n, x0) + Given an n-th degree polynomial, finds a root close to + the given guess x0. Note that this uses simple Newton + iteration scheme, and does not work for multiple roots. */ +QD_API qd_real polyroot(const qd_real *c, int n, + const qd_real &x0, int max_iter, double thresh) { + qd_real x = x0; + qd_real f; + qd_real *d = new qd_real[n]; + bool conv = false; + int i; + double max_c = std::abs(to_double(c[0])); + double v; + + if (thresh == 0.0) thresh = qd_real::_eps; + + /* Compute the coefficients of the derivatives. */ + for (i = 1; i <= n; i++) { + v = std::abs(to_double(c[i])); + if (v > max_c) max_c = v; + d[i-1] = c[i] * static_cast(i); + } + thresh *= max_c; + + /* Newton iteration. */ + for (i = 0; i < max_iter; i++) { + f = polyeval(c, n, x); + + if (abs(f) < thresh) { + conv = true; + break; + } + x -= (f / polyeval(d, n-1, x)); + } + delete [] d; + + if (!conv) { + qd_real::error("(qd_real::polyroot): Failed to converge."); + return qd_real::_nan; + } + + return x; +} + +qd_real qd_real::debug_rand() { + if (std::rand() % 2 == 0) + return qdrand(); + + int expn = 0; + qd_real a = 0.0; + double d; + for (int i = 0; i < 4; i++) { + d = std::ldexp(std::rand() / static_cast(RAND_MAX), -expn); + a += d; + expn = expn + 54 + std::rand() % 200; + } + return a; +} + diff --git a/external/PackedCSparse/qd/qd_real.h b/external/PackedCSparse/qd/qd_real.h new file mode 100644 index 000000000..1ecfc732c --- /dev/null +++ b/external/PackedCSparse/qd/qd_real.h @@ -0,0 +1,296 @@ +/* + * include/qd_real.h + * + * This work was supported by the Director, Office of Science, Division + * of Mathematical, Information, and Computational Sciences of the + * U.S. Department of Energy under contract number DE-AC03-76SF00098. + * + * Copyright (c) 2000-2007 + * + * Quad-double precision (>= 212-bit significand) floating point arithmetic + * package, written in ANSI C++, taking full advantage of operator overloading. + * Uses similar techniques as that of David Bailey's double-double package + * and that of Jonathan Shewchuk's adaptive precision floating point + * arithmetic package. See + * + * http://www.nersc.gov/~dhbailey/mpdist/mpdist.html + * http://www.cs.cmu.edu/~quake/robust.html + * + * for more details. + * + * Yozo Hida + */ +#ifndef _QD_QD_REAL_H +#define _QD_QD_REAL_H + +#include +#include +#include +#include "qd_config.h" +#include "dd_real.h" + +struct QD_API qd_real { + double x[4]; /* The Components. */ + + /* Eliminates any zeros in the middle component(s). */ + void zero_elim(); + void zero_elim(double &e); + + void renorm(); + void renorm(double &e); + + void quick_accum(double d, double &e); + void quick_prod_accum(double a, double b, double &e); + + qd_real(double x0, double x1, double x2, double x3); + explicit qd_real(const double *xx); + + static const qd_real _2pi; + static const qd_real _pi; + static const qd_real _3pi4; + static const qd_real _pi2; + static const qd_real _pi4; + static const qd_real _e; + static const qd_real _log2; + static const qd_real _log10; + static const qd_real _nan; + static const qd_real _inf; + + static const double _eps; + static const double _min_normalized; + static const qd_real _max; + static const qd_real _safe_max; + static const int _ndigits; + + qd_real(); + qd_real(const char *s); + qd_real(const dd_real &dd); + qd_real(double d); + qd_real(int i); + + double operator[](int i) const; + double &operator[](int i); + + static void error(const char *msg); + + bool isnan() const; + bool isfinite() const { return QD_ISFINITE(x[0]); } + bool isinf() const { return QD_ISINF(x[0]); } + + static qd_real ieee_add(const qd_real &a, const qd_real &b); + static qd_real sloppy_add(const qd_real &a, const qd_real &b); + + qd_real &operator+=(double a); + qd_real &operator+=(const dd_real &a); + qd_real &operator+=(const qd_real &a); + + qd_real &operator-=(double a); + qd_real &operator-=(const dd_real &a); + qd_real &operator-=(const qd_real &a); + + static qd_real sloppy_mul(const qd_real &a, const qd_real &b); + static qd_real accurate_mul(const qd_real &a, const qd_real &b); + + qd_real &operator*=(double a); + qd_real &operator*=(const dd_real &a); + qd_real &operator*=(const qd_real &a); + + static qd_real sloppy_div(const qd_real &a, const dd_real &b); + static qd_real accurate_div(const qd_real &a, const dd_real &b); + static qd_real sloppy_div(const qd_real &a, const qd_real &b); + static qd_real accurate_div(const qd_real &a, const qd_real &b); + + qd_real &operator/=(double a); + qd_real &operator/=(const dd_real &a); + qd_real &operator/=(const qd_real &a); + + qd_real operator^(int n) const; + + qd_real operator-() const; + + qd_real &operator=(double a); + qd_real &operator=(const dd_real &a); + qd_real &operator=(const char *s); + + bool is_zero() const; + bool is_one() const; + bool is_positive() const; + bool is_negative() const; + + explicit operator bool() const; // new + explicit operator double() const; // new + + static qd_real rand(void); + + void to_digits(char *s, int &expn, int precision = _ndigits) const; + void write(char *s, int len, int precision = _ndigits, + bool showpos = false, bool uppercase = false) const; + std::string to_string(int precision = _ndigits, int width = 0, + std::ios_base::fmtflags fmt = static_cast(0), + bool showpos = false, bool uppercase = false, char fill = ' ') const; + static int read(const char *s, qd_real &a); + + /* Debugging methods */ + void dump(const std::string &name, std::ostream &os = std::cerr) const; + void dump_bits(const std::string &name, + std::ostream &os = std::cerr) const; + + static qd_real debug_rand(); + +}; + +namespace std { + template <> + class numeric_limits : public numeric_limits { + public: + inline static double epsilon() { return qd_real::_eps; } + inline static double min() { return qd_real::_min_normalized; } + inline static qd_real max() { return qd_real::_max; } + inline static qd_real safe_max() { return qd_real::_safe_max; } + static const int digits = 209; + static const int digits10 = 62; + }; +} + +QD_API qd_real polyeval(const qd_real *c, int n, const qd_real &x); +QD_API qd_real polyroot(const qd_real *c, int n, + const qd_real &x0, int max_iter = 64, double thresh = 0.0); + +QD_API qd_real qdrand(void); +QD_API qd_real sqrt(const qd_real &a); + +QD_API inline bool isnan(const qd_real &a) { return a.isnan(); } +QD_API inline bool isfinite(const qd_real &a) { return a.isfinite(); } +QD_API inline bool isinf(const qd_real &a) { return a.isinf(); } + +/* Computes qd * d where d is known to be a power of 2. + This can be done component wise. */ +QD_API qd_real mul_pwr2(const qd_real &qd, double d); + +QD_API qd_real operator+(const qd_real &a, const qd_real &b); +QD_API qd_real operator+(const dd_real &a, const qd_real &b); +QD_API qd_real operator+(const qd_real &a, const dd_real &b); +QD_API qd_real operator+(const qd_real &a, double b); +QD_API qd_real operator+(double a, const qd_real &b); + +QD_API qd_real operator-(const qd_real &a, const qd_real &b); +QD_API qd_real operator-(const dd_real &a, const qd_real &b); +QD_API qd_real operator-(const qd_real &a, const dd_real &b); +QD_API qd_real operator-(const qd_real &a, double b); +QD_API qd_real operator-(double a, const qd_real &b); + +QD_API qd_real operator*(const qd_real &a, const qd_real &b); +QD_API qd_real operator*(const dd_real &a, const qd_real &b); +QD_API qd_real operator*(const qd_real &a, const dd_real &b); +QD_API qd_real operator*(const qd_real &a, double b); +QD_API qd_real operator*(double a, const qd_real &b); + +QD_API qd_real operator/(const qd_real &a, const qd_real &b); +QD_API qd_real operator/(const dd_real &a, const qd_real &b); +QD_API qd_real operator/(const qd_real &a, const dd_real &b); +QD_API qd_real operator/(const qd_real &a, double b); +QD_API qd_real operator/(double a, const qd_real &b); + +QD_API qd_real sqr(const qd_real &a); +QD_API qd_real sqrt(const qd_real &a); +QD_API qd_real pow(const qd_real &a, int n); +QD_API qd_real pow(const qd_real &a, const qd_real &b); +QD_API qd_real npwr(const qd_real &a, int n); + +QD_API qd_real nroot(const qd_real &a, int n); + +QD_API qd_real rem(const qd_real &a, const qd_real &b); +QD_API qd_real drem(const qd_real &a, const qd_real &b); +QD_API qd_real divrem(const qd_real &a, const qd_real &b, qd_real &r); + +dd_real to_dd_real(const qd_real &a); +double to_double(const qd_real &a); +int to_int(const qd_real &a); + +QD_API bool operator==(const qd_real &a, const qd_real &b); +QD_API bool operator==(const qd_real &a, const dd_real &b); +QD_API bool operator==(const dd_real &a, const qd_real &b); +QD_API bool operator==(double a, const qd_real &b); +QD_API bool operator==(const qd_real &a, double b); + +QD_API bool operator<(const qd_real &a, const qd_real &b); +QD_API bool operator<(const qd_real &a, const dd_real &b); +QD_API bool operator<(const dd_real &a, const qd_real &b); +QD_API bool operator<(double a, const qd_real &b); +QD_API bool operator<(const qd_real &a, double b); + +QD_API bool operator>(const qd_real &a, const qd_real &b); +QD_API bool operator>(const qd_real &a, const dd_real &b); +QD_API bool operator>(const dd_real &a, const qd_real &b); +QD_API bool operator>(double a, const qd_real &b); +QD_API bool operator>(const qd_real &a, double b); + +QD_API bool operator<=(const qd_real &a, const qd_real &b); +QD_API bool operator<=(const qd_real &a, const dd_real &b); +QD_API bool operator<=(const dd_real &a, const qd_real &b); +QD_API bool operator<=(double a, const qd_real &b); +QD_API bool operator<=(const qd_real &a, double b); + +QD_API bool operator>=(const qd_real &a, const qd_real &b); +QD_API bool operator>=(const qd_real &a, const dd_real &b); +QD_API bool operator>=(const dd_real &a, const qd_real &b); +QD_API bool operator>=(double a, const qd_real &b); +QD_API bool operator>=(const qd_real &a, double b); + +QD_API bool operator!=(const qd_real &a, const qd_real &b); +QD_API bool operator!=(const qd_real &a, const dd_real &b); +QD_API bool operator!=(const dd_real &a, const qd_real &b); +QD_API bool operator!=(double a, const qd_real &b); +QD_API bool operator!=(const qd_real &a, double b); + +QD_API qd_real fabs(const qd_real &a); +QD_API qd_real abs(const qd_real &a); /* same as fabs */ + +QD_API qd_real ldexp(const qd_real &a, int n); + +QD_API qd_real nint(const qd_real &a); +QD_API qd_real quick_nint(const qd_real &a); +QD_API qd_real floor(const qd_real &a); +QD_API qd_real ceil(const qd_real &a); +QD_API qd_real aint(const qd_real &a); + +QD_API qd_real sin(const qd_real &a); +QD_API qd_real cos(const qd_real &a); +QD_API qd_real tan(const qd_real &a); +QD_API void sincos(const qd_real &a, qd_real &s, qd_real &c); + +QD_API qd_real asin(const qd_real &a); +QD_API qd_real acos(const qd_real &a); +QD_API qd_real atan(const qd_real &a); +QD_API qd_real atan2(const qd_real &y, const qd_real &x); + +QD_API qd_real exp(const qd_real &a); +QD_API qd_real log(const qd_real &a); +QD_API qd_real log10(const qd_real &a); + +QD_API qd_real sinh(const qd_real &a); +QD_API qd_real cosh(const qd_real &a); +QD_API qd_real tanh(const qd_real &a); +QD_API void sincosh(const qd_real &a, qd_real &sin_qd, qd_real &cos_qd); + +QD_API qd_real asinh(const qd_real &a); +QD_API qd_real acosh(const qd_real &a); +QD_API qd_real atanh(const qd_real &a); + +QD_API qd_real qdrand(void); + +QD_API qd_real max(const qd_real &a, const qd_real &b); +QD_API qd_real max(const qd_real &a, const qd_real &b, const qd_real &c); +QD_API qd_real min(const qd_real &a, const qd_real &b); +QD_API qd_real min(const qd_real &a, const qd_real &b, const qd_real &c); + +QD_API qd_real fmod(const qd_real &a, const qd_real &b); + +QD_API std::ostream &operator<<(std::ostream &s, const qd_real &a); +QD_API std::istream &operator>>(std::istream &s, qd_real &a); +#ifdef QD_INLINE +#include "qd_inline.h" +#endif + +#endif /* _QD_QD_REAL_H */ + diff --git a/external/PackedCSparse/qd/util.cc b/external/PackedCSparse/qd/util.cc new file mode 100644 index 000000000..ab9620817 --- /dev/null +++ b/external/PackedCSparse/qd/util.cc @@ -0,0 +1,22 @@ +#include +#include "util.h" + +void append_expn(std::string &str, int expn) { + int k; + + str += (expn < 0 ? '-' : '+'); + expn = std::abs(expn); + + if (expn >= 100) { + k = (expn / 100); + str += '0' + k; + expn -= 100*k; + } + + k = (expn / 10); + str += '0' + k; + expn -= 10*k; + + str += '0' + expn; +} + diff --git a/external/PackedCSparse/qd/util.h b/external/PackedCSparse/qd/util.h new file mode 100644 index 000000000..7de358363 --- /dev/null +++ b/external/PackedCSparse/qd/util.h @@ -0,0 +1,4 @@ +#include + +void append_expn(std::string &str, int expn); + diff --git a/external/cmake-files/QD.cmake b/external/cmake-files/QD.cmake index b65e4f51c..a2e3e5e6d 100644 --- a/external/cmake-files/QD.cmake +++ b/external/cmake-files/QD.cmake @@ -1,54 +1,18 @@ set(QD_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) function(GetQD) - find_path(QD_DIR NAMES config.h PATHS ${QD_CMAKE_DIR}/../_deps/qd-src/) - - if (NOT QD_DIR) - include(FetchContent) - set(FETCHCONTENT_BASE_DIR "${QD_CMAKE_DIR}/../_deps") - FetchContent_Declare( - qd - URL https://www.davidhbailey.com/dhbsoftware/qd-2.3.23.tar.gz - ) - - FetchContent_GetProperties(qd) - - if(NOT qd_POPULATED) - message(STATUS "QD library not found locally, downloading it.") - FetchContent_Populate(qd) - endif() - - set(QD_DIR "${qd_SOURCE_DIR}") - message(STATUS "Using downloaded QD at: ${QD_DIR}") - - else() - - message(STATUS "QD library found: ${QD_DIR}") - - endif() - - include_directories(BEFORE "${QD_DIR}/include/") - message(STATUS "configuring the QD library") - execute_process( - COMMAND ./configure - WORKING_DIRECTORY ${QD_DIR} - OUTPUT_FILE CMD_OUTPUT - RESULT_VARIABLE EXECUTE - ) - if(NOT ${EXECUTE} EQUAL "0") - message(FATAL_ERROR "./configure QD library failed") - endif() - - execute_process( - COMMAND make - WORKING_DIRECTORY ${QD_DIR} - OUTPUT_FILE qd_compilation.txt - RESULT_VARIABLE EXECUTE_MAKE - ) - - if(NOT ${EXECUTE_MAKE} EQUAL "0") - message(FATAL_ERROR "building the QD library failed") - endif() - - find_library(QD_LIB NAMES libqd.a PATHS "${QD_DIR}/src/.libs") + set(QD_DIR "${QD_CMAKE_DIR}/../PackedCSparse/qd") + include_directories(BEFORE "${QD_DIR}") + set(QD_SOURCES + ${QD_DIR}/bits.cc + ${QD_DIR}/c_dd.cc + ${QD_DIR}/c_qd.cc + ${QD_DIR}/dd_const.cc + ${QD_DIR}/dd_real.cc + ${QD_DIR}/fpu.cc + ${QD_DIR}/qd_const.cc + ${QD_DIR}/qd_real.cc + ${QD_DIR}/util.cc + ) + add_library(QD_LIB ${QD_SOURCES}) endfunction() diff --git a/include/ode_solvers/implicit_midpoint.hpp b/include/ode_solvers/implicit_midpoint.hpp index 71408e542..786734d84 100644 --- a/include/ode_solvers/implicit_midpoint.hpp +++ b/include/ode_solvers/implicit_midpoint.hpp @@ -53,16 +53,15 @@ inline std::vector operator-(const std::vector &v1, return v1 + v2 * (-1.0); } -template +template struct ImplicitMidpointODESolver { using VT = typename Polytope::VT; using MT = typename Polytope::MT; - using pts = std::vector; - using hamiltonian = Hamiltonian; + using pts = std::vector; + using hamiltonian = Hamiltonian; using Opts = opts; unsigned int dim; - NT eta; int num_steps = 0; NT t; @@ -75,17 +74,14 @@ struct ImplicitMidpointODESolver { func F; Polytope &P; Opts &options; - VT nu; - + MT nu; + int num_runs = 0; hamiltonian ham; - bool done; #ifdef TIME_KEEPING std::chrono::time_point start, end; - std::chrono::duration DU_duration = - std::chrono::duration::zero(); - std::chrono::duration approxDK_duration = - std::chrono::duration::zero(); + std::chrono::duration DU_duration = std::chrono::duration::zero(); + std::chrono::duration approxDK_duration = std::chrono::duration::zero(); #endif ImplicitMidpointODESolver(NT initial_time, NT step, @@ -101,10 +97,11 @@ struct ImplicitMidpointODESolver { options(user_options), ham(hamiltonian(boundaries)) { - dim = xs[0].dimension(); + dim = xs[0].rows(); }; void step(int k, bool accepted) { + num_runs++; pts partialDerivatives; #ifdef TIME_KEEPING start = std::chrono::system_clock::now(); @@ -117,7 +114,7 @@ struct ImplicitMidpointODESolver { xs = xs + partialDerivatives * (eta / 2); xs_prev = xs; done = false; - nu = VT::Zero(P.equations()); + nu = MT::Zero(P.equations(), simdLen); for (int i = 0; i < options.maxODEStep; i++) { pts xs_old = xs; pts xmid = (xs_prev + xs) / 2.0; @@ -125,20 +122,21 @@ struct ImplicitMidpointODESolver { start = std::chrono::system_clock::now(); #endif partialDerivatives = ham.approxDK(xmid, nu); + #ifdef TIME_KEEPING end = std::chrono::system_clock::now(); approxDK_duration += end - start; #endif xs = xs_prev + partialDerivatives * (eta); - NT dist = ham.x_norm(xmid, xs - xs_old) / eta; - NT maxdist = dist; + VT dist = ham.x_norm(xmid, xs - xs_old) / eta; + NT maxdist = dist.maxCoeff(); //If the estimate does not change terminate if (maxdist < options.implicitTol) { done = true; num_steps = i; break; - //If the estimate is very bad sample another velocity - } else if (maxdist > options.convergence_limit) { + //If the estimate is very bad, sample another velocity + } else if (maxdist > options.convergence_bound) { xs = xs * std::nan("1"); done = true; num_steps = i; @@ -163,16 +161,15 @@ struct ImplicitMidpointODESolver { } } - Point get_state(int index) { return xs[index]; } + MT get_state(int index) { return xs[index]; } - void set_state(int index, Point p) { xs[index] = p; } - void print_state() { + void set_state(int index, MT p) { xs[index] = p; } + template + void print_state(StreamType &stream) { for (int j = 0; j < xs.size(); j++) { - std::cerr << "state " << j << ": "; - for (unsigned int i = 0; i < xs[j].dimension(); i++) { - std::cerr << xs[j][i] << " "; - } - std::cerr << '\n'; + stream << "state " << j << ": \n"; + stream << xs[j]; + stream << '\n'; } } }; diff --git a/include/ode_solvers/oracle_functors.hpp b/include/ode_solvers/oracle_functors.hpp index 056e96c3a..3aea450b2 100644 --- a/include/ode_solvers/oracle_functors.hpp +++ b/include/ode_solvers/oracle_functors.hpp @@ -142,11 +142,11 @@ struct IsotropicQuadraticFunctor { return xs[i + 1]; // returns derivative } } - - Point operator()(Point const&x){ - Point y = (-params.alpha)*x; - return y; - } + + Point operator()(Point const &x){ + Point y = (-params.alpha) * x; + return y; + } }; diff --git a/include/ode_solvers/oracle_functors_rcpp.hpp b/include/ode_solvers/oracle_functors_rcpp.hpp index 558ac1b07..853dcb3c0 100644 --- a/include/ode_solvers/oracle_functors_rcpp.hpp +++ b/include/ode_solvers/oracle_functors_rcpp.hpp @@ -91,6 +91,17 @@ struct RcppFunctor { } } + Point operator() (Point const& x) const { + VT y = Rcpp::as(neg_grad_f(Rcpp::wrap(x.getCoefficients()))); + + Point z(y); + + if (negate) z = (-1.0) * z; + + // Return result as Point + return z; + } + }; // Negative log-probability functor @@ -118,6 +129,31 @@ struct RcppFunctor { }; + // Log-probability hessian functor + template + < + typename Point + > + struct HessianFunctor { + typedef typename Point::FT NT; + typedef typename Point::Coeff VT; + + parameters params; + Rcpp::Function hessian; // Negative hessian as an Rcpp::Function + + HessianFunctor( + parameters params_, + Rcpp::Function hessian_) : + params(params_), + hessian(hessian_) + {}; + + Point operator() (Point const& x) const { + VT y= Rcpp::as(hessian(Rcpp::wrap(x.getCoefficients()))); + return Point(y); + } + + }; }; #endif diff --git a/include/preprocess/crhmc/analytic_center.h b/include/preprocess/crhmc/analytic_center.h index 35d4349aa..7124626b4 100644 --- a/include/preprocess/crhmc/analytic_center.h +++ b/include/preprocess/crhmc/analytic_center.h @@ -27,14 +27,6 @@ #endif const size_t chol_k2 = (SIMD_LEN == 0) ? 1 : SIMD_LEN; -using NT = double; -using MT = Eigen::Matrix; -using VT = Eigen::Matrix; -using SpMat = Eigen::SparseMatrix; -using CholObj = PackedChol; -using Triple = Eigen::Triplet; -using Tx = FloatArray; -using Opts = opts; /*This function computes the analytic center of the polytope*/ //And detects additional constraint that need to be added // x - It outputs the minimizer of min f(x) subjects to {Ax=b} @@ -43,9 +35,12 @@ using Opts = opts; // because of the dom(f), the algorithm will detect the collapsed dimension // and output the detected constraint C x = d // d - detected constraint vector -template +template std::tuple analytic_center(SpMat const &A, VT const &b, Polytope &f, Opts const &options, VT x = VT::Zero(0, 1)) { + using CholObj = typename Polytope::CholObj; + using Triple = typename Polytope::Triple; + using Tx = typename Polytope::Tx; // initial conditions int n = A.cols(); int m = A.rows(); @@ -65,7 +60,7 @@ std::tuple analytic_center(SpMat const &A, VT const &b, Polytope std::vector idx; CholObj solver = CholObj(transform_format(A)); - + solver.accuracyThreshold = 0; for (int iter = 0; iter < options.ipmMaxIter; iter++) { std::pair pair_analytic_oracle = f.analytic_center_oracle(x); @@ -159,14 +154,14 @@ std::tuple analytic_center(SpMat const &A, VT const &b, Polytope std::pair pboundary = f.barrier.boundary(x); VT A_ = pboundary.first; VT b_ = pboundary.second; - A_ = A_(idx); std::vector sparseIdx; for (int i = 0; i < idx.size(); i++) { - sparseIdx.push_back(Triple(i, i, A_(i))); + sparseIdx.push_back(Triple(i, idx[i], A_(idx[i]))); } C.setFromTriplets(sparseIdx.begin(), sparseIdx.end()); - d = b_(idx); + d.resize(idx.size(), 1); + copy_indicies(d, b_, idx); } else { diff --git a/include/preprocess/crhmc/constraint_problem.h b/include/preprocess/crhmc/constraint_problem.h new file mode 100644 index 000000000..829315059 --- /dev/null +++ b/include/preprocess/crhmc/constraint_problem.h @@ -0,0 +1,81 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2022-2022 Ioannis Iakovidis + +// Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of +// Code 2022 program. + +// Licensed under GNU LGPL.3, see LICENCE file + +#ifndef CONSTRAINT_PROBLEM_H +#define CONSTRAINT_PROBLEM_H +#include "Eigen/Eigen" +/*Input structure: With this the user can define a polytope sampling problem*/ +template +class constraint_problem { +public: + using Type = typename Point::FT; + using PointType = Point; + using VT = Eigen::Matrix; + using MT = MatrixType; +private: + unsigned int num_vars; // num_vars of the original problem + MatrixType Aeq; // Matrix of coefficients for the equality constraints + VT beq; // Right hand side of the equality constraints + MatrixType Aineq; // Matrix of coefficients for the inequality constraints + VT bineq; // Right hand side of the inequality constraints + VT lb; // lb on the output coordinates preset to -1e9 + VT ub; // ub on the output coordinates preset to +1e9 + Type inf = 1e9; +public: + /*Constructors for different input instances*/ + constraint_problem(const int dim, MT const &Aeq_, VT const &beq_, MT const &Aineq_, + VT const &bineq_, VT const &lb_, VT const &ub_) + : num_vars(dim), Aeq(Aeq_), beq(beq_), Aineq(Aineq_), bineq(bineq_), + lb(lb_), ub(ub_) { + } + + constraint_problem(const int dim) { + num_vars = dim; + init(num_vars); + } + + + void init(int num_vars) { + Aineq.resize(0, num_vars); + Aeq.resize(0, num_vars); + bineq.resize(0, 1); + beq.resize(0, 1); + lb = -VT::Ones(num_vars) * inf; + ub = VT::Ones(num_vars) * inf; + } + void set_equality_constraints(MT const &Aeq_, VT const &beq_){ + Aeq = Aeq_; + beq = beq_; + } + void set_inequality_constraints(MT const &Aineq_, VT const &bineq_){ + Aineq = Aineq_; + bineq = bineq_; + } + void set_bounds(VT const &lb_, VT const &ub_){ + lb = lb_; + ub = ub_; + } + std::pair get_equations(){ + return std::make_pair(Aeq,beq); + } + std::pair get_inequalities(){ + return std::make_pair(Aineq,bineq); + } + std::pair get_bounds(){ + return std::make_pair(lb,ub); + } + unsigned int dimension(){ + return num_vars; + } + +}; + +#endif diff --git a/include/preprocess/crhmc/crhmc_input.h b/include/preprocess/crhmc/crhmc_input.h index 1a674f1e4..05f61c4b8 100644 --- a/include/preprocess/crhmc/crhmc_input.h +++ b/include/preprocess/crhmc/crhmc_input.h @@ -17,12 +17,20 @@ #define CRHMC_INPUT_H #include "Eigen/Eigen" #include "opts.h" +#include "convex_bodies/hpolytope.h" +#include "preprocess/crhmc/constraint_problem.h" /*0 funciton handles are given as a reference in case the user gives no function. Then the uniform function is implied*/ template struct ZeroFunctor { + using Type = typename Point::FT; Point operator()(Point const &x) const { return Point(x.dimension()); } + struct parameters { + Type L=1; + Type eta=1; + }; + struct parameters params; }; template struct ZeroScalarFunctor @@ -45,9 +53,11 @@ class crhmc_input ZeroScalarFunctor zerosf; public: + using MT = MatrixType; using Func = func; using Grad = grad; using Hess = hess; + using point= Point; MatrixType Aineq; // Matrix of coefficients for the inequality constraints VT bineq; // Right hand side of the inequality constraints MatrixType Aeq; // Matrix of coefficients for the equality constraints @@ -62,37 +72,38 @@ class crhmc_input bool fHandle; // whether f is handle or not bool dfHandle; // whether df is handle or not bool ddfHandle; // whether ddf is handle or not + unsigned int dimension; // dimension of the original problem const Type inf = options.max_coord + 1; // helper for barrier handling /*Constructors for different input instances*/ - crhmc_input(int dimension, func &function, grad &g, hess &h) + crhmc_input(int dim, func &function, grad &g, hess &h) : f(function), df(g), ddf(h) - { + { dimension=dim; fZero = false; fHandle = true; dfHandle = true; ddfHandle = true; init(dimension); } - crhmc_input(int dimension, func &function) + crhmc_input(int dim, func &function) : f(function), df(zerof), ddf(zerof) - { + { dimension=dim; fZero = false; fHandle = true; dfHandle = false; ddfHandle = false; init(dimension); } - crhmc_input(int dimension, func &function, grad &g) + crhmc_input(int dim, func &function, grad &g) : f(function), df(g), ddf(zerof) - { + { dimension=dim; fZero = false; fHandle = true; dfHandle = true; ddfHandle = false; init(dimension); } - crhmc_input(int dimension) : f(zerosf), df(zerof), ddf(zerof) - { + crhmc_input(int dim) : f(zerosf), df(zerof), ddf(zerof) + { dimension=dim; fZero = true; fHandle = false; dfHandle = false; @@ -110,4 +121,52 @@ class crhmc_input ub = VT::Ones(dimension) * inf; } }; +#include + +template < + typename Input, typename Polytope, typename Func, typename Grad, typename Hess, + typename std::enable_if>::value>::type * = nullptr> +inline Input convert2crhmc_input(Polytope &P, Func &f, Grad &g, Hess &h) { + int dimension = P.dimension(); + Input input = Input(dimension, f, g, h); + if (std::is_same< + Hess, ZeroFunctor>::value){ + input.ddfHandle=false; + } + input.Aineq = P.get_mat(); + input.bineq = P.get_vec(); + return input; +} + +template >::value>::type + * = nullptr> +inline Input convert2crhmc_input(Polytope &P, Func &f, Grad &g, Hess &h) { + int dimension = P.dimension(); + Input input = Input(dimension, f, g, h); + if (std::is_same< + Hess, ZeroFunctor>::value){ + input.ddfHandle=false; + } + std::tie(input.Aineq, input.bineq) = P.get_inequalities(); + std::tie(input.Aeq, input.beq) = P.get_equations(); + std::tie(input.lb, input.ub) = P.get_bounds(); + return input; +} +template >::value && + !std::is_same>::value>:: + type * = nullptr> +inline Input convert2crhmc_input(Polytope &P, Func &f, Grad &g, Hess &h) { + /*CRHMC works only for H-polytopes and constraint_problems for now*/ + int dimension = 0; + Input input = Input(dimension, f, g, h); + return input; +} #endif diff --git a/include/preprocess/crhmc/crhmc_problem.h b/include/preprocess/crhmc/crhmc_problem.h index 68ccb25e5..c501bce62 100644 --- a/include/preprocess/crhmc/crhmc_problem.h +++ b/include/preprocess/crhmc/crhmc_problem.h @@ -60,6 +60,7 @@ class crhmc_problem { using Func = typename Input::Func; using Grad = typename Input::Grad; using Hess = typename Input::Hess; + using Crhmc_problem=crhmc_problem; unsigned int _d; // dimension // Problem variables Ax=b st lb<=x<=ub @@ -93,15 +94,20 @@ class crhmc_problem { bool fHandle; // whether f is handle or not bool dfHandle; // whether df is handle or not bool ddfHandle; // whether ddf is handle or not + /*Invalid polytope variables*/ + bool terminate=false; + std::string terminate_message; #ifdef TIME_KEEPING //Timing information std::chrono::duration rescale_duration, sparsify_duration, reordering_duration, rm_rows_duration, rm_fixed_vars_duration, ex_collapsed_vars_duration, shift_barrier_duration, lewis_center_duration; #endif - const NT inf = options.max_coord + 1; // helper for barrier handling + const NT inf = options.max_coord; // helper for barrier handling + const NT barrier_bound = 1e7; int equations() const { return Asp.rows(); } int dimension() const { return Asp.cols(); } + int nnz() const { return Asp.nonZeros(); } // Remove varibles that have width under some tolerance int remove_fixed_variables(const NT tol = 1e-12) { @@ -109,6 +115,7 @@ class crhmc_problem { int n = Asp.cols(); VT d = estimate_width(); CholObj solver = CholObj(transform_format(Asp)); + solver.accuracyThreshold = 0; VT w = VT::Ones(n, 1); solver.decompose((Tx *)w.data()); VT out_vector = VT(m, 1); @@ -133,7 +140,16 @@ class crhmc_problem { SpMat S = SpMat(n, freeIndices.size()); S.setFromTriplets(freeIndices.begin(), freeIndices.end()); append_map(S, x); - barrier.set_bound(barrier.lb(indices), barrier.ub(indices)); + copy_indicies(barrier.lb, barrier.lb, indices); + copy_indicies(barrier.ub, barrier.ub, indices); + barrier.lb.conservativeResize(indices.size()); + barrier.ub.conservativeResize(indices.size()); + + barrier.set_bound(barrier.lb, barrier.ub); + if (!isempty_center) { + copy_indicies(center, center, indices); + center.conservativeResize(indices.size()); + } return 1; } return 0; @@ -143,20 +159,20 @@ class crhmc_problem { SpMat Ac; VT bc; if (isempty_center) { - std::tie(center, Ac, bc) = analytic_center(Asp, b, *this, options); + std::tie(center, Ac, bc) = analytic_center(Asp, b, *this, options); isempty_center = false; } else { std::tie(center, Ac, bc) = - analytic_center(Asp, b, *this, options, center); + analytic_center(Asp, b, *this, options, center); analytic_ctr=center; } if (Ac.rows() == 0) { return 0; } - SpMat _A = Asp; - sparse_stack_v(Ac, _A, Asp); - b.resize(b.rows() + bc.rows(), 1); - b << bc, b; + SpMat _A = SpMat(Asp); + sparse_stack_v(_A, Ac, Asp); + b.conservativeResize(b.rows() + bc.rows(), 1); + b.bottomRows(bc.rows()) = bc; return 1; } // Rescale the polytope for numerical stability @@ -273,45 +289,41 @@ class crhmc_problem { // Reorder the polytope accordint to the AMD Reordering for better sparsity // pattern in the Cholesky decomposition void reorder() { - if (!options.EnableReordering) { + if (!options.EnableReordering || Asp.rows()*Asp.cols() < options.maxNZ) { return; } - Asp.prune(0.0); - Asp.makeCompressed(); - int m = Asp.rows(); - SpMat H; - H = Asp * SpMat(Asp.transpose()) + MT::Identity(m, m); - H.makeCompressed(); - PM permed = permuteMatAMD(H); - H = permed * H * permed.transpose(); - PM post_perm = postOrderPerm(H); - PM perm = permed * post_perm; - Asp = perm * Asp; - b = perm * b; + fillin_reduce(Asp,b); } //Using the Cholesky decomposition remove dependent rows in the systen Asp*x=b int remove_dependent_rows(NT tolerance = 1e-12, NT infinity = 1e+64) { - //this approach does not work with 0 collumns - remove_zero_rows(Asp); + //this approach does not work with 0 rows + remove_zero_rows(Asp, b); int m = Asp.rows(); int n = Asp.cols(); VT v = VT(m); VT w = VT::Ones(n, 1); CholObj solver = CholObj(transform_format(Asp)); + solver.accuracyThreshold = 0; solver.decompose((Tx *)w.data()); solver.diagL((Tx *)v.data()); - std::vector indices; + std::vector indices(m, false); + std::vector idx; + bool changed = false; for (int i = 0; i < m; i++) { if ((v(i) > tolerance) && (v(i) < infinity)) { - indices.push_back(i); + indices[i] = true; + idx.push_back(i); + }else{ + changed=true; } } - if (indices.size() == m) { + if (!changed) { return 0; } - Asp = A(indices, Eigen::all).sparseView(); - b = b(indices); + remove_rows(Asp, indices); + copy_indicies(b, b, idx); + b.conservativeResize(idx.size(), 1); return 1; } //Apply number of operations that simplify the problem @@ -373,10 +385,14 @@ class crhmc_problem { } } - VT estimate_width() { + VT estimate_width(bool use_center=false) { int n = Asp.cols(); VT hess = VT::Ones(n, 1); + if(use_center){ + std::tie(std::ignore, hess)=analytic_center_oracle(center); + } CholObj solver = CholObj(transform_format(Asp)); + solver.accuracyThreshold = 0; solver.decompose((Tx *)hess.data()); VT w_vector(n, 1); solver.leverageScoreComplement((Tx *)w_vector.data()); @@ -386,75 +402,110 @@ class crhmc_problem { return tau; } - void print(std::string const message = "Printing Sparse problem") { - std::cerr << "----------------" << message << "--------------" << '\n'; - std::cerr << "(m,n) = " << equations() << " , " << dimension() + template + void print(StreamType &stream, std::string const message = "Printing Sparse problem") { + stream << "----------------" << message << "--------------" << '\n'; + stream << "(m,n) = " << equations() << " , " << dimension() << " nnz= " << Asp.nonZeros() << "\n"; if (equations() > 20 || dimension() > 20) { - std::cerr << "too big for complete visulization\n"; + stream << "too big for complete visulization\n"; return; } - std::cerr << "A=\n"; + stream << "A=\n"; - std::cerr << MT(Asp); - std::cerr << "\n"; + stream << MT(Asp); + stream << "\n"; - std::cerr << "b=\n"; - std::cerr << b; - std::cerr << "\n"; + stream << "b=\n"; + stream << b; + stream << "\n"; - std::cerr << "lb=\n"; - std::cerr << barrier.lb; - std::cerr << "\n"; + stream << "lb=\n"; + stream << barrier.lb; + stream << "\n"; - std::cerr << "ub=\n"; - std::cerr << barrier.ub; - std::cerr << "\n"; + stream << "ub=\n"; + stream << barrier.ub; + stream << "\n"; - std::cerr << "T=\n"; - std::cerr << MT(T); - std::cerr << "\n"; + stream << "T=\n"; + stream << MT(T); + stream << "\n"; - std::cerr << "y=\n"; - std::cerr << y; - std::cerr << "\n"; + stream << "y=\n"; + stream << y; + stream << "\n"; - std::cerr << "center=\n"; - std::cerr << center; - std::cerr << "\n"; + stream << "center=\n"; + stream << center; + stream << "\n"; } - void print(const char *fileName) { - std::ofstream myfile; - myfile.open(fileName); - myfile << Asp.rows() << " " << Asp.cols() << "\n"; - - myfile << MT(Asp); - myfile << "\n"; - myfile << "\n"; - - myfile << b; - myfile << "\n"; - myfile << "\n"; - - myfile << barrier.lb; - myfile << "\n"; - myfile << "\n"; - - myfile << barrier.ub; - myfile << "\n"; - myfile << "\n"; - - myfile << MT(T); - myfile << "\n"; - myfile << "\n"; - - myfile << y; - myfile << "\n"; - myfile << "\n"; - - myfile << center; - } + void make_format(Input const &input, MT const &S) { + nP = input.Aeq.cols(); + int nIneq = input.Aineq.rows(); + int nEq = input.Aeq.rows(); + A.resize(nEq + nIneq, nP + nIneq); + A << input.Aeq, MT::Zero(nEq, nIneq), input.Aineq, MT::Identity(nIneq, nIneq); + b.resize(nEq + nIneq, 1); + b << input.beq, input.bineq; + lb.resize(nP + nIneq, 1); + ub.resize(nP + nIneq, 1); + lb << input.lb, MT::Zero(nIneq, 1); + ub << input.ub, MT::Ones(nIneq, 1) * inf; + Asp.resize(nEq + nIneq, nP + nIneq); + int n = dimension(); + /*Move lb=ub to Ax=b*/ + for (int i = 0; i < n; i++) { + if (doubleVectorEqualityComparison(lb(i), ub(i))) { + MT temp = MT::Zero(1, n); + temp(i) = 1; + A.conservativeResize(A.rows() + 1, A.cols()); + A.row(A.rows() - 1) = temp; + b.conservativeResize(b.rows() + 1); + b(b.rows() - 1) = (lb(i) + ub(i)) / 2; + lb(i) = -inf; + ub(i) = inf; + } + } + Asp = A.sparseView(); + } + void make_format(Input const &input, SpMat const &S) { + nP = input.Aeq.cols(); + int nIneq = input.Aineq.rows(); + int nEq = input.Aeq.rows(); + Asp.resize(nEq + nIneq, nP + nIneq); + SpMat B = SpMat(input.Aeq); + SpMat C = SpMat(input.Aineq); + B.conservativeResize(nEq, nIneq + nP); + SpMat temp = SpMat(nIneq, nIneq); + temp.setIdentity(); + sparse_stack_h_inplace(C, temp); + sparse_stack_v(B, C, Asp); + b.resize(nEq + nIneq, 1); + b << input.beq, input.bineq; + lb.resize(nP + nIneq, 1); + ub.resize(nP + nIneq, 1); + lb << input.lb, MT::Zero(nIneq, 1); + ub << input.ub, MT::Ones(nIneq, 1) * inf; + int n = dimension(); + /*Move lb=ub to Ax=b*/ + for (int i = 0; i < n; i++) { + if (doubleVectorEqualityComparison(lb(i), ub(i))) { + B.resize(Asp.rows(), Asp.cols()); + B = SpMat(Asp); + MT temp = MT::Zero(1, n); + temp(i) = 1; + C = temp.sparseView(); + sparse_stack_v(B, C, Asp); + b.conservativeResize(b.rows() + 1); + b(b.rows() - 1) = (lb(i) + ub(i)) / 2; + lb(i) = -inf; + ub(i) = inf; + } + } + Asp.makeCompressed(); + } //Class constructor crhmc_problem(Input const &input, Opts _options = Opts()) : options(_options), func(input.f), df(input.df), ddf(input.ddf), @@ -467,41 +518,13 @@ class crhmc_problem { std::chrono::duration::zero(); #endif - nP = input.Aeq.cols(); - int nIneq = input.Aineq.rows(); - int nEq = input.Aeq.rows(); - A.resize(nEq + nIneq, nP + nIneq); - A << input.Aeq, MT::Zero(nEq, nIneq), input.Aineq, - MT::Identity(nIneq, nIneq); - b.resize(nEq + nIneq, 1); - b << input.beq, input.bineq; - lb.resize(nP + nIneq, 1); - ub.resize(nP + nIneq, 1); - lb << input.lb, MT::Zero(nIneq, 1); - ub << input.ub, MT::Ones(nIneq, 1) * inf; - Asp.resize(nEq + nIneq, nP + nIneq); + make_format(input, input.Aeq); PreproccessProblem(); } // Initialization funciton void PreproccessProblem() { int n = dimension(); - /*Move lb=ub to Ax=b*/ - for (int i = 0; i < n; i++) { - if (doubleVectorEqualityComparison(lb(i), ub(i))) { - MT temp = MT::Zero(1, n); - temp(i) = 1; - A.conservativeResize(A.rows() + 1, A.cols()); - A.row(A.rows() - 1) = temp; - b.conservativeResize(b.rows() + 1); - b(b.rows() - 1) = (lb(i) + ub(i)) / 2; - lb(i) = -inf; - ub(i) = inf; - } - } - - barrier.set_bound(lb.cwiseMax(-1e7), ub.cwiseMin(1e7)); - - Asp = A.sparseView(); + barrier.set_bound(lb.cwiseMax(-barrier_bound), ub.cwiseMin(barrier_bound)); NT tol = std::numeric_limits::epsilon(); Asp.prune(tol, tol); /*Update the transformation Tx + y*/ @@ -527,7 +550,7 @@ class crhmc_problem { #endif if (isempty_center) { std::tie(center, std::ignore, std::ignore) = - analytic_center(Asp, b, *this, options); + analytic_center(Asp, b, *this, options); isempty_center = false; } shift_barrier(center); @@ -537,22 +560,17 @@ class crhmc_problem { #endif reorder(); - width = estimate_width(); - if (width.maxCoeff() > 1e9) { - std::cerr << "Domain seems to be unbounded. Either add a Gaussian term " - "via f, df, ddf or add bounds to variable via lb and ub." - << '\n'; - exit(1); - } + width = estimate_width(true); // Recenter again and make sure it is feasible VT hess; #ifdef TIME_KEEPING start = std::chrono::system_clock::now(); #endif std::tie(center, std::ignore, std::ignore, w_center) = - lewis_center(Asp, b, *this, options, center); + lewis_center(Asp, b, *this, options, center); std::tie(std::ignore, hess) = lewis_center_oracle(center, w_center); CholObj solver = CholObj(transform_format(Asp)); + solver.accuracyThreshold = 0; VT Hinv = hess.cwiseInverse(); solver.decompose((Tx *)Hinv.data()); VT out(equations(), 1); @@ -565,81 +583,101 @@ class crhmc_problem { #endif if ((center.array() > barrier.ub.array()).any() || (center.array() < barrier.lb.array()).any()) { - std::cerr << "Polytope:Infeasible. The algorithm cannot find a feasible " - "point.\n"; - exit(1); + terminate = true; + terminate_message = "Polytope:Infeasible. The algorithm cannot find a feasible point.\n"; + return; } + } #ifdef TIME_KEEPING - std::cerr << "Rescale completed in time, "; - std::cerr << rescale_duration.count() << " secs " << std::endl; - std::cerr << "Split dense columns completed in time, "; - std::cerr << sparsify_duration.count() << " secs " << std::endl; - std::cerr << "Reordering completed in time, "; - std::cerr << reordering_duration.count() << " secs " << std::endl; - std::cerr << "Removing dependent rows completed in time, "; - std::cerr << rm_rows_duration.count() << " secs " << std::endl; - std::cerr << "Removing fixed variables completed in time, "; - std::cerr << rm_fixed_vars_duration.count() << " secs " << std::endl; - std::cerr << "Extracting collapsed variables completed in time, "; - std::cerr << ex_collapsed_vars_duration.count() << " secs " << std::endl; - std::cerr << "Shift_barrier completed in time, "; - std::cerr << shift_barrier_duration.count() << " secs " << std::endl; - std::cerr << "Finding Center completed in time, "; - std::cerr << lewis_center_duration.count() << " secs " << std::endl; +template +void print_preparation_time(StreamType& stream){ + stream << "---Preparation Timing Information"<< std::endl; + stream << "Rescale completed in time, "; + stream << rescale_duration.count() << " secs " << std::endl; + stream << "Split dense columns completed in time, "; + stream << sparsify_duration.count() << " secs " << std::endl; + stream << "Reordering completed in time, "; + stream << reordering_duration.count() << " secs " << std::endl; + stream << "Removing dependent rows completed in time, "; + stream << rm_rows_duration.count() << " secs " << std::endl; + stream << "Removing fixed variables completed in time, "; + stream << rm_fixed_vars_duration.count() << " secs " << std::endl; + stream << "Extracting collapsed variables completed in time, "; + stream << ex_collapsed_vars_duration.count() << " secs " << std::endl; + stream << "Shift_barrier completed in time, "; + stream << shift_barrier_duration.count() << " secs " << std::endl; + stream << "Finding Center completed in time, "; + stream << lewis_center_duration.count() << " secs " << std::endl; +} #endif - } - // Gradient and hessian of for the analytic center std::pair analytic_center_oracle(VT const &x) { - VT g, h; + MT g, h; std::tie(std::ignore, g, h) = f_oracle(x); return std::make_pair(g + barrier.gradient(x), h + barrier.hessian(x)); } // Gradient and hessian of for the lewis center std::pair lewis_center_oracle(VT const &x, VT const &w) { - VT g, h; + MT g, h; std::tie(std::ignore, g, h) = f_oracle(x); return std::make_pair(g + w.cwiseProduct(barrier.gradient(x)), h + w.cwiseProduct(barrier.hessian(x))); } // Function that uses the transformation (T,y) to apply the function to the // original variables - std::tuple f_oracle(VT x) { - NT f; - VT g, h; + std::tuple f_oracle(MT const &x) { int n = x.rows(); + int m=x.cols(); + VT f=VT(m); + MT g=MT(n,m); + MT h=MT(n,m); if (fZero) { - f = 0; - g = VT::Zero(n); - h = VT::Zero(n); + f = VT::Zero(m); + g = MT::Zero(n,m); + h = MT::Zero(n,m); return std::make_tuple(f, g, h); } // Take the correpsonding point in the original space - VT z = VT::Zero(n); + MT z = MT::Zero(y.rows(), m); if (fHandle || dfHandle || ddfHandle) { - z(Tidx, Eigen::all) = Ta.cwiseProduct(x(Tidx, Eigen::all)) + y; + for(int k=0;k #include "PackedCSparse/SparseMatrix.h" #include #include @@ -93,6 +94,7 @@ void sparse_stack_h(const SparseMatrixType &left, const SparseMatrixType &right, [&](int i) { return i + left.nonZeros(); }); } +#include template void sparse_stack_h_inplace(SparseMatrixType &left, @@ -116,16 +118,13 @@ void sparse_stack_h_inplace(SparseMatrixType &left, { return i + leftnz; }); } -template -void remove_zero_rows(SparseMatrixType &A) -{ +template +void remove_zero_rows(SparseMatrixType &A, VectorType &b) { std::vector> tripletList; unsigned Ndata = A.cols(); unsigned Nbins = A.rows(); - for (int k = 0; k < A.outerSize(); ++k) - { - for (typename SparseMatrixType::InnerIterator it(A, k); it; ++it) - { + for (int k = 0; k < A.outerSize(); ++k) { + for (typename SparseMatrixType::InnerIterator it(A, k); it; ++it) { tripletList.push_back( Eigen::Triplet(it.row(), it.col(), it.value())); } @@ -134,20 +133,19 @@ void remove_zero_rows(SparseMatrixType &A) std::vector has_value(Nbins, false); for (auto tr : tripletList) has_value[tr.row()] = true; - if (std::all_of(has_value.begin(), has_value.end(), - [](bool v) - { return v; })) - { + [](bool v) { return v; })) { return; } // create map from old to new indices std::map row_map; unsigned new_idx = 0; for (unsigned old_idx = 0; old_idx < Nbins; old_idx++) - if (has_value[old_idx]) - row_map[old_idx] = new_idx++; - + if (has_value[old_idx]) { + row_map[old_idx] = new_idx; + b(new_idx) = b(old_idx); + new_idx++; + } // make new triplet list, dropping empty rows std::vector> newTripletList; newTripletList.reserve(Ndata); @@ -156,36 +154,15 @@ void remove_zero_rows(SparseMatrixType &A) Eigen::Triplet(row_map[tr.row()], tr.col(), tr.value())); // form new matrix and return - SparseMatrixType ret(new_idx, Ndata); - ret.setFromTriplets(newTripletList.begin(), newTripletList.end()); - A = SparseMatrixType(ret); + A.resize(new_idx, Ndata); + A.setFromTriplets(newTripletList.begin(), newTripletList.end()); + b.conservativeResize(new_idx); } template -void remove_rows(SparseMatrixType &A, std::vector indices) -{ - std::vector> tripletList; +void remove_rows(SparseMatrixType &A, std::vector ¬Removed) { unsigned Ndata = A.cols(); unsigned Nbins = A.rows(); - for (int k = 0; k < A.outerSize(); ++k) - { - for (typename SparseMatrixType::InnerIterator it(A, k); it; ++it) - { - tripletList.push_back( - Eigen::Triplet(it.row(), it.col(), it.value())); - } - } - - std::vector notRemoved(Nbins, false); - for (auto tr : indices) - notRemoved[tr] = true; - - if (std::all_of(notRemoved.begin(), notRemoved.end(), - [](bool v) - { return v; })) - { - return; - } // create map from old to new indices std::map row_map; unsigned new_idx = 0; @@ -193,17 +170,18 @@ void remove_rows(SparseMatrixType &A, std::vector indices) if (notRemoved[old_idx]) row_map[old_idx] = new_idx++; - // make new triplet list, dropping empty rows - std::vector> newTripletList; - newTripletList.reserve(Ndata); - for (auto tr : tripletList) - newTripletList.push_back( - Eigen::Triplet(row_map[tr.row()], tr.col(), tr.value())); - + std::vector> tripletList; + for (int k = 0; k < A.outerSize(); ++k) { + for (typename SparseMatrixType::InnerIterator it(A, k); it; ++it) { + if (notRemoved[it.row()]) { + tripletList.push_back( + Eigen::Triplet(row_map[it.row()], it.col(), it.value())); + } + } + } // form new matrix and return - SparseMatrixType ret(new_idx, Ndata); - ret.setFromTriplets(newTripletList.begin(), newTripletList.end()); - A = SparseMatrixType(ret); + A.resize(new_idx, Ndata); + A.setFromTriplets(tripletList.begin(), tripletList.end()); } template @@ -352,6 +330,17 @@ PM postOrderPerm(SparseMatrixType const &A) return post_perm; } +template +void fillin_reduce(SparseMatrixType &X,VectorType& b){ + SparseMatrixType I = SparseMatrixType(Eigen::VectorXd::Ones(X.rows()).asDiagonal()); + SparseMatrixType XX = X * X.transpose() + I; + XX.makeCompressed(); + Eigen::SimplicialLDLT> cholesky; + cholesky.analyzePattern(XX); + X = cholesky.permutationP() * X; + b = cholesky.permutationP() *b; +} template PackedCSparse::SparseMatrix transform_format(SparseMatrixType const &mat) { PackedCSparse::SparseMatrix A = PackedCSparse::SparseMatrix(mat.rows(), mat.cols(), mat.nonZeros()); @@ -367,5 +356,51 @@ PackedCSparse::SparseMatrix transform_format(SparseMatrixType co A.p[A.n] = nnz; return A; } - +template +void copy_indicies(MatrixType& a, MatrixType& b, std::vectorconst & a_idx, std::vectorconst & b_idx){ +for(int i=0;i +void copy_indicies(MatrixType& a, MatrixType b, std::vectorconst & b_idx){ +for(int i=0;i +void set(MatrixType &a, std::vectorconst & idx, const Type c){ + for(int i=0;i +void saxpy(MatrixType &a,MatrixType const &b,MatrixType const& c, std::vectorconst & a_idx, std::vectorconst & b_idx){ +for(int i=0;i +void load_problem(SpMat &A, VT &b, VT &lb, VT &ub, int &dimension, + std::string problem_name) { + { + std::string fileName(problem_name); + fileName.append(".mm"); + SpMat X; + loadMarket(X, fileName); + int m = X.rows(); + dimension = X.cols() - 1; + A = X.leftCols(dimension); + b = VT(X.col(dimension)); + } + { + std::string fileName(problem_name); + fileName.append("_bounds.mm"); + SpMat bounds; + loadMarket(bounds, fileName); + lb = VT(bounds.col(0)); + ub = VT(bounds.col(1)); + } +} #endif diff --git a/include/preprocess/crhmc/lewis_center.h b/include/preprocess/crhmc/lewis_center.h index f6ee7b22e..5bf89d151 100644 --- a/include/preprocess/crhmc/lewis_center.h +++ b/include/preprocess/crhmc/lewis_center.h @@ -28,15 +28,6 @@ #endif const size_t chol_k3 = (SIMD_LEN == 0) ? 1 : SIMD_LEN; -using NT = double; -using MT = Eigen::Matrix; -using VT = Eigen::Matrix; -using SpMat = Eigen::SparseMatrix; -using CholObj = PackedChol; -using Triple = Eigen::Triplet; -using Tx = FloatArray; -using Opts = opts; -NT epsilon = 1e-8; /*This function computes the Lewis center of the polytope*/ //And detects additional constraint that need to be added // x - It outputs the minimizer of min f(x) subjects to {Ax=b} @@ -46,9 +37,13 @@ NT epsilon = 1e-8; // because of the dom(f), the algorithm will detect the collapsed dimension // and output the detected constraint C x = d // d - detected constraint vector -template +template std::tuple lewis_center(SpMat const &A, VT const &b, Polytope &f, Opts const &options, VT x = VT::Zero(0, 1)) { + using CholObj = typename Polytope::CholObj; + using Triple = typename Polytope::Triple; + using Tx = typename Polytope::Tx; + NT epsilon = 1e-8; // initial conditions int n = A.cols(); int m = A.rows(); @@ -173,14 +168,14 @@ std::tuple lewis_center(SpMat const &A, VT const &b, Polytope std::pair pboundary = f.barrier.boundary(x); VT A_ = pboundary.first; VT b_ = pboundary.second; - A_ = A_(idx); std::vector sparseIdx; for (int i = 0; i < idx.size(); i++) { - sparseIdx.push_back(Triple(i, i, A_(i))); + sparseIdx.push_back(Triple(i, idx[i], A_(idx[i]))); } C.setFromTriplets(sparseIdx.begin(), sparseIdx.end()); - d = b_(idx); + d.resize(idx.size(), 1); + copy_indicies(d, b_, idx); } else { diff --git a/include/preprocess/crhmc/opts.h b/include/preprocess/crhmc/opts.h index df73d5a7c..573a69dbd 100644 --- a/include/preprocess/crhmc/opts.h +++ b/include/preprocess/crhmc/opts.h @@ -26,28 +26,31 @@ template class opts { const Type ipmDistanceTol = 1e-8; const Type ipmDualTol = 1e-12; int maxNZ = 30; - Type max_coord = 1e7; - bool EnableReordering = false; + Type max_coord = 1e9; + bool EnableReordering = true; const int min_convergence_steps=8; /*ODE options*/ const Type implicitTol = 1e-5; const int maxODEStep = 30; Type initialStep = 0.2; - Type convergence_limit = 1e16; + Type convergence_bound = 1e16; + + /*PackedCS Solver Options*/ Type solver_accuracy_threshold=1e-2; + int simdLen=1; /*Sampler options*/ bool DynamicWeight = true; //Enable the use of dynamic weights for each variable when sampling bool DynamicStepSize = true; // Enable adaptive step size that avoids low acceptance probability bool DynamicRegularizer = true; //Enable the addition of a regularization term - + Type regularization_factor=1e-20; /*Dynamic step choices*/ Type warmUpStep = 10; - Type maxConsecutiveBadStep = 10; + int maxConsecutiveBadStep = 10; Type targetODEStep = 10; Type shrinkFactor = 1.1; - Type minStepSize = 0.001; + Type minStepSize = 1e-5; Type effectiveStepSize = 1; opts() {} diff --git a/include/preprocess/crhmc/two_sided_barrier.h b/include/preprocess/crhmc/two_sided_barrier.h index 39b27bab9..7e279ab7f 100644 --- a/include/preprocess/crhmc/two_sided_barrier.h +++ b/include/preprocess/crhmc/two_sided_barrier.h @@ -21,6 +21,7 @@ #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" +#include "preprocess/crhmc/crhmc_utils.h" #include /// @brief A two sided barrier used by crhmc sampler @@ -43,16 +44,18 @@ template class two_sided_barrier { const NT max_step = 1e16; // largest step size const NT regularization_constant = 1e-20; // small regularization to not have a large inverse const NT unbounded_center_coord = 1e6; - VT extraHessian; //Regularization factor + MT extraHessian; const NT inf = std::numeric_limits::infinity(); - //initialization function - void set_bound(VT const &_lb, VT const &_ub) { + void set_bound(VT const &_lb, VT const &_ub) { + n = _lb.rows(); + extraHessian.resize(n, 1); + lb.resize(n); + ub.resize(n); lb = _lb; ub = _ub; - n = lb.rows(); - extraHessian = regularization_constant * VT::Ones(n); + extraHessian = regularization_constant * MT::Ones(n, 1); int x1 = 0, x2 = 0, x3 = 0; for (int i = 0; i < n; i++) { if (lb(i) == -inf) { @@ -69,35 +72,44 @@ template class two_sided_barrier { } VT c = (ub + lb) / 2; - - c(lowerIdx) = lb(lowerIdx) + VT::Ones(x2, 1) * unbounded_center_coord; - c(upperIdx) = ub(upperIdx) - VT::Ones(x1, 1) * unbounded_center_coord; - c(freeIdx) *= 0.0; + VT bias1=VT::Ones(x2, 1) * unbounded_center_coord; + saxpy(c,lb,bias1,lowerIdx,lowerIdx); + VT bias2=-VT::Ones(x1, 1) * unbounded_center_coord; + saxpy(c,ub,bias2,upperIdx,upperIdx); + set(c, freeIdx, 0.0); center = c; } two_sided_barrier(VT const &_lb, VT const &_ub, int _vdim = 1) { set_bound(_lb, _ub); vdim = _vdim; - extraHessian = regularization_constant * VT::Ones(n); + extraHessian = regularization_constant * MT::Ones(n,1); } two_sided_barrier() { vdim = 1; } - //barrier function gradient + VT gradient(VT const &x) { return (ub - x).cwiseInverse() - (x - lb).cwiseInverse(); } - //Return the barrier hessian with the extra Regularization + VT hessian(VT const &x) { VT d = ((ub - x).cwiseProduct((ub - x))).cwiseInverse() + ((x - lb).cwiseProduct((x - lb))).cwiseInverse(); return d + extraHessian; } - //third derivative of the barrier - VT tensor(VT const &x) { - VT d = 2 * (((ub - x).cwiseProduct((ub - x))).cwiseProduct((ub - x))).cwiseInverse() - - 2 * (((x - lb).cwiseProduct((x - lb))).cwiseProduct((x - lb))).cwiseInverse(); + MT hessian(MT const &x){ + MT d = (((- x).colwise()+ub).cwiseProduct(((- x).colwise()+ub))).cwiseInverse() + + ((x.colwise() - lb).cwiseProduct((x.colwise() - lb))).cwiseInverse(); + return d + extraHessian; + } + MT tensor(MT const &x) { + MT d = 2 * ((((-x).colwise()+ub).cwiseProduct(((-x).colwise()+ub))).cwiseProduct(((-x).colwise()+ub))).cwiseInverse() - + 2 * (((x.colwise() - lb).cwiseProduct(( x.colwise() - lb))).cwiseProduct(( x.colwise() - lb))).cwiseInverse(); return d; } + MT quadratic_form_gradient(MT const &x, MT const &u) { + // Output the -grad of u' (hess phi(x)) u. + return (u.cwiseProduct(u)).cwiseProduct(tensor(x)); + } VT quadratic_form_gradient(VT const &x, VT const &u) { // Output the -grad of u' (hess phi(x)) u. @@ -119,13 +131,19 @@ template class two_sided_barrier { VT boundary_distance(VT const &x) { // Output the distance of x with its closest boundary for each // coordinate - return ((x - lb).cwiseMin(ub - x)).cwiseAbs(); } bool feasible(VT const &x) { return (x.array() > lb.array() && x.array() < ub.array()).all(); } + VT feasible(MT const &x) { + VT result=VT::Ones(x.cols()); + for(int i=0;i lb.array() && x.col(i).array() < ub.array()).all(); + } + return result; + } std::pair analytic_center_oracle(VT const &x) { VT g = VT::Zero(n, 1); @@ -136,8 +154,7 @@ template class two_sided_barrier { std::pair lewis_center_oracle(VT const &x, VT const &w) { VT g = VT::Zero(n, 1); VT h = VT::Zero(n, 1); - return std::make_pair(g + w.cwiseProduct(gradient(x)), - h + w.cwiseProduct(hessian(x))); + return std::make_pair(g + w.cwiseProduct(gradient(x)),h + w.cwiseProduct(hessian(x))); } std::pair boundary(VT const &x) { @@ -145,11 +162,9 @@ template class two_sided_barrier { // Assume: only 1 vector is given VT A = VT::Ones(x.rows(), 1); - VT b = ub; b = (x.array() < center.array()).select(-lb, b); - A = (x.array() < center.array()).select(-A, A); return std::make_pair(A, b); diff --git a/include/preprocess/crhmc/weighted_two_sided_barrier.h b/include/preprocess/crhmc/weighted_two_sided_barrier.h index 1bda5d3bf..09f5eb798 100644 --- a/include/preprocess/crhmc/weighted_two_sided_barrier.h +++ b/include/preprocess/crhmc/weighted_two_sided_barrier.h @@ -21,6 +21,7 @@ #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" +#include "preprocess/crhmc/crhmc_utils.h" #include /// @brief A weighted two sided barrier used by crhmc sampler @@ -43,8 +44,7 @@ template class weighted_two_sided_barrier { const NT max_step = 1e16; // largest step size const NT regularization_constant = 1e-20; // small regularization to not have a large inverse const NT unbounded_center_coord = 1e6; - VT extraHessian; - + MT extraHessian; const NT inf = std::numeric_limits::infinity(); VT w; @@ -54,7 +54,7 @@ template class weighted_two_sided_barrier { set_bound(_lb, _ub); w = _w; vdim = _vdim; - extraHessian = regularization_constant * VT::Ones(n); + extraHessian = regularization_constant * VT::Ones(n,1); } weighted_two_sided_barrier() { vdim = 1; } @@ -67,11 +67,25 @@ template class weighted_two_sided_barrier { w.cwiseQuotient((x - lb).cwiseProduct((x - lb))); return d + extraHessian; } + MT hessian(MT const &x){ + MT d = (((- x).colwise()+ub).cwiseProduct(((- x).colwise()+ub))).cwiseInverse() + + ((x.colwise() - lb).cwiseProduct((x.colwise() - lb))).cwiseInverse(); + return w.asDiagonal()*d + extraHessian; + } VT tensor(VT const &x) { VT d = 2 * w.cwiseQuotient(((ub - x).cwiseProduct((ub - x))).cwiseProduct((ub - x))) - 2 * w.cwiseQuotient(((x - lb).cwiseProduct((x - lb))).cwiseProduct((x - lb))); return d; } + MT tensor(MT const &x) { + MT d = 2 * ((((-x).colwise()+ub).cwiseProduct(((-x).colwise()+ub))).cwiseProduct(((-x).colwise()+ub))).cwiseInverse() - + 2 * (((x.colwise() - lb).cwiseProduct(( x.colwise() - lb))).cwiseProduct(( x.colwise() - lb))).cwiseInverse(); + return w.asDiagonal()*d; + } + MT quadratic_form_gradient(MT const &x, MT const &u) { + // Output the -grad of u' (hess phi(x)) u. + return (u.cwiseProduct(u)).cwiseProduct(tensor(x)); + } VT quadratic_form_gradient(VT const &x, VT const &u) { // Output the -grad of u' (hess phi(x)) u. @@ -99,7 +113,13 @@ template class weighted_two_sided_barrier { bool feasible(VT const &x) { return (x.array() > lb.array() && x.array() < ub.array()).all(); } - + VT feasible(MT const &x) { + VT result=VT::Ones(x.cols()); + for(int i=0;i lb.array() && x.col(i).array() < ub.array()).all(); + } + return result; + } void set_bound(VT const &_lb, VT const &_ub) { lb = _lb; @@ -122,10 +142,11 @@ template class weighted_two_sided_barrier { } VT c = (ub + lb) / 2; - - c(lowerIdx) = lb(lowerIdx) + VT::Ones(x2, 1) * unbounded_center_coord; - c(upperIdx) = ub(upperIdx) - VT::Ones(x1, 1) * unbounded_center_coord; - c(freeIdx) *= 0.0; + VT bias1=VT::Ones(x2, 1) * unbounded_center_coord; + saxpy(c,lb,bias1,lowerIdx,lowerIdx); + VT bias2=-VT::Ones(x1, 1) * unbounded_center_coord; + saxpy(c,ub,bias2,upperIdx,upperIdx); + set(c, freeIdx, 0.0); center = c; } @@ -133,13 +154,10 @@ template class weighted_two_sided_barrier { std::pair boundary(VT const &x) { // Output the normal at the boundary around x for each barrier. // Assume: only 1 vector is given - VT A = VT::Ones(x.rows(), 1); - VT b = ub; b = (x.array() < center.array()).select(-lb, b); - A = (x.array() < center.array()).select(-A, A); return std::make_pair(A, b); diff --git a/include/random_walks/crhmc/additional_units/auto_tuner.hpp b/include/random_walks/crhmc/additional_units/auto_tuner.hpp index 0fc50e79a..66a8d51a7 100644 --- a/include/random_walks/crhmc/additional_units/auto_tuner.hpp +++ b/include/random_walks/crhmc/additional_units/auto_tuner.hpp @@ -33,24 +33,23 @@ class auto_tuner { public: Opts options; - weight_tuner *tune_weights; - regularizion_tuner *tune_regularization; - step_size_tuner *tune_step_size; + std::unique_ptr tune_weights; + std::unique_ptr tune_regularization; + std::unique_ptr tune_step_size; auto_tuner(Sampler &s) : options(s.params.options) { if (options.DynamicWeight) { - tune_weights = new weight_tuner(s); + tune_weights = std::unique_ptr(new weight_tuner(s)); } if (options.DynamicRegularizer) { - tune_regularization = new regularizion_tuner(s); + tune_regularization = std::unique_ptr(new regularizion_tuner(s)); } if (options.DynamicStepSize) { - tune_step_size = new step_size_tuner(s); + tune_step_size = std::unique_ptr(new step_size_tuner(s)); } } - void updateModules(Sampler &s, RandomNumberGenerator &rng) - { + void updateModules(Sampler &s, RandomNumberGenerator &rng) { if (options.DynamicWeight) { tune_weights->update_weights(s, rng); } diff --git a/include/random_walks/crhmc/additional_units/dynamic_regularizer.hpp b/include/random_walks/crhmc/additional_units/dynamic_regularizer.hpp index 9cd80b18d..81449836b 100644 --- a/include/random_walks/crhmc/additional_units/dynamic_regularizer.hpp +++ b/include/random_walks/crhmc/additional_units/dynamic_regularizer.hpp @@ -25,33 +25,34 @@ class dynamic_regularizer { public: using NT = typename Sampler::NT; using Point = typename Sampler::point; - using VT = Eigen::Matrix; + using MT = Eigen::Matrix; using Opts = typename Sampler::Opts; int n; - VT bound; + int simdLen; + MT bound; Opts &options; - VT &extraHessian; + MT &extraHessian; dynamic_regularizer(Sampler &s) : + simdLen(s.simdLen), options(s.params.options), extraHessian(options.DynamicWeight ? s.solver->ham.weighted_barrier->extraHessian : s.solver->ham.barrier->extraHessian) { n = s.dim; - bound = VT::Ones(n); - extraHessian = VT::Ones(n); + bound = MT::Ones(n, simdLen); + extraHessian = MT::Ones(n, simdLen); } - void update_regularization_factor(Sampler &s, RandomNumberGenerator &rng) - { - VT x = s.x.getCoefficients(); - x = (x.cwiseAbs()).cwiseMax(VT::Ones(n)); + void update_regularization_factor(Sampler &s, RandomNumberGenerator &rng) { + MT x = s.x; + x = (x.cwiseAbs()).cwiseMax(1); bound = bound.cwiseMax(x); - if ((2 / (bound.array() * bound.array()) < n * extraHessian.array()).any()) { extraHessian = (0.5 / n) * (bound.cwiseProduct(bound)).cwiseInverse(); + s.solver->ham.forceUpdate = true; s.solver->ham.move({s.x, s.v}); - s.v = s.get_direction_with_momentum(n, rng, s.x, Point(n), false); + s.v = s.get_direction_with_momentum(n, rng, s.x, MT::Zero(n, simdLen), 0, false); } } }; diff --git a/include/random_walks/crhmc/additional_units/dynamic_step_size.hpp b/include/random_walks/crhmc/additional_units/dynamic_step_size.hpp index ef1871731..367211962 100644 --- a/include/random_walks/crhmc/additional_units/dynamic_step_size.hpp +++ b/include/random_walks/crhmc/additional_units/dynamic_step_size.hpp @@ -22,26 +22,34 @@ template class dynamic_step_size { using NT = typename Sampler::NT; using Opts = typename Sampler::Opts; + using IVT = Eigen::Array; + using VT = Eigen::Array; public: - int consecutiveBadStep = 0; + int simdLen; + IVT consecutiveBadStep; int iterSinceShrink = 0; - NT rejectSinceShrink = 0; + VT rejectSinceShrink; int ODEStepSinceShrink = 0; int effectiveStep = 0; bool warmupFinished = false; Opts &options; NT η NT &momentum; - NT acceptedStep = 0; + VT acceptedStep; + VT nEffectiveStep; // number of effective steps NT accumulatedMomentum = 0; - NT nEffectiveStep = 0; // number of effective steps - dynamic_step_size(Sampler &s) : + simdLen(s.simdLen), options(s.params.options), eta(s.solver->eta), momentum(s.params.momentum) { + nEffectiveStep = VT::Zero(simdLen); + acceptedStep = VT::Zero(simdLen); + consecutiveBadStep = IVT::Zero(simdLen); + rejectSinceShrink = VT::Zero(simdLen); + if (options.warmUpStep > 0) { eta = 1e-3; } else { @@ -49,53 +57,58 @@ class dynamic_step_size { } } void update_step_size(Sampler &s) { - acceptedStep = acceptedStep + s.prob; - accumulatedMomentum = s.prob * momentum * accumulatedMomentum + eta; - nEffectiveStep = nEffectiveStep + eta * accumulatedMomentum * s.accept; - - int bad_step = s.prob < 0.5 || s.solver->num_steps == options.maxODEStep ? 1 : 0; + acceptedStep = acceptedStep + s.prob.array(); + accumulatedMomentum = s.prob.mean() * momentum * accumulatedMomentum + eta; + Eigen::Matrix accept = (s.accept.template cast()); + nEffectiveStep = nEffectiveStep + eta * accumulatedMomentum * accept.array(); + IVT bad_step = IVT::Zero(simdLen); + if (s.solver->num_steps == options.maxODEStep) { + bad_step += 1; + } else { + bad_step = (s.prob.array() < 0.5).select(1, IVT::Zero(simdLen)); + } consecutiveBadStep = bad_step * consecutiveBadStep + bad_step; - NT warmupRatio = nEffectiveStep / options.warmUpStep; + NT warmupRatio = nEffectiveStep.mean() / options.warmUpStep; if (warmupRatio < 1 && !warmupFinished && - consecutiveBadStep < options.maxConsecutiveBadStep) { + consecutiveBadStep.maxCoeff() < options.maxConsecutiveBadStep) { eta = options.initialStep * std::min(warmupRatio + 1e-2, 1.0); momentum = 1 - std::min(1.0, eta / options.effectiveStepSize); return; } + if (!warmupFinished) { - acceptedStep = 0; - nEffectiveStep = 0; + acceptedStep = VT::Zero(simdLen); + nEffectiveStep = VT::Zero(simdLen); warmupFinished = true; } iterSinceShrink++; - rejectSinceShrink += 1 - s.prob; + rejectSinceShrink += 1 - s.prob.array(); ODEStepSinceShrink += s.solver->num_steps; int shrink = 0; NT shiftedIter = iterSinceShrink + 20 / (1 - momentum); NT targetProbability = std::pow((1.0 - momentum), (2 / 3)) / 4; - if (rejectSinceShrink > targetProbability * shiftedIter || - consecutiveBadStep > options.maxConsecutiveBadStep || + if (rejectSinceShrink.maxCoeff() > targetProbability * shiftedIter|| + consecutiveBadStep.maxCoeff() > options.maxConsecutiveBadStep || ODEStepSinceShrink > options.targetODEStep * shiftedIter) { shrink = 1; } if (shrink == 1) { iterSinceShrink = 0; - rejectSinceShrink = 0; ODEStepSinceShrink = 0; - consecutiveBadStep = 0; + rejectSinceShrink = VT::Zero(simdLen); + consecutiveBadStep = IVT::Zero(simdLen); eta /= options.shrinkFactor; momentum = 1 - std::min(0.999, eta / options.effectiveStepSize); if (eta < options.minStepSize) { - std::cerr << "Algorithm fails to converge even with step size h = " - << eta << "\n"; - exit(1); + s.P.terminate=true; + s.P.terminate_message="Algorithm fails to converge even with step size h = "+std::to_string(eta)+"\n"; } } diff --git a/include/random_walks/crhmc/additional_units/dynamic_weight.hpp b/include/random_walks/crhmc/additional_units/dynamic_weight.hpp index ce945216f..6b9433774 100644 --- a/include/random_walks/crhmc/additional_units/dynamic_weight.hpp +++ b/include/random_walks/crhmc/additional_units/dynamic_weight.hpp @@ -23,48 +23,52 @@ class dynamic_weight { using NT = typename Sampler::NT; using Point = typename Sampler::point; using VT = Eigen::Matrix; + using MT = Eigen::Matrix; + using IVT = Eigen::Array; using Opts = typename Sampler::Opts; public: - int consecutiveBadStep = 0; + int simdLen; + IVT consecutiveBadStep; int n; VT &w; Opts options; - dynamic_weight(Sampler &s) : - w(s.solver->ham.weighted_barrier->w), - options(s.params.options) + dynamic_weight(Sampler &s) + : simdLen(s.simdLen), w(s.solver->ham.weighted_barrier->w), options(s.params.options) { n = s.dim; + consecutiveBadStep = IVT::Zero(simdLen); } // If we have consecutive bad steps update the weights with // the help of the leverage scores. void update_weights(Sampler &s, RandomNumberGenerator &rng) { - int bad_step = 0; - NT threshold; - if (s.prob < 0.5 || s.solver->num_steps == options.maxODEStep) { - bad_step = 1; + IVT bad_step = IVT::Zero(simdLen); + if (s.solver->num_steps == options.maxODEStep) { + bad_step += 1; + } else { + bad_step = (s.prob.array() < 0.5).select(1, IVT::Zero(simdLen)); } + NT threshold; consecutiveBadStep = bad_step * consecutiveBadStep + bad_step; - if (!s.accepted) { - VT lsc = s.solver->ham.lsc; + if (s.accept.sum() < simdLen) { + VT lsc = s.solver->ham.lsc.colwise().maxCoeff().transpose(); /*The more bad steps in a row we have the higher we want the threshold to be In order to change w more drasticaly according to the leverage scores. So if we have more than 2 bad steps in a row we elect to set the threshold to 4 else to 16. Not many changes will be possible as the w should be upperbounded by 1*/ - if (consecutiveBadStep > 2) { + if (consecutiveBadStep.maxCoeff() > 2) { threshold = 4; } else { threshold = 16; } bool changed = (lsc.array() > threshold * w.array()).any(); - w = (lsc.array() > threshold * w.array()) - .select((w * threshold).cwiseMin(VT::Ones(n)), w); if (changed) { + w = (lsc.array() > threshold * w.array()).select((w * threshold).cwiseMin(1), w); s.solver->ham.forceUpdate = true; s.solver->ham.move({s.x, s.v}); - s.v = s.get_direction_with_momentum(n, rng, s.x, Point(n), false); + s.v = s.get_direction_with_momentum(n, rng, s.x, MT::Zero(n, simdLen), false); } } } diff --git a/include/random_walks/crhmc/crhmc_walk.hpp b/include/random_walks/crhmc/crhmc_walk.hpp index b97d79fa9..21ed8d6bb 100644 --- a/include/random_walks/crhmc/crhmc_walk.hpp +++ b/include/random_walks/crhmc/crhmc_walk.hpp @@ -36,7 +36,7 @@ struct CRHMCWalk { parameters(OracleFunctor const &F, unsigned int dim, Opts &user_options, - NT epsilon_ = 2) : + NT epsilon_ = 2) : options(user_options) { epsilon = epsilon_; @@ -59,17 +59,19 @@ struct CRHMCWalk { using pts = std::vector; using NT = typename Point::FT; using VT = Eigen::Matrix; + using MT = Eigen::Matrix; using Sampler = CRHMCWalk::Walk; using Opts = typename Polytope::Opts; + using IVT = Eigen::Matrix; // Hyperparameters of the sampler parameters ¶ms; // Numerical ODE solver - Solver *solver; + std::unique_ptr solver; // Dimension unsigned int dim; @@ -87,25 +89,25 @@ struct CRHMCWalk { float average_acceptance_prob = 0; // Acceptance probability - NT prob; + VT prob; bool accepted; - NT accept; + IVT accept; bool update_modules; - + int simdLen; // References to xs - Point x, v; + MT x, v; // Proposal points - Point x_tilde, v_tilde; + MT x_tilde, v_tilde; // Gradient function NegativeGradientFunctor &F; // Auto tuner - auto_tuner *module_update; + std::unique_ptr>module_update; // Helper variables - NT H, H_tilde, log_prob, u_logprob; + VT H, H_tilde; // Density exponent NegativeLogprobFunctor &f; #ifdef TIME_KEEPING @@ -118,41 +120,50 @@ struct CRHMCWalk { NegativeLogprobFunctor &neg_logprob_f, parameters ¶m) : params(param), + P(Problem), F(neg_grad_f), - f(neg_logprob_f), - P(Problem) + f(neg_logprob_f) { dim = p.dimension(); - + simdLen = params.options.simdLen; // Starting point is provided from outside - x = p; + x = p.getCoefficients() * MT::Ones(1, simdLen); accepted = false; // Initialize solver - solver = - new Solver(0.0, params.eta, pts{x, x}, F, Problem, params.options); - v = solver->get_state(1); - module_update = new auto_tuner(*this); + solver = std::unique_ptr(new Solver(0.0, params.eta, {x, x}, F, Problem, params.options)); + v = MT::Zero(dim, simdLen); + module_update = std::unique_ptr>(new auto_tuner(*this)); update_modules = params.options.DynamicWeight || params.options.DynamicRegularizer || params.options.DynamicStepSize; }; - Point get_direction_with_momentum(unsigned int const &dim, - RandomNumberGenerator &rng, - Point x, - Point v, - NT momentum = 0, - bool normalize = true) + // Sample a new velocity with momentum + MT get_direction_with_momentum(unsigned int const &dim, + RandomNumberGenerator &rng, MT const &x, MT v, + NT momentum = 0, bool normalize = true) { - Point z = GetDirection::apply(dim, rng, normalize); + MT z = MT(dim, simdLen); + for (int i = 0; i < simdLen; i++) + { + z.col(i) = GetDirection::apply(dim, rng, normalize).getCoefficients(); + } solver->ham.move({x, v}); - VT sqrthess = (solver->ham.hess).cwiseSqrt(); - z = Point(sqrthess.cwiseProduct(z.getCoefficients())); + MT sqrthess = (solver->ham.hess).cwiseSqrt(); + z = sqrthess.cwiseProduct(z); return v * std::sqrt(momentum) + z * std::sqrt(1 - momentum); } // Returns the current point in the tranformed in the original space - inline Point getPoint() { return Point(P.T * x.getCoefficients() + P.y); } + inline MT getPoints() { return (P.T * x).colwise() + P.y; } + // Returns the current point in the tranformed in the original space + inline Point getPoint() { return Point(P.T * x.col(0) + P.y); } + inline MT masked_choose(MT &x, MT &x_tilde, IVT &accept) { + return accept.transpose().replicate(x.rows(), 1).select(x_tilde, x); + } + inline void disable_adaptive(){ + update_modules=false; + } inline void apply(RandomNumberGenerator &rng, int walk_length = 1, bool metropolis_filter = true) @@ -160,47 +171,45 @@ struct CRHMCWalk { num_runs++; // Pick a random velocity with momentum v = get_direction_with_momentum(dim, rng, x, v, params.momentum, false); - solver->set_state(0, x); solver->set_state(1, v); // Get proposals solver->steps(walk_length, accepted); x_tilde = solver->get_state(0); v_tilde = solver->get_state(1); - if (metropolis_filter) { #ifdef TIME_KEEPING start = std::chrono::system_clock::now(); #endif // Calculate initial Hamiltonian H = solver->ham.hamiltonian(x, v); + // Calculate new Hamiltonian - H_tilde = solver->ham.hamiltonian(x_tilde, Point(dim) - v_tilde); + H_tilde = solver->ham.hamiltonian(x_tilde, -v_tilde); + #ifdef TIME_KEEPING end = std::chrono::system_clock::now(); H_duration += end - start; #endif - NT feasible = solver->ham.feasible(x_tilde.getCoefficients(), - v_tilde.getCoefficients()); - prob = std::min(1.0, exp(H - H_tilde)) * feasible; - - log_prob = log(prob); - total_acceptance_prob += prob; - - // Decide to switch - if (rng.sample_urdist() < prob) { - x = x_tilde; - v = v_tilde; - accepted = true; - } - else { - total_discarded_samples++; - accepted = false; - v = Point(dim) - v; + VT feasible = solver->ham.feasible(x_tilde, + v_tilde); + prob = (1.0 < exp((H - H_tilde).array())).select(1.0, exp((H - H_tilde).array())); + prob = (feasible.array() > 0.5).select(prob, 0); + + total_acceptance_prob += prob.sum(); + VT rng_vector = VT(simdLen); + for (int i = 0; i < simdLen; i++) + { + rng_vector(i) = rng.sample_urdist(); } - discard_ratio = (1.0 * total_discarded_samples) / num_runs; - average_acceptance_prob = total_acceptance_prob / num_runs; - accept = accepted ? 1 : 0; + accept = (rng_vector.array() < prob.array()).select(1 * IVT::Ones(simdLen), 0 * IVT::Ones(simdLen)); + + x = masked_choose(x, x_tilde, accept); + v = -v; + v = masked_choose(v, v_tilde, accept); + total_discarded_samples += simdLen - accept.sum(); + discard_ratio = (1.0 * total_discarded_samples) / (num_runs * simdLen); + average_acceptance_prob = total_acceptance_prob / (num_runs * simdLen); } else { x = x_tilde; v = v_tilde; @@ -210,18 +219,24 @@ struct CRHMCWalk { } } #ifdef TIME_KEEPING - void print_timing_information() { - std::cerr << "--------------Timing Information--------------\n"; + void initialize_timers() { + H_duration = std::chrono::duration::zero(); + solver->DU_duration = std::chrono::duration::zero(); + solver->approxDK_duration = std::chrono::duration::zero(); + } + template + void print_timing_information(StreamType &stream) { + stream << "---Sampling Timing Information" << std::endl; double DU_time = solver->DU_duration.count(); double DK_time = solver->approxDK_duration.count(); double H_time = H_duration.count(); double total_time = H_time + DK_time + DU_time; - std::cerr << "Computing the Hamiltonian in time, " << H_time << " secs\n"; - std::cerr << "Computing DU partial derivatives in time, " << DU_time - << " secs\n"; - std::cerr << "Computing DK partial derivatives in time, " << DK_time - << " secs\n"; - std::cerr << "H_time + DK_time + DU_time: " << total_time << "\n"; + stream << "Computing the Hamiltonian in time, " << H_time << " secs\n"; + stream << "Computing DU partial derivatives in time, " << DU_time + << " secs\n"; + stream << "Computing DK partial derivatives in time, " << DK_time + << " secs\n"; + stream << "H_time + DK_time + DU_time: " << total_time << "\n"; } #endif }; diff --git a/include/random_walks/crhmc/hamiltonian.hpp b/include/random_walks/crhmc/hamiltonian.hpp index d8cb5a82e..0d9ef5465 100644 --- a/include/random_walks/crhmc/hamiltonian.hpp +++ b/include/random_walks/crhmc/hamiltonian.hpp @@ -17,42 +17,43 @@ #define HAMILTONIAN_HPP #include "preprocess/crhmc/two_sided_barrier.h" #include "preprocess/crhmc/weighted_two_sided_barrier.h" +#include "PackedCSparse/PackedChol.h" #include "preprocess/crhmc/crhmc_utils.h" #include -/// @brief Class for the hamiltonian used in crhmc sampler -/// @tparam Polytope Polytope Type -/// @tparam Point Point Type -template +template class Hamiltonian { using VT = typename Polytope::VT; + using IVT = Eigen::Array; + using BVT = Eigen::Matrix; using NT = typename Polytope::NT; using MT = typename Polytope::MT; - using Tx = typename Polytope::Tx; - using CholObj = typename Polytope::CholObj; - using Opts = typename Polytope::Opts; using SpMat = typename Polytope::SpMat; - using pts = std::vector; + using Tx = FloatArray; + using CholObj = PackedChol; + using Opts = typename Polytope::Opts; + using pts = std::vector; using Barrier = two_sided_barrier; using WeightedBarrier = weighted_two_sided_barrier; public: bool prepared = false; - bool forceUpdate = true; + bool forceUpdate = true; // Update function oracle temporary varibles Polytope &P; - VT hess; + MT hess; bool dUDx_empty = true; - Point last_dUdx; + MT last_dUdx; CholObj solver; pts xs; - VT x; - VT dfx; - VT lsc; - NT fx = 0; + MT x; + MT dfx; + MT lsc; + VT fx; int n; int m; + int num_runs = 0; Barrier *barrier; - WeightedBarrier *weighted_barrier; + std::unique_ptr weighted_barrier; Opts &options; Hamiltonian(Polytope &boundaries) : P(boundaries), @@ -61,111 +62,122 @@ class Hamiltonian { { n = P.dimension(); m = P.equations(); - x = VT::Zero(n); - xs = {Point(n), Point(n)}; - lsc = VT::Zero(n); + x = MT::Zero(n, simdLen); + xs = {x, x}; + lsc = MT::Zero(simdLen, n); solver.accuracyThreshold = options.solver_accuracy_threshold; - if (options.DynamicWeight) { + if (options.DynamicWeight) + { weighted_barrier = - new WeightedBarrier(P.barrier.lb, P.barrier.ub, P.w_center); + std::unique_ptr(new WeightedBarrier(P.barrier.lb, P.barrier.ub, P.w_center)); + weighted_barrier->extraHessian.resize(n, simdLen); + weighted_barrier->extraHessian = MT::Ones(n, simdLen) * options.regularization_factor; } barrier = &P.barrier; + barrier->extraHessian.resize(n, simdLen); + barrier->extraHessian = MT::Ones(n, simdLen) * options.regularization_factor; } // Compute H(x,v) - NT hamiltonian(Point x, Point v) + VT hamiltonian(MT x, MT v) { prepare({x, v}); pts pd = DK({x, v}); - NT K = 0.5 * v.dot(pd[0]); - NT U = 0.5 * (solver.logdet() + ((hess.array()).log()).sum()); - U = U + fx; - NT E = U + K; + VT K = 0.5 * (v.cwiseProduct(pd[0])).colwise().sum(); + Tx out=solver.logdet(); + VT logdet=VT(simdLen); + for (int i = 0; i < simdLen; i++) + logdet(i) = get(out, i); + VT U = ((hess.array()).log()).colwise().sum(); + U = (U + logdet) * 0.5 + fx; + VT E = U + K; return E; } // Helper is nan function for vectors template - bool isnan(MatrixType x) + IVT is_not_nan(MatrixType x) { + IVT result = IVT::Ones(x.cols()); for (int i = 0; i < x.rows(); i++) { for (int j = 0; j < x.cols(); j++) { if (std::isnan(x(i, j))) { - return true; + result(j) = 0; } } } - return false; + return result; } // Test if the values of x and v are valid and if x is feasible - NT feasible(VT x, VT v) + VT feasible(MT x, MT v) { - bool feasible_coordinate = true; + VT feasible_coordinate = VT::Ones(x.cols()); if (options.DynamicWeight) { feasible_coordinate = weighted_barrier->feasible(x); } else { feasible_coordinate = barrier->feasible(x); } - bool r = !isnan(x) && !isnan(v) && feasible_coordinate; - if (r) { - return 1; - } - return 0; + VT r = feasible_coordinate.cwiseProduct((is_not_nan(x) * is_not_nan(v)).matrix()); + return r; } // prepare the solver weighted by the hessian void prepare(pts const &xs) { move(xs); if (!prepared) { - VT Hinv = hess.cwiseInverse(); + MT Hinv = (hess.cwiseInverse()).transpose(); solver.decompose((Tx *)Hinv.data()); + dUDx_empty = true; } - dUDx_empty = true; prepared = true; } // Computation of the partial derivatives of the K term pts DK(pts const &x_bar) { - VT x = x_bar[0].getCoefficients(); - VT v = x_bar[1].getCoefficients(); + MT x = x_bar[0]; + MT v = x_bar[1]; move(x_bar); - VT invHessV = v.cwiseQuotient(hess); - VT input_vector = P.Asp * invHessV; - VT out_vector = VT::Zero(m); + MT invHessV = v.cwiseQuotient(hess); + MT input_vector = P.Asp * invHessV; + input_vector.transposeInPlace(); + MT out_vector = MT::Zero(simdLen, m); solver.solve((Tx *)input_vector.data(), (Tx *)out_vector.data()); - Point dKdv = - Point(invHessV - (P.Asp.transpose() * out_vector).cwiseQuotient(hess)); + out_vector.transposeInPlace(); + MT dKdv = + invHessV - (P.Asp.transpose() * out_vector).cwiseQuotient(hess); - Point dKdx = Point(n); + MT dKdx = MT::Zero(n, simdLen); if (options.DynamicWeight) { - dKdx = Point( - weighted_barrier->quadratic_form_gradient(x, dKdv.getCoefficients()) / - 2); + dKdx = + weighted_barrier->quadratic_form_gradient(x, dKdv) / + 2; } else { - dKdx = Point(barrier->quadratic_form_gradient(x, dKdv.getCoefficients()) / - 2); + dKdx = barrier->quadratic_form_gradient(x, dKdv) / + 2; } return {dKdv, dKdx}; } // Approximate computation of the partial derivatives of the K term - pts approxDK(pts const &x_bar, VT &nu) + pts approxDK(pts const &x_bar, MT &nu) { - VT x = x_bar[0].getCoefficients(); - VT v = x_bar[1].getCoefficients(); + MT x = x_bar[0]; + MT v = x_bar[1]; move(x_bar); - VT dUdv_b = P.Asp * (v - P.Asp.transpose() * nu).cwiseQuotient(hess); - VT out_solver = VT(nu.rows(), nu.cols()); + MT dUdv_b = P.Asp * (v - P.Asp.transpose() * nu).cwiseQuotient(hess); + dUdv_b.transposeInPlace(); + MT out_solver = MT(nu.cols(), nu.rows()); solver.solve((Tx *)dUdv_b.data(), (Tx *)out_solver.data()); - nu = nu + out_solver; - Point dKdv = Point((v - P.Asp.transpose() * nu).cwiseQuotient(hess)); - Point dKdx = Point(n); + nu = nu + out_solver.transpose(); + + MT dKdv = (v - P.Asp.transpose() * nu).cwiseQuotient(hess); + MT dKdx = MT::Zero(n, simdLen); if (options.DynamicWeight) { - dKdx = Point( - weighted_barrier->quadratic_form_gradient(x, dKdv.getCoefficients()) / - 2); + dKdx = + weighted_barrier->quadratic_form_gradient(x, dKdv) / + 2; } else { - dKdx = Point(barrier->quadratic_form_gradient(x, dKdv.getCoefficients()) / - 2); + dKdx = barrier->quadratic_form_gradient(x, dKdv) / + 2; } return {dKdv, dKdx}; } @@ -173,24 +185,25 @@ class Hamiltonian { // This is only dependent on x and so DU/Dv=0 pts DU(pts const &x_bar) { - VT x = x_bar[0].getCoefficients(); + MT x = x_bar[0]; move(x_bar); if (!prepared || dUDx_empty) { prepare(x_bar); solver.leverageScoreComplement((Tx *)lsc.data()); if (options.DynamicWeight) { - last_dUdx = Point(-(weighted_barrier->tensor(x).cwiseProduct(lsc)) - .cwiseQuotient(2 * hess) - - dfx); + last_dUdx = (weighted_barrier->tensor(x).cwiseProduct(lsc.transpose())) + .cwiseQuotient(2 * hess) + + dfx; } else { - last_dUdx = Point( - -(barrier->tensor(x).cwiseProduct(lsc)).cwiseQuotient(2 * hess) - - dfx); + last_dUdx = + (barrier->tensor(x).cwiseProduct(lsc.transpose())).cwiseQuotient(2 * hess) + + dfx; } dUDx_empty = false; } - return {Point(n), last_dUdx}; + + return {MT::Zero(n, simdLen), -last_dUdx}; } // Compute the computations involving only x iff x has been changed // Else they are stored @@ -200,37 +213,37 @@ class Hamiltonian { return; } xs = y; - x = xs[0].getCoefficients(); - VT h; + x = xs[0]; + MT h; std::tie(fx, dfx, h) = P.f_oracle(x); if (options.DynamicWeight) { hess = weighted_barrier->hessian(x) + h; } else { hess = barrier->hessian(x) + h; } - forceUpdate = false; prepared = false; } // Project x to the polytope - void project(pts &xs) - { + void project(pts &xs) { move(xs); - VT x = xs[0].getCoefficients(); + MT x = xs[0]; int m = P.Asp.rows(); - VT out_vector = VT(m); - VT in_vector = P.b - P.Asp * x; + MT out_vector = MT(simdLen, m); + MT in_vector = (-P.Asp * x).colwise() + P.b; + in_vector.transposeInPlace(); solver.solve((Tx *)in_vector.data(), (Tx *)out_vector.data()); + out_vector.transposeInPlace(); out_vector = P.Asp.transpose() * out_vector; - xs[0] = xs[0] + Point((out_vector).cwiseQuotient(hess)); + xs[0] = xs[0] + (out_vector).cwiseQuotient(hess); } // Get the inner product of x and ds weighted by the hessian - NT x_norm(pts const &xs, pts const &dx) + VT x_norm(pts const &xs, pts const &dx) { move(xs); - VT dx_x = dx[0].getCoefficients(); - VT r = (dx_x.cwiseProduct(dx_x)).cwiseProduct(hess); - return r.sum(); + MT dx_x = dx[0]; + MT r = (dx_x.cwiseProduct(dx_x)).cwiseProduct(hess); + return r.colwise().sum(); } }; #endif diff --git a/include/sampling/random_point_generators.hpp b/include/sampling/random_point_generators.hpp index a2a811dd1..e70e14617 100644 --- a/include/sampling/random_point_generators.hpp +++ b/include/sampling/random_point_generators.hpp @@ -255,6 +255,65 @@ struct LogconcaveRandomPointGenerator } }; +template +< + typename Walk +> +struct CrhmcRandomPointGenerator +{ + + template + < + typename Polytope, + typename Point, + typename PointList, + typename WalkPolicy, + typename RandomNumberGenerator, + typename NegativeGradientFunctor, + typename NegativeLogprobFunctor, + typename Parameters + > + static void apply(Polytope &P, + Point &p, // a point to start + unsigned int const& rnum, + unsigned int const& walk_length, + PointList &randPoints, + WalkPolicy &policy, + RandomNumberGenerator &rng, + NegativeGradientFunctor &F, + NegativeLogprobFunctor &f, + Parameters ¶meters, + Walk &walk, + int simdLen=1, + bool raw_output= false) + { + typedef typename Walk::MT MT; + for (unsigned int i = 0; i < std::ceil((float)rnum/simdLen); ++i) + { + // Gather one sample + walk.apply(rng, walk_length); + if(walk.P.terminate){return;} + MT x; + if(raw_output){ + x=walk.x; + }else{ + x=walk.getPoints(); + } + if((i + 1) * simdLen > rnum){ + for(int j = 0; j < rnum-simdLen*i; j++){ + Point p = Point(x.col(j)); + policy.apply(randPoints, p); + } + break; + } + // Use PushBackWalkPolicy + for(int j=0; j +void crhmc_sampling(PointList &randPoints, + Polytope &P, + RandomNumberGenerator &rng, + const int walk_len, + const unsigned int rnum, + const unsigned int nburns, + NegativeGradientFunctor &F, + NegativeLogprobFunctor &f, + HessianFunctor &h, + int simdLen = 1, + bool raw_output=false) { + typedef typename Polytope::MT MatrixType; + typedef crhmc_input + < + MatrixType, + Point, + NegativeLogprobFunctor, + NegativeGradientFunctor, + HessianFunctor + > Input; + Input input = convert2crhmc_input(P, f, F, h); + typedef crhmc_problem CrhmcProblem; + CrhmcProblem problem = CrhmcProblem(input); + if(problem.terminate){return;} + typedef typename WalkTypePolicy::template Walk + < + Point, + CrhmcProblem, + RandomNumberGenerator, + NegativeGradientFunctor, + NegativeLogprobFunctor, + Solver + > walk; + typedef typename WalkTypePolicy::template parameters + < + NT, + NegativeGradientFunctor + > walk_params; + Point p = Point(problem.center); + problem.options.simdLen=simdLen; + walk_params params(input.df, p.dimension(), problem.options); + + if (input.df.params.eta > 0) { + params.eta = input.df.params.eta; + } + + PushBackWalkPolicy push_back_policy; + + walk crhmc_walk = walk(problem, p, input.df, input.f, params); + + typedef CrhmcRandomPointGenerator RandomPointGenerator; + + RandomPointGenerator::apply(problem, p, nburns, walk_len, randPoints, + push_back_policy, rng, F, f, params, crhmc_walk); + //crhmc_walk.disable_adaptive(); + randPoints.clear(); + RandomPointGenerator::apply(problem, p, rnum, walk_len, randPoints, + push_back_policy, rng, F, f, params, crhmc_walk, simdLen, raw_output); +} +#include "ode_solvers/ode_solvers.hpp" +template < + typename Polytope, + typename RNGType, + typename PointList, + typename NegativeGradientFunctor, + typename NegativeLogprobFunctor, + typename HessianFunctor, + typename CRHMCWalk, + int simdLen=1 +> +void execute_crhmc(Polytope &P, RNGType &rng, PointList &randPoints, + unsigned int const& walkL, unsigned int const& numpoints, + unsigned int const& nburns, NegativeGradientFunctor *F=NULL, + NegativeLogprobFunctor *f=NULL, HessianFunctor *h=NULL, bool raw_output= false){ +typedef typename Polytope::MT MatrixType; +typedef typename Polytope::PointType Point; +typedef typename Point::FT NT; +if(h!=NULL){ +typedef crhmc_input + < + MatrixType, + Point, + NegativeLogprobFunctor, + NegativeGradientFunctor, + HessianFunctor + > Input; +typedef crhmc_problem CrhmcProblem; +crhmc_sampling < + PointList, + Polytope, + RNGType, + CRHMCWalk, + NT, + Point, + NegativeGradientFunctor, + NegativeLogprobFunctor, + HessianFunctor, + ImplicitMidpointODESolver < + Point, + NT, + CrhmcProblem, + NegativeGradientFunctor, + simdLen + > +>(randPoints, P, rng, walkL, numpoints, nburns, *F, *f, *h, simdLen, raw_output); +}else{ + typedef crhmc_input + < + MatrixType, + Point, + NegativeLogprobFunctor, + NegativeGradientFunctor, + ZeroFunctor + > Input; + typedef crhmc_problem CrhmcProblem; + ZeroFunctor zerof; +crhmc_sampling < + PointList, + Polytope, + RNGType, + CRHMCWalk, + NT, + Point, + NegativeGradientFunctor, + NegativeLogprobFunctor, + ZeroFunctor, + ImplicitMidpointODESolver < + Point, + NT, + CrhmcProblem, + NegativeGradientFunctor, + simdLen + > +>(randPoints, P, rng, walkL, numpoints, nburns, *F, *f, zerof, simdLen, raw_output); +} +} template < typename WalkTypePolicy, diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d95a49c7f..3adbe4681 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -324,12 +324,14 @@ else () COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc) + add_executable (crhmc_sampling_test crhmc_sampling_test.cpp $) add_test(NAME crhmc_sampling_test_crhmc COMMAND crhmc_sampling_test -tc=crhmc) add_test(NAME crhmc_test_polytope_sampling COMMAND crhmc_sampling_test -tc=test_polytope_sampling_crhmc) - + add_test(NAME crhmc_test_sparse_sampling + COMMAND crhmc_sampling_test -tc=test_sampling_sparse_problem) add_executable (simple_mc_integration simple_mc_integration.cpp $) add_test(NAME simple_mc_integration_over_limits COMMAND simple_mc_integration -tc=rectangle) @@ -365,7 +367,7 @@ else () #set_target_properties(benchmarks_crhmc # PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) #set_target_properties(benchmarks_crhmc_sampling - # PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) + # PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) set_target_properties(crhmc_polytope_preparation_test PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) set_target_properties(crhmc_sampling_test @@ -389,15 +391,15 @@ else () TARGET_LINK_LIBRARIES(benchmarks_sob ${LP_SOLVE} ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(benchmarks_cg ${LP_SOLVE} ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(benchmarks_cb ${LP_SOLVE} ${MKL_LINK} coverage_config) - #TARGET_LINK_LIBRARIES(benchmarks_crhmc_sampling ${LP_SOLVE} ${MKL_LINK} ${QD_LIB} coverage_config) - #TARGET_LINK_LIBRARIES(benchmarks_crhmc ${LP_SOLVE} ${MKL_LINK} ${QD_LIB} coverage_config) + #TARGET_LINK_LIBRARIES(benchmarks_crhmc_sampling ${LP_SOLVE} ${MKL_LINK} QD_LIB coverage_config) + #TARGET_LINK_LIBRARIES(benchmarks_crhmc ${LP_SOLVE} ${MKL_LINK} QD_LIB coverage_config) TARGET_LINK_LIBRARIES(simple_mc_integration ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(ode_solvers_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} ${QD_LIB} coverage_config) + TARGET_LINK_LIBRARIES(ode_solvers_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) TARGET_LINK_LIBRARIES(boundary_oracles_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(root_finders_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(crhmc_polytope_preparation_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} ${QD_LIB} coverage_config) + TARGET_LINK_LIBRARIES(crhmc_polytope_preparation_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) TARGET_LINK_LIBRARIES(logconcave_sampling_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(crhmc_sampling_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} ${QD_LIB} coverage_config) + TARGET_LINK_LIBRARIES(crhmc_sampling_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) TARGET_LINK_LIBRARIES(order_polytope ${LP_SOLVE} coverage_config) TARGET_LINK_LIBRARIES(matrix_sampling_test ${LP_SOLVE} ${MKL_LINK} coverage_config) diff --git a/test/benchmarks_crhmc.cpp b/test/benchmarks_crhmc.cpp index 848c4d6db..3088cb656 100644 --- a/test/benchmarks_crhmc.cpp +++ b/test/benchmarks_crhmc.cpp @@ -24,12 +24,13 @@ #include #include using NT = double; +using VT = Eigen::Matrix; +using MT = Eigen::Matrix; using Kernel = Cartesian; using Point = typename Kernel::Point; using Hpolytope = HPolytope; using Input = crhmc_input; using CrhmcProblem = crhmc_problem; -using VT = Eigen::Matrix; inline bool exists_check(const std::string &name) { std::ifstream f(name.c_str()); diff --git a/test/benchmarks_crhmc_sampling.cpp b/test/benchmarks_crhmc_sampling.cpp index 27460b5be..6706553a7 100644 --- a/test/benchmarks_crhmc_sampling.cpp +++ b/test/benchmarks_crhmc_sampling.cpp @@ -51,8 +51,7 @@ struct SimulationStats { NT average_acceptance_prob = NT(0); NT step_size = NT(0); - friend std::ostream &operator<<(std::ostream &out, - const SimulationStats &stats) + friend std::ostream &operator<<(std::ostream &out, const SimulationStats &stats) { out << stats.method << "," << stats.walk_length << "," << stats.min_ess << "," << stats.max_psrf << "," << stats.time_per_draw << "," @@ -147,13 +146,12 @@ NT check_interval_psrf(MT &samples, NT target = NT(1.2)) { } return max_psrf; } -template -std::vector> benchmark_polytope_sampling( - Polytope &P, NT eta = NT(-1), unsigned int walk_length = 1, - double target_time = std::numeric_limits::max(), bool rounding = false, - bool centered = false, unsigned int max_draws = 80000, - unsigned int num_burns = 20000) -{ +template +std::vector> benchmark_polytope_sampling(StreamType &stream, + Polytope &P, NT eta = NT(-1), unsigned int walk_length = 1, + double target_time = std::numeric_limits::max(), bool rounding = false, + bool centered = false, unsigned int max_draws = 80000, + unsigned int num_burns = 20000) { using Kernel = Cartesian; using Point = typename Kernel::Point; using MT = typename Polytope::MT; @@ -164,7 +162,7 @@ std::vector> benchmark_polytope_sampling( using Input = crhmc_input; using CrhmcProblem = crhmc_problem; using Opts = opts; - using Solver = ImplicitMidpointODESolver; + using Solver = ImplicitMidpointODESolver; using RandomNumberGenerator = BoostRandomNumberGenerator; SimulationStats rdhr_stats; @@ -187,7 +185,7 @@ std::vector> benchmark_polytope_sampling( unsigned int dim = x0.dimension(); if (rounding) { - std::cout << "SVD Rounding" << std::endl; + stream << "SVD Rounding" << std::endl; svd_rounding(P, inner_ball, walk_length, rng); } @@ -207,12 +205,17 @@ std::vector> benchmark_polytope_sampling( std::chrono::time_point start, stop; Opts options; + options.simdLen = simdLen; CRHMCWalk::parameters crhmc_params(F, dim, options); Input input = Input(P.dimension(), f, F, H); input.Aineq = P.get_mat(); input.bineq = P.get_vec(); CrhmcProblem crhmc_problem = CrhmcProblem(input); +#ifdef TIME_KEEPING + crhmc_problem.print_preparation_time(stream); +#endif + Point x_start(crhmc_problem.center); CRHMCWalk::Walk @@ -237,13 +240,20 @@ std::vector> benchmark_polytope_sampling( std::cout << std::endl; std::cout << "Sampling" << std::endl; - +#ifdef TIME_KEEPING + crhmc.initialize_timers(); +#endif start = std::chrono::high_resolution_clock::now(); - for (unsigned int i = 0; i < max_actual_draws; i++) { + for (unsigned int i = 0; i < std::ceil(max_actual_draws / simdLen); i++) { for (int k = 0; k < walk_length; k++) { crhmc.apply(rng, 1); } - samples.col(i) = crhmc.getPoint().getCoefficients(); + MT sample = crhmc.getPoints(); + if (i * simdLen + simdLen - 1 < max_actual_draws) { + samples(Eigen::all, Eigen::seq(i * simdLen, i * simdLen + simdLen - 1)) = sample; + } else { + samples(Eigen::all, Eigen::seq(i * simdLen, max_actual_draws - 1)) = sample(Eigen::all, Eigen::seq(0, max_actual_draws - 1 - simdLen * i)); + } if (i % 1000 == 0 && i > 0) std::cout << "."; } @@ -251,30 +261,31 @@ std::vector> benchmark_polytope_sampling( ETA = (NT)std::chrono::duration_cast(stop - start) .count(); - std::cout << std::endl; -#ifdef TIME_KEEPING std::chrono::duration total_time = stop - start; - std::cerr << "Total time: " << total_time.count() << "\n"; + stream << "Total Sampling time: " << total_time.count() << "\n"; assert(total_time.count() < target_time); - std::cout << "Assertion (preparation_time< " << target_time - << " secs) passed!" << std::endl - << std::endl; - crhmc.print_timing_information(); + stream << "Assertion (preparation_time< " << target_time + << " secs) passed!" << std::endl + << std::endl; +#ifdef TIME_KEEPING + crhmc.print_timing_information(stream); #endif print_diagnostics(samples, min_ess, std::cout); - std::cout << "min ess " << min_ess << "us" << std::endl; - std::cout << "Average time per sample: " << ETA / max_actual_draws << "us" - << std::endl; - std::cout << "Average time per independent sample: " << ETA / min_ess << "us" - << std::endl; - std::cout << "Step size (final): " << crhmc.solver->eta << std::endl; - std::cout << "Discard Ratio: " << crhmc.discard_ratio << std::endl; - std::cout << "Average Acceptance Probability: " - << crhmc.average_acceptance_prob << std::endl; + stream << "Problem original size: m= " << P.num_of_hyperplanes() << ", n= " << P.dimension() << std::endl; + stream << "Number of non Zeros: " << crhmc_problem.nnz() << std::endl; + stream << "min ess " << min_ess << std::endl; + stream << "Average time per sample: " << ETA / max_actual_draws << "us" + << std::endl; + stream << "Average time per independent sample: " << ETA / min_ess << "us" + << std::endl; + stream << "Step size (final): " << crhmc.solver->eta << std::endl; + stream << "Discard Ratio: " << crhmc.discard_ratio << std::endl; + stream << "Average Acceptance Probability: " + << crhmc.average_acceptance_prob << std::endl; max_psrf = check_interval_psrf(samples); - std::cout << "max_psrf: " << max_psrf << std::endl; - std::cout << std::endl; + stream << "max_psrf: " << max_psrf << std::endl; + stream << std::endl; crhmc_stats.method = "CRHMC"; crhmc_stats.walk_length = walk_length; @@ -288,31 +299,33 @@ std::vector> benchmark_polytope_sampling( return std::vector>{rdhr_stats, crhmc_stats}; } -template -void test_benchmark_polytope( - HPolytope &P, std::string &name, bool centered, - double target_time = std::numeric_limits::max(), int walk_length = 1) -{ +template +void test_benchmark_polytope(StreamType &stream, + HPolytope &P, std::string &name, bool centered, + double target_time = std::numeric_limits::max(), int walk_length = 1) { + stream << "CRHMC polytope preparation for " << name << std::endl; std::cout << "CRHMC polytope preparation for " << name << std::endl; std::vector> results; NT step_size = 0; std::pair inner_ball; std::ofstream outfile; - std::cout << name << std::endl; outfile.open("results_" + name + "_new.txt"); P.normalize(); inner_ball = P.ComputeInnerBall(); step_size = inner_ball.second / 10; - results = benchmark_polytope_sampling(P, step_size, walk_length, target_time, - false, centered); + results = benchmark_polytope_sampling(stream, P, step_size, walk_length, target_time, + false, centered); outfile << results[0]; outfile << results[1]; outfile.close(); } -template +template void call_test_benchmark_polytope() { + std::ofstream stream; + stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + ".txt"); + stream << "---------------Using simdLen= " << simdLen << "---------------" << std::endl; using Kernel = Cartesian; using Point = typename Kernel::Point; using Hpolytope = HPolytope; @@ -321,7 +334,7 @@ void call_test_benchmark_polytope() { std::string name = "100_skinny_cube"; bool centered = false; double target_time = 20; // secs - test_benchmark_polytope(P, name, false, target_time); + test_benchmark_polytope(stream, P, name, target_time, false); } { @@ -329,23 +342,23 @@ void call_test_benchmark_polytope() { std::string name = "5_cross"; bool centered = false; double target_time = 10; // secs - test_benchmark_polytope(P, name, centered, target_time); + test_benchmark_polytope(stream, P, name, target_time, centered); } { Hpolytope P = generate_simplex(100, false); std::string name = "100_simplex"; bool centered = false; - double target_time = 15; // secs - test_benchmark_polytope(P, name, centered, target_time); + double target_time = 20; // secs + test_benchmark_polytope(stream, P, name, target_time, centered); } { Hpolytope P = generate_prod_simplex(50, false); std::string name = "50_prod_simplex"; bool centered = false; - double target_time = 15; // secs - test_benchmark_polytope(P, name, centered, target_time); + double target_time = 20; // secs + test_benchmark_polytope(stream, P, name, target_time, centered); } { @@ -353,35 +366,36 @@ void call_test_benchmark_polytope() { std::string name = "10_birkhoff"; bool centered = false; double target_time = 15; // secs - test_benchmark_polytope(P, name, centered, target_time); + test_benchmark_polytope(stream, P, name, target_time, centered); } - if (exists_check("netlib/afiro.ine")) - { - Hpolytope P = read_polytope("netlib/afiro.ine"); + if (exists_check("../test/netlib/afiro.ine")) { + Hpolytope P = read_polytope("../test/netlib/afiro.ine"); std::string name = "afiro"; bool centered = true; double target_time = 100; // secs - test_benchmark_polytope(P, name, centered, target_time); + test_benchmark_polytope(stream, P, name, target_time, centered); } - if (exists_check("metabolic_full_dim/polytope_e_coli.ine")) - { + if (exists_check("../test/metabolic_full_dim/polytope_e_coli.ine")) { Hpolytope P = - read_polytope("metabolic_full_dim/polytope_e_coli.ine"); + read_polytope("../test/metabolic_full_dim/polytope_e_coli.ine"); std::string name = "e_coli"; bool centered = true; double target_time = 600; // secs - test_benchmark_polytope(P, name, centered, target_time); + test_benchmark_polytope(stream, P, name, target_time, centered); } + + stream.close(); } int main() { - std::cout << "---------------CRHMC polytope sampling benchmarking---------------" << std::endl << std::endl; - call_test_benchmark_polytope(); + call_test_benchmark_polytope(); + call_test_benchmark_polytope(); + call_test_benchmark_polytope(); return 0; } diff --git a/test/crhmc_polytope_preparation_test.cpp b/test/crhmc_polytope_preparation_test.cpp index 6da13269b..db6fa0674 100644 --- a/test/crhmc_polytope_preparation_test.cpp +++ b/test/crhmc_polytope_preparation_test.cpp @@ -117,6 +117,8 @@ template void test_crhmc_dependent_polytope() { using VT = Eigen::Matrix; using Input = crhmc_input; using CrhmcProblem = crhmc_problem; + using SpMat = typename CrhmcProblem::SpMat; + using InputSparse = crhmc_input; using PolytopeType = HPolytope; using Opts = opts; unsigned d = 3; @@ -131,6 +133,13 @@ template void test_crhmc_dependent_polytope() { options.EnableReordering = true; CrhmcProblem P = CrhmcProblem(input, options); CHECK(P.equations() == 2); + + SpMat A = Aeq.sparseView(); + InputSparse input_sparse = InputSparse(d); + input_sparse.Aeq = A; + input_sparse.beq = beq; + crhmc_problem Q = crhmc_problem(input_sparse,options); + CHECK(Q.equations() == 2); } template void test_center_computation() { @@ -188,6 +197,7 @@ template void call_test_center_computation(){ std::cout << "--- Testing CRHMC polytope-center computation" << std::endl; test_center_computation(); } + TEST_CASE("test_preparation_crhmc") { call_test_crhmc_preprocesssing(); } diff --git a/test/crhmc_sampling_test.cpp b/test/crhmc_sampling_test.cpp index 2bd1b7995..a13a6e299 100644 --- a/test/crhmc_sampling_test.cpp +++ b/test/crhmc_sampling_test.cpp @@ -16,6 +16,8 @@ #include "ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" #include "preprocess/crhmc/crhmc_problem.h" +#include "preprocess/crhmc/crhmc_problem.h" +#include "preprocess/crhmc/crhmc_utils.h" #include "random.hpp" #include "random/normal_distribution.hpp" #include "random/uniform_int.hpp" @@ -33,6 +35,7 @@ #include #include #include "preprocess/svd_rounding.hpp" +#include "sampling/sampling.hpp" struct InnerBallFunctor { // Gaussian density centered at the inner ball center @@ -178,15 +181,14 @@ template = skip_samples) { - Point x = sampler.getPoint(); + Point x = Point(sampler.getPoints().rowwise().sum()); mean = mean + x; } @@ -228,12 +230,11 @@ Polytope read_polytope(std::string filename) { return P; } -template +template void crhmc_polytope_sampling( Polytope &P, NT eta = NT(-1), unsigned int walk_length = 1, bool rounding = false, bool centered = false, - unsigned int max_draws = 80000, unsigned int num_burns = 20000) -{ + unsigned int max_draws = 80000, unsigned int num_burns = 20000) { using Kernel = Cartesian; using Point = typename Kernel::Point; using RandomNumberGenerator = BoostRandomNumberGenerator; @@ -246,8 +247,7 @@ void crhmc_polytope_sampling( NegativeGradientFunctor, HessianFunctor>; using CrhmcProblem = crhmc_problem; using Opts = opts; - using Solver = ImplicitMidpointODESolver; + using Solver = ImplicitMidpointODESolver; std::pair inner_ball; if (centered) { @@ -286,8 +286,8 @@ void crhmc_polytope_sampling( NT max_psrf; Opts options; - CRHMCWalk::parameters crhmc_params(F, dim, - options); + options.simdLen = simdLen; + CRHMCWalk::parameters crhmc_params(F, dim,options); Input input = Input(P.dimension(), f, F, H); input.Aineq = P.get_mat(); input.bineq = P.get_vec(); @@ -318,11 +318,16 @@ void crhmc_polytope_sampling( std::cout << std::endl; std::cout << "Sampling" << std::endl; - for (unsigned int i = 0; i < max_actual_draws; i++) { + for (unsigned int i = 0; i < std::ceil(max_actual_draws / simdLen); i++) { for (int k = 0; k < walk_length; k++) { crhmc.apply(rng, 1); } - samples.col(i) = crhmc.getPoint().getCoefficients(); + MT sample = crhmc.getPoints(); + if (i * simdLen + simdLen - 1 < max_actual_draws) { + samples(Eigen::all, Eigen::seq(i * simdLen, i * simdLen + simdLen - 1)) = sample; + } else { + samples(Eigen::all, Eigen::seq(i * simdLen, max_actual_draws - 1)) = sample(Eigen::all, Eigen::seq(0, max_actual_draws - 1 - simdLen * i)); + } if (i % 1000 == 0 && i > 0) std::cout << "."; } @@ -340,7 +345,7 @@ inline bool exists_check(const std::string &name) { return f.good(); } -template +template void test_sampling_polytope(HPolytope &P, std::string &name, bool centered, int walk_length = 1) { NT step_size = 0; @@ -349,9 +354,9 @@ void test_sampling_polytope(HPolytope &P, std::string &name, bool centered, P.normalize(); inner_ball = P.ComputeInnerBall(); step_size = inner_ball.second / 10; - crhmc_polytope_sampling(P, step_size, walk_length, false, centered); + crhmc_polytope_sampling(P, step_size, walk_length, false, centered); } -template +template void call_test_sampling_polytope() { using Kernel = Cartesian; using Point = typename Kernel::Point; @@ -362,35 +367,35 @@ void call_test_sampling_polytope() { Hpolytope P = generate_skinny_cube(100, false); std::string name = "100_skinny_cube"; bool centered = false; - test_sampling_polytope(P, name, false); + test_sampling_polytope(P, name, false); } { Hpolytope P = generate_cross(5, false); std::string name = "5_cross"; bool centered = false; - test_sampling_polytope(P, name, centered); + test_sampling_polytope(P, name, centered); } { Hpolytope P = generate_simplex(100, false); std::string name = "100_simplex"; bool centered = false; - test_sampling_polytope(P, name, centered); + test_sampling_polytope(P, name, centered); } { Hpolytope P = generate_prod_simplex(50, false); std::string name = "50_prod_simplex"; bool centered = false; - test_sampling_polytope(P, name, centered); + test_sampling_polytope(P, name, centered); } { Hpolytope P = generate_birkhoff(10); std::string name = "10_birkhoff"; bool centered = false; - test_sampling_polytope(P, name, centered); + test_sampling_polytope(P, name, centered); } } @@ -443,7 +448,7 @@ void benchmark_cube_crhmc() { } } -template +template void test_crhmc() { using Kernel = Cartesian; using Point = typename Kernel::Point; @@ -458,8 +463,7 @@ void test_crhmc() { crhmc_input; using CrhmcProblem = crhmc_problem; using RandomNumberGenerator = BoostRandomNumberGenerator; - using Solver = ImplicitMidpointODESolver; + using Solver = ImplicitMidpointODESolver; using Opts = opts; IsotropicQuadraticFunctor::parameters params; params.order = 2; @@ -468,12 +472,16 @@ void test_crhmc() { RandomNumberGenerator rng(1); unsigned int dim = 10; Opts options; + options.simdLen = simdLen; + options.DynamicWeight=false; + options.DynamicStepSize=false; + options.DynamicRegularizer=false; CRHMCWalk::parameters crhmc_params(g, dim, options); Input input = Input(dim, f, g); input.lb = -VT::Ones(dim); input.ub = VT::Ones(dim); - CrhmcProblem P = CrhmcProblem(input); + CrhmcProblem P = CrhmcProblem(input,options); Point x0(dim); CRHMCWalk::Walk @@ -486,13 +494,68 @@ template void call_test_crhmc() { std::cout << "--- Testing Constrained Riemannian Hamiltonian Monte Carlo" << std::endl; - test_crhmc(); + std::cout << "------------SIMDLEN=1-------------------\n" + << std::endl; + test_crhmc(); + std::cout << "------------SIMDLEN=4-------------------\n" + << std::endl; + test_crhmc(); } template void call_test_benchmark_cube_crhmc() { benchmark_cube_crhmc(); } +template +void test_polytope_sampling_sparse_problem(ConstraintProblem &problem, int n_samples = 80000, int n_burns = 20000){ + using NT = typename Point::FT; + using VT = Eigen::Matrix; + using MT = Eigen::Matrix; + using Func = GaussianFunctor::FunctionFunctor; + using Grad = GaussianFunctor::GradientFunctor; + using Hess = GaussianFunctor::HessianFunctor; + using func_params = GaussianFunctor::parameters; + using RNG = BoostRandomNumberGenerator; + func_params params = func_params(Point(problem.dimension()), 0.5, 1); + Func* f= new Func(params); + Grad* g= new Grad(params); + Hess* h= new Hess(params); + RNG rng(1); + std::list PointList; + execute_crhmc, Grad, Func, Hess, CRHMCWalk, simdLen>(problem, rng, PointList, 1, n_samples, n_burns, g, f, h, true); + std::cout<<"Here--------------------------\n"; + MT samples = MT(PointList.front().dimension(), PointList.size()); + int i=0; + for (typename std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ + samples.col(i) = (*it).getCoefficients(); + i++; + } + NT max_psrf = check_interval_psrf(samples); + std::cout<<"PSRF: "< +void call_test_polytope_sampling_sparse_problem(){ + std::cout << " ---Sampling sparse problems " << std::endl; + using SpMat = Eigen::SparseMatrix; + using Kernel = Cartesian; + using Point = typename Kernel::Point; + using VT = Eigen::Matrix; + using ConstraintProblem =constraint_problem; + if(exists_check("../test/netlib/degen2.mm")){ + std::cout<<"Problem name: degen2" << std::endl; + SpMat A; + VT b, lb, ub; + int dimension; + load_problem(A, b, lb, ub, dimension, "../test/netlib/degen2"); + ConstraintProblem problem = ConstraintProblem(dimension); + problem.set_equality_constraints(A, b); + problem.set_bounds(lb, ub); + test_polytope_sampling_sparse_problem(problem); + } +} TEST_CASE("crhmc") { call_test_crhmc(); } @@ -502,5 +565,19 @@ TEST_CASE("benchmark_crhmc_cube") { } TEST_CASE("test_polytope_sampling_crhmc") { - call_test_sampling_polytope(); + std::cout << "------------SIMDLEN=1-------------------\n" + << std::endl; + call_test_sampling_polytope(); + std::cout << "------------SIMDLEN=4-------------------\n" + << std::endl; + call_test_sampling_polytope(); +} + +TEST_CASE("test_sampling_sparse_problem") { + std::cout << "------------SIMDLEN=1-------------------\n" + << std::endl; + call_test_polytope_sampling_sparse_problem(); + std::cout << "------------SIMDLEN=4-------------------\n" + << std::endl; + call_test_polytope_sampling_sparse_problem(); } diff --git a/test/netlib/degen2.mm b/test/netlib/degen2.mm new file mode 100644 index 000000000..0232eff96 --- /dev/null +++ b/test/netlib/degen2.mm @@ -0,0 +1,4447 @@ +%%MatrixMarket matrix coordinate real general +% Generated 28-Oct-2022 +444 758 4444 +1 1 1 +2 2 1 +3 3 1 +225 4 1 +226 5 1 +227 6 1 +228 7 1 +229 8 1 +230 9 1 +231 10 1 +232 11 1 +233 12 1 +234 13 1 +235 14 1 +236 15 1 +237 16 1 +238 17 1 +239 18 1 +240 19 1 +241 20 1 +242 21 1 +243 22 1 +244 23 1 +245 24 1 +246 25 1 +247 26 1 +248 27 1 +249 28 1 +250 29 1 +251 30 1 +252 31 1 +253 32 1 +254 33 1 +255 34 1 +256 35 1 +257 36 1 +258 37 1 +259 38 1 +260 39 1 +261 40 1 +262 41 1 +263 42 1 +264 43 1 +265 44 1 +266 45 1 +267 46 1 +268 47 1 +269 48 1 +270 49 1 +271 50 1 +272 51 1 +273 52 1 +274 53 1 +275 54 1 +276 55 1 +277 56 1 +278 57 1 +279 58 1 +280 59 1 +281 60 1 +282 61 1 +283 62 1 +284 63 1 +285 64 1 +286 65 1 +287 66 1 +288 67 1 +289 68 1 +290 69 1 +291 70 1 +292 71 1 +293 72 1 +294 73 1 +295 74 1 +296 75 1 +297 76 1 +298 77 1 +299 78 1 +300 79 1 +301 80 1 +302 81 1 +303 82 1 +304 83 1 +305 84 1 +306 85 1 +307 86 1 +308 87 1 +309 88 1 +310 89 1 +311 90 1 +312 91 1 +313 92 1 +314 93 1 +315 94 1 +316 95 1 +317 96 1 +318 97 1 +319 98 1 +320 99 1 +321 100 1 +322 101 1 +323 102 1 +324 103 1 +325 104 1 +326 105 1 +327 106 1 +328 107 1 +329 108 1 +330 109 1 +331 110 1 +332 111 1 +333 112 1 +334 113 1 +335 114 1 +336 115 1 +337 116 1 +338 117 1 +339 118 1 +340 119 1 +341 120 1 +342 121 1 +343 122 1 +344 123 1 +345 124 1 +346 125 1 +347 126 1 +348 127 1 +349 128 1 +350 129 1 +351 130 1 +352 131 1 +353 132 1 +354 133 1 +355 134 1 +356 135 1 +357 136 1 +358 137 1 +359 138 1 +360 139 1 +361 140 1 +362 141 1 +363 142 1 +364 143 1 +365 144 1 +366 145 1 +367 146 1 +368 147 1 +369 148 1 +370 149 1 +371 150 1 +372 151 1 +373 152 1 +374 153 1 +375 154 1 +376 155 1 +377 156 1 +378 157 1 +379 158 1 +380 159 1 +381 160 1 +382 161 1 +383 162 1 +384 163 1 +385 164 1 +386 165 1 +387 166 1 +388 167 1 +389 168 1 +390 169 1 +391 170 1 +392 171 1 +393 172 1 +394 173 1 +395 174 1 +396 175 1 +397 176 1 +398 177 1 +399 178 1 +400 179 1 +401 180 1 +402 181 1 +403 182 1 +404 183 1 +405 184 1 +406 185 1 +407 186 1 +408 187 1 +409 188 1 +410 189 1 +411 190 1 +412 191 1 +413 192 1 +414 193 1 +415 194 1 +416 195 1 +417 196 1 +418 197 1 +419 198 1 +420 199 1 +421 200 1 +422 201 1 +423 202 1 +424 203 1 +425 204 1 +426 205 1 +427 206 1 +428 207 1 +429 208 1 +430 209 1 +431 210 1 +432 211 1 +433 212 1 +434 213 1 +435 214 1 +436 215 1 +437 216 1 +438 217 1 +439 218 1 +440 219 1 +441 220 1 +442 221 1 +443 222 1 +444 223 1 +1 224 1 +4 224 1 +193 224 -1 +202 224 1 +291 224 -1 +292 224 -1 +2 225 1 +4 225 1 +194 225 -1 +203 225 1 +296 225 -1 +297 225 -1 +1 226 1 +5 226 1 +197 226 1 +202 226 -1 +331 226 -1 +332 226 -1 +333 226 -1 +334 226 -1 +2 227 1 +5 227 1 +198 227 1 +203 227 -1 +339 227 -1 +340 227 -1 +341 227 -1 +1 228 1 +6 228 1 +197 228 -1 +202 228 1 +305 228 -1 +306 228 -1 +2 229 1 +6 229 1 +198 229 -1 +203 229 1 +308 229 -1 +309 229 -1 +1 230 1 +7 230 1 +197 230 1 +202 230 -1 +327 230 -1 +328 230 -1 +329 230 -1 +330 230 -1 +331 230 -1 +332 230 -1 +333 230 -1 +334 230 -1 +2 231 1 +7 231 1 +198 231 1 +203 231 -1 +336 231 -1 +337 231 -1 +338 231 -1 +339 231 -1 +340 231 -1 +341 231 -1 +8 232 1 +197 232 -1 +202 232 1 +306 232 -1 +327 232 1 +328 232 1 +329 232 1 +330 232 1 +331 232 1 +332 232 1 +333 232 1 +334 232 1 +8 233 1 +198 233 -1 +203 233 1 +309 233 -1 +336 233 1 +337 233 1 +338 233 1 +339 233 1 +340 233 1 +341 233 1 +9 234 1 +193 234 1 +202 234 -1 +291 234 1 +292 234 1 +333 234 -1 +334 234 -1 +9 235 1 +194 235 1 +203 235 -1 +296 235 1 +297 235 1 +341 235 -1 +10 236 1 +193 236 -1 +202 236 1 +292 236 -1 +329 236 1 +330 236 1 +331 236 1 +332 236 1 +333 236 1 +334 236 1 +10 237 1 +194 237 -1 +203 237 1 +297 237 -1 +337 237 1 +338 237 1 +339 237 1 +340 237 1 +341 237 1 +11 238 1 +197 238 1 +202 238 -1 +305 238 1 +306 238 1 +333 238 -1 +334 238 -1 +11 239 1 +198 239 1 +203 239 -1 +308 239 1 +309 239 1 +341 239 -1 +1 240 1 +12 240 1 +197 240 1 +220 240 -1 +418 240 -1 +419 240 -1 +2 241 1 +12 241 1 +198 241 1 +221 241 -1 +421 241 -1 +422 241 -1 +13 242 1 +197 242 -1 +220 242 1 +306 242 -1 +418 242 1 +419 242 1 +13 243 1 +198 243 -1 +221 243 1 +309 243 -1 +421 243 1 +422 243 1 +14 244 1 +193 244 1 +202 244 -1 +288 244 1 +289 244 1 +290 244 1 +291 244 1 +292 244 1 +326 244 -1 +327 244 -1 +328 244 -1 +329 244 -1 +330 244 -1 +331 244 -1 +332 244 -1 +333 244 -1 +334 244 -1 +14 245 1 +194 245 1 +203 245 -1 +293 245 1 +294 245 1 +295 245 1 +296 245 1 +297 245 1 +335 245 -1 +336 245 -1 +337 245 -1 +338 245 -1 +339 245 -1 +340 245 -1 +341 245 -1 +15 246 1 +197 246 -1 +222 246 1 +428 246 1 +429 246 1 +430 246 1 +431 246 1 +432 246 1 +15 247 1 +198 247 -1 +223 247 1 +436 247 1 +437 247 1 +438 247 1 +439 247 1 +440 247 1 +1 248 1 +16 248 1 +197 248 1 +222 248 -1 +427 248 -1 +428 248 -1 +429 248 -1 +430 248 -1 +431 248 -1 +432 248 -1 +2 249 1 +16 249 1 +198 249 1 +223 249 -1 +435 249 -1 +436 249 -1 +437 249 -1 +438 249 -1 +439 249 -1 +440 249 -1 +1 250 1 +17 250 1 +197 250 -1 +222 250 1 +305 250 -1 +306 250 -1 +2 251 1 +17 251 1 +198 251 -1 +223 251 1 +308 251 -1 +309 251 -1 +18 252 1 +197 252 -1 +222 252 1 +431 252 1 +432 252 1 +18 253 1 +198 253 -1 +223 253 1 +439 253 1 +440 253 1 +1 254 1 +19 254 1 +197 254 1 +222 254 -1 +429 254 -1 +430 254 -1 +431 254 -1 +432 254 -1 +2 255 1 +19 255 1 +198 255 1 +223 255 -1 +437 255 -1 +438 255 -1 +439 255 -1 +440 255 -1 +20 256 1 +197 256 -1 +202 256 1 +334 256 1 +20 257 1 +198 257 -1 +203 257 1 +341 257 1 +21 258 1 +197 258 1 +222 258 -1 +305 258 1 +306 258 1 +431 258 -1 +432 258 -1 +21 259 1 +198 259 1 +223 259 -1 +308 259 1 +309 259 1 +439 259 -1 +440 259 -1 +22 260 1 +193 260 -1 +222 260 1 +428 260 1 +429 260 1 +430 260 1 +431 260 1 +432 260 1 +22 261 1 +194 261 -1 +223 261 1 +436 261 1 +437 261 1 +438 261 1 +439 261 1 +440 261 1 +22 262 1 +442 262 1 +23 263 1 +193 263 1 +222 263 -1 +288 263 1 +289 263 1 +290 263 1 +291 263 1 +292 263 1 +428 263 -1 +429 263 -1 +430 263 -1 +431 263 -1 +432 263 -1 +23 264 1 +194 264 1 +223 264 -1 +293 264 1 +294 264 1 +295 264 1 +296 264 1 +297 264 1 +436 264 -1 +437 264 -1 +438 264 -1 +439 264 -1 +440 264 -1 +3 265 1 +23 265 1 +442 265 -1 +24 266 1 +193 266 1 +202 266 -1 +292 266 1 +24 267 1 +194 267 1 +203 267 -1 +297 267 1 +1 268 1 +25 268 1 +193 268 -1 +202 268 1 +288 268 -1 +289 268 -1 +290 268 -1 +291 268 -1 +292 268 -1 +333 268 1 +334 268 1 +2 269 1 +25 269 1 +194 269 -1 +203 269 1 +293 269 -1 +294 269 -1 +295 269 -1 +296 269 -1 +297 269 -1 +341 269 1 +1 270 1 +26 270 1 +197 270 -1 +220 270 1 +304 270 -1 +305 270 -1 +306 270 -1 +2 271 1 +26 271 1 +198 271 -1 +221 271 1 +307 271 -1 +308 271 -1 +309 271 -1 +27 272 1 +197 272 1 +220 272 -1 +305 272 1 +306 272 1 +27 273 1 +198 273 1 +221 273 -1 +308 273 1 +309 273 1 +1 274 1 +28 274 1 +195 274 -1 +222 274 1 +302 274 -1 +2 275 1 +28 275 1 +196 275 -1 +223 275 1 +303 275 -1 +1 276 1 +29 276 1 +195 276 -1 +202 276 1 +302 276 -1 +2 277 1 +29 277 1 +196 277 -1 +203 277 1 +303 277 -1 +1 278 1 +30 278 1 +185 278 1 +222 278 -1 +427 278 -1 +428 278 -1 +429 278 -1 +430 278 -1 +431 278 -1 +432 278 -1 +2 279 1 +30 279 1 +186 279 1 +223 279 -1 +435 279 -1 +436 279 -1 +437 279 -1 +438 279 -1 +439 279 -1 +440 279 -1 +31 280 1 +202 280 1 +212 280 -1 +329 280 1 +330 280 1 +331 280 1 +332 280 1 +333 280 1 +334 280 1 +31 281 1 +203 281 1 +213 281 -1 +337 281 1 +338 281 1 +339 281 1 +340 281 1 +341 281 1 +32 282 1 +195 282 1 +202 282 -1 +302 282 1 +333 282 -1 +334 282 -1 +32 283 1 +196 283 1 +203 283 -1 +303 283 1 +341 283 -1 +33 284 1 +195 284 1 +222 284 -1 +302 284 1 +431 284 -1 +432 284 -1 +33 285 1 +196 285 1 +223 285 -1 +303 285 1 +439 285 -1 +440 285 -1 +34 286 1 +185 286 -1 +222 286 1 +427 286 1 +428 286 1 +429 286 1 +430 286 1 +431 286 1 +432 286 1 +34 287 1 +186 287 -1 +223 287 1 +435 287 1 +436 287 1 +437 287 1 +438 287 1 +439 287 1 +440 287 1 +1 288 1 +35 288 1 +195 288 1 +202 288 -1 +326 288 -1 +327 288 -1 +328 288 -1 +329 288 -1 +330 288 -1 +331 288 -1 +332 288 -1 +333 288 -1 +334 288 -1 +2 289 1 +35 289 1 +196 289 1 +203 289 -1 +335 289 -1 +336 289 -1 +337 289 -1 +338 289 -1 +339 289 -1 +340 289 -1 +341 289 -1 +36 290 1 +187 290 1 +208 290 -1 +247 290 1 +248 290 1 +36 291 1 +188 291 1 +209 291 -1 +250 291 1 +251 291 1 +36 292 1 +253 292 1 +254 292 1 +37 293 1 +181 293 -1 +202 293 1 +326 293 1 +327 293 1 +328 293 1 +329 293 1 +330 293 1 +331 293 1 +332 293 1 +333 293 1 +334 293 1 +37 294 1 +182 294 -1 +203 294 1 +335 294 1 +336 294 1 +337 294 1 +338 294 1 +339 294 1 +340 294 1 +341 294 1 +38 295 1 +183 295 1 +222 295 -1 +236 295 1 +237 295 1 +431 295 -1 +432 295 -1 +38 296 1 +184 296 1 +223 296 -1 +239 296 1 +240 296 1 +439 296 -1 +440 296 -1 +39 297 1 +183 297 -1 +222 297 1 +427 297 1 +428 297 1 +429 297 1 +430 297 1 +431 297 1 +432 297 1 +39 298 1 +184 298 -1 +223 298 1 +435 298 1 +436 298 1 +437 298 1 +438 298 1 +439 298 1 +440 298 1 +1 299 1 +40 299 1 +183 299 1 +222 299 -1 +427 299 -1 +428 299 -1 +429 299 -1 +430 299 -1 +431 299 -1 +432 299 -1 +2 300 1 +40 300 1 +184 300 1 +223 300 -1 +435 300 -1 +436 300 -1 +437 300 -1 +438 300 -1 +439 300 -1 +440 300 -1 +1 301 1 +41 301 1 +183 301 -1 +222 301 1 +236 301 -1 +237 301 -1 +2 302 1 +41 302 1 +184 302 -1 +223 302 1 +239 302 -1 +240 302 -1 +1 303 1 +42 303 1 +181 303 1 +202 303 -1 +328 303 -1 +329 303 -1 +330 303 -1 +331 303 -1 +332 303 -1 +333 303 -1 +334 303 -1 +2 304 1 +42 304 1 +182 304 1 +203 304 -1 +337 304 -1 +338 304 -1 +339 304 -1 +340 304 -1 +341 304 -1 +43 305 1 +195 305 -1 +202 305 1 +334 305 1 +43 306 1 +196 306 -1 +203 306 1 +341 306 1 +1 307 1 +44 307 1 +202 307 -1 +212 307 1 +327 307 -1 +328 307 -1 +329 307 -1 +330 307 -1 +331 307 -1 +332 307 -1 +333 307 -1 +334 307 -1 +2 308 1 +44 308 1 +203 308 -1 +213 308 1 +336 308 -1 +337 308 -1 +338 308 -1 +339 308 -1 +340 308 -1 +341 308 -1 +1 309 1 +45 309 1 +183 309 -1 +202 309 1 +237 309 -1 +2 310 1 +45 310 1 +184 310 -1 +203 310 1 +240 310 -1 +1 311 1 +46 311 1 +202 311 -1 +214 311 1 +328 311 -1 +329 311 -1 +330 311 -1 +331 311 -1 +332 311 -1 +333 311 -1 +334 311 -1 +2 312 1 +46 312 1 +203 312 -1 +215 312 1 +337 312 -1 +338 312 -1 +339 312 -1 +340 312 -1 +341 312 -1 +47 313 1 +202 313 1 +214 313 -1 +329 313 1 +330 313 1 +331 313 1 +332 313 1 +333 313 1 +334 313 1 +47 314 1 +203 314 1 +215 314 -1 +337 314 1 +338 314 1 +339 314 1 +340 314 1 +341 314 1 +48 315 1 +202 315 -1 +208 315 1 +333 315 -1 +334 315 -1 +365 315 1 +366 315 1 +367 315 1 +368 315 1 +48 316 1 +203 316 -1 +209 316 1 +341 316 -1 +377 316 1 +378 316 1 +379 316 1 +380 316 1 +49 317 1 +202 317 1 +208 317 -1 +331 317 1 +332 317 1 +333 317 1 +334 317 1 +49 318 1 +203 318 1 +209 318 -1 +339 318 1 +340 318 1 +341 318 1 +1 319 1 +50 319 1 +202 319 -1 +212 319 1 +332 319 -1 +333 319 -1 +334 319 -1 +2 320 1 +50 320 1 +203 320 -1 +213 320 1 +340 320 -1 +341 320 -1 +51 321 1 +183 321 1 +202 321 -1 +237 321 1 +51 322 1 +184 322 1 +203 322 -1 +240 322 1 +52 323 1 +199 323 1 +202 323 -1 +52 324 1 +53 325 1 +208 325 1 +222 325 -1 +360 325 1 +361 325 1 +362 325 1 +363 325 1 +364 325 1 +365 325 1 +366 325 1 +367 325 1 +368 325 1 +430 325 -1 +431 325 -1 +432 325 -1 +53 326 1 +209 326 1 +223 326 -1 +374 326 1 +375 326 1 +376 326 1 +377 326 1 +378 326 1 +379 326 1 +380 326 1 +438 326 -1 +439 326 -1 +440 326 -1 +1 327 1 +54 327 1 +212 327 -1 +222 327 1 +398 327 -1 +2 328 1 +54 328 1 +213 328 -1 +223 328 1 +401 328 -1 +1 329 1 +55 329 1 +212 329 1 +222 329 -1 +427 329 -1 +428 329 -1 +429 329 -1 +430 329 -1 +431 329 -1 +432 329 -1 +2 330 1 +55 330 1 +213 330 1 +223 330 -1 +435 330 -1 +436 330 -1 +437 330 -1 +438 330 -1 +439 330 -1 +440 330 -1 +1 331 1 +56 331 1 +431 331 -1 +432 331 -1 +3 332 1 +56 332 1 +57 333 1 +208 333 1 +222 333 -1 +358 333 1 +359 333 1 +360 333 1 +361 333 1 +362 333 1 +363 333 1 +364 333 1 +365 333 1 +366 333 1 +367 333 1 +368 333 1 +426 333 -1 +427 333 -1 +428 333 -1 +429 333 -1 +430 333 -1 +431 333 -1 +432 333 -1 +57 334 1 +209 334 1 +223 334 -1 +371 334 1 +372 334 1 +373 334 1 +374 334 1 +375 334 1 +376 334 1 +377 334 1 +378 334 1 +379 334 1 +380 334 1 +434 334 -1 +435 334 -1 +436 334 -1 +437 334 -1 +438 334 -1 +439 334 -1 +440 334 -1 +58 335 1 +212 335 -1 +222 335 1 +427 335 1 +428 335 1 +429 335 1 +430 335 1 +431 335 1 +432 335 1 +58 336 1 +213 336 -1 +223 336 1 +435 336 1 +436 336 1 +437 336 1 +438 336 1 +439 336 1 +440 336 1 +59 337 1 +208 337 -1 +222 337 1 +430 337 1 +431 337 1 +432 337 1 +59 338 1 +209 338 -1 +223 338 1 +438 338 1 +439 338 1 +440 338 1 +60 339 1 +199 339 -1 +202 339 1 +328 339 1 +329 339 1 +330 339 1 +331 339 1 +332 339 1 +333 339 1 +334 339 1 +60 340 1 +342 340 1 +343 340 1 +344 340 1 +345 340 1 +61 341 1 +212 341 1 +222 341 -1 +396 341 1 +397 341 1 +398 341 1 +431 341 -1 +432 341 -1 +61 342 1 +213 342 1 +223 342 -1 +399 342 1 +400 342 1 +401 342 1 +439 342 -1 +440 342 -1 +1 343 1 +62 343 1 +208 343 -1 +222 343 1 +357 343 -1 +358 343 -1 +359 343 -1 +360 343 -1 +361 343 -1 +362 343 -1 +363 343 -1 +364 343 -1 +365 343 -1 +366 343 -1 +367 343 -1 +368 343 -1 +432 343 1 +2 344 1 +62 344 1 +209 344 -1 +223 344 1 +369 344 -1 +370 344 -1 +371 344 -1 +372 344 -1 +373 344 -1 +374 344 -1 +375 344 -1 +376 344 -1 +377 344 -1 +378 344 -1 +379 344 -1 +380 344 -1 +440 344 1 +1 345 1 +63 345 1 +193 345 -1 +220 345 1 +291 345 -1 +292 345 -1 +2 346 1 +63 346 1 +194 346 -1 +221 346 1 +296 346 -1 +297 346 -1 +3 347 1 +63 347 1 +301 347 -1 +1 348 1 +64 348 1 +212 348 -1 +220 348 1 +2 349 1 +64 349 1 +213 349 -1 +221 349 1 +3 350 1 +64 350 1 +65 351 1 +208 351 1 +210 351 -1 +365 351 1 +366 351 1 +367 351 1 +368 351 1 +65 352 1 +209 352 1 +211 352 -1 +377 352 1 +378 352 1 +379 352 1 +380 352 1 +65 353 1 +388 353 1 +389 353 1 +390 353 1 +391 353 1 +66 354 1 +208 354 -1 +210 354 1 +364 354 -1 +365 354 -1 +366 354 -1 +367 354 -1 +368 354 -1 +392 354 1 +393 354 1 +2 355 1 +66 355 1 +209 355 -1 +211 355 1 +376 355 -1 +377 355 -1 +378 355 -1 +379 355 -1 +380 355 -1 +3 356 1 +66 356 1 +387 356 -1 +388 356 -1 +389 356 -1 +390 356 -1 +391 356 -1 +1 357 1 +67 357 1 +183 357 -1 +220 357 1 +236 357 -1 +237 357 -1 +2 358 1 +67 358 1 +184 358 -1 +221 358 1 +239 358 -1 +240 358 -1 +3 359 1 +67 359 1 +242 359 -1 +68 360 1 +193 360 1 +220 360 -1 +289 360 1 +290 360 1 +291 360 1 +292 360 1 +68 361 1 +194 361 1 +221 361 -1 +294 361 1 +295 361 1 +296 361 1 +297 361 1 +68 362 1 +298 362 1 +299 362 1 +300 362 1 +301 362 1 +69 363 1 +181 363 1 +220 363 -1 +226 363 1 +227 363 1 +69 364 1 +182 364 1 +221 364 -1 +229 364 1 +230 364 1 +69 365 1 +232 365 1 +233 365 1 +1 366 1 +70 366 1 +183 366 1 +220 366 -1 +419 366 -1 +2 367 1 +70 367 1 +184 367 1 +221 367 -1 +422 367 -1 +3 368 1 +70 368 1 +424 368 -1 +71 369 1 +189 369 1 +197 369 -1 +256 369 1 +257 369 1 +258 369 1 +259 369 1 +260 369 1 +261 369 1 +262 369 1 +305 369 -1 +306 369 -1 +71 370 1 +190 370 1 +198 370 -1 +264 370 1 +265 370 1 +266 370 1 +267 370 1 +268 370 1 +269 370 1 +270 370 1 +308 370 -1 +309 370 -1 +71 371 1 +272 371 1 +273 371 1 +274 371 1 +275 371 1 +276 371 1 +277 371 1 +278 371 1 +310 371 -1 +1 372 1 +72 372 1 +197 372 1 +202 372 -1 +330 372 -1 +331 372 -1 +332 372 -1 +333 372 -1 +334 372 -1 +2 373 1 +72 373 1 +198 373 1 +203 373 -1 +338 373 -1 +339 373 -1 +340 373 -1 +341 373 -1 +3 374 1 +72 374 1 +344 374 -1 +345 374 -1 +73 375 1 +197 375 1 +222 375 -1 +304 375 1 +305 375 1 +306 375 1 +432 375 -1 +73 376 1 +198 376 1 +223 376 -1 +307 376 1 +308 376 1 +309 376 1 +440 376 -1 +3 377 1 +73 377 1 +74 378 1 +189 378 1 +197 378 -1 +259 378 1 +260 378 1 +261 378 1 +262 378 1 +74 379 1 +190 379 1 +198 379 -1 +267 379 1 +268 379 1 +269 379 1 +270 379 1 +74 380 1 +275 380 1 +276 380 1 +277 380 1 +278 380 1 +75 381 1 +193 381 -1 +202 381 1 +330 381 1 +331 381 1 +332 381 1 +333 381 1 +334 381 1 +75 382 1 +194 382 -1 +203 382 1 +338 382 1 +339 382 1 +340 382 1 +341 382 1 +75 383 1 +344 383 1 +345 383 1 +76 384 1 +193 384 1 +222 384 -1 +290 384 1 +291 384 1 +292 384 1 +431 384 -1 +432 384 -1 +76 385 1 +194 385 1 +223 385 -1 +295 385 1 +296 385 1 +297 385 1 +439 385 -1 +440 385 -1 +76 386 1 +300 386 1 +301 386 1 +77 387 1 +193 387 -1 +218 387 1 +410 387 1 +411 387 1 +77 388 1 +194 388 -1 +219 388 1 +412 388 1 +413 388 1 +414 388 1 +77 389 1 +415 389 1 +416 389 1 +1 390 1 +78 390 1 +202 390 1 +212 390 -1 +397 390 -1 +398 390 -1 +2 391 1 +78 391 1 +203 391 1 +213 391 -1 +400 391 -1 +401 391 -1 +78 392 1 +79 393 1 +193 393 -1 +200 393 1 +313 393 1 +314 393 1 +315 393 1 +79 394 1 +194 394 -1 +201 394 1 +318 394 1 +319 394 1 +320 394 1 +79 395 1 +323 395 1 +324 395 1 +325 395 1 +1 396 1 +80 396 1 +191 396 1 +200 396 -1 +312 396 -1 +313 396 -1 +314 396 -1 +315 396 -1 +2 397 1 +80 397 1 +192 397 1 +201 397 -1 +317 397 -1 +318 397 -1 +319 397 -1 +320 397 -1 +3 398 1 +80 398 1 +322 398 -1 +323 398 -1 +324 398 -1 +325 398 -1 +81 399 1 +193 399 1 +218 399 -1 +288 399 1 +289 399 1 +290 399 1 +291 399 1 +292 399 1 +410 399 -1 +411 399 -1 +81 400 1 +194 400 1 +219 400 -1 +293 400 1 +294 400 1 +295 400 1 +296 400 1 +297 400 1 +412 400 -1 +413 400 -1 +414 400 -1 +3 401 1 +81 401 1 +415 401 -1 +416 401 -1 +1 402 -1 +82 402 1 +189 402 1 +216 402 -1 +255 402 1 +256 402 1 +257 402 1 +258 402 1 +259 402 1 +260 402 1 +261 402 1 +262 402 1 +2 403 -1 +82 403 1 +190 403 1 +217 403 -1 +263 403 1 +264 403 1 +265 403 1 +266 403 1 +267 403 1 +268 403 1 +269 403 1 +270 403 1 +3 404 -1 +82 404 1 +271 404 1 +272 404 1 +273 404 1 +274 404 1 +275 404 1 +276 404 1 +277 404 1 +278 404 1 +83 405 1 +189 405 -1 +208 405 1 +368 405 1 +83 406 1 +190 406 -1 +209 406 1 +380 406 1 +83 407 1 +391 407 1 +84 408 1 +191 408 -1 +200 408 1 +312 408 1 +313 408 1 +314 408 1 +315 408 1 +84 409 1 +192 409 -1 +201 409 1 +317 409 1 +318 409 1 +319 409 1 +320 409 1 +84 410 1 +322 410 1 +323 410 1 +324 410 1 +325 410 1 +1 411 1 +85 411 1 +195 411 1 +202 411 -1 +331 411 -1 +332 411 -1 +333 411 -1 +334 411 -1 +2 412 1 +85 412 1 +196 412 1 +203 412 -1 +339 412 -1 +340 412 -1 +341 412 -1 +3 413 1 +85 413 1 +345 413 -1 +86 414 1 +189 414 1 +208 414 -1 +261 414 1 +262 414 1 +86 415 1 +190 415 1 +209 415 -1 +269 415 1 +270 415 1 +86 416 1 +277 416 1 +278 416 1 +87 417 1 +208 417 -1 +212 417 1 +367 417 -1 +368 417 -1 +398 417 1 +87 418 1 +209 418 -1 +213 418 1 +379 418 -1 +380 418 -1 +401 418 1 +3 419 1 +87 419 1 +390 419 -1 +391 419 -1 +88 420 1 +181 420 -1 +208 420 1 +226 420 -1 +227 420 -1 +359 420 1 +360 420 1 +361 420 1 +362 420 1 +363 420 1 +364 420 1 +365 420 1 +366 420 1 +367 420 1 +368 420 1 +88 421 1 +182 421 -1 +209 421 1 +229 421 -1 +230 421 -1 +373 421 1 +374 421 1 +375 421 1 +376 421 1 +377 421 1 +378 421 1 +379 421 1 +380 421 1 +88 422 1 +232 422 -1 +233 422 -1 +385 422 1 +386 422 1 +387 422 1 +388 422 1 +389 422 1 +390 422 1 +391 422 1 +89 423 1 +189 423 1 +204 423 -1 +257 423 1 +258 423 1 +259 423 1 +260 423 1 +261 423 1 +262 423 1 +346 423 -1 +347 423 -1 +89 424 1 +190 424 1 +205 424 -1 +265 424 1 +266 424 1 +267 424 1 +268 424 1 +269 424 1 +270 424 1 +348 424 -1 +349 424 -1 +89 425 1 +273 425 1 +274 425 1 +275 425 1 +276 425 1 +277 425 1 +278 425 1 +350 425 -1 +351 425 -1 +1 426 1 +90 426 1 +187 426 -1 +189 426 1 +246 426 -1 +247 426 -1 +248 426 -1 +2 427 1 +90 427 1 +188 427 -1 +190 427 1 +249 427 -1 +250 427 -1 +251 427 -1 +3 428 1 +90 428 1 +252 428 -1 +253 428 -1 +254 428 -1 +91 429 1 +193 429 1 +208 429 -1 +291 429 1 +292 429 1 +367 429 -1 +368 429 -1 +91 430 1 +194 430 1 +209 430 -1 +296 430 1 +297 430 1 +379 430 -1 +380 430 -1 +91 431 1 +301 431 1 +390 431 -1 +391 431 -1 +92 432 1 +193 432 -1 +208 432 1 +290 432 -1 +291 432 -1 +292 432 -1 +359 432 1 +360 432 1 +361 432 1 +362 432 1 +363 432 1 +364 432 1 +365 432 1 +366 432 1 +367 432 1 +368 432 1 +92 433 1 +194 433 -1 +209 433 1 +295 433 -1 +296 433 -1 +297 433 -1 +373 433 1 +374 433 1 +375 433 1 +376 433 1 +377 433 1 +378 433 1 +379 433 1 +380 433 1 +92 434 1 +299 434 -1 +300 434 -1 +301 434 -1 +385 434 1 +386 434 1 +387 434 1 +388 434 1 +389 434 1 +390 434 1 +391 434 1 +1 435 1 +93 435 1 +2 436 1 +93 436 1 +3 437 1 +93 437 1 +94 438 1 +189 438 -1 +222 438 1 +261 438 -1 +262 438 -1 +429 438 1 +430 438 1 +431 438 1 +432 438 1 +94 439 1 +190 439 -1 +223 439 1 +269 439 -1 +270 439 -1 +437 439 1 +438 439 1 +439 439 1 +440 439 1 +94 440 1 +277 440 -1 +278 440 -1 +442 440 1 +1 441 -1 +95 441 1 +206 441 -1 +208 441 1 +358 441 1 +359 441 1 +360 441 1 +361 441 1 +362 441 1 +363 441 1 +364 441 1 +365 441 1 +366 441 1 +367 441 1 +368 441 1 +2 442 -1 +95 442 1 +207 442 -1 +209 442 1 +371 442 1 +372 442 1 +373 442 1 +374 442 1 +375 442 1 +376 442 1 +377 442 1 +378 442 1 +379 442 1 +380 442 1 +95 443 1 +355 443 -1 +356 443 -1 +383 443 1 +384 443 1 +385 443 1 +386 443 1 +387 443 1 +388 443 1 +389 443 1 +390 443 1 +391 443 1 +96 444 1 +183 444 -1 +189 444 1 +259 444 1 +260 444 1 +261 444 1 +262 444 1 +96 445 1 +184 445 -1 +190 445 1 +267 445 1 +268 445 1 +269 445 1 +270 445 1 +96 446 1 +275 446 1 +276 446 1 +277 446 1 +278 446 1 +97 447 1 +195 447 -1 +220 447 1 +417 447 1 +418 447 1 +419 447 1 +97 448 1 +196 448 -1 +221 448 1 +420 448 1 +421 448 1 +422 448 1 +97 449 1 +423 449 1 +424 449 1 +1 450 1 +98 450 1 +206 450 -1 +216 450 1 +2 451 1 +98 451 1 +207 451 -1 +217 451 1 +3 452 1 +98 452 1 +99 453 1 +209 453 1 +224 453 -1 +372 453 1 +373 453 1 +374 453 1 +375 453 1 +376 453 1 +377 453 1 +378 453 1 +379 453 1 +380 453 1 +443 453 -1 +99 454 1 +384 454 1 +385 454 1 +386 454 1 +387 454 1 +388 454 1 +389 454 1 +390 454 1 +391 454 1 +444 454 -1 +100 455 1 +183 455 -1 +200 455 1 +311 455 1 +312 455 1 +313 455 1 +314 455 1 +315 455 1 +100 456 1 +184 456 -1 +201 456 1 +316 456 1 +317 456 1 +318 456 1 +319 456 1 +320 456 1 +100 457 1 +321 457 1 +322 457 1 +323 457 1 +324 457 1 +325 457 1 +101 458 1 +197 458 1 +208 458 -1 +306 458 1 +101 459 1 +198 459 1 +209 459 -1 +309 459 1 +101 460 1 +310 460 1 +102 461 1 +193 461 1 +200 461 -1 +288 461 1 +289 461 1 +290 461 1 +291 461 1 +292 461 1 +314 461 -1 +315 461 -1 +102 462 1 +194 462 1 +201 462 -1 +293 462 1 +294 462 1 +295 462 1 +296 462 1 +297 462 1 +319 462 -1 +320 462 -1 +3 463 1 +102 463 1 +324 463 -1 +325 463 -1 +103 464 1 +187 464 -1 +208 464 1 +247 464 -1 +248 464 -1 +358 464 1 +359 464 1 +360 464 1 +361 464 1 +362 464 1 +363 464 1 +364 464 1 +365 464 1 +366 464 1 +367 464 1 +368 464 1 +103 465 1 +188 465 -1 +209 465 1 +250 465 -1 +251 465 -1 +371 465 1 +372 465 1 +373 465 1 +374 465 1 +375 465 1 +376 465 1 +377 465 1 +378 465 1 +379 465 1 +380 465 1 +103 466 1 +253 466 -1 +254 466 -1 +383 466 1 +384 466 1 +385 466 1 +386 466 1 +387 466 1 +388 466 1 +389 466 1 +390 466 1 +391 466 1 +104 467 1 +187 467 1 +208 467 -1 +246 467 1 +247 467 1 +248 467 1 +359 467 -1 +360 467 -1 +361 467 -1 +362 467 -1 +363 467 -1 +364 467 -1 +365 467 -1 +366 467 -1 +367 467 -1 +368 467 -1 +104 468 1 +188 468 1 +209 468 -1 +249 468 1 +250 468 1 +251 468 1 +373 468 -1 +374 468 -1 +375 468 -1 +376 468 -1 +377 468 -1 +378 468 -1 +379 468 -1 +380 468 -1 +104 469 1 +252 469 1 +253 469 1 +254 469 1 +385 469 -1 +386 469 -1 +387 469 -1 +388 469 -1 +389 469 -1 +390 469 -1 +391 469 -1 +105 470 1 +189 470 -1 +204 470 1 +260 470 -1 +261 470 -1 +262 470 -1 +346 470 1 +347 470 1 +105 471 1 +190 471 -1 +205 471 1 +268 471 -1 +269 471 -1 +270 471 -1 +348 471 1 +349 471 1 +105 472 1 +276 472 -1 +277 472 -1 +278 472 -1 +350 472 1 +351 472 1 +1 473 1 +106 473 1 +204 473 1 +208 473 -1 +359 473 -1 +360 473 -1 +361 473 -1 +362 473 -1 +363 473 -1 +364 473 -1 +365 473 -1 +366 473 -1 +367 473 -1 +368 473 -1 +2 474 1 +106 474 1 +205 474 1 +209 474 -1 +373 474 -1 +374 474 -1 +375 474 -1 +376 474 -1 +377 474 -1 +378 474 -1 +379 474 -1 +380 474 -1 +3 475 1 +106 475 1 +385 475 -1 +386 475 -1 +387 475 -1 +388 475 -1 +389 475 -1 +390 475 -1 +391 475 -1 +107 476 1 +204 476 -1 +218 476 1 +411 476 1 +107 477 1 +205 477 -1 +219 477 1 +414 477 1 +107 478 1 +416 478 1 +108 479 1 +189 479 -1 +191 479 1 +281 479 1 +108 480 1 +190 480 -1 +192 480 1 +284 480 1 +108 481 1 +287 481 1 +109 482 1 +181 482 1 +189 482 -1 +225 482 1 +226 482 1 +227 482 1 +259 482 -1 +260 482 -1 +261 482 -1 +262 482 -1 +109 483 1 +182 483 1 +190 483 -1 +228 483 1 +229 483 1 +230 483 1 +267 483 -1 +268 483 -1 +269 483 -1 +270 483 -1 +109 484 1 +231 484 1 +232 484 1 +233 484 1 +275 484 -1 +276 484 -1 +277 484 -1 +278 484 -1 +110 485 1 +187 485 1 +204 485 -1 +248 485 1 +347 485 -1 +110 486 1 +188 486 1 +205 486 -1 +251 486 1 +349 486 -1 +110 487 1 +254 487 1 +351 487 -1 +1 488 1 +111 488 1 +187 488 -1 +206 488 1 +248 488 -1 +2 489 1 +111 489 1 +188 489 -1 +207 489 1 +251 489 -1 +111 490 1 +254 490 -1 +355 490 1 +356 490 1 +1 491 1 +112 491 1 +189 491 -1 +208 491 1 +255 491 -1 +256 491 -1 +257 491 -1 +258 491 -1 +259 491 -1 +260 491 -1 +261 491 -1 +262 491 -1 +365 491 1 +366 491 1 +367 491 1 +368 491 1 +2 492 1 +112 492 1 +190 492 -1 +209 492 1 +263 492 -1 +264 492 -1 +265 492 -1 +266 492 -1 +267 492 -1 +268 492 -1 +269 492 -1 +270 492 -1 +377 492 1 +378 492 1 +379 492 1 +380 492 1 +3 493 1 +112 493 1 +271 493 -1 +272 493 -1 +273 493 -1 +274 493 -1 +275 493 -1 +276 493 -1 +277 493 -1 +278 493 -1 +388 493 1 +389 493 1 +390 493 1 +391 493 1 +1 494 1 +113 494 1 +189 494 -1 +200 494 1 +255 494 -1 +256 494 -1 +257 494 -1 +258 494 -1 +259 494 -1 +260 494 -1 +261 494 -1 +262 494 -1 +314 494 1 +315 494 1 +2 495 1 +113 495 1 +190 495 -1 +201 495 1 +263 495 -1 +264 495 -1 +265 495 -1 +266 495 -1 +267 495 -1 +268 495 -1 +269 495 -1 +270 495 -1 +319 495 1 +320 495 1 +3 496 1 +113 496 1 +271 496 -1 +272 496 -1 +273 496 -1 +274 496 -1 +275 496 -1 +276 496 -1 +277 496 -1 +278 496 -1 +324 496 1 +325 496 1 +1 497 1 +114 497 1 +200 497 -1 +202 497 1 +311 497 -1 +312 497 -1 +313 497 -1 +314 497 -1 +315 497 -1 +2 498 1 +114 498 1 +201 498 -1 +203 498 1 +316 498 -1 +317 498 -1 +318 498 -1 +319 498 -1 +320 498 -1 +3 499 1 +114 499 1 +321 499 -1 +322 499 -1 +323 499 -1 +324 499 -1 +325 499 -1 +1 500 1 +115 500 1 +191 500 1 +208 500 -1 +357 500 -1 +358 500 -1 +359 500 -1 +360 500 -1 +361 500 -1 +362 500 -1 +363 500 -1 +364 500 -1 +365 500 -1 +366 500 -1 +367 500 -1 +368 500 -1 +2 501 1 +115 501 1 +192 501 1 +209 501 -1 +370 501 -1 +371 501 -1 +372 501 -1 +373 501 -1 +374 501 -1 +375 501 -1 +376 501 -1 +377 501 -1 +378 501 -1 +379 501 -1 +380 501 -1 +3 502 1 +115 502 1 +382 502 -1 +383 502 -1 +384 502 -1 +385 502 -1 +386 502 -1 +387 502 -1 +388 502 -1 +389 502 -1 +390 502 -1 +391 502 -1 +116 503 1 +208 503 -1 +216 503 1 +366 503 -1 +367 503 -1 +368 503 -1 +407 503 1 +116 504 1 +209 504 -1 +217 504 1 +378 504 -1 +379 504 -1 +380 504 -1 +408 504 1 +116 505 1 +389 505 -1 +390 505 -1 +391 505 -1 +409 505 1 +1 506 1 +117 506 1 +187 506 1 +189 506 -1 +258 506 -1 +259 506 -1 +260 506 -1 +261 506 -1 +262 506 -1 +2 507 1 +117 507 1 +188 507 1 +190 507 -1 +266 507 -1 +267 507 -1 +268 507 -1 +269 507 -1 +270 507 -1 +3 508 1 +117 508 1 +274 508 -1 +275 508 -1 +276 508 -1 +277 508 -1 +278 508 -1 +118 509 1 +185 509 -1 +189 509 1 +243 509 -1 +256 509 1 +257 509 1 +258 509 1 +259 509 1 +260 509 1 +261 509 1 +262 509 1 +118 510 1 +186 510 -1 +190 510 1 +244 510 -1 +264 510 1 +265 510 1 +266 510 1 +267 510 1 +268 510 1 +269 510 1 +270 510 1 +118 511 1 +245 511 -1 +272 511 1 +273 511 1 +274 511 1 +275 511 1 +276 511 1 +277 511 1 +278 511 1 +119 512 1 +191 512 -1 +208 512 1 +279 512 -1 +280 512 -1 +281 512 -1 +358 512 1 +359 512 1 +360 512 1 +361 512 1 +362 512 1 +363 512 1 +364 512 1 +365 512 1 +366 512 1 +367 512 1 +368 512 1 +119 513 1 +192 513 -1 +209 513 1 +282 513 -1 +283 513 -1 +284 513 -1 +371 513 1 +372 513 1 +373 513 1 +374 513 1 +375 513 1 +376 513 1 +377 513 1 +378 513 1 +379 513 1 +380 513 1 +119 514 1 +285 514 -1 +286 514 -1 +287 514 -1 +383 514 1 +384 514 1 +385 514 1 +386 514 1 +387 514 1 +388 514 1 +389 514 1 +390 514 1 +391 514 1 +1 515 1 +120 515 1 +193 515 1 +208 515 -1 +358 515 -1 +359 515 -1 +360 515 -1 +361 515 -1 +362 515 -1 +363 515 -1 +364 515 -1 +365 515 -1 +366 515 -1 +367 515 -1 +368 515 -1 +2 516 1 +120 516 1 +194 516 1 +209 516 -1 +371 516 -1 +372 516 -1 +373 516 -1 +374 516 -1 +375 516 -1 +376 516 -1 +377 516 -1 +378 516 -1 +379 516 -1 +380 516 -1 +3 517 1 +120 517 1 +383 517 -1 +384 517 -1 +385 517 -1 +386 517 -1 +387 517 -1 +388 517 -1 +389 517 -1 +390 517 -1 +391 517 -1 +1 518 1 +121 518 1 +181 518 -1 +208 518 1 +225 518 -1 +226 518 -1 +227 518 -1 +2 519 1 +121 519 1 +182 519 -1 +209 519 1 +228 519 -1 +229 519 -1 +230 519 -1 +3 520 1 +121 520 1 +231 520 -1 +232 520 -1 +233 520 -1 +122 521 1 +193 521 1 +218 521 -1 +290 521 1 +291 521 1 +292 521 1 +122 522 1 +194 522 1 +219 522 -1 +295 522 1 +296 522 1 +297 522 1 +122 523 1 +299 523 1 +300 523 1 +301 523 1 +123 524 1 +189 524 1 +208 524 -1 +257 524 1 +258 524 1 +259 524 1 +260 524 1 +261 524 1 +262 524 1 +366 524 -1 +367 524 -1 +368 524 -1 +123 525 1 +190 525 1 +209 525 -1 +265 525 1 +266 525 1 +267 525 1 +268 525 1 +269 525 1 +270 525 1 +378 525 -1 +379 525 -1 +380 525 -1 +123 526 1 +273 526 1 +274 526 1 +275 526 1 +276 526 1 +277 526 1 +278 526 1 +389 526 -1 +390 526 -1 +391 526 -1 +124 527 1 +202 527 -1 +212 527 1 +333 527 -1 +334 527 -1 +397 527 1 +398 527 1 +124 528 1 +203 528 -1 +213 528 1 +341 528 -1 +400 528 1 +401 528 1 +3 529 1 +124 529 1 +125 530 1 +183 530 1 +189 530 -1 +236 530 1 +237 530 1 +262 530 -1 +125 531 1 +184 531 1 +190 531 -1 +239 531 1 +240 531 1 +270 531 -1 +125 532 1 +242 532 1 +278 532 -1 +126 533 1 +198 533 -1 +223 533 1 +309 533 -1 +433 533 1 +434 533 1 +435 533 1 +436 533 1 +437 533 1 +438 533 1 +439 533 1 +440 533 1 +126 534 1 +310 534 -1 +441 534 1 +442 534 1 +127 535 1 +181 535 1 +189 535 -1 +225 535 1 +226 535 1 +227 535 1 +260 535 -1 +261 535 -1 +262 535 -1 +127 536 1 +182 536 1 +190 536 -1 +228 536 1 +229 536 1 +230 536 1 +268 536 -1 +269 536 -1 +270 536 -1 +127 537 1 +231 537 1 +232 537 1 +233 537 1 +276 537 -1 +277 537 -1 +278 537 -1 +128 538 1 +189 538 -1 +200 538 1 +315 538 1 +128 539 1 +190 539 -1 +201 539 1 +320 539 1 +128 540 1 +325 540 1 +129 541 1 +189 541 1 +191 541 -1 +256 541 1 +257 541 1 +258 541 1 +259 541 1 +260 541 1 +261 541 1 +262 541 1 +280 541 -1 +281 541 -1 +129 542 1 +190 542 1 +192 542 -1 +264 542 1 +265 542 1 +266 542 1 +267 542 1 +268 542 1 +269 542 1 +270 542 1 +283 542 -1 +284 542 -1 +129 543 1 +272 543 1 +273 543 1 +274 543 1 +275 543 1 +276 543 1 +277 543 1 +278 543 1 +286 543 -1 +287 543 -1 +1 544 1 +130 544 1 +200 544 1 +208 544 -1 +361 544 -1 +362 544 -1 +363 544 -1 +364 544 -1 +365 544 -1 +366 544 -1 +367 544 -1 +368 544 -1 +2 545 1 +130 545 1 +201 545 1 +209 545 -1 +375 545 -1 +376 545 -1 +377 545 -1 +378 545 -1 +379 545 -1 +380 545 -1 +3 546 1 +130 546 1 +386 546 -1 +387 546 -1 +388 546 -1 +389 546 -1 +390 546 -1 +391 546 -1 +131 547 1 +200 547 -1 +206 547 1 +352 547 1 +131 548 1 +201 548 -1 +207 548 1 +354 548 1 +131 549 1 +356 549 1 +1 550 1 +132 550 1 +183 550 1 +200 550 -1 +313 550 -1 +314 550 -1 +315 550 -1 +2 551 1 +132 551 1 +184 551 1 +201 551 -1 +318 551 -1 +319 551 -1 +320 551 -1 +3 552 1 +132 552 1 +323 552 -1 +324 552 -1 +325 552 -1 +1 553 1 +133 553 1 +206 553 -1 +222 553 1 +352 553 -1 +2 554 1 +133 554 1 +207 554 -1 +223 554 1 +354 554 -1 +3 555 1 +133 555 1 +356 555 -1 +1 556 1 +134 556 1 +189 556 -1 +210 556 1 +255 556 -1 +256 556 -1 +257 556 -1 +258 556 -1 +259 556 -1 +260 556 -1 +261 556 -1 +262 556 -1 +393 556 1 +2 557 1 +134 557 1 +190 557 -1 +211 557 1 +263 557 -1 +264 557 -1 +265 557 -1 +266 557 -1 +267 557 -1 +268 557 -1 +269 557 -1 +270 557 -1 +394 557 1 +3 558 1 +134 558 1 +271 558 -1 +272 558 -1 +273 558 -1 +274 558 -1 +275 558 -1 +276 558 -1 +277 558 -1 +278 558 -1 +395 558 1 +1 559 1 +135 559 1 +189 559 1 +212 559 -1 +396 559 -1 +397 559 -1 +398 559 -1 +2 560 1 +135 560 1 +190 560 1 +213 560 -1 +399 560 -1 +400 560 -1 +401 560 -1 +135 561 1 +136 562 1 +202 562 -1 +208 562 1 +327 562 -1 +328 562 -1 +329 562 -1 +330 562 -1 +331 562 -1 +332 562 -1 +333 562 -1 +334 562 -1 +358 562 1 +359 562 1 +360 562 1 +361 562 1 +362 562 1 +363 562 1 +364 562 1 +365 562 1 +366 562 1 +367 562 1 +368 562 1 +136 563 1 +203 563 -1 +209 563 1 +336 563 -1 +337 563 -1 +338 563 -1 +339 563 -1 +340 563 -1 +341 563 -1 +371 563 1 +372 563 1 +373 563 1 +374 563 1 +375 563 1 +376 563 1 +377 563 1 +378 563 1 +379 563 1 +380 563 1 +136 564 1 +342 564 -1 +343 564 -1 +344 564 -1 +345 564 -1 +383 564 1 +384 564 1 +385 564 1 +386 564 1 +387 564 1 +388 564 1 +389 564 1 +390 564 1 +391 564 1 +137 565 1 +181 565 -1 +189 565 1 +258 565 1 +259 565 1 +260 565 1 +261 565 1 +262 565 1 +137 566 1 +182 566 -1 +190 566 1 +266 566 1 +267 566 1 +268 566 1 +269 566 1 +270 566 1 +137 567 1 +274 567 1 +275 567 1 +276 567 1 +277 567 1 +278 567 1 +1 568 1 +138 568 1 +208 568 -1 +218 568 1 +361 568 -1 +362 568 -1 +363 568 -1 +364 568 -1 +365 568 -1 +366 568 -1 +367 568 -1 +368 568 -1 +2 569 1 +138 569 1 +209 569 -1 +219 569 1 +375 569 -1 +376 569 -1 +377 569 -1 +378 569 -1 +379 569 -1 +380 569 -1 +3 570 1 +138 570 1 +386 570 -1 +387 570 -1 +388 570 -1 +389 570 -1 +390 570 -1 +391 570 -1 +139 571 1 +191 571 1 +222 571 -1 +280 571 1 +281 571 1 +431 571 -1 +432 571 -1 +139 572 1 +192 572 1 +223 572 -1 +283 572 1 +284 572 1 +439 572 -1 +440 572 -1 +139 573 1 +286 573 1 +287 573 1 +1 574 1 +140 574 1 +183 574 1 +218 574 -1 +411 574 -1 +2 575 1 +140 575 1 +184 575 1 +219 575 -1 +414 575 -1 +3 576 1 +140 576 1 +416 576 -1 +141 577 1 +183 577 1 +200 577 -1 +234 577 1 +235 577 1 +236 577 1 +237 577 1 +315 577 -1 +2 578 1 +141 578 1 +184 578 1 +201 578 -1 +320 578 -1 +3 579 1 +141 579 1 +325 579 -1 +142 580 1 +181 580 1 +208 580 -1 +227 580 1 +368 580 -1 +142 581 1 +182 581 1 +209 581 -1 +230 581 1 +380 581 -1 +142 582 1 +233 582 1 +391 582 -1 +1 583 1 +143 583 1 +206 583 1 +208 583 -1 +364 583 -1 +365 583 -1 +366 583 -1 +367 583 -1 +368 583 -1 +143 584 1 +207 584 1 +209 584 -1 +353 584 1 +354 584 1 +376 584 -1 +377 584 -1 +378 584 -1 +379 584 -1 +380 584 -1 +143 585 1 +355 585 1 +356 585 1 +387 585 -1 +388 585 -1 +389 585 -1 +390 585 -1 +391 585 -1 +1 586 1 +144 586 1 +185 586 1 +216 586 -1 +407 586 -1 +2 587 1 +144 587 1 +186 587 1 +217 587 -1 +408 587 -1 +3 588 1 +144 588 1 +409 588 -1 +145 589 1 +204 589 1 +208 589 -1 +347 589 1 +145 590 1 +205 590 1 +209 590 -1 +349 590 1 +145 591 1 +351 591 1 +146 592 1 +189 592 1 +208 592 -1 +259 592 1 +260 592 1 +261 592 1 +262 592 1 +366 592 -1 +367 592 -1 +368 592 -1 +146 593 1 +190 593 1 +209 593 -1 +267 593 1 +268 593 1 +269 593 1 +270 593 1 +378 593 -1 +379 593 -1 +380 593 -1 +146 594 1 +275 594 1 +276 594 1 +277 594 1 +278 594 1 +389 594 -1 +390 594 -1 +391 594 -1 +1 595 1 +147 595 1 +202 595 1 +222 595 -1 +425 595 -1 +426 595 -1 +427 595 -1 +428 595 -1 +429 595 -1 +430 595 -1 +431 595 -1 +432 595 -1 +2 596 1 +147 596 1 +203 596 1 +223 596 -1 +433 596 -1 +434 596 -1 +435 596 -1 +436 596 -1 +437 596 -1 +438 596 -1 +439 596 -1 +440 596 -1 +3 597 1 +147 597 1 +441 597 -1 +442 597 -1 +148 598 1 +202 598 1 +220 598 -1 +332 598 1 +333 598 1 +334 598 1 +148 599 1 +203 599 1 +221 599 -1 +340 599 1 +341 599 1 +148 600 1 +345 600 1 +1 601 1 +149 601 1 +202 601 -1 +220 601 1 +329 601 -1 +330 601 -1 +331 601 -1 +332 601 -1 +333 601 -1 +334 601 -1 +2 602 1 +149 602 1 +203 602 -1 +221 602 1 +337 602 -1 +338 602 -1 +339 602 -1 +340 602 -1 +341 602 -1 +3 603 1 +149 603 1 +343 603 -1 +344 603 -1 +345 603 -1 +150 604 1 +202 604 1 +220 604 -1 +329 604 1 +330 604 1 +331 604 1 +332 604 1 +333 604 1 +334 604 1 +419 604 -1 +150 605 1 +203 605 1 +221 605 -1 +337 605 1 +338 605 1 +339 605 1 +340 605 1 +341 605 1 +422 605 -1 +150 606 1 +343 606 1 +344 606 1 +345 606 1 +424 606 -1 +151 607 1 +202 607 -1 +220 607 1 +332 607 -1 +333 607 -1 +334 607 -1 +419 607 1 +151 608 1 +203 608 -1 +221 608 1 +340 608 -1 +341 608 -1 +422 608 1 +151 609 1 +345 609 -1 +424 609 1 +152 610 1 +189 610 1 +220 610 -1 +255 610 1 +256 610 1 +257 610 1 +258 610 1 +259 610 1 +260 610 1 +261 610 1 +262 610 1 +417 610 -1 +418 610 -1 +419 610 -1 +152 611 1 +190 611 1 +221 611 -1 +263 611 1 +264 611 1 +265 611 1 +266 611 1 +267 611 1 +268 611 1 +269 611 1 +270 611 1 +420 611 -1 +421 611 -1 +422 611 -1 +152 612 1 +271 612 1 +272 612 1 +273 612 1 +274 612 1 +275 612 1 +276 612 1 +277 612 1 +278 612 1 +423 612 -1 +424 612 -1 +1 613 1 +153 613 1 +189 613 -1 +200 613 1 +256 613 -1 +257 613 -1 +258 613 -1 +259 613 -1 +260 613 -1 +261 613 -1 +262 613 -1 +2 614 1 +153 614 1 +190 614 -1 +201 614 1 +264 614 -1 +265 614 -1 +266 614 -1 +267 614 -1 +268 614 -1 +269 614 -1 +270 614 -1 +3 615 1 +153 615 1 +272 615 -1 +273 615 -1 +274 615 -1 +275 615 -1 +276 615 -1 +277 615 -1 +278 615 -1 +154 616 1 +191 616 -1 +208 616 1 +364 616 1 +365 616 1 +366 616 1 +367 616 1 +368 616 1 +154 617 1 +192 617 -1 +209 617 1 +376 617 1 +377 617 1 +378 617 1 +379 617 1 +380 617 1 +154 618 1 +387 618 1 +388 618 1 +389 618 1 +390 618 1 +391 618 1 +155 619 1 +191 619 -1 +208 619 1 +281 619 -1 +362 619 1 +363 619 1 +364 619 1 +365 619 1 +366 619 1 +367 619 1 +368 619 1 +155 620 1 +192 620 -1 +209 620 1 +284 620 -1 +375 620 1 +376 620 1 +377 620 1 +378 620 1 +379 620 1 +380 620 1 +155 621 1 +287 621 -1 +386 621 1 +387 621 1 +388 621 1 +389 621 1 +390 621 1 +391 621 1 +156 622 1 +183 622 -1 +208 622 1 +235 622 -1 +236 622 -1 +237 622 -1 +359 622 1 +360 622 1 +361 622 1 +362 622 1 +363 622 1 +364 622 1 +365 622 1 +366 622 1 +367 622 1 +368 622 1 +156 623 1 +184 623 -1 +209 623 1 +238 623 -1 +239 623 -1 +240 623 -1 +373 623 1 +374 623 1 +375 623 1 +376 623 1 +377 623 1 +378 623 1 +379 623 1 +380 623 1 +156 624 1 +241 624 -1 +242 624 -1 +385 624 1 +386 624 1 +387 624 1 +388 624 1 +389 624 1 +390 624 1 +391 624 1 +157 625 1 +183 625 -1 +208 625 1 +366 625 1 +367 625 1 +368 625 1 +157 626 1 +184 626 -1 +209 626 1 +378 626 1 +379 626 1 +380 626 1 +157 627 1 +389 627 1 +390 627 1 +391 627 1 +158 628 1 +187 628 -1 +208 628 1 +364 628 1 +365 628 1 +366 628 1 +367 628 1 +368 628 1 +158 629 1 +188 629 -1 +209 629 1 +376 629 1 +377 629 1 +378 629 1 +379 629 1 +380 629 1 +158 630 1 +387 630 1 +388 630 1 +389 630 1 +390 630 1 +391 630 1 +159 631 1 +185 631 1 +208 631 -1 +243 631 1 +365 631 -1 +366 631 -1 +367 631 -1 +368 631 -1 +159 632 1 +186 632 1 +209 632 -1 +244 632 1 +377 632 -1 +378 632 -1 +379 632 -1 +380 632 -1 +159 633 1 +245 633 1 +388 633 -1 +389 633 -1 +390 633 -1 +391 633 -1 +160 634 1 +181 634 -1 +208 634 1 +227 634 -1 +362 634 1 +363 634 1 +364 634 1 +365 634 1 +366 634 1 +367 634 1 +368 634 1 +160 635 1 +182 635 -1 +209 635 1 +230 635 -1 +375 635 1 +376 635 1 +377 635 1 +378 635 1 +379 635 1 +380 635 1 +160 636 1 +233 636 -1 +386 636 1 +387 636 1 +388 636 1 +389 636 1 +390 636 1 +391 636 1 +161 637 1 +181 637 -1 +208 637 1 +366 637 1 +367 637 1 +368 637 1 +161 638 1 +182 638 -1 +209 638 1 +378 638 1 +379 638 1 +380 638 1 +161 639 1 +389 639 1 +390 639 1 +391 639 1 +162 640 1 +185 640 -1 +208 640 1 +366 640 1 +367 640 1 +368 640 1 +162 641 1 +186 641 -1 +209 641 1 +378 641 1 +379 641 1 +380 641 1 +162 642 1 +389 642 1 +390 642 1 +391 642 1 +1 643 1 +163 643 1 +181 643 1 +208 643 -1 +359 643 -1 +360 643 -1 +361 643 -1 +362 643 -1 +363 643 -1 +364 643 -1 +365 643 -1 +366 643 -1 +367 643 -1 +368 643 -1 +2 644 1 +163 644 1 +182 644 1 +209 644 -1 +372 644 -1 +373 644 -1 +374 644 -1 +375 644 -1 +376 644 -1 +377 644 -1 +378 644 -1 +379 644 -1 +380 644 -1 +3 645 1 +163 645 1 +384 645 -1 +385 645 -1 +386 645 -1 +387 645 -1 +388 645 -1 +389 645 -1 +390 645 -1 +391 645 -1 +1 646 1 +164 646 1 +189 646 -1 +210 646 1 +257 646 -1 +258 646 -1 +259 646 -1 +260 646 -1 +261 646 -1 +262 646 -1 +2 647 1 +164 647 1 +190 647 -1 +211 647 1 +265 647 -1 +266 647 -1 +267 647 -1 +268 647 -1 +269 647 -1 +270 647 -1 +3 648 1 +164 648 1 +273 648 -1 +274 648 -1 +275 648 -1 +276 648 -1 +277 648 -1 +278 648 -1 +165 649 1 +189 649 1 +210 649 -1 +260 649 1 +261 649 1 +262 649 1 +165 650 1 +190 650 1 +211 650 -1 +268 650 1 +269 650 1 +270 650 1 +165 651 1 +276 651 1 +277 651 1 +278 651 1 +166 652 1 +190 652 -1 +224 652 1 +267 652 -1 +268 652 -1 +269 652 -1 +270 652 -1 +443 652 1 +166 653 1 +275 653 -1 +276 653 -1 +277 653 -1 +278 653 -1 +444 653 1 +2 654 1 +167 654 1 +190 654 -1 +224 654 1 +265 654 -1 +266 654 -1 +267 654 -1 +268 654 -1 +269 654 -1 +270 654 -1 +3 655 1 +167 655 1 +273 655 -1 +274 655 -1 +275 655 -1 +276 655 -1 +277 655 -1 +278 655 -1 +168 656 1 +189 656 -1 +222 656 1 +259 656 -1 +260 656 -1 +261 656 -1 +262 656 -1 +426 656 1 +427 656 1 +428 656 1 +429 656 1 +430 656 1 +431 656 1 +432 656 1 +168 657 1 +190 657 -1 +223 657 1 +267 657 -1 +268 657 -1 +269 657 -1 +270 657 -1 +434 657 1 +435 657 1 +436 657 1 +437 657 1 +438 657 1 +439 657 1 +440 657 1 +168 658 1 +275 658 -1 +276 658 -1 +277 658 -1 +278 658 -1 +441 658 1 +442 658 1 +169 659 1 +208 659 -1 +214 659 1 +368 659 -1 +403 659 1 +169 660 1 +209 660 -1 +215 660 1 +380 660 -1 +405 660 1 +169 661 1 +391 661 -1 +406 661 1 +170 662 1 +208 662 -1 +214 662 1 +365 662 -1 +366 662 -1 +367 662 -1 +368 662 -1 +402 662 1 +403 662 1 +170 663 1 +209 663 -1 +215 663 1 +377 663 -1 +378 663 -1 +379 663 -1 +380 663 -1 +404 663 1 +405 663 1 +3 664 1 +170 664 1 +388 664 -1 +389 664 -1 +390 664 -1 +391 664 -1 +171 665 1 +208 665 1 +214 665 -1 +364 665 1 +365 665 1 +366 665 1 +367 665 1 +368 665 1 +403 665 -1 +171 666 1 +209 666 1 +215 666 -1 +376 666 1 +377 666 1 +378 666 1 +379 666 1 +380 666 1 +405 666 -1 +171 667 1 +387 667 1 +388 667 1 +389 667 1 +390 667 1 +391 667 1 +406 667 -1 +172 668 1 +208 668 1 +214 668 -1 +361 668 1 +362 668 1 +363 668 1 +364 668 1 +365 668 1 +366 668 1 +367 668 1 +368 668 1 +402 668 -1 +403 668 -1 +172 669 1 +209 669 1 +215 669 -1 +375 669 1 +376 669 1 +377 669 1 +378 669 1 +379 669 1 +380 669 1 +404 669 -1 +405 669 -1 +3 670 -1 +172 670 1 +386 670 1 +387 670 1 +388 670 1 +389 670 1 +390 670 1 +391 670 1 +173 671 1 +183 671 1 +208 671 -1 +235 671 1 +236 671 1 +237 671 1 +365 671 -1 +366 671 -1 +367 671 -1 +368 671 -1 +173 672 1 +184 672 1 +209 672 -1 +238 672 1 +239 672 1 +240 672 1 +377 672 -1 +378 672 -1 +379 672 -1 +380 672 -1 +173 673 1 +241 673 1 +242 673 1 +388 673 -1 +389 673 -1 +390 673 -1 +391 673 -1 +174 674 1 +357 674 1 +358 674 1 +359 674 1 +360 674 1 +361 674 1 +362 674 1 +174 675 1 +370 675 1 +371 675 1 +372 675 1 +373 675 1 +374 675 1 +375 675 1 +174 676 1 +382 676 1 +383 676 1 +384 676 1 +385 676 1 +386 676 1 +175 677 1 +191 677 1 +208 677 -1 +279 677 1 +280 677 1 +281 677 1 +360 677 -1 +361 677 -1 +362 677 -1 +363 677 -1 +364 677 -1 +365 677 -1 +366 677 -1 +367 677 -1 +368 677 -1 +175 678 1 +192 678 1 +209 678 -1 +282 678 1 +283 678 1 +284 678 1 +374 678 -1 +375 678 -1 +376 678 -1 +377 678 -1 +378 678 -1 +379 678 -1 +380 678 -1 +175 679 1 +285 679 1 +286 679 1 +287 679 1 +386 679 -1 +387 679 -1 +388 679 -1 +389 679 -1 +390 679 -1 +391 679 -1 +176 680 1 +193 680 -1 +208 680 1 +289 680 -1 +290 680 -1 +291 680 -1 +292 680 -1 +358 680 1 +359 680 1 +360 680 1 +361 680 1 +362 680 1 +363 680 1 +364 680 1 +365 680 1 +366 680 1 +367 680 1 +368 680 1 +176 681 1 +194 681 -1 +209 681 1 +294 681 -1 +295 681 -1 +296 681 -1 +297 681 -1 +371 681 1 +372 681 1 +373 681 1 +374 681 1 +375 681 1 +376 681 1 +377 681 1 +378 681 1 +379 681 1 +380 681 1 +176 682 1 +298 682 -1 +299 682 -1 +300 682 -1 +301 682 -1 +383 682 1 +384 682 1 +385 682 1 +386 682 1 +387 682 1 +388 682 1 +389 682 1 +390 682 1 +391 682 1 +177 683 1 +189 683 1 +200 683 -1 +262 683 1 +177 684 1 +190 684 1 +201 684 -1 +270 684 1 +177 685 1 +278 685 1 +1 686 1 +178 686 1 +187 686 1 +208 686 -1 +357 686 -1 +358 686 -1 +359 686 -1 +360 686 -1 +361 686 -1 +362 686 -1 +363 686 -1 +364 686 -1 +365 686 -1 +366 686 -1 +367 686 -1 +368 686 -1 +2 687 1 +178 687 1 +188 687 1 +209 687 -1 +370 687 -1 +371 687 -1 +372 687 -1 +373 687 -1 +374 687 -1 +375 687 -1 +376 687 -1 +377 687 -1 +378 687 -1 +379 687 -1 +380 687 -1 +3 688 1 +178 688 1 +381 688 -1 +382 688 -1 +383 688 -1 +384 688 -1 +385 688 -1 +386 688 -1 +387 688 -1 +388 688 -1 +389 688 -1 +390 688 -1 +391 688 -1 +179 689 1 +187 689 -1 +208 689 1 +367 689 1 +368 689 1 +179 690 1 +188 690 -1 +209 690 1 +379 690 1 +380 690 1 +179 691 1 +390 691 1 +391 691 1 +180 692 1 +189 692 1 +210 692 -1 +255 692 1 +256 692 1 +257 692 1 +258 692 1 +259 692 1 +260 692 1 +261 692 1 +262 692 1 +393 692 -1 +180 693 1 +190 693 1 +211 693 -1 +263 693 1 +264 693 1 +265 693 1 +266 693 1 +267 693 1 +268 693 1 +269 693 1 +270 693 1 +394 693 -1 +180 694 1 +271 694 1 +272 694 1 +273 694 1 +274 694 1 +275 694 1 +276 694 1 +277 694 1 +278 694 1 +395 694 -1 +1 695 1 +225 695 -1 +226 695 -1 +227 695 -1 +2 696 1 +228 696 -1 +229 696 -1 +230 696 -1 +3 697 1 +231 697 -1 +232 697 -1 +233 697 -1 +1 698 1 +234 698 -1 +235 698 -1 +236 698 -1 +237 698 -1 +2 699 1 +238 699 -1 +239 699 -1 +240 699 -1 +3 700 1 +241 700 -1 +242 700 -1 +1 701 1 +243 701 -1 +2 702 1 +244 702 -1 +3 703 1 +245 703 -1 +1 704 1 +246 704 -1 +247 704 -1 +248 704 -1 +2 705 1 +249 705 -1 +250 705 -1 +251 705 -1 +3 706 1 +252 706 -1 +253 706 -1 +254 706 -1 +1 707 1 +255 707 -1 +256 707 -1 +257 707 -1 +258 707 -1 +259 707 -1 +260 707 -1 +261 707 -1 +262 707 -1 +2 708 1 +263 708 -1 +264 708 -1 +265 708 -1 +266 708 -1 +267 708 -1 +268 708 -1 +269 708 -1 +270 708 -1 +3 709 1 +271 709 -1 +272 709 -1 +273 709 -1 +274 709 -1 +275 709 -1 +276 709 -1 +277 709 -1 +278 709 -1 +1 710 1 +279 710 -1 +280 710 -1 +281 710 -1 +2 711 1 +282 711 -1 +283 711 -1 +284 711 -1 +3 712 1 +285 712 -1 +286 712 -1 +287 712 -1 +1 713 1 +288 713 -1 +289 713 -1 +290 713 -1 +291 713 -1 +292 713 -1 +2 714 1 +293 714 -1 +294 714 -1 +295 714 -1 +296 714 -1 +297 714 -1 +3 715 1 +298 715 -1 +299 715 -1 +300 715 -1 +301 715 -1 +1 716 1 +302 716 -1 +2 717 1 +303 717 -1 +1 718 1 +304 718 -1 +305 718 -1 +306 718 -1 +2 719 1 +307 719 -1 +308 719 -1 +309 719 -1 +3 720 1 +310 720 -1 +1 721 1 +311 721 -1 +312 721 -1 +313 721 -1 +314 721 -1 +315 721 -1 +2 722 1 +316 722 -1 +317 722 -1 +318 722 -1 +319 722 -1 +320 722 -1 +3 723 1 +321 723 -1 +322 723 -1 +323 723 -1 +324 723 -1 +325 723 -1 +1 724 1 +326 724 -1 +327 724 -1 +328 724 -1 +329 724 -1 +330 724 -1 +331 724 -1 +332 724 -1 +333 724 -1 +334 724 -1 +2 725 1 +335 725 -1 +336 725 -1 +337 725 -1 +338 725 -1 +339 725 -1 +340 725 -1 +341 725 -1 +3 726 1 +342 726 -1 +343 726 -1 +344 726 -1 +345 726 -1 +1 727 1 +346 727 -1 +347 727 -1 +2 728 1 +348 728 -1 +349 728 -1 +3 729 1 +350 729 -1 +351 729 -1 +1 730 1 +352 730 -1 +2 731 1 +353 731 -1 +354 731 -1 +3 732 1 +355 732 -1 +356 732 -1 +1 733 1 +357 733 -1 +358 733 -1 +359 733 -1 +360 733 -1 +361 733 -1 +362 733 -1 +363 733 -1 +364 733 -1 +365 733 -1 +366 733 -1 +367 733 -1 +368 733 -1 +2 734 1 +369 734 -1 +370 734 -1 +371 734 -1 +372 734 -1 +373 734 -1 +374 734 -1 +375 734 -1 +376 734 -1 +377 734 -1 +378 734 -1 +379 734 -1 +380 734 -1 +3 735 1 +381 735 -1 +382 735 -1 +383 735 -1 +384 735 -1 +385 735 -1 +386 735 -1 +387 735 -1 +388 735 -1 +389 735 -1 +390 735 -1 +391 735 -1 +1 736 1 +392 736 -1 +393 736 -1 +2 737 1 +394 737 -1 +3 738 1 +395 738 -1 +1 739 1 +396 739 -1 +397 739 -1 +398 739 -1 +2 740 1 +399 740 -1 +400 740 -1 +401 740 -1 +1 741 1 +402 741 -1 +403 741 -1 +2 742 1 +404 742 -1 +405 742 -1 +3 743 1 +406 743 -1 +1 744 1 +407 744 -1 +2 745 1 +408 745 -1 +3 746 1 +409 746 -1 +1 747 1 +410 747 -1 +411 747 -1 +2 748 1 +412 748 -1 +413 748 -1 +414 748 -1 +3 749 1 +415 749 -1 +416 749 -1 +1 750 1 +417 750 -1 +418 750 -1 +419 750 -1 +2 751 1 +420 751 -1 +421 751 -1 +422 751 -1 +3 752 1 +423 752 -1 +424 752 -1 +1 753 1 +425 753 -1 +426 753 -1 +427 753 -1 +428 753 -1 +429 753 -1 +430 753 -1 +431 753 -1 +432 753 -1 +2 754 1 +433 754 -1 +434 754 -1 +435 754 -1 +436 754 -1 +437 754 -1 +438 754 -1 +439 754 -1 +440 754 -1 +3 755 1 +441 755 -1 +442 755 -1 +2 756 1 +443 756 -1 +3 757 1 +444 757 -1 +1 758 38 +2 758 16 +3 758 19 +4 758 1 +5 758 1 +6 758 1 +7 758 1 +8 758 1 +9 758 1 +10 758 1 +11 758 1 +12 758 1 +13 758 1 +14 758 1 +15 758 1 +16 758 1 +17 758 1 +18 758 1 +19 758 1 +20 758 1 +21 758 1 +22 758 1 +23 758 1 +24 758 1 +25 758 1 +26 758 1 +27 758 1 +28 758 1 +29 758 1 +30 758 1 +31 758 1 +32 758 1 +33 758 1 +34 758 1 +35 758 1 +36 758 1 +37 758 1 +38 758 1 +39 758 1 +40 758 1 +41 758 1 +42 758 1 +43 758 1 +44 758 1 +45 758 1 +46 758 1 +47 758 1 +48 758 1 +49 758 1 +50 758 1 +51 758 1 +52 758 1 +53 758 1 +54 758 1 +55 758 1 +56 758 1 +57 758 1 +58 758 1 +59 758 1 +60 758 1 +61 758 1 +62 758 1 +63 758 1 +64 758 1 +65 758 1 +66 758 1 +67 758 1 +68 758 1 +69 758 1 +70 758 1 +71 758 1 +72 758 1 +73 758 1 +74 758 1 +75 758 1 +76 758 1 +77 758 1 +78 758 1 +79 758 1 +80 758 1 +81 758 1 +82 758 1 +83 758 1 +84 758 1 +85 758 1 +86 758 1 +87 758 1 +88 758 1 +89 758 1 +90 758 1 +91 758 1 +92 758 1 +93 758 1 +94 758 1 +95 758 1 +96 758 1 +97 758 1 +98 758 1 +99 758 1 +100 758 1 +101 758 1 +102 758 1 +103 758 1 +104 758 1 +105 758 1 +106 758 1 +107 758 1 +108 758 1 +109 758 1 +110 758 1 +111 758 1 +112 758 1 +113 758 1 +114 758 1 +115 758 1 +116 758 1 +117 758 1 +118 758 1 +119 758 1 +120 758 1 +121 758 1 +122 758 1 +123 758 1 +124 758 1 +125 758 1 +126 758 1 +127 758 1 +128 758 1 +129 758 1 +130 758 1 +131 758 1 +132 758 1 +133 758 1 +134 758 1 +135 758 1 +136 758 1 +137 758 1 +138 758 1 +139 758 1 +140 758 1 +141 758 1 +142 758 1 +143 758 1 +144 758 1 +145 758 1 +146 758 1 +147 758 1 +148 758 1 +149 758 1 +150 758 1 +151 758 1 +152 758 1 +153 758 1 +154 758 1 +155 758 1 +156 758 1 +157 758 1 +158 758 1 +159 758 1 +160 758 1 +161 758 1 +162 758 1 +163 758 1 +164 758 1 +165 758 1 +166 758 1 +167 758 1 +168 758 1 +169 758 1 +170 758 1 +171 758 1 +172 758 1 +173 758 1 +174 758 1 +175 758 1 +176 758 1 +177 758 1 +178 758 1 +179 758 1 +180 758 1 +183 758 1 +202 758 -1 +207 758 1 +209 758 -1 +234 758 1 +235 758 1 +236 758 1 +237 758 1 +263 758 1 +264 758 1 +265 758 1 +266 758 1 +267 758 1 +268 758 1 +269 758 1 +270 758 1 +300 758 1 +301 758 1 +331 758 -1 +332 758 -1 +334 758 1 +335 758 -1 +336 758 -1 +337 758 -1 +338 758 -1 +339 758 -1 +340 758 -1 +353 758 1 +354 758 1 +358 758 -1 +359 758 -1 +360 758 -1 +361 758 -1 +363 758 -1 +369 758 -1 +370 758 -1 +371 758 -1 +372 758 -1 +373 758 -1 +374 758 -1 +375 758 -1 +376 758 -1 +377 758 -1 +378 758 -1 +379 758 -1 +380 758 -1 +381 758 -1 +382 758 -1 +383 758 -1 +384 758 -1 +385 758 -1 +386 758 -1 +387 758 -1 +388 758 -1 +389 758 -1 +390 758 -1 +391 758 -1 +425 758 -2 +426 758 -2 +427 758 -2 +428 758 -2 +429 758 -2 +430 758 -2 diff --git a/test/netlib/degen2_bounds.mm b/test/netlib/degen2_bounds.mm new file mode 100644 index 000000000..d4fd6fb88 --- /dev/null +++ b/test/netlib/degen2_bounds.mm @@ -0,0 +1,760 @@ +%%MatrixMarket matrix coordinate real general +% Generated 28-Oct-2022 +757 2 757 +1 2 1000000000 +2 2 1000000000 +3 2 1000000000 +4 2 1000000000 +5 2 1000000000 +6 2 1000000000 +7 2 1000000000 +8 2 1000000000 +9 2 1000000000 +10 2 1000000000 +11 2 1000000000 +12 2 1000000000 +13 2 1000000000 +14 2 1000000000 +15 2 1000000000 +16 2 1000000000 +17 2 1000000000 +18 2 1000000000 +19 2 1000000000 +20 2 1000000000 +21 2 1000000000 +22 2 1000000000 +23 2 1000000000 +24 2 1000000000 +25 2 1000000000 +26 2 1000000000 +27 2 1000000000 +28 2 1000000000 +29 2 1000000000 +30 2 1000000000 +31 2 1000000000 +32 2 1000000000 +33 2 1000000000 +34 2 1000000000 +35 2 1000000000 +36 2 1000000000 +37 2 1000000000 +38 2 1000000000 +39 2 1000000000 +40 2 1000000000 +41 2 1000000000 +42 2 1000000000 +43 2 1000000000 +44 2 1000000000 +45 2 1000000000 +46 2 1000000000 +47 2 1000000000 +48 2 1000000000 +49 2 1000000000 +50 2 1000000000 +51 2 1000000000 +52 2 1000000000 +53 2 1000000000 +54 2 1000000000 +55 2 1000000000 +56 2 1000000000 +57 2 1000000000 +58 2 1000000000 +59 2 1000000000 +60 2 1000000000 +61 2 1000000000 +62 2 1000000000 +63 2 1000000000 +64 2 1000000000 +65 2 1000000000 +66 2 1000000000 +67 2 1000000000 +68 2 1000000000 +69 2 1000000000 +70 2 1000000000 +71 2 1000000000 +72 2 1000000000 +73 2 1000000000 +74 2 1000000000 +75 2 1000000000 +76 2 1000000000 +77 2 1000000000 +78 2 1000000000 +79 2 1000000000 +80 2 1000000000 +81 2 1000000000 +82 2 1000000000 +83 2 1000000000 +84 2 1000000000 +85 2 1000000000 +86 2 1000000000 +87 2 1000000000 +88 2 1000000000 +89 2 1000000000 +90 2 1000000000 +91 2 1000000000 +92 2 1000000000 +93 2 1000000000 +94 2 1000000000 +95 2 1000000000 +96 2 1000000000 +97 2 1000000000 +98 2 1000000000 +99 2 1000000000 +100 2 1000000000 +101 2 1000000000 +102 2 1000000000 +103 2 1000000000 +104 2 1000000000 +105 2 1000000000 +106 2 1000000000 +107 2 1000000000 +108 2 1000000000 +109 2 1000000000 +110 2 1000000000 +111 2 1000000000 +112 2 1000000000 +113 2 1000000000 +114 2 1000000000 +115 2 1000000000 +116 2 1000000000 +117 2 1000000000 +118 2 1000000000 +119 2 1000000000 +120 2 1000000000 +121 2 1000000000 +122 2 1000000000 +123 2 1000000000 +124 2 1000000000 +125 2 1000000000 +126 2 1000000000 +127 2 1000000000 +128 2 1000000000 +129 2 1000000000 +130 2 1000000000 +131 2 1000000000 +132 2 1000000000 +133 2 1000000000 +134 2 1000000000 +135 2 1000000000 +136 2 1000000000 +137 2 1000000000 +138 2 1000000000 +139 2 1000000000 +140 2 1000000000 +141 2 1000000000 +142 2 1000000000 +143 2 1000000000 +144 2 1000000000 +145 2 1000000000 +146 2 1000000000 +147 2 1000000000 +148 2 1000000000 +149 2 1000000000 +150 2 1000000000 +151 2 1000000000 +152 2 1000000000 +153 2 1000000000 +154 2 1000000000 +155 2 1000000000 +156 2 1000000000 +157 2 1000000000 +158 2 1000000000 +159 2 1000000000 +160 2 1000000000 +161 2 1000000000 +162 2 1000000000 +163 2 1000000000 +164 2 1000000000 +165 2 1000000000 +166 2 1000000000 +167 2 1000000000 +168 2 1000000000 +169 2 1000000000 +170 2 1000000000 +171 2 1000000000 +172 2 1000000000 +173 2 1000000000 +174 2 1000000000 +175 2 1000000000 +176 2 1000000000 +177 2 1000000000 +178 2 1000000000 +179 2 1000000000 +180 2 1000000000 +181 2 1000000000 +182 2 1000000000 +183 2 1000000000 +184 2 1000000000 +185 2 1000000000 +186 2 1000000000 +187 2 1000000000 +188 2 1000000000 +189 2 1000000000 +190 2 1000000000 +191 2 1000000000 +192 2 1000000000 +193 2 1000000000 +194 2 1000000000 +195 2 1000000000 +196 2 1000000000 +197 2 1000000000 +198 2 1000000000 +199 2 1000000000 +200 2 1000000000 +201 2 1000000000 +202 2 1000000000 +203 2 1000000000 +204 2 1000000000 +205 2 1000000000 +206 2 1000000000 +207 2 1000000000 +208 2 1000000000 +209 2 1000000000 +210 2 1000000000 +211 2 1000000000 +212 2 1000000000 +213 2 1000000000 +214 2 1000000000 +215 2 1000000000 +216 2 1000000000 +217 2 1000000000 +218 2 1000000000 +219 2 1000000000 +220 2 1000000000 +221 2 1000000000 +222 2 1000000000 +223 2 1000000000 +224 2 1000000000 +225 2 1000000000 +226 2 1000000000 +227 2 1000000000 +228 2 1000000000 +229 2 1000000000 +230 2 1000000000 +231 2 1000000000 +232 2 1000000000 +233 2 1000000000 +234 2 1000000000 +235 2 1000000000 +236 2 1000000000 +237 2 1000000000 +238 2 1000000000 +239 2 1000000000 +240 2 1000000000 +241 2 1000000000 +242 2 1000000000 +243 2 1000000000 +244 2 1000000000 +245 2 1000000000 +246 2 1000000000 +247 2 1000000000 +248 2 1000000000 +249 2 1000000000 +250 2 1000000000 +251 2 1000000000 +252 2 1000000000 +253 2 1000000000 +254 2 1000000000 +255 2 1000000000 +256 2 1000000000 +257 2 1000000000 +258 2 1000000000 +259 2 1000000000 +260 2 1000000000 +261 2 1000000000 +262 2 1000000000 +263 2 1000000000 +264 2 1000000000 +265 2 1000000000 +266 2 1000000000 +267 2 1000000000 +268 2 1000000000 +269 2 1000000000 +270 2 1000000000 +271 2 1000000000 +272 2 1000000000 +273 2 1000000000 +274 2 1000000000 +275 2 1000000000 +276 2 1000000000 +277 2 1000000000 +278 2 1000000000 +279 2 1000000000 +280 2 1000000000 +281 2 1000000000 +282 2 1000000000 +283 2 1000000000 +284 2 1000000000 +285 2 1000000000 +286 2 1000000000 +287 2 1000000000 +288 2 1000000000 +289 2 1000000000 +290 2 1000000000 +291 2 1000000000 +292 2 1000000000 +293 2 1000000000 +294 2 1000000000 +295 2 1000000000 +296 2 1000000000 +297 2 1000000000 +298 2 1000000000 +299 2 1000000000 +300 2 1000000000 +301 2 1000000000 +302 2 1000000000 +303 2 1000000000 +304 2 1000000000 +305 2 1000000000 +306 2 1000000000 +307 2 1000000000 +308 2 1000000000 +309 2 1000000000 +310 2 1000000000 +311 2 1000000000 +312 2 1000000000 +313 2 1000000000 +314 2 1000000000 +315 2 1000000000 +316 2 1000000000 +317 2 1000000000 +318 2 1000000000 +319 2 1000000000 +320 2 1000000000 +321 2 1000000000 +322 2 1000000000 +323 2 1000000000 +324 2 1000000000 +325 2 1000000000 +326 2 1000000000 +327 2 1000000000 +328 2 1000000000 +329 2 1000000000 +330 2 1000000000 +331 2 1000000000 +332 2 1000000000 +333 2 1000000000 +334 2 1000000000 +335 2 1000000000 +336 2 1000000000 +337 2 1000000000 +338 2 1000000000 +339 2 1000000000 +340 2 1000000000 +341 2 1000000000 +342 2 1000000000 +343 2 1000000000 +344 2 1000000000 +345 2 1000000000 +346 2 1000000000 +347 2 1000000000 +348 2 1000000000 +349 2 1000000000 +350 2 1000000000 +351 2 1000000000 +352 2 1000000000 +353 2 1000000000 +354 2 1000000000 +355 2 1000000000 +356 2 1000000000 +357 2 1000000000 +358 2 1000000000 +359 2 1000000000 +360 2 1000000000 +361 2 1000000000 +362 2 1000000000 +363 2 1000000000 +364 2 1000000000 +365 2 1000000000 +366 2 1000000000 +367 2 1000000000 +368 2 1000000000 +369 2 1000000000 +370 2 1000000000 +371 2 1000000000 +372 2 1000000000 +373 2 1000000000 +374 2 1000000000 +375 2 1000000000 +376 2 1000000000 +377 2 1000000000 +378 2 1000000000 +379 2 1000000000 +380 2 1000000000 +381 2 1000000000 +382 2 1000000000 +383 2 1000000000 +384 2 1000000000 +385 2 1000000000 +386 2 1000000000 +387 2 1000000000 +388 2 1000000000 +389 2 1000000000 +390 2 1000000000 +391 2 1000000000 +392 2 1000000000 +393 2 1000000000 +394 2 1000000000 +395 2 1000000000 +396 2 1000000000 +397 2 1000000000 +398 2 1000000000 +399 2 1000000000 +400 2 1000000000 +401 2 1000000000 +402 2 1000000000 +403 2 1000000000 +404 2 1000000000 +405 2 1000000000 +406 2 1000000000 +407 2 1000000000 +408 2 1000000000 +409 2 1000000000 +410 2 1000000000 +411 2 1000000000 +412 2 1000000000 +413 2 1000000000 +414 2 1000000000 +415 2 1000000000 +416 2 1000000000 +417 2 1000000000 +418 2 1000000000 +419 2 1000000000 +420 2 1000000000 +421 2 1000000000 +422 2 1000000000 +423 2 1000000000 +424 2 1000000000 +425 2 1000000000 +426 2 1000000000 +427 2 1000000000 +428 2 1000000000 +429 2 1000000000 +430 2 1000000000 +431 2 1000000000 +432 2 1000000000 +433 2 1000000000 +434 2 1000000000 +435 2 1000000000 +436 2 1000000000 +437 2 1000000000 +438 2 1000000000 +439 2 1000000000 +440 2 1000000000 +441 2 1000000000 +442 2 1000000000 +443 2 1000000000 +444 2 1000000000 +445 2 1000000000 +446 2 1000000000 +447 2 1000000000 +448 2 1000000000 +449 2 1000000000 +450 2 1000000000 +451 2 1000000000 +452 2 1000000000 +453 2 1000000000 +454 2 1000000000 +455 2 1000000000 +456 2 1000000000 +457 2 1000000000 +458 2 1000000000 +459 2 1000000000 +460 2 1000000000 +461 2 1000000000 +462 2 1000000000 +463 2 1000000000 +464 2 1000000000 +465 2 1000000000 +466 2 1000000000 +467 2 1000000000 +468 2 1000000000 +469 2 1000000000 +470 2 1000000000 +471 2 1000000000 +472 2 1000000000 +473 2 1000000000 +474 2 1000000000 +475 2 1000000000 +476 2 1000000000 +477 2 1000000000 +478 2 1000000000 +479 2 1000000000 +480 2 1000000000 +481 2 1000000000 +482 2 1000000000 +483 2 1000000000 +484 2 1000000000 +485 2 1000000000 +486 2 1000000000 +487 2 1000000000 +488 2 1000000000 +489 2 1000000000 +490 2 1000000000 +491 2 1000000000 +492 2 1000000000 +493 2 1000000000 +494 2 1000000000 +495 2 1000000000 +496 2 1000000000 +497 2 1000000000 +498 2 1000000000 +499 2 1000000000 +500 2 1000000000 +501 2 1000000000 +502 2 1000000000 +503 2 1000000000 +504 2 1000000000 +505 2 1000000000 +506 2 1000000000 +507 2 1000000000 +508 2 1000000000 +509 2 1000000000 +510 2 1000000000 +511 2 1000000000 +512 2 1000000000 +513 2 1000000000 +514 2 1000000000 +515 2 1000000000 +516 2 1000000000 +517 2 1000000000 +518 2 1000000000 +519 2 1000000000 +520 2 1000000000 +521 2 1000000000 +522 2 1000000000 +523 2 1000000000 +524 2 1000000000 +525 2 1000000000 +526 2 1000000000 +527 2 1000000000 +528 2 1000000000 +529 2 1000000000 +530 2 1000000000 +531 2 1000000000 +532 2 1000000000 +533 2 1000000000 +534 2 1000000000 +535 2 1000000000 +536 2 1000000000 +537 2 1000000000 +538 2 1000000000 +539 2 1000000000 +540 2 1000000000 +541 2 1000000000 +542 2 1000000000 +543 2 1000000000 +544 2 1000000000 +545 2 1000000000 +546 2 1000000000 +547 2 1000000000 +548 2 1000000000 +549 2 1000000000 +550 2 1000000000 +551 2 1000000000 +552 2 1000000000 +553 2 1000000000 +554 2 1000000000 +555 2 1000000000 +556 2 1000000000 +557 2 1000000000 +558 2 1000000000 +559 2 1000000000 +560 2 1000000000 +561 2 1000000000 +562 2 1000000000 +563 2 1000000000 +564 2 1000000000 +565 2 1000000000 +566 2 1000000000 +567 2 1000000000 +568 2 1000000000 +569 2 1000000000 +570 2 1000000000 +571 2 1000000000 +572 2 1000000000 +573 2 1000000000 +574 2 1000000000 +575 2 1000000000 +576 2 1000000000 +577 2 1000000000 +578 2 1000000000 +579 2 1000000000 +580 2 1000000000 +581 2 1000000000 +582 2 1000000000 +583 2 1000000000 +584 2 1000000000 +585 2 1000000000 +586 2 1000000000 +587 2 1000000000 +588 2 1000000000 +589 2 1000000000 +590 2 1000000000 +591 2 1000000000 +592 2 1000000000 +593 2 1000000000 +594 2 1000000000 +595 2 1000000000 +596 2 1000000000 +597 2 1000000000 +598 2 1000000000 +599 2 1000000000 +600 2 1000000000 +601 2 1000000000 +602 2 1000000000 +603 2 1000000000 +604 2 1000000000 +605 2 1000000000 +606 2 1000000000 +607 2 1000000000 +608 2 1000000000 +609 2 1000000000 +610 2 1000000000 +611 2 1000000000 +612 2 1000000000 +613 2 1000000000 +614 2 1000000000 +615 2 1000000000 +616 2 1000000000 +617 2 1000000000 +618 2 1000000000 +619 2 1000000000 +620 2 1000000000 +621 2 1000000000 +622 2 1000000000 +623 2 1000000000 +624 2 1000000000 +625 2 1000000000 +626 2 1000000000 +627 2 1000000000 +628 2 1000000000 +629 2 1000000000 +630 2 1000000000 +631 2 1000000000 +632 2 1000000000 +633 2 1000000000 +634 2 1000000000 +635 2 1000000000 +636 2 1000000000 +637 2 1000000000 +638 2 1000000000 +639 2 1000000000 +640 2 1000000000 +641 2 1000000000 +642 2 1000000000 +643 2 1000000000 +644 2 1000000000 +645 2 1000000000 +646 2 1000000000 +647 2 1000000000 +648 2 1000000000 +649 2 1000000000 +650 2 1000000000 +651 2 1000000000 +652 2 1000000000 +653 2 1000000000 +654 2 1000000000 +655 2 1000000000 +656 2 1000000000 +657 2 1000000000 +658 2 1000000000 +659 2 1000000000 +660 2 1000000000 +661 2 1000000000 +662 2 1000000000 +663 2 1000000000 +664 2 1000000000 +665 2 1000000000 +666 2 1000000000 +667 2 1000000000 +668 2 1000000000 +669 2 1000000000 +670 2 1000000000 +671 2 1000000000 +672 2 1000000000 +673 2 1000000000 +674 2 1000000000 +675 2 1000000000 +676 2 1000000000 +677 2 1000000000 +678 2 1000000000 +679 2 1000000000 +680 2 1000000000 +681 2 1000000000 +682 2 1000000000 +683 2 1000000000 +684 2 1000000000 +685 2 1000000000 +686 2 1000000000 +687 2 1000000000 +688 2 1000000000 +689 2 1000000000 +690 2 1000000000 +691 2 1000000000 +692 2 1000000000 +693 2 1000000000 +694 2 1000000000 +695 2 1000000000 +696 2 1000000000 +697 2 1000000000 +698 2 1000000000 +699 2 1000000000 +700 2 1000000000 +701 2 1000000000 +702 2 1000000000 +703 2 1000000000 +704 2 1000000000 +705 2 1000000000 +706 2 1000000000 +707 2 1000000000 +708 2 1000000000 +709 2 1000000000 +710 2 1000000000 +711 2 1000000000 +712 2 1000000000 +713 2 1000000000 +714 2 1000000000 +715 2 1000000000 +716 2 1000000000 +717 2 1000000000 +718 2 1000000000 +719 2 1000000000 +720 2 1000000000 +721 2 1000000000 +722 2 1000000000 +723 2 1000000000 +724 2 1000000000 +725 2 1000000000 +726 2 1000000000 +727 2 1000000000 +728 2 1000000000 +729 2 1000000000 +730 2 1000000000 +731 2 1000000000 +732 2 1000000000 +733 2 1000000000 +734 2 1000000000 +735 2 1000000000 +736 2 1000000000 +737 2 1000000000 +738 2 1000000000 +739 2 1000000000 +740 2 1000000000 +741 2 1000000000 +742 2 1000000000 +743 2 1000000000 +744 2 1000000000 +745 2 1000000000 +746 2 1000000000 +747 2 1000000000 +748 2 1000000000 +749 2 1000000000 +750 2 1000000000 +751 2 1000000000 +752 2 1000000000 +753 2 1000000000 +754 2 1000000000 +755 2 1000000000 +756 2 1000000000 +757 2 1000000000 diff --git a/test/ode_solvers_test.cpp b/test/ode_solvers_test.cpp index b8cfd9d6d..735afdef0 100644 --- a/test/ode_solvers_test.cpp +++ b/test/ode_solvers_test.cpp @@ -132,12 +132,12 @@ void check_norm_progress(Solver &solver, int num_steps, std::vector target, #else for (int i = 0; i < num_steps; i++) { solver.step(i, true); - solver.print_state(); + solver.print_state(std::cerr); } #endif NT norm = NT(0); for (unsigned int i = 0; i < solver.xs.size(); i++) { - norm += solver.xs[i].dot(solver.xs[i]); + norm += (solver.xs[i].cwiseProduct(solver.xs[i])).sum(); } norm = sqrt(norm); @@ -155,7 +155,9 @@ void check_norm_progress(Solver &solver, int num_steps, std::vector target, template void test_implicit_midpoint() { typedef Cartesian Kernel; typedef typename Kernel::Point Point; - typedef std::vector pts; + using MT = Eigen::Matrix; + using VT = Eigen::Matrix; + typedef std::vector pts; typedef GaussianFunctor::GradientFunctor grad; typedef GaussianFunctor::FunctionFunctor func; typedef GaussianFunctor::parameters func_params; @@ -172,13 +174,14 @@ template void test_implicit_midpoint() { Input input = Input(d, f, F); input.lb = -VT::Ones(d); input.ub = VT::Ones(d); - CrhmcProblem P = CrhmcProblem(input); + opts.EnableReordering=false; + opts.DynamicWeight = false; + CrhmcProblem P = CrhmcProblem(input,opts); d = P.dimension(); - Point x0 = Point(d); - Point v0 = Point::all_ones(d); + MT x0 = MT::Zero(d,1); + MT v0 = MT::Ones(d,1); pts q{x0, v0}; opts.solver_accuracy_threshold = 1e-2; - opts.DynamicWeight = false; ImplicitMidpointODESolver implicit_midpoint_solver = ImplicitMidpointODESolver(0, 0.01, q, From e767f4669c19ff019eb47aa2ecd1dba14cb424b6 Mon Sep 17 00:00:00 2001 From: Vissarion Fisikopoulos Date: Wed, 15 Nov 2023 11:57:30 +0200 Subject: [PATCH 04/44] Update CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 09827eb16..272634eb9 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at . All +reported by contacting the project team at geomscale@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. From c9fb177a163f45fa9d5bdce0d9abf0dba73740d1 Mon Sep 17 00:00:00 2001 From: Vissarion Fisikopoulos Date: Fri, 9 Feb 2024 15:35:47 +0200 Subject: [PATCH 05/44] Add define lp_solve guards to orderpolytope --- include/convex_bodies/orderpolytope.h | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/include/convex_bodies/orderpolytope.h b/include/convex_bodies/orderpolytope.h index 66854234b..2df5c6619 100644 --- a/include/convex_bodies/orderpolytope.h +++ b/include/convex_bodies/orderpolytope.h @@ -208,7 +208,32 @@ class OrderPolytope { std::pair ComputeInnerBall() { normalize(); - return ComputeChebychevBall(_A, b); + std::pair inner_ball; + #ifndef DISABLE_LPSOLVE + inner_ball = ComputeChebychevBall(_A, b); // use lpsolve library + #else + + if (inner_ball.second <= NT(0)) { + + NT const tol = 0.00000001; + std::tuple inner_ball = max_inscribed_ball(_A, b, 150, tol); + + // check if the solution is feasible + if (is_in(Point(std::get<0>(inner_ball))) == 0 || std::get<1>(inner_ball) < NT(0) || + std::isnan(std::get<1>(inner_ball)) || std::isinf(std::get<1>(inner_ball)) || + !std::get<2>(inner_ball) || is_inner_point_nan_inf(std::get<0>(inner_ball))) + { + inner_ball.second = -1.0; + } else + { + inner_ball.first = Point(std::get<0>(inner_ball)); + inner_ball.second = std::get<1>(inner_ball); + } + } + #endif + + return inner_ball; + } From f91d4a98c7e75bb4c9c6e39bce6a03d0f434df4e Mon Sep 17 00:00:00 2001 From: Vissarion Fisikopoulos Date: Fri, 9 Feb 2024 16:27:30 +0200 Subject: [PATCH 06/44] Rename LinearProgramFunctor to ExponentialFunctor and add inverse variance parameter --- include/ode_solvers/oracle_functors.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/ode_solvers/oracle_functors.hpp b/include/ode_solvers/oracle_functors.hpp index 3aea450b2..35fc8887b 100644 --- a/include/ode_solvers/oracle_functors.hpp +++ b/include/ode_solvers/oracle_functors.hpp @@ -243,7 +243,7 @@ struct IsotropicLinearFunctor { }; -struct LinearProgramFunctor { +struct ExponentialFunctor { // Sample from linear program c^T x (exponential density) template < @@ -256,8 +256,10 @@ struct LinearProgramFunctor { NT m; // Strong convexity constant NT kappa; // Condition number Point c; // Coefficients of LP objective + NT a; // Inverse variance - parameters(Point c_) : order(2), L(1), m(1), kappa(1), c(c_) {}; + parameters(Point c_) : order(2), L(1), m(1), kappa(1), c(c_), a(1.0) {}; + parameters(Point c_, NT a_) : order(2), L(1), m(1), kappa(1), c(c_), a(a_) {}; }; @@ -277,7 +279,7 @@ struct LinearProgramFunctor { Point operator() (unsigned int const& i, pts const& xs, NT const& t) const { if (i == params.order - 1) { Point y(params.c); - return (-1.0) * y; + return (-params.a) * y; } else { return xs[i + 1]; // returns derivative } @@ -298,7 +300,7 @@ struct LinearProgramFunctor { // The index i represents the state vector index NT operator() (Point const& x) const { - return x.dot(params.c); + return params.a * x.dot(params.c); } }; From b15c9d858b984ed7bd2c853842d887e5d050696e Mon Sep 17 00:00:00 2001 From: vfisikop Date: Wed, 14 Feb 2024 16:18:33 +0200 Subject: [PATCH 07/44] Rename LinearProgramFunctor to ExponentialFunctor, add inverse variance parameter, add define lp_solve guards to orderpolytope --- include/convex_bodies/orderpolytope.h | 27 ++++++++++++++++++++++++- include/ode_solvers/oracle_functors.hpp | 10 +++++---- test/logconcave_sampling_test.cpp | 14 ++++++------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/include/convex_bodies/orderpolytope.h b/include/convex_bodies/orderpolytope.h index 66854234b..2df5c6619 100644 --- a/include/convex_bodies/orderpolytope.h +++ b/include/convex_bodies/orderpolytope.h @@ -208,7 +208,32 @@ class OrderPolytope { std::pair ComputeInnerBall() { normalize(); - return ComputeChebychevBall(_A, b); + std::pair inner_ball; + #ifndef DISABLE_LPSOLVE + inner_ball = ComputeChebychevBall(_A, b); // use lpsolve library + #else + + if (inner_ball.second <= NT(0)) { + + NT const tol = 0.00000001; + std::tuple inner_ball = max_inscribed_ball(_A, b, 150, tol); + + // check if the solution is feasible + if (is_in(Point(std::get<0>(inner_ball))) == 0 || std::get<1>(inner_ball) < NT(0) || + std::isnan(std::get<1>(inner_ball)) || std::isinf(std::get<1>(inner_ball)) || + !std::get<2>(inner_ball) || is_inner_point_nan_inf(std::get<0>(inner_ball))) + { + inner_ball.second = -1.0; + } else + { + inner_ball.first = Point(std::get<0>(inner_ball)); + inner_ball.second = std::get<1>(inner_ball); + } + } + #endif + + return inner_ball; + } diff --git a/include/ode_solvers/oracle_functors.hpp b/include/ode_solvers/oracle_functors.hpp index 3aea450b2..35fc8887b 100644 --- a/include/ode_solvers/oracle_functors.hpp +++ b/include/ode_solvers/oracle_functors.hpp @@ -243,7 +243,7 @@ struct IsotropicLinearFunctor { }; -struct LinearProgramFunctor { +struct ExponentialFunctor { // Sample from linear program c^T x (exponential density) template < @@ -256,8 +256,10 @@ struct LinearProgramFunctor { NT m; // Strong convexity constant NT kappa; // Condition number Point c; // Coefficients of LP objective + NT a; // Inverse variance - parameters(Point c_) : order(2), L(1), m(1), kappa(1), c(c_) {}; + parameters(Point c_) : order(2), L(1), m(1), kappa(1), c(c_), a(1.0) {}; + parameters(Point c_, NT a_) : order(2), L(1), m(1), kappa(1), c(c_), a(a_) {}; }; @@ -277,7 +279,7 @@ struct LinearProgramFunctor { Point operator() (unsigned int const& i, pts const& xs, NT const& t) const { if (i == params.order - 1) { Point y(params.c); - return (-1.0) * y; + return (-params.a) * y; } else { return xs[i + 1]; // returns derivative } @@ -298,7 +300,7 @@ struct LinearProgramFunctor { // The index i represents the state vector index NT operator() (Point const& x) const { - return x.dot(params.c); + return params.a * x.dot(params.c); } }; diff --git a/test/logconcave_sampling_test.cpp b/test/logconcave_sampling_test.cpp index 8e53f489b..1f67b2851 100644 --- a/test/logconcave_sampling_test.cpp +++ b/test/logconcave_sampling_test.cpp @@ -334,12 +334,12 @@ void benchmark_nuts_hmc(bool truncated) { bool automatic_burnin = false; std::chrono::time_point start, stop; - for (unsigned int dim = dim_min; dim <= dim_max; dim+=10) + for (unsigned int dim = dim_min; dim <= dim_max; dim+=10) { MT samples(dim, n_samples); Point x0(dim); NutsHamiltonianMonteCarloWalk::parameters hmc_params(F, dim); - if (truncated) + if (truncated) { Hpolytope P = generate_cube(dim, false); @@ -784,8 +784,8 @@ void benchmark_polytope_linear_program_optimization( typedef std::vector pts; typedef boost::mt19937 RNGType; typedef BoostRandomNumberGenerator RandomNumberGenerator; - typedef LinearProgramFunctor::GradientFunctor NegativeGradientFunctor; - typedef LinearProgramFunctor::FunctionFunctor NegativeLogprobFunctor; + typedef ExponentialFunctor::GradientFunctor NegativeGradientFunctor; + typedef ExponentialFunctor::FunctionFunctor NegativeLogprobFunctor; typedef OptimizationFunctor::GradientFunctor NegativeGradientOptimizationFunctor; typedef OptimizationFunctor::FunctionFunctor lp_params(coeffs); + ExponentialFunctor::parameters lp_params(coeffs); NegativeGradientFunctor F_lp(lp_params); NegativeLogprobFunctor f_lp(lp_params); @@ -1116,8 +1116,8 @@ void call_test_exp_sampling() { typedef HPolytope Hpolytope; std::string name; std::vector> polytopes; - - + + if (exists_check("metabolic_full_dim/e_coli_biomass_function.txt") && exists_check("metabolic_full_dim/polytope_e_coli.ine")){ Point biomass_function_e_coli = load_biomass_function("metabolic_full_dim/e_coli_biomass_function.txt"); polytopes.push_back(std::make_tuple(read_polytope("metabolic_full_dim/polytope_e_coli.ine"), biomass_function_e_coli, "e_coli", true)); From 1ae6a45f54260db9532f6d48b9a8fa90577462dc Mon Sep 17 00:00:00 2001 From: vfisikop Date: Wed, 14 Feb 2024 16:19:03 +0200 Subject: [PATCH 08/44] Remove C11 flags from cran --- R-proj/src/Makevars | 2 -- R-proj/src/Makevars.win | 1 - cran_gen/Makevars | 1 - cran_gen/Makevars.win | 1 - 4 files changed, 5 deletions(-) diff --git a/R-proj/src/Makevars b/R-proj/src/Makevars index b642e2fbe..ea3607acf 100644 --- a/R-proj/src/Makevars +++ b/R-proj/src/Makevars @@ -2,8 +2,6 @@ PKG_CPPFLAGS= -I../../external/boost -I../../external/LPsolve_src/run_headers -I PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES -CXX_STD = CXX11 - PKG_LIBS=-LRproj_externals/lp_solve -llp_solve -L../../external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) $(SHLIB): Rproj_externals/lp_solve/liblp_solve.a ../../external/PackedCSparse/qd/libqd.a diff --git a/R-proj/src/Makevars.win b/R-proj/src/Makevars.win index 17d28e206..83ed4e0c6 100644 --- a/R-proj/src/Makevars.win +++ b/R-proj/src/Makevars.win @@ -1,6 +1,5 @@ PKG_CPPFLAGS=-I../../external/boost -I../../external/LPsolve_src/run_headers -I../../external/minimum_ellipsoid -I../../include -I../../include/convex_bodies/spectrahedra PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES -CXX_STD = CXX11 PKG_LIBS=-LRproj_externals/lp_solve -llp_solve -L../../external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) diff --git a/cran_gen/Makevars b/cran_gen/Makevars index 28c42dcad..8194d4c8a 100644 --- a/cran_gen/Makevars +++ b/cran_gen/Makevars @@ -1,6 +1,5 @@ PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimum_ellipsoid -Iinclude -Iinclude/convex_bodies/spectrahedra PKG_CXXFLAGS= -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES -CXX_STD = CXX11 PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) diff --git a/cran_gen/Makevars.win b/cran_gen/Makevars.win index b93299131..e4f79d991 100644 --- a/cran_gen/Makevars.win +++ b/cran_gen/Makevars.win @@ -1,6 +1,5 @@ PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimum_ellipsoid -Iinclude -Iinclude/convex_bodies/spectrahedra PKG_CXXFLAGS= -lm -ldl -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES -CXX_STD = CXX11 PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) From 432b9679e8359ca706c7b8517ca564b047c4272d Mon Sep 17 00:00:00 2001 From: vfisikop Date: Thu, 15 Feb 2024 16:22:25 +0200 Subject: [PATCH 09/44] Build only with lp-solve source code, no need for liblpsolve55.so files --- examples/hpolytope-volume/CMakeLists.txt | 85 ++++++++++-------------- external/cmake-files/LPSolve.cmake | 43 +++++++++++- 2 files changed, 76 insertions(+), 52 deletions(-) diff --git a/examples/hpolytope-volume/CMakeLists.txt b/examples/hpolytope-volume/CMakeLists.txt index 1d923f238..eff88889a 100644 --- a/examples/hpolytope-volume/CMakeLists.txt +++ b/examples/hpolytope-volume/CMakeLists.txt @@ -6,7 +6,6 @@ project( VolEsti ) - CMAKE_MINIMUM_REQUIRED(VERSION 3.11) set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) @@ -15,11 +14,10 @@ if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) - -option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON) -option(BUILTIN_EIGEN "Use eigen from ../../external" OFF) +set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") +option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON) if(DISABLE_NLP_ORACLES) add_definitions(-DDISABLE_NLP_ORACLES) else() @@ -53,60 +51,47 @@ else() message(STATUS "Library fftw3 found:" ${FFTW3}) endif(NOT IFOPT) - endif(DISABLE_NLP_ORACLES) +# eigen +option(BUILTIN_EIGEN "Use eigen from ../../external" OFF) include("../../external/cmake-files/Eigen.cmake") GetEigen() +if (${CMAKE_VERSION} VERSION_LESS "3.12.0") + add_compile_options(-D "EIGEN_NO_DEBUG") +else () + add_compile_definitions("EIGEN_NO_DEBUG") +endif () + +# boost include("../../external/cmake-files/Boost.cmake") GetBoost() +# lp_solve include("../../external/cmake-files/LPSolve.cmake") GetLPSolve() -# Find lpsolve library -find_library(LP_SOLVE NAMES liblpsolve55.so PATHS /usr/lib/lp_solve) - -if (NOT LP_SOLVE) - message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") -else () - message(STATUS "Library lp_solve found: ${LP_SOLVE}") - - set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - - include_directories (BEFORE ../../external) - include_directories (BEFORE ../../external/minimum_ellipsoid) - include_directories (BEFORE ../../include/generators) - include_directories (BEFORE ../../include/volume) - include_directories (BEFORE ../../include) - include_directories (BEFORE ../../include/convex_bodies) - include_directories (BEFORE ../../include/random_walks) - include_directories (BEFORE ../../include/annealing) - include_directories (BEFORE ../../include/ode_solvers) - include_directories (BEFORE ../../include/root_finders) - include_directories (BEFORE ../../include/samplers) - include_directories (BEFORE ../../include/lp_oracles) - include_directories (BEFORE ../../include/nlp_oracles) - include_directories (BEFORE ../../include/misc) - include_directories (BEFORE ../../include/optimization) - - # for Eigen - if (${CMAKE_VERSION} VERSION_LESS "3.12.0") - add_compile_options(-D "EIGEN_NO_DEBUG") - else () - add_compile_definitions("EIGEN_NO_DEBUG") - endif () - - - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard - add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler - #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") - - add_executable (hpolytopeVolume hpolytopeVolume.cpp) - TARGET_LINK_LIBRARIES(hpolytopeVolume ${LP_SOLVE}) - -endif() +include_directories (BEFORE ../../external) +include_directories (BEFORE ../../external/minimum_ellipsoid) +include_directories (BEFORE ../../include/generators) +include_directories (BEFORE ../../include/volume) +include_directories (BEFORE ../../include) +include_directories (BEFORE ../../include/convex_bodies) +include_directories (BEFORE ../../include/random_walks) +include_directories (BEFORE ../../include/annealing) +include_directories (BEFORE ../../include/ode_solvers) +include_directories (BEFORE ../../include/root_finders) +include_directories (BEFORE ../../include/samplers) +include_directories (BEFORE ../../include/lp_oracles) +include_directories (BEFORE ../../include/nlp_oracles) +include_directories (BEFORE ../../include/misc) +include_directories (BEFORE ../../include/optimization) + +add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") + +add_executable(hpolytopeVolume hpolytopeVolume.cpp) +target_link_libraries(hpolytopeVolume PUBLIC lp_solve) diff --git a/external/cmake-files/LPSolve.cmake b/external/cmake-files/LPSolve.cmake index c5a173837..56bf2ebc2 100644 --- a/external/cmake-files/LPSolve.cmake +++ b/external/cmake-files/LPSolve.cmake @@ -26,7 +26,46 @@ function(GetLPSolve) message(STATUS "lp_solve library found: ${LP_SOLVE_DIR}") endif() - - include_directories(${LP_SOLVE_DIR}) + + #to disable interactive mode of lp_solve lex parser + add_compile_options(-DYY_NEVER_INTERACTIVE) + + add_compile_options(-DLoadInverseLib=0) + add_compile_options(-DLoadLanguageLib=0) + add_compile_definitions(RoleIsExternalInvEngine) + add_compile_definitions(INVERSE_ACTIVE=3) + + include_directories (BEFORE ${LP_SOLVE_DIR}) + include_directories (BEFORE ${LP_SOLVE_DIR}/bfp) + include_directories (BEFORE ${LP_SOLVE_DIR}/bfp/bfp_LUSOL) + include_directories (BEFORE ${LP_SOLVE_DIR}/bfp/bfp_LUSOL/LUSOL) + include_directories (BEFORE ${LP_SOLVE_DIR}/colamd) + include_directories (BEFORE ${LP_SOLVE_DIR}/shared) + + add_library (lp_solve + ${LP_SOLVE_DIR}/bfp/bfp_LUSOL/lp_LUSOL.c + ${LP_SOLVE_DIR}/bfp/bfp_LUSOL/LUSOL/lusol.c + ${LP_SOLVE_DIR}/colamd/colamd.c + ${LP_SOLVE_DIR}/ini.c + ${LP_SOLVE_DIR}/shared/commonlib.c + ${LP_SOLVE_DIR}/shared/mmio.c + ${LP_SOLVE_DIR}/shared/myblas.c + ${LP_SOLVE_DIR}/lp_crash.c + ${LP_SOLVE_DIR}/lp_Hash.c + ${LP_SOLVE_DIR}/lp_lib.c + ${LP_SOLVE_DIR}/lp_matrix.c + ${LP_SOLVE_DIR}/lp_MDO.c + ${LP_SOLVE_DIR}/lp_mipbb.c + ${LP_SOLVE_DIR}/lp_MPS.c + ${LP_SOLVE_DIR}/lp_params.c + ${LP_SOLVE_DIR}/lp_presolve.c + ${LP_SOLVE_DIR}/lp_price.c + ${LP_SOLVE_DIR}/lp_pricePSE.c + ${LP_SOLVE_DIR}/lp_report.c + ${LP_SOLVE_DIR}/lp_scale.c + ${LP_SOLVE_DIR}/lp_simplex.c + ${LP_SOLVE_DIR}/lp_SOS.c + ${LP_SOLVE_DIR}/lp_utils.c + ${LP_SOLVE_DIR}/lp_wlp.c) endfunction() From 7da53c4e2b1657790f04439c4c42e7d4969d07ff Mon Sep 17 00:00:00 2001 From: vfisikop Date: Thu, 15 Feb 2024 17:10:32 +0200 Subject: [PATCH 10/44] Update tests and some examples to buid with lp solve from sources --- .github/workflows/cmake-clang.yml | 2 +- .github/workflows/cmake-gcc.yml | 2 +- examples/crhmc_prepare/CMakeLists.txt | 76 ++-- examples/vpolytope-volume/CMakeLists.txt | 75 ++-- test/CMakeLists.txt | 518 +++++++++++------------ 5 files changed, 321 insertions(+), 352 deletions(-) diff --git a/.github/workflows/cmake-clang.yml b/.github/workflows/cmake-clang.yml index caa22fff2..520b33159 100644 --- a/.github/workflows/cmake-clang.yml +++ b/.github/workflows/cmake-clang.yml @@ -30,7 +30,7 @@ jobs: steps: - uses: actions/checkout@v1 - run: sudo apt-get update || true; - sudo apt-get install ${{ matrix.config.compiler_pkg }} lp-solve; + sudo apt-get install ${{ matrix.config.compiler_pkg }} lp-solve libopenblas-dev; rm -rf build; mkdir build; cd build; diff --git a/.github/workflows/cmake-gcc.yml b/.github/workflows/cmake-gcc.yml index e42805492..f18e358ac 100644 --- a/.github/workflows/cmake-gcc.yml +++ b/.github/workflows/cmake-gcc.yml @@ -29,7 +29,7 @@ jobs: steps: - uses: actions/checkout@v1 - run: sudo apt-get update || true; - sudo apt-get install ${{ matrix.config.compiler }} lp-solve; + sudo apt-get install ${{ matrix.config.compiler }} lp-solve libopenblas-dev; rm -rf build; mkdir build; cd build; diff --git a/examples/crhmc_prepare/CMakeLists.txt b/examples/crhmc_prepare/CMakeLists.txt index 35c31e9e1..3575c4a46 100644 --- a/examples/crhmc_prepare/CMakeLists.txt +++ b/examples/crhmc_prepare/CMakeLists.txt @@ -76,52 +76,42 @@ GetLPSolve() include("../../external/cmake-files/QD.cmake") GetQD() -# Find lpsolve library -find_library(LP_SOLVE NAMES liblpsolve55.so PATHS /usr/lib/lp_solve) - -if (NOT LP_SOLVE) - message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") -else () - - message(STATUS "Library lp_solve found: ${LP_SOLVE}") - set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - - if (USE_MKL) - find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) - find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) - find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) - find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) - - include_directories (BEFORE ${MKLROOT}/include) - set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) - set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") - add_definitions(-DEIGEN_USE_MKL_ALL) - else() - set(MKL_LINK "") - endif(USE_MKL) +set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") + +if (USE_MKL) + find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) + find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) + find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) + find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) + + include_directories (BEFORE ${MKLROOT}/include) + set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) + set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") + add_definitions(-DEIGEN_USE_MKL_ALL) +else() + set(MKL_LINK "") +endif(USE_MKL) - include_directories (BEFORE ../../external) - include_directories (BEFORE ../../external/minimum_ellipsoid) - include_directories (BEFORE ../../include/) +include_directories (BEFORE ../../external) +include_directories (BEFORE ../../external/minimum_ellipsoid) +include_directories (BEFORE ../../include/) - # for Eigen - if (${CMAKE_VERSION} VERSION_LESS "3.12.0") - add_compile_options(-D "EIGEN_NO_DEBUG") - else () - add_compile_definitions("EIGEN_NO_DEBUG") - endif () +# for Eigen +if (${CMAKE_VERSION} VERSION_LESS "3.12.0") + add_compile_options(-D "EIGEN_NO_DEBUG") +else () + add_compile_definitions("EIGEN_NO_DEBUG") +endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard - #add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger - set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") - add_definitions(${CMAKE_CXX_FLAGS} "-O3 " ${ADDITIONAL_FLAGS}) # optimization of the compiler - #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") +#add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger +set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") +add_definitions(${CMAKE_CXX_FLAGS} "-O3 " ${ADDITIONAL_FLAGS}) # optimization of the compiler +#add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") - add_executable (crhmc_prepare crhmc_prepare.cpp ) - TARGET_LINK_LIBRARIES(crhmc_prepare QD_LIB ${MKL_LINK} ${LP_SOLVE}) +add_executable (crhmc_prepare crhmc_prepare.cpp ) +TARGET_LINK_LIBRARIES(crhmc_prepare QD_LIB ${MKL_LINK}) -endif() diff --git a/examples/vpolytope-volume/CMakeLists.txt b/examples/vpolytope-volume/CMakeLists.txt index 5ffd4784b..e1a0c2576 100644 --- a/examples/vpolytope-volume/CMakeLists.txt +++ b/examples/vpolytope-volume/CMakeLists.txt @@ -65,48 +65,37 @@ GetBoost() include("../../external/cmake-files/LPSolve.cmake") GetLPSolve() -# Find lpsolve library -find_library(LP_SOLVE NAMES liblpsolve55.so PATHS /usr/lib/lp_solve) -if (NOT LP_SOLVE) - message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") +set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") + +include_directories (BEFORE ../../external) +include_directories (BEFORE ../../external/minimum_ellipsoid) +include_directories (BEFORE ../../include/generators) +include_directories (BEFORE ../../include/volume) +include_directories (BEFORE ../../include) +include_directories (BEFORE ../../include/convex_bodies) +include_directories (BEFORE ../../include/random_walks) +include_directories (BEFORE ../../include/annealing) +include_directories (BEFORE ../../include/ode_solvers) +include_directories (BEFORE ../../include/root_finders) +include_directories (BEFORE ../../include/samplers) +include_directories (BEFORE ../../include/lp_oracles) +include_directories (BEFORE ../../include/nlp_oracles) +include_directories (BEFORE ../../include/misc) +include_directories (BEFORE ../../include/optimization) + +# for Eigen +if (${CMAKE_VERSION} VERSION_LESS "3.12.0") + add_compile_options(-D "EIGEN_NO_DEBUG") else () - message(STATUS "Library lp_solve found: ${LP_SOLVE}") - - set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - - include_directories (BEFORE ../../external) - include_directories (BEFORE ../../external/minimum_ellipsoid) - include_directories (BEFORE ../../include/generators) - include_directories (BEFORE ../../include/volume) - include_directories (BEFORE ../../include) - include_directories (BEFORE ../../include/convex_bodies) - include_directories (BEFORE ../../include/random_walks) - include_directories (BEFORE ../../include/annealing) - include_directories (BEFORE ../../include/ode_solvers) - include_directories (BEFORE ../../include/root_finders) - include_directories (BEFORE ../../include/samplers) - include_directories (BEFORE ../../include/lp_oracles) - include_directories (BEFORE ../../include/nlp_oracles) - include_directories (BEFORE ../../include/misc) - include_directories (BEFORE ../../include/optimization) - - # for Eigen - if (${CMAKE_VERSION} VERSION_LESS "3.12.0") - add_compile_options(-D "EIGEN_NO_DEBUG") - else () - add_compile_definitions("EIGEN_NO_DEBUG") - endif () - - - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard - add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler - #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") - - add_executable (vpolytopevolume vpolytopevolume.cpp) - TARGET_LINK_LIBRARIES(vpolytopevolume ${LP_SOLVE}) - -endif() + add_compile_definitions("EIGEN_NO_DEBUG") +endif () + +add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler +#add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") + +add_executable (vpolytopevolume vpolytopevolume.cpp) +TARGET_LINK_LIBRARIES(vpolytopevolume lp_solve) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3adbe4681..a009795cc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -26,7 +26,7 @@ endif() option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON) option(BUILTIN_EIGEN "Use eigen from ../external" OFF) -option(USE_MKL "Use MKL library to build eigen" ON) +option(USE_MKL "Use MKL library to build eigen" OFF) if(DISABLE_NLP_ORACLES) add_definitions(-DDISABLE_NLP_ORACLES) @@ -136,271 +136,261 @@ if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") endif() endif(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") -find_library(LP_SOLVE NAMES liblpsolve55.so liblpsolve55.dylib PATHS /usr/lib/lp_solve /usr/local/lib) -if (NOT LP_SOLVE) +set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") +if (USE_MKL) + find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) + find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) + find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) + find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) + include_directories (BEFORE ${MKLROOT}/include) + set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) + set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") + add_definitions(-DEIGEN_USE_MKL_ALL) +else() + set(MKL_LINK "") +endif(USE_MKL) + +include_directories (BEFORE ../external) +include_directories (BEFORE ../external/minimum_ellipsoid) +include_directories (BEFORE ../include/generators) +include_directories (BEFORE ../include/volume) +include_directories (BEFORE ../include) +include_directories (BEFORE ../include/integration) +include_directories (BEFORE ../include/convex_bodies) +include_directories (BEFORE ../include/convex_bodies/spectrahedra) +include_directories (BEFORE ../include/annealing) +include_directories (BEFORE ../include/ode_solvers) +include_directories (BEFORE ../include/root_finders) +include_directories (BEFORE ../include/samplers) +include_directories (BEFORE ../include/lp_oracles) +include_directories (BEFORE ../include/nlp_oracles) +include_directories (BEFORE ../include/misc) +include_directories (BEFORE ../test) + +#for Eigen +if (${CMAKE_VERSION} VERSION_LESS "3.12.0") + add_compile_options(-D "EIGEN_NO_DEBUG") else () + add_compile_definitions("EIGEN_NO_DEBUG") +endif () + +add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger +#add_definitions(${CMAKE_CXX_FLAGS} "-Wint-in-bool-context") +#add_definitions(${CMAKE_CXX_FLAGS} "-Wall") + +add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler +#add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") +add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") +add_definitions(${CMAKE_CXX_FLAGS} "-DMKL_ILP64") +#add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgslcblas") +#add_definitions( "-O3 -lgsl -lm -ldl -lgslcblas" ) + +add_executable (new_volume_example new_volume_example.cpp) +add_executable (benchmarks_sob benchmarks_sob.cpp) +add_executable (benchmarks_cg benchmarks_cg.cpp) +add_executable (benchmarks_cb benchmarks_cb.cpp) + +add_library(test_main OBJECT test_main.cpp) + +add_executable (mcmc_diagnostics_test mcmc_diagnostics_test.cpp $) +add_test(NAME test_psrf COMMAND mcmc_diagnostics_test -tc=psrf) +add_test(NAME test_univariate_psrf COMMAND mcmc_diagnostics_test -tc=univariate_psrf) +add_test(NAME test_interval_psrf COMMAND mcmc_diagnostics_test -tc=interval_psrf) +add_test(NAME test_ess COMMAND mcmc_diagnostics_test -tc=ess) +add_test(NAME test_geweke COMMAND mcmc_diagnostics_test -tc=geweke) +add_test(NAME test_raftery COMMAND mcmc_diagnostics_test -tc=raftery) + +add_executable (sampling_test sampling_test.cpp $) +add_test(NAME test_dikin COMMAND sampling_test -tc=dikin) +add_test(NAME test_john COMMAND sampling_test -tc=john) +add_test(NAME test_vaidya COMMAND sampling_test -tc=vaidya) +add_test(NAME test_brdhr COMMAND sampling_test -tc=brdhr) +add_test(NAME test_bcdhr COMMAND sampling_test -tc=bcdhr) +add_test(NAME test_grdhr COMMAND sampling_test -tc=grdhr) +add_test(NAME test_gbaw COMMAND sampling_test -tc=gbaw) +add_test(NAME test_ghmc COMMAND sampling_test -tc=ghmc) + +add_executable (mmcs_test mmcs_test.cpp $) +add_test(NAME test_mmcs COMMAND mmcs_test -tc=mmcs) + +add_executable (ode_solvers_test ode_solvers_test.cpp $) +add_test(NAME ode_solvers_test_first_order + COMMAND ode_solvers_test -tc=first_order) +add_test(NAME ode_solvers_test_second_order + COMMAND ode_solvers_test -tc=second_order) + +add_executable (root_finders_test root_finders_test.cpp $) +add_test(NAME root_finders_test_root_finders + COMMAND root_finders_test -tc=root_finders) + +#add_executable (benchmarks_crhmc benchmarks_crhmc.cpp ) +#add_executable (benchmarks_crhmc_sampling benchmarks_crhmc_sampling.cpp ) + +add_executable (crhmc_polytope_preparation_test crhmc_polytope_preparation_test.cpp $) +add_test(NAME crhmc_polytope_test_preparation + COMMAND crhmc_polytope_preparation_test -tc=test_preparation_crhmc) +add_test(NAME crhmc_test_fixed_vars + COMMAND crhmc_polytope_preparation_test -tc=test_fixed_vars_crhmc) +add_test(NAME crhmc_test_dep_vars + COMMAND crhmc_polytope_preparation_test -tc=test_dep_vars_crhmc) +add_test(NAME crhmc_test_center_computation + COMMAND crhmc_polytope_preparation_test -tc=test_center_computation) + +add_executable (boundary_oracles_test boundary_oracles_test.cpp $) +add_test(NAME boundary_oracles_test_h_poly_oracles + COMMAND boundary_oracles_test -tc=h_poly_oracles) + +add_executable (volume_sob_hpolytope volume_sob_hpolytope.cpp $) +add_test(NAME volume_sob_hpolytope_cube COMMAND volume_sob_hpolytope -tc=cube) +add_test(NAME volume_sob_hpolytope_cross COMMAND volume_sob_hpolytope -tc=cross) +add_test(NAME volume_sob_hpolytope_birkhoff COMMAND volume_sob_hpolytope -tc=birk) +add_test(NAME volume_sob_hpolytope_prod_simplex COMMAND volume_sob_hpolytope -tc=prod_simplex) +add_test(NAME volume_sob_hpolytope_simplex COMMAND volume_sob_hpolytope -tc=simplex) +add_test(NAME volume_sob_hpolytope_skinny_cube COMMAND volume_sob_hpolytope -tc=skinny_cube) +add_test(NAME volume_sob_hpolytope_cube_overflow COMMAND volume_sob_hpolytope -tc=cube_overflow) +set_property(TEST volume_sob_hpolytope_cube_overflow PROPERTY TIMEOUT 1) + +add_executable (volume_sob_vpolytope volume_sob_vpolytope.cpp $) +add_test(NAME volume_sob_vpolytope_cube COMMAND volume_sob_vpolytope -tc=cube) +add_test(NAME volume_sob_vpolytope_cross COMMAND volume_sob_vpolytope -tc=cross) +add_test(NAME volume_sob_vpolytope_simplex COMMAND volume_sob_vpolytope -tc=simplex) + +add_executable (volume_cg_hpolytope volume_cg_hpolytope.cpp $) +add_test(NAME volume_cg_hpolytope_cube COMMAND volume_cg_hpolytope -tc=cube) +add_test(NAME volume_cg_hpolytope_cross COMMAND volume_cg_hpolytope -tc=cross) +add_test(NAME volume_cg_hpolytope_birkhoff COMMAND volume_cg_hpolytope -tc=birk) +add_test(NAME volume_cg_hpolytope_prod_simplex COMMAND volume_cg_hpolytope -tc=prod_simplex) +add_test(NAME volume_cg_hpolytope_simplex COMMAND volume_cg_hpolytope -tc=simplex) +add_test(NAME volume_cg_hpolytope_skinny_cube COMMAND volume_cg_hpolytope -tc=skinny_cube) + +add_executable (volume_cg_vpolytope volume_cg_vpolytope.cpp $) +add_test(NAME volume_cg_vpolytope_cube COMMAND volume_cg_vpolytope -tc=cube) +add_test(NAME volume_cg_vpolytope_cross COMMAND volume_cg_vpolytope -tc=cross) +add_test(NAME volume_cg_vpolytope_simplex COMMAND volume_cg_vpolytope -tc=simplex) + +add_executable (volume_cb_hpolytope volume_cb_hpolytope.cpp $) +add_test(NAME volume_cb_hpolytope_cube COMMAND volume_cb_hpolytope -tc=cube) +add_test(NAME volume_cb_hpolytope_cross COMMAND volume_cb_hpolytope -tc=cross) +add_test(NAME volume_cb_hpolytope_birkhoff COMMAND volume_cb_hpolytope -tc=birk) +add_test(NAME volume_cb_hpolytope_prod_simplex COMMAND volume_cb_hpolytope -tc=prod_simplex) +add_test(NAME volume_cb_hpolytope_simplex COMMAND volume_cb_hpolytope -tc=simplex) +add_test(NAME volume_cb_hpolytope_skinny_cube COMMAND volume_cb_hpolytope -tc=skinny_cube) + +add_executable (volume_cb_vpolytope volume_cb_vpolytope.cpp $) +add_test(NAME volume_cb_vpolytope_cube COMMAND volume_cb_vpolytope -tc=cube) +add_test(NAME volume_cb_vpolytope_cross COMMAND volume_cb_vpolytope -tc=cross) +add_test(NAME volume_cb_vpolytope_simplex COMMAND volume_cb_vpolytope -tc=simplex) + +add_executable (volume_cb_zonotopes volume_cb_zonotopes.cpp $) +add_test(NAME volume_cb_zonotopes_uniform_zonotopes + COMMAND volume_cb_zonotopes -tc=uniform_zonotopes) + +add_executable (volume_cb_vpoly_intersection_vpoly volume_cb_vpoly_intersection_vpoly.cpp $) +add_test(NAME volume_cb_vpoly_intersection_vpoly_random_vpoly_sphere + COMMAND volume_cb_vpoly_intersection_vpoly -tc=random_vpoly_sphere) + +add_executable (new_rounding_test new_rounding_test.cpp $) +add_test(NAME test_round_min_ellipsoid + COMMAND new_rounding_test -tc=round_min_ellipsoid) +add_test(NAME test_round_max_ellipsoid + COMMAND new_rounding_test -tc=round_max_ellipsoid) +add_test(NAME test_round_svd + COMMAND new_rounding_test -tc=round_svd) + +add_executable (logconcave_sampling_test logconcave_sampling_test.cpp $) +add_test(NAME logconcave_sampling_test_hmc + COMMAND logconcave_sampling_test -tc=hmc) +add_test(NAME logconcave_sampling_test_uld + COMMAND logconcave_sampling_test -tc=uld) +add_test(NAME logconcave_sampling_test_exponential_biomass_sampling + COMMAND logconcave_sampling_test -tc=exponential_biomass_sampling) +add_test(NAME logconcave_sampling_test_nuts_hmc_truncated + COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc_truncated) +add_test(NAME logconcave_sampling_test_nuts_hmc + COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc) + + + +add_executable (crhmc_sampling_test crhmc_sampling_test.cpp $) +add_test(NAME crhmc_sampling_test_crhmc + COMMAND crhmc_sampling_test -tc=crhmc) +add_test(NAME crhmc_test_polytope_sampling + COMMAND crhmc_sampling_test -tc=test_polytope_sampling_crhmc) +add_test(NAME crhmc_test_sparse_sampling + COMMAND crhmc_sampling_test -tc=test_sampling_sparse_problem) +add_executable (simple_mc_integration simple_mc_integration.cpp $) +add_test(NAME simple_mc_integration_over_limits + COMMAND simple_mc_integration -tc=rectangle) +add_test(NAME simple_mc_integration_over_cubes + COMMAND simple_mc_integration -tc=cube) +add_test(NAME simple_mc_integration_over_simplices + COMMAND simple_mc_integration -tc=simplex) +add_test(NAME simple_mc_integration_over_product_simplices + COMMAND simple_mc_integration -tc=prod_simplex) +add_test(NAME simple_mc_integration_over_cross_polytopes + COMMAND simple_mc_integration -tc=cross) +add_test(NAME simple_mc_integration_over_birkhoff_polytopes + COMMAND simple_mc_integration -tc=birkhoff) + +add_executable (order_polytope order_polytope.cpp $) +add_test(NAME order_polytope_basics COMMAND order_polytope -tc=basics) +add_test(NAME order_polytope_line_intersect COMMAND order_polytope -tc=line_intersect) +add_test(NAME order_polytope_reflection COMMAND order_polytope -tc=reflection) +add_test(NAME order_polytope_vec_mult COMMAND order_polytope -tc=vec_mult) + +add_executable (matrix_sampling_test sampling_correlation_matrices_test.cpp $) +add_test(NAME test_corre_spectra_classes COMMAND matrix_sampling_test -tc=corre_spectra) +add_test(NAME test_new_ball_uniform COMMAND matrix_sampling_test -tc=new_ball_uniform) +add_test(NAME test_new_billiard_uniform COMMAND matrix_sampling_test -tc=new_billiard_uniform) +add_test(NAME test_new_accelerated_billiard_uniform COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform) +add_test(NAME test_new_ball_uniform_MT COMMAND matrix_sampling_test -tc=new_ball_uniform_MT) +add_test(NAME test_new_rdhr_uniform_MT COMMAND matrix_sampling_test -tc=new_rdhr_uniform_MT) +add_test(NAME test_new_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_billiard_uniform_MT) +add_test(NAME test_new_accelerated_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform_MT) + +set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") + +#set_target_properties(benchmarks_crhmc +# PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) +#set_target_properties(benchmarks_crhmc_sampling +# PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) +set_target_properties(crhmc_polytope_preparation_test + PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) +set_target_properties(crhmc_sampling_test + PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) + +TARGET_LINK_LIBRARIES(new_volume_example lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(new_volume_example lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_sob_hpolytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_sob_vpolytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cg_hpolytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cg_vpolytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cb_hpolytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cb_vpolytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cb_zonotopes lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly lp_solve coverage_config) +TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(new_rounding_test lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(mcmc_diagnostics_test lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(sampling_test lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(mmcs_test lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(benchmarks_sob lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(benchmarks_cg lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(benchmarks_cb lp_solve ${MKL_LINK} coverage_config) +#TARGET_LINK_LIBRARIES(benchmarks_crhmc_sampling lp_solve ${MKL_LINK} QD_LIB coverage_config) +#TARGET_LINK_LIBRARIES(benchmarks_crhmc lp_solve ${MKL_LINK} QD_LIB coverage_config) +TARGET_LINK_LIBRARIES(simple_mc_integration lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(ode_solvers_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) +TARGET_LINK_LIBRARIES(boundary_oracles_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(root_finders_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(crhmc_polytope_preparation_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) +TARGET_LINK_LIBRARIES(logconcave_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(crhmc_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) +TARGET_LINK_LIBRARIES(order_polytope lp_solve coverage_config) +TARGET_LINK_LIBRARIES(matrix_sampling_test lp_solve ${MKL_LINK} coverage_config) - message(STATUS "Library lp_solve found: ${LP_SOLVE}") - set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - - if (USE_MKL) - find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) - find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) - find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) - find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) - - include_directories (BEFORE ${MKLROOT}/include) - set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) - set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") - add_definitions(-DEIGEN_USE_MKL_ALL) - else() - set(MKL_LINK "") - endif(USE_MKL) - - include_directories (BEFORE ../external) - include_directories (BEFORE ../external/minimum_ellipsoid) - include_directories (BEFORE ../include/generators) - include_directories (BEFORE ../include/volume) - include_directories (BEFORE ../include) - include_directories (BEFORE ../include/integration) - include_directories (BEFORE ../include/convex_bodies) - include_directories (BEFORE ../include/convex_bodies/spectrahedra) - include_directories (BEFORE ../include/annealing) - include_directories (BEFORE ../include/ode_solvers) - include_directories (BEFORE ../include/root_finders) - include_directories (BEFORE ../include/samplers) - include_directories (BEFORE ../include/lp_oracles) - include_directories (BEFORE ../include/nlp_oracles) - include_directories (BEFORE ../include/misc) - include_directories (BEFORE ../test) - - #for Eigen - if (${CMAKE_VERSION} VERSION_LESS "3.12.0") - add_compile_options(-D "EIGEN_NO_DEBUG") - else () - add_compile_definitions("EIGEN_NO_DEBUG") - endif () - - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard - add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger - #add_definitions(${CMAKE_CXX_FLAGS} "-Wint-in-bool-context") - #add_definitions(${CMAKE_CXX_FLAGS} "-Wall") - - add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler - #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") - add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") - add_definitions(${CMAKE_CXX_FLAGS} "-DMKL_ILP64") - #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgslcblas") - #add_definitions( "-O3 -lgsl -lm -ldl -lgslcblas" ) - - add_executable (new_volume_example new_volume_example.cpp) - add_executable (benchmarks_sob benchmarks_sob.cpp) - add_executable (benchmarks_cg benchmarks_cg.cpp) - add_executable (benchmarks_cb benchmarks_cb.cpp) - - add_library(test_main OBJECT test_main.cpp) - - add_executable (mcmc_diagnostics_test mcmc_diagnostics_test.cpp $) - add_test(NAME test_psrf COMMAND mcmc_diagnostics_test -tc=psrf) - add_test(NAME test_univariate_psrf COMMAND mcmc_diagnostics_test -tc=univariate_psrf) - add_test(NAME test_interval_psrf COMMAND mcmc_diagnostics_test -tc=interval_psrf) - add_test(NAME test_ess COMMAND mcmc_diagnostics_test -tc=ess) - add_test(NAME test_geweke COMMAND mcmc_diagnostics_test -tc=geweke) - add_test(NAME test_raftery COMMAND mcmc_diagnostics_test -tc=raftery) - - add_executable (sampling_test sampling_test.cpp $) - add_test(NAME test_dikin COMMAND sampling_test -tc=dikin) - add_test(NAME test_john COMMAND sampling_test -tc=john) - add_test(NAME test_vaidya COMMAND sampling_test -tc=vaidya) - add_test(NAME test_brdhr COMMAND sampling_test -tc=brdhr) - add_test(NAME test_bcdhr COMMAND sampling_test -tc=bcdhr) - add_test(NAME test_grdhr COMMAND sampling_test -tc=grdhr) - add_test(NAME test_gbaw COMMAND sampling_test -tc=gbaw) - add_test(NAME test_ghmc COMMAND sampling_test -tc=ghmc) - - add_executable (mmcs_test mmcs_test.cpp $) - add_test(NAME test_mmcs COMMAND mmcs_test -tc=mmcs) - - add_executable (ode_solvers_test ode_solvers_test.cpp $) - add_test(NAME ode_solvers_test_first_order - COMMAND ode_solvers_test -tc=first_order) - add_test(NAME ode_solvers_test_second_order - COMMAND ode_solvers_test -tc=second_order) - - add_executable (root_finders_test root_finders_test.cpp $) - add_test(NAME root_finders_test_root_finders - COMMAND root_finders_test -tc=root_finders) - - #add_executable (benchmarks_crhmc benchmarks_crhmc.cpp ) - #add_executable (benchmarks_crhmc_sampling benchmarks_crhmc_sampling.cpp ) - - add_executable (crhmc_polytope_preparation_test crhmc_polytope_preparation_test.cpp $) - add_test(NAME crhmc_polytope_test_preparation - COMMAND crhmc_polytope_preparation_test -tc=test_preparation_crhmc) - add_test(NAME crhmc_test_fixed_vars - COMMAND crhmc_polytope_preparation_test -tc=test_fixed_vars_crhmc) - add_test(NAME crhmc_test_dep_vars - COMMAND crhmc_polytope_preparation_test -tc=test_dep_vars_crhmc) - add_test(NAME crhmc_test_center_computation - COMMAND crhmc_polytope_preparation_test -tc=test_center_computation) - - add_executable (boundary_oracles_test boundary_oracles_test.cpp $) - add_test(NAME boundary_oracles_test_h_poly_oracles - COMMAND boundary_oracles_test -tc=h_poly_oracles) - - add_executable (volume_sob_hpolytope volume_sob_hpolytope.cpp $) - add_test(NAME volume_sob_hpolytope_cube COMMAND volume_sob_hpolytope -tc=cube) - add_test(NAME volume_sob_hpolytope_cross COMMAND volume_sob_hpolytope -tc=cross) - add_test(NAME volume_sob_hpolytope_birkhoff COMMAND volume_sob_hpolytope -tc=birk) - add_test(NAME volume_sob_hpolytope_prod_simplex COMMAND volume_sob_hpolytope -tc=prod_simplex) - add_test(NAME volume_sob_hpolytope_simplex COMMAND volume_sob_hpolytope -tc=simplex) - add_test(NAME volume_sob_hpolytope_skinny_cube COMMAND volume_sob_hpolytope -tc=skinny_cube) - add_test(NAME volume_sob_hpolytope_cube_overflow COMMAND volume_sob_hpolytope -tc=cube_overflow) - set_property(TEST volume_sob_hpolytope_cube_overflow PROPERTY TIMEOUT 1) - - add_executable (volume_sob_vpolytope volume_sob_vpolytope.cpp $) - add_test(NAME volume_sob_vpolytope_cube COMMAND volume_sob_vpolytope -tc=cube) - add_test(NAME volume_sob_vpolytope_cross COMMAND volume_sob_vpolytope -tc=cross) - add_test(NAME volume_sob_vpolytope_simplex COMMAND volume_sob_vpolytope -tc=simplex) - - add_executable (volume_cg_hpolytope volume_cg_hpolytope.cpp $) - add_test(NAME volume_cg_hpolytope_cube COMMAND volume_cg_hpolytope -tc=cube) - add_test(NAME volume_cg_hpolytope_cross COMMAND volume_cg_hpolytope -tc=cross) - add_test(NAME volume_cg_hpolytope_birkhoff COMMAND volume_cg_hpolytope -tc=birk) - add_test(NAME volume_cg_hpolytope_prod_simplex COMMAND volume_cg_hpolytope -tc=prod_simplex) - add_test(NAME volume_cg_hpolytope_simplex COMMAND volume_cg_hpolytope -tc=simplex) - add_test(NAME volume_cg_hpolytope_skinny_cube COMMAND volume_cg_hpolytope -tc=skinny_cube) - - add_executable (volume_cg_vpolytope volume_cg_vpolytope.cpp $) - add_test(NAME volume_cg_vpolytope_cube COMMAND volume_cg_vpolytope -tc=cube) - add_test(NAME volume_cg_vpolytope_cross COMMAND volume_cg_vpolytope -tc=cross) - add_test(NAME volume_cg_vpolytope_simplex COMMAND volume_cg_vpolytope -tc=simplex) - - add_executable (volume_cb_hpolytope volume_cb_hpolytope.cpp $) - add_test(NAME volume_cb_hpolytope_cube COMMAND volume_cb_hpolytope -tc=cube) - add_test(NAME volume_cb_hpolytope_cross COMMAND volume_cb_hpolytope -tc=cross) - add_test(NAME volume_cb_hpolytope_birkhoff COMMAND volume_cb_hpolytope -tc=birk) - add_test(NAME volume_cb_hpolytope_prod_simplex COMMAND volume_cb_hpolytope -tc=prod_simplex) - add_test(NAME volume_cb_hpolytope_simplex COMMAND volume_cb_hpolytope -tc=simplex) - add_test(NAME volume_cb_hpolytope_skinny_cube COMMAND volume_cb_hpolytope -tc=skinny_cube) - - add_executable (volume_cb_vpolytope volume_cb_vpolytope.cpp $) - add_test(NAME volume_cb_vpolytope_cube COMMAND volume_cb_vpolytope -tc=cube) - add_test(NAME volume_cb_vpolytope_cross COMMAND volume_cb_vpolytope -tc=cross) - add_test(NAME volume_cb_vpolytope_simplex COMMAND volume_cb_vpolytope -tc=simplex) - - add_executable (volume_cb_zonotopes volume_cb_zonotopes.cpp $) - add_test(NAME volume_cb_zonotopes_uniform_zonotopes - COMMAND volume_cb_zonotopes -tc=uniform_zonotopes) - - add_executable (volume_cb_vpoly_intersection_vpoly volume_cb_vpoly_intersection_vpoly.cpp $) - add_test(NAME volume_cb_vpoly_intersection_vpoly_random_vpoly_sphere - COMMAND volume_cb_vpoly_intersection_vpoly -tc=random_vpoly_sphere) - - add_executable (new_rounding_test new_rounding_test.cpp $) - add_test(NAME test_round_min_ellipsoid - COMMAND new_rounding_test -tc=round_min_ellipsoid) - add_test(NAME test_round_max_ellipsoid - COMMAND new_rounding_test -tc=round_max_ellipsoid) - add_test(NAME test_round_svd - COMMAND new_rounding_test -tc=round_svd) - - add_executable (logconcave_sampling_test logconcave_sampling_test.cpp $) - add_test(NAME logconcave_sampling_test_hmc - COMMAND logconcave_sampling_test -tc=hmc) - add_test(NAME logconcave_sampling_test_uld - COMMAND logconcave_sampling_test -tc=uld) - add_test(NAME logconcave_sampling_test_exponential_biomass_sampling - COMMAND logconcave_sampling_test -tc=exponential_biomass_sampling) - add_test(NAME logconcave_sampling_test_nuts_hmc_truncated - COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc_truncated) - add_test(NAME logconcave_sampling_test_nuts_hmc - COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc) - - - - add_executable (crhmc_sampling_test crhmc_sampling_test.cpp $) - add_test(NAME crhmc_sampling_test_crhmc - COMMAND crhmc_sampling_test -tc=crhmc) - add_test(NAME crhmc_test_polytope_sampling - COMMAND crhmc_sampling_test -tc=test_polytope_sampling_crhmc) - add_test(NAME crhmc_test_sparse_sampling - COMMAND crhmc_sampling_test -tc=test_sampling_sparse_problem) - add_executable (simple_mc_integration simple_mc_integration.cpp $) - add_test(NAME simple_mc_integration_over_limits - COMMAND simple_mc_integration -tc=rectangle) - add_test(NAME simple_mc_integration_over_cubes - COMMAND simple_mc_integration -tc=cube) - add_test(NAME simple_mc_integration_over_simplices - COMMAND simple_mc_integration -tc=simplex) - add_test(NAME simple_mc_integration_over_product_simplices - COMMAND simple_mc_integration -tc=prod_simplex) - add_test(NAME simple_mc_integration_over_cross_polytopes - COMMAND simple_mc_integration -tc=cross) - add_test(NAME simple_mc_integration_over_birkhoff_polytopes - COMMAND simple_mc_integration -tc=birkhoff) - - add_executable (order_polytope order_polytope.cpp $) - add_test(NAME order_polytope_basics COMMAND order_polytope -tc=basics) - add_test(NAME order_polytope_line_intersect COMMAND order_polytope -tc=line_intersect) - add_test(NAME order_polytope_reflection COMMAND order_polytope -tc=reflection) - add_test(NAME order_polytope_vec_mult COMMAND order_polytope -tc=vec_mult) - - add_executable (matrix_sampling_test sampling_correlation_matrices_test.cpp $) - add_test(NAME test_corre_spectra_classes COMMAND matrix_sampling_test -tc=corre_spectra) - add_test(NAME test_new_ball_uniform COMMAND matrix_sampling_test -tc=new_ball_uniform) - add_test(NAME test_new_billiard_uniform COMMAND matrix_sampling_test -tc=new_billiard_uniform) - add_test(NAME test_new_accelerated_billiard_uniform COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform) - add_test(NAME test_new_ball_uniform_MT COMMAND matrix_sampling_test -tc=new_ball_uniform_MT) - add_test(NAME test_new_rdhr_uniform_MT COMMAND matrix_sampling_test -tc=new_rdhr_uniform_MT) - add_test(NAME test_new_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_billiard_uniform_MT) - add_test(NAME test_new_accelerated_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform_MT) - - set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") - - #set_target_properties(benchmarks_crhmc - # PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) - #set_target_properties(benchmarks_crhmc_sampling - # PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) - set_target_properties(crhmc_polytope_preparation_test - PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) - set_target_properties(crhmc_sampling_test - PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) - - TARGET_LINK_LIBRARIES(new_volume_example ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(new_volume_example ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_sob_hpolytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_sob_vpolytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cg_hpolytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cg_vpolytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cb_hpolytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cb_vpolytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cb_zonotopes ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(new_rounding_test ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(mcmc_diagnostics_test ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(sampling_test ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(mmcs_test ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(benchmarks_sob ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(benchmarks_cg ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(benchmarks_cb ${LP_SOLVE} ${MKL_LINK} coverage_config) - #TARGET_LINK_LIBRARIES(benchmarks_crhmc_sampling ${LP_SOLVE} ${MKL_LINK} QD_LIB coverage_config) - #TARGET_LINK_LIBRARIES(benchmarks_crhmc ${LP_SOLVE} ${MKL_LINK} QD_LIB coverage_config) - TARGET_LINK_LIBRARIES(simple_mc_integration ${LP_SOLVE} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(ode_solvers_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) - TARGET_LINK_LIBRARIES(boundary_oracles_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(root_finders_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(crhmc_polytope_preparation_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) - TARGET_LINK_LIBRARIES(logconcave_sampling_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) - TARGET_LINK_LIBRARIES(crhmc_sampling_test ${LP_SOLVE} ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) - TARGET_LINK_LIBRARIES(order_polytope ${LP_SOLVE} coverage_config) - TARGET_LINK_LIBRARIES(matrix_sampling_test ${LP_SOLVE} ${MKL_LINK} coverage_config) - -endif() From f8db05ccf6694e1f1246fab730061dee1bce323d Mon Sep 17 00:00:00 2001 From: vfisikop Date: Fri, 16 Feb 2024 12:24:10 +0200 Subject: [PATCH 11/44] Upgrade boost from 1.76 to 1.84 --- external/cmake-files/Boost.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/external/cmake-files/Boost.cmake b/external/cmake-files/Boost.cmake index 48dad5e6f..4c17f3753 100644 --- a/external/cmake-files/Boost.cmake +++ b/external/cmake-files/Boost.cmake @@ -2,10 +2,10 @@ set(BOOST_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) function(GetBoost) find_path(BOOST_DIR NAMES boost PATHS ${BOOST_CMAKE_DIR}/../_deps/boost-src) - if (NOT BOOST_DIR) - - set(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2" CACHE STRING "Boost download URL") - set(BOOST_URL_SHA256 "f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41" CACHE STRING "Boost download URL SHA256 checksum") + if (NOT BOOST_DIR) + + set(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.84.0/source/boost_1_84_0.tar.bz2" CACHE STRING "Boost download URL") + set(BOOST_URL_SHA256 "cc4b893acf645c9d4b698e9a0f08ca8846aa5d6c68275c14c3e7949c24109454" CACHE STRING "Boost download URL SHA256 checksum") include(FetchContent) set(FETCHCONTENT_BASE_DIR "${BOOST_CMAKE_DIR}/../_deps") From 1703e69d7d88647a8d35ecef91b71e3a60e48e97 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Fri, 16 Feb 2024 12:44:47 +0200 Subject: [PATCH 12/44] Fix ambiguous call to pow for clang, and disable LoadableBlasLib --- external/cmake-files/LPSolve.cmake | 1 + include/diagnostics/effective_sample_size.hpp | 2 +- include/diagnostics/print_diagnostics.hpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/external/cmake-files/LPSolve.cmake b/external/cmake-files/LPSolve.cmake index 56bf2ebc2..f8779ace3 100644 --- a/external/cmake-files/LPSolve.cmake +++ b/external/cmake-files/LPSolve.cmake @@ -34,6 +34,7 @@ function(GetLPSolve) add_compile_options(-DLoadLanguageLib=0) add_compile_definitions(RoleIsExternalInvEngine) add_compile_definitions(INVERSE_ACTIVE=3) + add_compile_options(-DLoadableBlasLib=0) include_directories (BEFORE ${LP_SOLVE_DIR}) include_directories (BEFORE ${LP_SOLVE_DIR}/bfp) diff --git a/include/diagnostics/effective_sample_size.hpp b/include/diagnostics/effective_sample_size.hpp index aaf418529..c372eb696 100644 --- a/include/diagnostics/effective_sample_size.hpp +++ b/include/diagnostics/effective_sample_size.hpp @@ -68,7 +68,7 @@ VT effective_sample_size(MT const& samples, unsigned int &min_ess) { variance = NT(0); for (int j = 0; j < N; j++) { - variance += pow(normalized_sample_row[j], 2); + variance += std::pow(normalized_sample_row[j], 2); } variance *= (1.0 / N); diff --git a/include/diagnostics/print_diagnostics.hpp b/include/diagnostics/print_diagnostics.hpp index 91bd8b0ed..b009d6d0c 100644 --- a/include/diagnostics/print_diagnostics.hpp +++ b/include/diagnostics/print_diagnostics.hpp @@ -42,7 +42,7 @@ void print_diagnostics(MT const& samples, unsigned int &min_ess, StreamType &str row_mean = samples.row(i).mean(); row_std = NT(0); for (int j = 0; j < N; j++) { - row_std += pow(samples(i, j) - row_mean, 2); + row_std += std::pow(samples(i, j) - row_mean, 2); } row_std = sqrt(row_std / N); vt.addRow(i + 1, row_mean, row_std, ess(i), intv_psrf(i)); From 5bf9188fb11fddab17de98fabc505e993216ca5f Mon Sep 17 00:00:00 2001 From: vfisikop <160006479+vfisikop@users.noreply.github.com> Date: Tue, 20 Feb 2024 11:38:21 +0200 Subject: [PATCH 13/44] Update requirements.txt --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index f02db7709..9fa3dfbed 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,4 @@ breathe sphinx_sitemap myst_parser sphinx-math-dollar +sphinx_rtd_theme From b2b5c06ceb18ea599cdd8cde110197db2f7d024b Mon Sep 17 00:00:00 2001 From: zhanggiene Date: Wed, 6 Mar 2024 16:17:00 +0800 Subject: [PATCH 14/44] Autopoint (#256) --- R-proj/src/Makevars | 2 +- examples/autopoint/CMakeLists.txt | 165 + .../autopoint/Gaussian_mixture_autopoint.cpp | 122 + ...idimensionalGaussian_mixture_autopoint.cpp | 126 + examples/autopoint/README.md | 65 + ..._multidimensional_gaussian_mixture_data.py | 18 + examples/autopoint/readData.cpp | 37 + examples/autopoint/readData.h | 8 + examples/autopoint/requirements.txt | 3 + examples/autopoint/test1.txt | 8000 +++++++++++++++++ .../userDefinedFunction_autopoint.cpp | 111 + .../userDefinedFunction_manual_gradient.cpp | 154 + external/cmake-files/Autodiff.cmake | 31 + include/cartesian_geom/autopoint.h | 311 + include/diagnostics/print_diagnostics.hpp | 2 +- .../generators/known_polytope_generators.h | 6 +- include/ode_solvers/oracle_functors.hpp | 86 + test/CMakeLists.txt | 10 +- 18 files changed, 9251 insertions(+), 6 deletions(-) create mode 100644 examples/autopoint/CMakeLists.txt create mode 100644 examples/autopoint/Gaussian_mixture_autopoint.cpp create mode 100644 examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp create mode 100644 examples/autopoint/README.md create mode 100644 examples/autopoint/generate_multidimensional_gaussian_mixture_data.py create mode 100644 examples/autopoint/readData.cpp create mode 100644 examples/autopoint/readData.h create mode 100644 examples/autopoint/requirements.txt create mode 100644 examples/autopoint/test1.txt create mode 100755 examples/autopoint/userDefinedFunction_autopoint.cpp create mode 100644 examples/autopoint/userDefinedFunction_manual_gradient.cpp create mode 100644 external/cmake-files/Autodiff.cmake create mode 100644 include/cartesian_geom/autopoint.h diff --git a/R-proj/src/Makevars b/R-proj/src/Makevars index ea3607acf..12623b8b9 100644 --- a/R-proj/src/Makevars +++ b/R-proj/src/Makevars @@ -1,4 +1,4 @@ -PKG_CPPFLAGS= -I../../external/boost -I../../external/LPsolve_src/run_headers -I../../external/minimum_ellipsoid -I../../include +PKG_CPPFLAGS= -I../../external/boost -I../../external/autodiff -I../../external/LPsolve_src/run_headers -I../../external/minimum_ellipsoid -I../../include PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES diff --git a/examples/autopoint/CMakeLists.txt b/examples/autopoint/CMakeLists.txt new file mode 100644 index 000000000..d96e6dac2 --- /dev/null +++ b/examples/autopoint/CMakeLists.txt @@ -0,0 +1,165 @@ +# VolEsti (volume computation and sampling library) +# Copyright (c) 2012-2018 Vissarion Fisikopoulos +# Copyright (c) 2018 Apostolos Chalkis +# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. +# Contributed and/or modified by Zhang zhuyan, as part of Google Summer of Code 2022 program. +# Licensed under GNU LGPL.3, see LICENCE file + + +project( VolEsti ) + + +option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON) +option(BUILTIN_EIGEN "Use eigen from ../external" OFF) +option(BUILTIN_AUTODIFF "Use eigen from ../external" OFF) +option(USE_MKL "Use MKL library to build eigen" ON) + +CMAKE_MINIMUM_REQUIRED(VERSION 3.17) + +set(MKLROOT /opt/intel/oneapi/mkl/2023.0.0) +message( "MKLROOT" ${MKLROOT}) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) + +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + + +if(DISABLE_NLP_ORACLES) + add_definitions(-DDISABLE_NLP_ORACLES) +else() + find_library(IFOPT NAMES libifopt_core.so PATHS /usr/local/lib) + find_library(IFOPT_IPOPT NAMES libifopt_ipopt.so PATHS /usr/local/lib) + find_library(GMP NAMES libgmp.so PATHS /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu) + find_library(MPSOLVE NAMES libmps.so PATHS /usr/local/lib) + find_library(PTHREAD NAMES libpthread.so PATHS /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu) + find_library(FFTW3 NAMES libfftw3.so.3 PATHS /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu) + + if (NOT IFOPT) + + message(FATAL_ERROR "This program requires the ifopt library, and will not be compiled.") + + elseif (NOT GMP) + + message(FATAL_ERROR "This program requires the gmp library, and will not be compiled.") + + elseif (NOT MPSOLVE) + + message(FATAL_ERROR "This program requires the mpsolve library, and will not be compiled.") + + elseif (NOT FFTW3) + + message(FATAL_ERROR "This program requires the fftw3 library, and will not be compiled.") + + else() + message(STATUS "Library ifopt found: ${IFOPT}") + message(STATUS "Library gmp found: ${GMP}") + message(STATUS "Library mpsolve found: ${MPSOLVE}") + message(STATUS "Library fftw3 found:" ${FFTW3}) + + endif(NOT IFOPT) + +endif(DISABLE_NLP_ORACLES) + +include("../../external/cmake-files/Autodiff.cmake") +GetAutodiff() +include("../../external/cmake-files/Eigen.cmake") +GetEigen() + +include("../../external/cmake-files/Boost.cmake") +GetBoost() + +include("../../external/cmake-files/LPSolve.cmake") +GetLPSolve() + +if (BUILTIN_EIGEN) + include_directories (BEFORE ../../external/_deps/Eigen) +else () + include_directories(BEFORE /usr/include/eigen3) +endif(BUILTIN_EIGEN) +if (BUILTIN_AUTODIFF) + include_directories (BEFORE ../../external/_deps/Autodiff) +else () + include_directories(BEFORE /usr/local/include) +endif(BUILTIN_AUTODIFF) + +if (USE_MKL) +find_library(BLAS +NAMES libblas.so +PATHS /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib64/atlas /usr/lib/atlas /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib +) + +message("Found MKL: ${MKLROOT}") + include_directories (BEFORE ${MKLROOT}/include) + set(PROJECT_LIBS ${BLAS_LIBRARIES}) + set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") + add_definitions(-DEIGEN_USE_MKL_ALL) +endif(USE_MKL) + +# Find lpsolve library +find_library(LP_SOLVE NAMES liblpsolve55.so PATHS /usr/lib/lp_solve) + +if (NOT LP_SOLVE) + message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") +else () + message(STATUS "Library lp_solve found: ${LP_SOLVE} ${BLAS}") + + set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") + + include_directories (BEFORE ../../external) + include_directories (BEFORE ../../external/minimum_ellipsoid) + include_directories (BEFORE ../../include/generators) + include_directories (BEFORE ../../include/volume) + include_directories (BEFORE ../../include) + include_directories (BEFORE ../../include/lp_oracles) + include_directories (BEFORE ../../include/nlp_oracles) + include_directories (BEFORE ../../include/convex_bodies) + include_directories (BEFORE ../../include/random_walks) + include_directories (BEFORE ../../include/annealing) + include_directories (BEFORE ../../include/ode_solvers) + include_directories (BEFORE ../../include/root_finders) + include_directories (BEFORE ../../include/samplers) + include_directories (BEFORE ../../include/misc) + include_directories (BEFORE ../../include/optimization) + + # for Eigen + if (${CMAKE_VERSION} VERSION_LESS "3.12.0") + add_compile_options(-D "EIGEN_NO_DEBUG") + else () + add_compile_definitions("EIGEN_NO_DEBUG") + endif () + + + message("THIS IS mkl ${MKL_INCLUDE_DIRS}") + if (MKL_FOUND) + message("MKL") + message("${MKL_INCLUDE_DIRS}") +endif() + + + + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++14 standard + add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler + add_definitions(${CMAKE_CXX_FLAGS} "-pthread") # optimization of the compiler + + #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") + add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") + add_definitions(${CMAKE_CXX_FLAGS} "-DMKL_ILP64") + add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") + add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") + + add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-D_REENTRANT") + #add_definitions( "-O3 -lgsl -lm -ldl -lgslcblas" ) + + add_executable (userDefinedFunction_manual_gradient userDefinedFunction_manual_gradient.cpp) + TARGET_LINK_LIBRARIES(userDefinedFunction_manual_gradient ${LP_SOLVE} ${BLAS} ${MKL_LINK}) + add_executable (userDefinedFunction_autopoint userDefinedFunction_autopoint.cpp) + TARGET_LINK_LIBRARIES(userDefinedFunction_autopoint ${LP_SOLVE} ${BLAS} ${MKL_LINK}) + add_executable (Gaussian_mixture_autopoint Gaussian_mixture_autopoint.cpp readData.cpp) + TARGET_LINK_LIBRARIES(Gaussian_mixture_autopoint ${LP_SOLVE} ${BLAS} ${MKL_LINK}) + add_executable (MultidimensionalGaussian_mixture_autopoint MultidimensionalGaussian_mixture_autopoint.cpp readData.cpp) + TARGET_LINK_LIBRARIES(MultidimensionalGaussian_mixture_autopoint ${LP_SOLVE} ${BLAS} ${MKL_LINK}) + + + endif() + diff --git a/examples/autopoint/Gaussian_mixture_autopoint.cpp b/examples/autopoint/Gaussian_mixture_autopoint.cpp new file mode 100644 index 000000000..b0d4f2b96 --- /dev/null +++ b/examples/autopoint/Gaussian_mixture_autopoint.cpp @@ -0,0 +1,122 @@ +// Use forward-mode automatic differentiation using Autodiff Library + +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2020-2020 Marios Papachristou +// Copyright (c) 2022-2022 Zhang zhuyan + +// Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. +// Contributed and/or modified by Zhang zhuyan, as part of Google Summer of Code 2020 program. + +// Licensed under GNU LGPL.3, see LICENCE file + +// task number 1 use array and fix the problem first done +// difference between EigenArray and EigenVector + +#include +#include +#include +#include +#include +#include +#include + +#include "Eigen/Eigen" + +#include "ode_solvers/ode_solvers.hpp" +#include "random.hpp" +#include "random/uniform_int.hpp" +#include "random/normal_distribution.hpp" +#include "random/uniform_real_distribution.hpp" +#include "random_walks/random_walks.hpp" +#include "volume/volume_sequence_of_balls.hpp" +#include "volume/volume_cooling_gaussians.hpp" +#include "volume/volume_cooling_balls.hpp" +#include "generators/known_polytope_generators.h" +#include "readData.h" +#include "diagnostics/diagnostics.hpp" +#include "cartesian_geom/autopoint.h" + +template +void run_main() +{ + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef std::vector pts; + typedef HPolytope Hpolytope; + typedef BoostRandomNumberGenerator RandomNumberGenerator; + typedef AutoDiffFunctor::GradientFunctor NegativeGradientFunctor; + typedef AutoDiffFunctor::FunctionFunctor NegativeLogprobFunctor; + typedef LeapfrogODESolver Solver; + typedef typename Hpolytope::MT MT; + typedef typename Hpolytope::VT VT; + AutoDiffFunctor::parameters params; + params.data = readMatrix("data.txt"); + NegativeGradientFunctor F(params); + NegativeLogprobFunctor f(params); + RandomNumberGenerator rng(1); + unsigned int dim = 2; + + HamiltonianMonteCarloWalk::parameters hmc_params(F, dim); + hmc_params.eta=0.00005;// working learning rate for this specific example + std::chrono::time_point start, stop; + + Hpolytope P = generate_cube(dim, false); + + Point x0 = -0.25 * Point::all_ones(dim); + + // In the first argument put in the address of an H-Polytope + // for truncated sampling and NULL for untruncated + HamiltonianMonteCarloWalk::Walk + hmc(&P, x0, F, f, hmc_params); + int n_samples = 50000; // Half will be burned + int max_actual_draws = n_samples / 2; + unsigned int min_ess = 0; + MT samples; + samples.resize(dim, max_actual_draws); + + for (int i = 0; i < n_samples - max_actual_draws; i++) { + hmc.apply(rng, 3); + } + start = std::chrono::high_resolution_clock::now(); + std::cerr << (long)std::chrono::duration_cast(start - stop).count(); + for (int i = 0; i < max_actual_draws; i++) { + std::cout << hmc.x.getCoefficients().transpose() << std::endl; + hmc.apply(rng, 3); + samples.col(i) = hmc.x.getCoefficients(); + } + stop = std::chrono::high_resolution_clock::now(); + long ETA = (long)std::chrono::duration_cast(stop - start).count(); + std::cerr << "total time taken " << ETA << std::endl; + std::cerr << std::endl; + print_diagnostics(samples, min_ess, std::cerr); + std::cerr << "min ess " << min_ess << "us" << std::endl; + std::cerr << "Average time per sample: " << ETA / max_actual_draws << "us" << std::endl; + std::cerr << "Average time per independent sample: " << ETA / min_ess << "us" << std::endl; + std::cerr << "Average number of reflections: " << (1.0 * hmc.solver->num_reflections) / hmc.solver->num_steps << std::endl; + std::cerr << "Step size (final): " << hmc.solver->eta << std::endl; + std::cerr << "Discard Ratio: " << hmc.discard_ratio << std::endl; + std::cerr << "Average Acceptance Probability: " << exp(hmc.average_acceptance_log_prob) << std::endl; + std::cerr << "PSRF: " << multivariate_psrf(samples) << std::endl; + std::cerr << std::endl; +} +using TT = double; +typedef Eigen::Matrix EigenMatrix; +typename autopoint::FT pdf_(const autopoint &x, const Eigen::Matrix &data_) { + // define your function here, + autopoint data_auto = autopoint(data_); + autopoint result = (((-0.5 * 100 * (data_auto - x.getCoefficients()[0]).pow(2)).exp() + (-0.5 * 100 * (data_auto - x.getCoefficients()[1]).pow(2)).exp())).log(); + + auto y = (result * -1.0).sum(); + return y; +} + +template <> +std::function::FT(const autopoint &, const EigenMatrix&)> AutoDiffFunctor::FunctionFunctor_internal::pdf = pdf_; + +int main() { + run_main(); + return 0; +} diff --git a/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp b/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp new file mode 100644 index 000000000..0db40c544 --- /dev/null +++ b/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp @@ -0,0 +1,126 @@ +// Use forward-mode automatic differentiation using Autodiff Library + +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2020-2020 Marios Papachristou +// Copyright (c) 2022-2022 Zhang zhuyan + +// Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. +// Contributed and/or modified by Zhang zhuyan, as part of Google Summer of Code 2020 program. + +// Licensed under GNU LGPL.3, see LICENCE file + + +#include +#include +#include +#include +#include +#include +#include + +#include "Eigen/Eigen" + +#include "ode_solvers/ode_solvers.hpp" +#include "random.hpp" +#include "random/uniform_int.hpp" +#include "random/normal_distribution.hpp" +#include "random/uniform_real_distribution.hpp" +#include "random_walks/random_walks.hpp" +#include "volume/volume_sequence_of_balls.hpp" +#include "volume/volume_cooling_gaussians.hpp" +#include "volume/volume_cooling_balls.hpp" +#include "generators/known_polytope_generators.h" +#include "readData.h" +#include "diagnostics/diagnostics.hpp" + + +template +void run_main() +{ + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef std::vector pts; + typedef HPolytope Hpolytope; + typedef BoostRandomNumberGenerator RandomNumberGenerator; + typedef AutoDiffFunctor::GradientFunctor NegativeGradientFunctor; + typedef AutoDiffFunctor::FunctionFunctor NegativeLogprobFunctor; + typedef LeapfrogODESolver Solver; + typedef typename Hpolytope::MT MT; + typedef typename Hpolytope::VT VT; + AutoDiffFunctor::parameters params; + params.data=readMatrix("data.txt"); + NegativeGradientFunctor F(params); + NegativeLogprobFunctor f(params); + RandomNumberGenerator rng(1); + unsigned int dim = 4; + + HamiltonianMonteCarloWalk::parameters hmc_params(F, dim); + std::chrono::time_point start,stop; + + Hpolytope P = generate_cube(dim, false); + + Point x0 = -0.25 * Point::all_ones(dim); + + // In the first argument put in the address of an H-Polytope + // for truncated sampling and NULL for untruncated + HamiltonianMonteCarloWalk::Walk + hmc(&P, x0, F, f, hmc_params); + int n_samples = 50000; // Half will be burned + int max_actual_draws = n_samples / 2; + unsigned int min_ess = 0; + MT samples; + samples.resize(dim, max_actual_draws); + + for (int i = 0; i < n_samples - max_actual_draws; i++) { + hmc.apply(rng, 3); + } + start = std::chrono::high_resolution_clock::now(); + std::cerr << (long)std::chrono::duration_cast(start - stop).count(); + for (int i = 0; i < max_actual_draws; i++) { + std::cout << hmc.x.getCoefficients().transpose() << std::endl; + hmc.apply(rng, 3); + samples.col(i) = hmc.x.getCoefficients(); + } + stop = std::chrono::high_resolution_clock::now(); + long ETA = (long)std::chrono::duration_cast(stop - start).count(); + std::cerr << "total time taken " << ETA << std::endl; + std::cerr << std::endl; + print_diagnostics(samples, min_ess, std::cerr); + std::cerr << "min ess " << min_ess << "us" << std::endl; + std::cerr << "Average time per sample: " << ETA / max_actual_draws << "us" << std::endl; + std::cerr << "Average time per independent sample: " << ETA / min_ess << "us" << std::endl; + std::cerr << "Average number of reflections: " << (1.0 * hmc.solver->num_reflections) / hmc.solver->num_steps << std::endl; + std::cerr << "Step size (final): " << hmc.solver->eta << std::endl; + std::cerr << "Discard Ratio: " << hmc.discard_ratio << std::endl; + std::cerr << "Average Acceptance Probability: " << exp(hmc.average_acceptance_log_prob) << std::endl; + std::cerr << "PSRF: " << multivariate_psrf(samples) << std::endl; + std::cerr << std::endl; +} +using TT=double; +typedef Eigen::Matrix EigenMatrix; +typename autopoint::FT pdf_(const autopoint& x,const EigenMatrix& data_) { + int d=x.getCoefficients().rows(); + autopoint firstX=x.head(d/2); + autopoint secondX=x.tail(d/2); + typename autopoint::FT SUM=0; + auto I=Eigen::Matrix::Identity(d,d); + for(int i=0;i datavector=data_.row(i).transpose(); + autopoint data_autopoint= autopoint(datavector); + autopoint x_mu_first= data_autopoint - firstX; + autopoint x_mu_second= data_autopoint -secondX; + SUM +=(-log(exp(-0.5*x_mu_first.pow(2).sum()) + exp(-0.5*x_mu_second.pow(2).sum() ) )); + } + return SUM; +} +template <> std::function::FT(const autopoint&,const EigenMatrix&)> AutoDiffFunctor::FunctionFunctor_internal::pdf=pdf_; + + + +int main() { + run_main(); + return 0; +} diff --git a/examples/autopoint/README.md b/examples/autopoint/README.md new file mode 100644 index 000000000..d49ffd8ea --- /dev/null +++ b/examples/autopoint/README.md @@ -0,0 +1,65 @@ + +## Background information +Autopoint is implemented using [Autodiff Library]( +https://github.com/autodiff/autodiff/), after experiments of comparing various automatic differentiating libraries.Read [here](https://gist.github.com/zhanggiene/8471601fa25ba9db90303661b0e2237b) to find out more! + +## Compilation +``` +cmake . +build +``` + +## Running the examples + +For plotting the results: + * `examples/python_utilities/plot_samples.py` for plotting the outputs of the HMC sampler + +The script has requirements listed in `requirements.txt`. Install via +``` +pip install -r requirements.txt +``` + +You can also use the `--limits` argument to set {x, y, z}-limits for the joint plots. + + +### 1. User defined function where the pdf function is explicitly defined by the user. + +``` +./userDefinedFunction_autopoint > userDefinedFunction_autopoint.txt + +python ../python_utilities/plot_samples.py < userDefinedFunction_autopoint.txt +``` +The histogram of samples from user defined distribution.It is the same as the real pdf of the distribution when -1 data.txt +``` +2. Data from the true distribution is used to define the pdf. +``` +./Gaussian_mixture_autopoint > Gaussian_mixture.txt +``` +3. Plot the graph +``` +python ../python_utilities/plot_samples.py < Gaussian_mixture.txt +``` +![gaussian_mixture](./2.2.png) + +### 3.The pdf is defined using a mixture of multi-dimensional gaussian distribution with multi-dimensional data. + +1. Generating data points from a mixture of multi-dimensional gaussian distribution with mean of dimension d. The variable d can be changed to be any integer number, but it should be the same as unsigned int dim variable in MultidimensionalGaussian_mixture_autopoint.cpp +``` +python generate_multidimensional_gaussian_mixture_data.py -d=4 > data.txt +``` +2. Conduct hmc sampling + +``` +./MultidimensionalGaussian_mixture_autopoint +``` +### Points to take note +it is advised to use NutsHamiltonianMonteCarloWalk instead of HamiltonianMonteCarloWalk. diff --git a/examples/autopoint/generate_multidimensional_gaussian_mixture_data.py b/examples/autopoint/generate_multidimensional_gaussian_mixture_data.py new file mode 100644 index 000000000..011957d23 --- /dev/null +++ b/examples/autopoint/generate_multidimensional_gaussian_mixture_data.py @@ -0,0 +1,18 @@ +import numpy as np +import random +import argparse + +argParser = argparse.ArgumentParser() +argParser.add_argument("-d", "--dimension", type=int,help="dimension of mean of normal distribution.There will be samples from two normal distribution") +argParser.add_argument("-n", "--number", type=int,default=4000,help="number of samples") +args = argParser.parse_args() +mean1_=[random.random() for i in range(args.dimension) ] +#the two mean are directly opposite for maximum sampling efficiency +mean2_=[-i for i in mean1_] +cov = 0.1*np.identity(args.dimension) +pts1 = np.random.multivariate_normal(mean1_, cov, size=args.number//2) +pts2 = np.random.multivariate_normal(mean2_, cov, size=args.number//2) +sample=np.r_[pts1,pts2] +for i in sample: + print(" ".join(map(str, i))) + diff --git a/examples/autopoint/readData.cpp b/examples/autopoint/readData.cpp new file mode 100644 index 000000000..d6de0b497 --- /dev/null +++ b/examples/autopoint/readData.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +using namespace std; +using namespace Eigen; + +#define MAXBUFSIZE ((int)1e6) + +template +Matrix readMatrix(const char * filename) { + int cols=0, rows=0; + NT buff[MAXBUFSIZE]; + + ifstream infile; + infile.open(filename); + while(!infile.eof()) { + string line; + getline(infile,line); + int temp_cols=0; + stringstream stream(line); + while(!stream.eof()) stream>>buff[cols*rows+temp_cols++]; + if(temp_cols==0) continue; + if (cols==0) cols=temp_cols; + rows++; + } + infile.close(); + Matrix result(rows,cols); + for(int i =0;i +#include "readData.cpp" +template +Eigen::Matrix readMatrix(const char * filename); + +#endif /* BCC3CEE0_8697_484B_B5E2_2A7DAFF1284D */ diff --git a/examples/autopoint/requirements.txt b/examples/autopoint/requirements.txt new file mode 100644 index 000000000..010503e45 --- /dev/null +++ b/examples/autopoint/requirements.txt @@ -0,0 +1,3 @@ +matplotlib==3.3.2 +numpy==1.22.0 +seaborn==0.11.0 diff --git a/examples/autopoint/test1.txt b/examples/autopoint/test1.txt new file mode 100644 index 000000000..928bebb1e --- /dev/null +++ b/examples/autopoint/test1.txt @@ -0,0 +1,8000 @@ +1.4389312743620264 +-1.3429444686350107 +-1.2839824846615373 +0.17425408483408453 +-0.317145414150371 +1.210417765935969 +2.039815431693488 +-0.5586309991920968 +0.25595721573618835 +0.4125979094251532 +0.11088989514699005 +-1.627890496582001 +-0.3648803571858281 +-1.2187669402757682 +-0.64164859953216 +-0.14014893845852533 +-2.192549685553632 +-0.703492429957417 +0.2918256467137392 +-0.9017002976066446 +0.02565575937218867 +1.0830978980411001 +-0.14516470354384836 +-0.9575137523854835 +0.5075367023443571 +-0.3513244668242659 +1.0797989152122078 +0.9739864440041945 +0.2532335178221895 +0.48175990748697717 +0.8500197831092988 +1.8017048246439276 +0.7887751223651034 +1.4549203439068983 +0.6255030928484168 +2.2378551855131112 +1.0065242521713897 +1.1795749577734629 +-0.4302437038198378 +0.45480938619056627 +-0.0011808096668151913 +1.1258892192432781 +0.6069789421218854 +0.9160927288248275 +0.39748850536432584 +0.8831544974680436 +0.3994892273436168 +1.4061619639702572 +-1.085973406450066 +0.7686596105872932 +0.9781093810583458 +-0.754029794246235 +-0.7129413467343139 +-0.3856079035191352 +-0.7745884207207039 +1.2668228183988122 +-0.5646556010405765 +0.9060209589591424 +0.051019830316273634 +-2.776780689778862 +-1.2282112447259785 +0.8469631329207489 +-0.5851887314152927 +0.6770760708033563 +2.3308072757033322 +0.4044141919592825 +-1.2543455178446206 +0.2552835519304951 +0.9532588583974619 +1.0277235161253313 +0.040326507313035415 +-0.2258535735124716 +0.39058120726948026 +-0.9689652457692679 +0.5434508983126822 +-0.17962132262618064 +-0.7627440801279135 +0.5370193569007295 +2.606502131994561 +0.8346227834131333 +-0.7617367340068403 +-0.7260524574687648 +0.5919346827508521 +1.5201713581765384 +2.0859168058130675 +0.15767055958538195 +-2.000025713391259 +-0.9733150696065462 +0.19414726767515228 +0.357644614680221 +-0.43997799021248585 +-0.7014061651843775 +-1.3987951445206552 +0.34042221741881007 +1.416999758159151 +0.4442134654050433 +-0.19080070963211399 +-0.37535207015084093 +1.060910553289824 +0.04380585991006472 +-0.4085230020575795 +1.0800530738944984 +1.9447471487295913 +2.1504491095802325 +2.5930541270661047 +0.8929829819113982 +-1.8183468554916191 +1.4045651031304427 +0.9935379535436617 +-0.812446388283558 +1.293236836321771 +1.3944789206654218 +0.9869385666313367 +-0.18171187356315 +-0.9214432351180788 +0.8155416065038007 +1.6219806093417823 +-0.4030286757774162 +0.6315122109708535 +-1.9712132813251453 +0.27916890974784403 +-0.2495201884114409 +1.5511788223987006 +-0.5486730589546956 +0.11540261156781831 +0.8881406105586184 +0.4356953844726819 +-0.05085095929111627 +2.3818442532998114 +-0.3327795836658318 +0.2729726340106885 +0.3574164671859378 +2.693476001543927 +0.5975330043740719 +0.7533835684867694 +1.863080723006012 +0.423198384786203 +-0.7625599629265221 +-0.3550998394494326 +1.2235960243636892 +1.4617266836784346 +-0.3846619729113996 +0.9638539029381655 +-0.9823621644552614 +0.3988788558778702 +0.5522506652319159 +-0.8613777285723414 +-1.124546689535219 +1.8142441679229053 +0.6930134331237859 +1.2123294485343012 +-0.4599584645997532 +0.3164237862039946 +0.1299855401688784 +0.6106386975349418 +1.282741631712128 +-0.2137405613804912 +-0.1339769830132017 +0.686213957033106 +0.896044544373173 +0.5550667160771849 +1.3810336530101317 +-0.5258798568120143 +-1.0221313246604071 +-0.014427461117132584 +-1.2461113228399405 +-1.3637095410731377 +0.8681810509161852 +0.2104121944945841 +-0.20579626223894526 +1.5806476987635913 +-0.2958396216325586 +-0.19087979307927755 +1.862712391766958 +0.13370338278363003 +1.5680546335072894 +0.28764580517391164 +0.1857776783287964 +0.006596538960246562 +0.34977159348435033 +0.1382394722302465 +0.44555828302148665 +-2.1767683370178776 +-0.18270087070759905 +1.3159357009944808 +1.585748854087624 +1.7017818326051481 +1.2431260148036063 +0.9947703104153859 +0.7339615481432674 +-0.7371473176289575 +-0.1456839327490746 +-0.41765343657725396 +-0.12450775838161104 +-1.0525926353581374 +1.146239074174727 +1.1646840503628726 +-0.268564622075392 +0.8660546889984144 +-0.15569466371137985 +0.5732900045811375 +-0.14877202828857855 +-0.5141544120658305 +0.2753170956561294 +-0.974045025903292 +0.11204533319141508 +-0.022073143570356085 +1.432248303002012 +2.53429835765564 +0.06806482416872318 +-0.6096633074573565 +0.28420190009806906 +1.747047533673821 +0.5078280631116362 +-1.6689520256019543 +0.7016629187920355 +-0.34167063932929176 +-1.347329354908254 +-0.3089433544728062 +1.237785604579344 +0.5978549765679249 +1.0007600328383326 +1.7215099835707568 +-0.12416581594156545 +0.7854572921273687 +-0.2341909963345763 +1.1520782988589229 +0.30372901076093956 +-0.4029977387355893 +0.08075298483986314 +-0.08913782828846761 +0.9842576411192376 +-1.5994514364809682 +-0.07045083503051497 +0.9368521850772835 +1.1609966271822183 +2.949145527568252 +-0.11006435493510458 +-0.4901630895841025 +-0.41040283171542813 +0.16782717752075246 +0.23459957397686632 +0.27969452960398533 +1.5885236719212554 +-0.014375419925456517 +0.7681448884491527 +1.525676111296602 +0.041419096194456495 +-0.5621769743636449 +2.5807504775686283 +0.6808139259179025 +-1.1630380214725957 +-0.6481383953833989 +0.10798578434791818 +-0.4575180944445433 +0.13745667668118108 +-0.6473384002288922 +-0.022260745266244303 +0.05558981708504637 +0.47953114254108353 +-0.11336660093194312 +-0.5232024355815905 +1.1230831284633398 +0.5120488543676602 +2.238632218665824 +0.2983690227913586 +-1.1542525648977622 +0.5467127993538798 +0.41261049485391965 +-0.16915061223862654 +-0.9256376042382952 +0.3084311847298725 +1.4665491109498612 +-0.9755727885738921 +-2.126287008968516 +1.4057843161067785 +0.6815790663673456 +1.7203048870785176 +0.5696043501233603 +-0.42239019638393605 +2.5641782476343984 +0.333705780254793 +1.6439822535022293 +0.21673763483821112 +-1.3549718960871617 +0.1880359422150748 +1.5381282674874004 +0.7255235364645972 +0.052168531879254326 +0.19437674623957685 +0.10268504295096714 +-0.45284900501993897 +-0.5601872259941293 +1.2423975623069436 +0.9372106015500493 +1.1131828679753624 +0.3469142897399695 +0.8519099664755511 +0.4524955445282952 +-0.3958368008094012 +0.006987539565988549 +1.1041671549361414 +1.1483098276058386 +-2.3286822749451686 +0.6542755208413851 +-1.2162776396162795 +-2.370553422667758 +-0.6404850774400347 +0.5492567344535221 +0.4021411843852788 +0.20715721866041087 +-0.30862695787426636 +0.3863136941106339 +-0.1423918494244124 +-2.7589803027333613 +0.8623299441302312 +1.3769652479351022 +2.105770184802287 +0.4460609650743488 +-2.275162518968023 +0.4653352759430595 +1.1766090352774223 +0.32407108267174844 +-1.9425917866380054 +-0.4179633525747998 +0.14502429422575178 +1.2248490887918568 +-0.3624557171049767 +0.9052464534561482 +-0.10857118655052533 +1.105417894294232 +0.13339222669025266 +-0.3538796618777278 +-0.34245712187411514 +0.18208919456586856 +-0.38686901757630365 +0.6414247769810986 +1.8841292156776595 +-0.8879003281240496 +1.5734897086962485 +2.6872109495375796 +0.13145956728537003 +3.0089177074631355 +-0.7270505753537252 +-0.13177183575316426 +1.6172126380192657 +1.8496684263609613 +-1.3492517213961361 +-0.062117400736129424 +-0.31816291576023215 +0.24503954211099668 +-0.8234618512843568 +-0.19462564700786184 +0.005329143276808335 +-0.5725994094502492 +-0.12403635407058927 +0.9240275383399548 +-1.3932232523069146 +0.7568723285298065 +-2.960578666919784 +1.0663737595604295 +0.3323113169496679 +-0.8495192928065638 +1.7433083951175854 +-0.5843793333705019 +-0.8957339994772793 +-1.6534985061948482 +0.7224382538011832 +-0.5426521416566354 +-0.8293208175858151 +-0.7431193805283998 +0.17811029046939514 +-0.5363105682520661 +0.22781548187212813 +0.1756350550673646 +0.9894358778751396 +1.584961907483094 +2.345812593449944 +-0.006830462025120443 +-0.14615450724023804 +-1.7305448950812632 +-0.9831559613152623 +1.7159685505223754 +1.0768516852018841 +0.6682935244313462 +0.5624995878875156 +0.162967455296286 +1.2221277791212724 +0.20162059665485296 +-0.13339112382460494 +1.698858894323301 +-0.13861983297223718 +0.692845608994738 +-1.3953532222779732 +-0.014148316017940893 +-0.8813123797802103 +0.032781801034983016 +1.5682559653706731 +0.35530613318271403 +0.25963768024955713 +-0.5345360423865787 +1.1125840527700999 +-0.13834890142465606 +0.3839008876089417 +2.066199334914972 +1.279172297032458 +-0.4385800494534281 +0.17557630411188907 +-1.0446917292886166 +0.4094218082101718 +0.3053345322511208 +-0.042804533704990017 +-0.7538149099278381 +0.14226086734708868 +-0.028403343964443883 +-0.1845123366175977 +0.4427360329837772 +1.0253740921013736 +1.538855882198877 +0.3598467227919546 +0.5875603350211789 +1.3436475597726119 +1.0601572399162533 +0.4378962862563608 +-1.0161028346276897 +-0.2697549916424518 +0.8673174436450288 +-1.3575098245024821 +-0.3814225234083112 +1.6183830767250231 +0.27745366811806516 +-0.2572038136144182 +0.7879557331471672 +-1.064695145063001 +-1.927958055612285 +0.02599334467059683 +0.047478936179838394 +0.9203232618872975 +-1.2268443351167302 +1.7787788550392991 +-1.5381007801357622 +0.38263773000901197 +-1.364794607147365 +-0.15820208514434975 +-0.24163953461494952 +0.26716378726033396 +-1.1554831380510782 +0.7120773235374662 +0.4925966890409565 +-0.6064192626348373 +0.8889334922686424 +-1.3463288721677542 +1.0069646422203244 +1.765352960449221 +-0.5817003063128859 +0.49288162185734363 +0.21468168581854752 +-1.4846203593810734 +1.0179054588688419 +-0.3346712505197862 +-0.42883248325406054 +1.0315199086353688 +-0.5213541904463107 +0.8650786283296585 +0.401031841586423 +-1.067543062754412 +-0.09720951568522179 +1.4882055927224687 +0.9465864339766087 +0.4407030608167036 +0.3697936769067162 +-0.0006080954943673833 +0.4480419984977911 +-0.44610040231053605 +2.1530706488971347 +-0.05680758771746022 +0.8329359702744177 +0.16112261702187822 +0.792040234035573 +-0.13772836787712045 +0.07753432945861129 +0.1218692844585247 +0.6246315363264597 +0.3916269123243369 +-1.4390245811228084 +0.033904241967934734 +1.2549568663370194 +-0.23150162679526376 +-0.5389787857974818 +1.8919345624053572 +1.977850213071629 +-0.3966124822565389 +0.004196626905056761 +0.8649025609068441 +1.5280914703045276 +-0.628173779291751 +0.8838210719290766 +-0.10301764008403524 +-0.2889541375672139 +0.08695230098536784 +-0.19831446657840268 +2.6674504567858595 +0.09681064705364427 +-0.5645993667744608 +-1.5027633688717914 +-0.34953575416209604 +-0.35735825655036224 +1.8665454829492443 +0.7567330493878769 +-0.8003963960250374 +1.9674253894885991 +0.8390276131934888 +2.0415725206173336 +0.4073749478455591 +2.4437882580029537 +-0.9375193014651053 +2.074486987876393 +-0.4706286911471712 +-0.09852331183623064 +-0.5657169540770844 +0.02928075643923453 +1.5410728116476242 +1.9642058795388464 +1.0271737818878641 +-0.03966552514988653 +-1.0501312540187542 +0.4195348807543381 +-0.9676481851416554 +0.21506201397352084 +0.3207726328847261 +-0.14464970670716537 +-0.011886004031352704 +0.358327809222576 +-0.6046305958688758 +-1.0337525923412818 +-0.8209997762928523 +-0.7087454544406989 +1.6621944726276678 +1.33150834275908 +-0.31611597597681174 +1.0090351523092824 +-0.8693550602985283 +2.3743821070414217 +-0.4860969305480195 +1.2179349834862223 +-0.640834251593063 +-1.81650674141358 +-0.41416006232339087 +-0.0842852159107656 +0.5080157975938056 +1.1086571518586827 +0.4814493819876181 +0.1319968072629058 +1.1148354014579676 +0.14991773808153477 +1.6238520004775916 +2.6165026662070705 +1.0592607752032919 +-0.3042703852006516 +0.7069223222991128 +0.4129988849482207 +-0.38594348142915924 +-0.2635115314974777 +-0.7276227621740073 +1.3719860753863757 +-0.24270366174642088 +-1.1070078598487223 +-0.8512918681598529 +-0.6197219489092591 +2.016112729041194 +0.1553921973379822 +0.4165338239940918 +-1.8923731525403429 +0.18757397519051014 +-1.531910488065769 +-0.049087453865025305 +2.4517123250840855 +-1.2811634480350254 +-0.8985701615401582 +0.7094809639529166 +0.26829642378004853 +0.9725035462765602 +-0.550463780045868 +-0.6788008778565775 +1.1423117703382026 +0.9686494960951288 +1.1960762518767638 +2.562327281625546 +-0.09713610602659445 +-0.5736399961737636 +0.8073691451458054 +0.8880694892886741 +0.2750384266483562 +0.035909284428600086 +2.3685164737124946 +-1.0652179957145702 +-0.313918218888122 +-1.2013796557953331 +-0.028002229263854594 +-0.6843816163330418 +0.5205110384569231 +-0.4302021937333851 +-1.0816709372818798 +0.1586430181936621 +2.1206897584857822 +0.8149663566278115 +-0.7286081946803837 +0.31113855617873065 +0.7571682975087223 +2.086756865513243 +-0.4522567207012437 +-0.2130515503784996 +1.6322989037779647 +-1.136172624714986 +-1.7408235185218832 +0.7774461936260683 +0.0790931485234116 +-1.0267856671066726 +-0.1018014119325858 +0.5893900968203897 +1.7255348186809634 +-1.1162911563520805 +1.280581097050053 +-0.15282248387809388 +0.28509927107631 +0.3272269565248911 +1.4460499151422213 +1.3281392783463004 +0.4606239962924887 +1.4046214936337535 +0.6996247541516841 +1.0347728659375348 +0.43151949024882397 +1.5747652185559091 +-0.006394562660284264 +-0.3405394724817672 +-0.1130775547237351 +-2.09250631257288 +0.13564308726619048 +1.16293533042098 +-1.1406935908288187 +1.9674821725166254 +0.9282901172755424 +-0.4051627366693139 +0.7942001308963352 +0.5962424931536736 +1.0661870621280536 +1.3138592366684054 +0.9193642017628658 +1.3004682910208607 +-1.1711601423691504 +1.5491918957157844 +0.496937651221855 +-1.0750252707730534 +-0.7717848916665278 +0.3231712900583267 +-0.9114434992991602 +-0.5237621330244833 +-1.289695122923207 +-1.5503035455418044 +-1.3101421891116944 +-0.1559988393078176 +0.09255120293591532 +-0.19936560968272743 +-1.2806103948873684 +-0.14472619295951505 +-0.0020394735312094514 +0.5164917786459285 +-0.8610841974066301 +-2.749729842978522 +-1.0804400307380546 +0.5106793001677035 +0.6773500893903555 +0.7056811935499703 +1.3687646664362088 +-0.2954285656682946 +-0.4199274251476379 +1.028874639455589 +1.2024433603704543 +-2.525187986182715 +2.680150376821378 +-0.6770662383200605 +0.6697931907620212 +0.13842640325814498 +1.4517876900360633 +0.6694660611030168 +3.6979781523299478 +0.6664496195088546 +0.47627102533125243 +-0.6831232730978971 +0.2149766596316214 +-0.24175756886968564 +0.34769542815226784 +-1.5105428606058224 +0.23862809217867842 +0.8998359278753197 +-1.7487869237287057 +-1.1238538009179064 +0.7400028587582744 +-0.46391665162168405 +0.4511774810365649 +0.299097506263858 +0.6491306761528888 +0.05653079284849613 +-0.3374678876001629 +-1.3195585952261097 +-0.25845800776111627 +0.9415091366083757 +-0.3358340747965638 +1.4746379059583135 +0.41208008359384385 +0.5275045959438074 +-1.9533745135515657 +-1.2811042937791304 +-0.38487500010052933 +0.1382676620154556 +0.5671120573812782 +0.147302466853873 +0.3180663089975624 +0.6176790879434725 +0.05244794754024412 +0.21355075319256014 +-0.678990982306402 +-0.23217661441812026 +-1.2616600826525877 +0.5510739282427639 +0.04614229612685236 +-0.7249260964872748 +0.46512310177838473 +0.5084750997164954 +-1.1046093551319718 +-1.3918222571778596 +0.6357822484004989 +-0.6369310622443048 +0.9751750130926079 +-0.215918326723594 +-0.84535152871658 +0.6575854948818975 +-0.7112485555134526 +-0.3992936882776549 +-1.4499708994239278 +0.39431361357379213 +-0.15274696742200405 +1.2077542664045977 +0.6847103554356022 +0.6655479508810478 +0.006626610031813196 +-0.10470298611094991 +1.4490011699087622 +-2.222182800167926 +-1.289354237703813 +-0.23343381529862617 +0.5822926784375628 +-0.25174764808445793 +0.5269935824716594 +0.40120164979007444 +0.12512311565887135 +-0.0916166314552942 +0.9533744207835851 +0.42311964472781427 +-0.450743221494345 +2.4113051200080946 +0.32692912793102735 +-0.5982450887260461 +0.8709255531467722 +1.0822391777141767 +-0.6117919115107293 +1.7376264617215418 +1.5493869096218431 +1.593854534485795 +-0.45995592960241216 +1.2305530889868619 +0.7182943032039822 +0.1341464353149367 +-0.4745441558555388 +0.017184962736261078 +-0.596998368107729 +-0.19741365540760708 +1.5568120110684303 +1.2874922137360485 +0.5612429145830525 +-0.23660524959531326 +-0.3510992479373817 +-1.358375567652577 +-1.6184071049803554 +1.4040366067529069 +-1.4777621115275115 +-0.41377139094682824 +0.38157444978898536 +2.130985968560063 +0.5424876126752749 +1.3078332279810339 +0.0857652485910418 +-1.1682453814122884 +-2.0085220073250243 +1.1357319484242816 +0.7485874750265599 +0.362993159814215 +-1.824491372843992 +-1.0332321402915157 +-0.10806218976392867 +0.14182982273508152 +1.0732308643137878 +0.2676612535508777 +0.06324098788095611 +0.8279596270616729 +0.09793997119637289 +-0.7745271293087521 +1.3820821422596885 +0.4965116549219473 +0.47863018889017067 +0.08154379946127445 +-0.8355968005609438 +-1.358094874582965 +-1.1496873448170002 +-1.3442830449348313 +-0.6925452185585584 +-1.4774474201632313 +0.1550630101021208 +-1.3426479370775743 +1.0064992077365127 +0.6724830706242244 +1.262582574234698 +0.8979809337598831 +0.7292435339765511 +-0.7889302667876492 +2.2176950972119958 +0.6398659934507027 +0.48358645043847026 +0.01379891925302823 +2.920120889629805 +0.7867142163116002 +0.22506308782385775 +-0.2603098770624625 +-1.0455620864218922 +-0.8542423724431241 +1.299935488999902 +0.40652487481070265 +0.6400646671079518 +-0.045072107297613684 +2.230479856359918 +0.5326063493640069 +0.25124354956596767 +0.8971313455533219 +0.02285810198468677 +1.1477842959637732 +0.4717108615622739 +-1.1836360704054183 +-1.8409273733635627 +0.5592594317107064 +0.13351398805685127 +1.3579483275645161 +-0.8009024602079566 +0.884149494549367 +0.21267521317134624 +-1.3221477858442303 +1.3771409858541006 +-0.5539886004230409 +0.9911920941630766 +-0.12708587582296327 +3.1478656600583204 +-0.3852221840552008 +-0.7588467409647544 +1.905693383607005 +-1.5826497858555302 +2.094874907229495 +2.773012025809309 +-0.09097015802694891 +0.5165643656296954 +2.273110919195533 +1.0411908106928551 +1.3245114396877817 +-0.38714602350169636 +0.7081361097071645 +0.8832209115575388 +-0.7010808227056209 +1.5147904980515987 +0.5425108039755632 +1.5684171311218487 +0.4602767472670886 +1.038291111113826 +-1.4821924901013217 +-0.4457795415451973 +-1.4235637494060767 +-0.05843974584066339 +0.2206373883247093 +1.4756228961028632 +0.08178951480218141 +0.4294218601931943 +0.011397720790373461 +1.1621882064431288 +-0.6008636275045282 +0.7899754982645887 +-0.2945681793280924 +-0.37416159783507097 +1.1828495177909586 +0.7579312433951858 +-0.9803480152615041 +0.2963154935303343 +0.5438029433750587 +0.19997247725242775 +1.1760225980888508 +0.8833985297750673 +-0.30139203833515293 +-0.5704110762301484 +1.068757255822224 +0.08782781786658125 +0.9691650437768525 +1.7854417556164741 +-0.8559889861344705 +-0.33812445966465343 +1.3652577377907262 +-0.5824374832713433 +-1.7389869145597632 +1.6342379434898207 +-0.22346414046525193 +-0.11101856909808078 +-0.7669022458868221 +0.9084602628024293 +-0.37643844920969183 +-1.1597528270011204 +-1.55539067592519 +-0.823820862471691 +1.2753663401866442 +0.5668771011802578 +0.6646454249561629 +-0.5715047606698784 +0.0958308279825154 +1.6770384152523252 +-0.3267756855680357 +1.1874096859579861 +1.0646958000063036 +1.484572302211001 +-0.4716129762841671 +-1.1211807435205605 +-1.316833402224791 +0.4299221396070196 +-0.14380942457771684 +-0.24095498432284773 +-0.11821152902830862 +-0.7831718354291981 +0.09493545649933022 +0.7547278364442995 +0.35836909531852446 +1.1510694035923839 +-0.15810646373586096 +-1.1808430824882674 +0.4440265253459133 +-0.2828951632040667 +-1.5914878039540106 +-0.24951824286041457 +1.37954705244461 +-1.232490657647633 +0.532336897059523 +0.8602994145667038 +-0.37351723736086373 +0.4061833901286957 +0.5632246403929703 +1.4489663020943924 +-0.2581618468745478 +1.0948785261930067 +-0.4608423439149225 +-1.3559594993486597 +0.855931479276968 +0.39566856190157407 +0.09710727196565971 +0.4003653669527595 +-0.6070841831261452 +-0.5714536095648495 +0.9968055587505017 +-1.7840111319338645 +-0.041849307633435334 +1.629752339678787 +-1.7701849209119946 +-2.3383058332516766 +0.35145539785293056 +0.09665275641371296 +-0.2549936764427113 +-0.5582207434439171 +1.423792906821755 +0.08292761537346971 +-0.12528900385812897 +0.19746518730543539 +-0.5821422225965789 +-1.2697123645057724 +2.5041667516050117 +-0.5435071015033427 +1.2805481990897056 +-0.27141241139397615 +-1.5409612052596207 +0.8861252690220941 +1.5500425967631615 +-0.35778893747152973 +0.4666809803587525 +2.651445808102711 +-0.3644162183085159 +0.20917523006577293 +0.7325429326792078 +-0.8061333671935731 +-0.03734499674361491 +0.12390789068248943 +0.439730451358399 +-0.839530134079369 +0.6325007487600653 +-0.6641609433126797 +1.6291989813856247 +0.8864982485220373 +0.2807932178311149 +-1.7328324542739793 +0.20562583050088964 +-1.8515604082148325 +-1.1996936564591472 +0.4190119452893982 +-0.536981593343709 +0.6243644815063885 +0.13117601121725234 +0.5018234987920287 +1.1183982735622733 +-0.4404063850482419 +-0.4977240782959901 +1.257715634937693 +1.7770924521701719 +-0.4887912554575732 +-0.16078253308274465 +0.8607273107888783 +0.6471445400372847 +-0.5403848237520475 +0.7226428768046724 +-0.17362543369952643 +-0.15684470267595935 +-0.7422207365774102 +-0.5820457624640119 +2.454623800060779 +-2.1452823374489505 +0.8556524808550426 +-0.911711150409676 +1.3826482900969899 +-0.10515025757610064 +0.5119612907909594 +1.1260932827370889 +-0.5555850302802333 +0.9140035908885377 +1.4659552479204683 +-0.35629760420425904 +-0.23538932846998445 +1.244264756259445 +1.7725953530813792 +0.10642030456228412 +-0.4511351197885827 +0.23255008517177472 +1.4690727317733339 +0.7274076757563126 +-0.46214369835821323 +-0.18914163778611276 +0.35635964484344285 +0.5259141010890197 +-0.5808323548590367 +-1.2374395559458669 +2.6797766300603483 +-0.9892967481481778 +1.1277448720884202 +0.21919038263409413 +-0.15642976741169784 +0.06722740718059256 +0.37728694715530875 +-0.2553176445417456 +0.19924972237556898 +0.3238657759650568 +1.3725135829449369 +0.6560389170517884 +0.8069520540192848 +0.9405536400267392 +1.0444292379590374 +0.2454551735225721 +1.149944924787935 +-0.6073787073195279 +-1.0266973237791368 +-2.410621397544811 +-0.017652886820084035 +-0.781747043075181 +-0.9715499378157451 +-0.7393524258002182 +1.7519824455375548 +1.2042109493038848 +1.4414511028569046 +-0.2989812818510331 +-1.5877092760984672 +-0.6350731388909361 +0.09662326297588297 +2.3595180347598363 +-0.23135263305676845 +1.3253684015000968 +1.2877714619390837 +-0.016406368523743053 +0.3282981575346147 +0.07684613740478115 +0.8699983335472947 +1.11631334481477 +0.08317320169232831 +-1.370910520942273 +0.12061573320381741 +1.6233846328177015 +1.099180573020747 +-0.16732080116867365 +-0.57218154804481 +1.9770468170352236 +-0.8292280353676225 +2.0788970203767545 +0.6861507323415885 +0.23266066637982002 +0.7569617194946353 +-1.8574769259822232 +-0.9000458813322003 +-0.31994954234617734 +0.6691966237096416 +-1.111291538117263 +0.6619318483999148 +1.6238779323508894 +-0.1083052008813557 +0.6770044324484263 +-0.49052757654744383 +0.16876977664522952 +1.440963534233286 +2.8844953780288485 +0.8307614920207261 +0.4241557955805578 +0.7066828308637986 +0.36187725399981535 +0.3050382156553555 +-1.4002825114922892 +-0.46675419044158395 +-0.6734579100666267 +-1.1831555359429522 +1.394191369253104 +0.06296992620673766 +-1.1286884632243217 +-1.4619955232580881 +-1.653266380386268 +1.2876612806618715 +0.2726197186666408 +-0.3532857155900101 +0.10963853945163488 +0.8204917063927171 +0.1162396985167445 +0.25793729540875504 +-1.31386211770855 +0.6941412832761519 +0.5998168294631911 +0.7713929640919448 +0.8251978348227446 +0.24816909023003064 +-0.39791977343039 +0.0516286823000687 +0.5860271660106403 +-0.15408967275619223 +-0.7778398569094773 +1.768216184116797 +-0.5682748231502225 +-1.215889600621365 +-2.4816250612091473 +0.7566359228485726 +0.42970386145315087 +1.4563974530301917 +-0.421552135265451 +-1.08407356273903 +0.33192818326091433 +-1.0169766414542665 +-0.7242610950227851 +-0.5144568938030659 +-0.5649663576782047 +-0.4646563913927646 +-0.3983762647174526 +-0.22004434195145278 +-0.6895686891394903 +0.12454248668236513 +0.04607522288537033 +0.4037113838830687 +-0.4920391273136917 +1.6862179803250659 +-0.5007939345854971 +-1.8775559045001862 +0.591581707613821 +0.2921047456100207 +-0.5488369277042439 +0.18189787544242403 +1.52116143498705 +0.6396360601730187 +-0.15449909227726977 +-0.63080214389388 +-0.28721517838659527 +-1.2293702059968958 +-1.1465728267145212 +1.6590593872443524 +-2.3109052821410794 +0.09983393946405587 +0.2060671707090354 +-2.1298391299313524 +-0.6230393856279974 +-1.358953100614956 +1.551695153170227 +-0.8811367442004698 +-0.8108778865938122 +-0.36181438746575645 +-0.4488014285387397 +0.19007212724065908 +0.7254378239654562 +0.12862621452721165 +1.2710096783475289 +0.19340810177090065 +-0.3730416655520554 +-0.22616698083119025 +0.6952525650574088 +0.9233193798039776 +-0.40258048974194605 +1.0245666041970556 +1.0987232440955137 +-0.05820783186114048 +0.3699322777728846 +-0.2881053174116157 +-0.0721297202813736 +-0.046124483453624854 +0.4475668661002609 +1.3230711210869535 +-0.0673380266522452 +1.2179485871887303 +0.9650794276583264 +-0.31142851768594737 +-0.76114690499524 +0.19011306745597334 +0.11543394253197815 +0.04681831221913513 +-1.347803978216084 +0.9692771529895091 +-0.8122786317772479 +2.4749276046583972 +0.7822728028801771 +-0.20174868446640015 +1.8609628030839485 +0.6284809986861262 +-0.8936317291823523 +2.3325638018146355 +1.4367452211796103 +0.47200200704079875 +1.0166163761865756 +1.0127692278065314 +0.904220569396564 +-0.6613286397795063 +-0.015260428769946877 +-0.3272607661207937 +0.03172034213739944 +-0.13408226186916822 +-0.08890464723924485 +-0.5093162840324816 +1.5765061773894715 +-0.7036642098077586 +-0.5355137070235761 +0.8675315516958614 +-1.1308502235178783 +0.9023499853421273 +0.005878029737790336 +-1.1130324499657076 +-2.4334393354021557 +-0.9792606042737737 +-0.7593235278436709 +0.23872948572804342 +1.1508365613943958 +-1.3166307855104071 +0.16050323610718137 +-0.12820787132339045 +0.9731997498126089 +1.8530532416120202 +-0.2652130237559444 +0.6609228409261791 +0.7652273492085722 +-0.019998204120835222 +0.23236223151268023 +1.9993243216744754 +-0.5592314943187748 +0.3195593952222715 +0.8853890064904526 +0.9829490801312147 +-0.8088536468523129 +-0.4857875552494444 +-0.004975370006673002 +0.46331189199790407 +-0.6337330885926085 +-0.12004760717490548 +0.13237666703422785 +-0.1902503299214826 +0.49387091923280035 +1.0744233978112652 +0.9526701911961981 +-0.1323890490264923 +-2.603889981637895 +1.2146124043987525 +0.11136618098692667 +-1.77258142370055 +-0.3469569311271131 +0.08564251506078768 +2.611594735905479 +-1.0452397522856067 +0.5990942970046629 +1.8212863567595972 +0.7534622637600948 +1.4594722410691794 +1.5967604080032933 +-0.9650366570427431 +-0.7969813384726113 +-0.918117183325551 +0.20886246994791316 +0.9089828244306798 +0.6209420477407332 +2.1410509549063397 +0.7821011659108271 +0.01475226971152685 +0.2383920751788755 +1.7096378612886345 +0.9956773317900421 +0.9379445374508757 +0.7634193672831455 +0.5695227300426483 +0.7623400271762614 +-0.6972061621567189 +-1.1617776651098577 +0.6276795587400046 +0.21392101927821364 +1.3534801982221032 +-0.36458018828768546 +-0.7374355145442656 +-0.9621406933315244 +-0.5773132630848239 +0.06234905153977033 +1.6046654934124995 +0.30888315070082073 +-0.7236378775714916 +0.03444761752526884 +0.4519321024028991 +-0.39980742562142846 +-0.6122668348849546 +-1.1539593526779655 +-0.05626148356391719 +0.09021842184883017 +0.2939870506768224 +0.1701384004973595 +-0.2824236025276138 +0.4832921684882478 +0.9256375106081983 +-0.8493181660231712 +0.6733386886221829 +-0.9949215628978738 +-1.0513487424089112 +0.615785954171238 +-0.026817363599353383 +-0.1908278729226952 +1.1085231497008352 +0.46438397679381954 +-0.23562768938981365 +-0.7016273772487348 +0.4363639208747443 +0.017075454592124617 +-0.04682136717962804 +0.7669882078056617 +0.40270965247058144 +-0.5612960933151725 +-1.1966563575605766 +0.8669042502692752 +-1.2513654019312217 +-0.6214234014686713 +-0.2567572618873129 +-0.8389849592101211 +-0.6422119241266259 +0.9710153499698136 +0.7973817723962144 +0.5383320499971951 +-0.1702059178874546 +0.08412579932802021 +-0.5696308228447879 +1.1789692842944322 +0.899290118536553 +1.4520170224426658 +0.17550669919945414 +0.6892806570944322 +-1.8992472675184058 +-0.7243813976749768 +0.018470929270117148 +1.1535170748011974 +0.2017735484286274 +0.4109866280734199 +0.7108792020559722 +-0.42543528316600376 +-0.9449501319612876 +0.47265417914973207 +-1.5712793841807007 +0.5340064633733361 +-0.15486203335021104 +0.02228365583266409 +0.2656137301723211 +0.8076279983926479 +-1.1843426445941914 +0.05457499366797253 +0.3646734849913163 +0.13191014740315812 +0.08685818486502393 +1.1232196962609713 +-0.25511532053330843 +1.0809248096507331 +-0.8182110890057748 +-0.5561858156319563 +1.0375660415003172 +0.46091907842579505 +-0.06078240534463991 +0.801301295911144 +-1.3997917201741807 +0.7802273065826547 +-0.3035049638700489 +-2.3189609679284473 +-0.39577763857729964 +-0.6172163156297907 +0.27724900601195235 +-0.5092183525498213 +1.0644879476749536 +1.355478113788748 +-0.7447538959847041 +-0.5159785977629595 +0.17321780883243162 +0.9979037400710719 +1.8254641886555665 +0.5137651008473507 +0.7115455870858788 +0.6645188810548076 +0.9053004471891708 +-1.4328116300846299 +1.4300517993506037 +0.2639067386680266 +0.838677517238674 +-0.8316049141348898 +-2.0572803088863116 +0.017237452605121356 +-1.2348306255633652 +-0.16521378503441747 +-0.5093354810830527 +1.690896040870111 +-1.8800229464043026 +-0.7692061417093073 +0.18872928911628728 +0.5906220022765668 +1.3629915152581293 +0.005373820123711015 +-0.4638375269070468 +0.008854943282941785 +-0.34994842506893153 +2.0503226162257358 +-0.007693790257141647 +1.1635400849014395 +0.6656572800671603 +0.5291826794186695 +-0.7063435956022732 +0.3524275546710609 +1.6092752024620225 +-2.035866130535638 +1.9636918641979717 +0.1956770990364833 +1.0736621981818861 +-0.04645401594363882 +1.0078045613228745 +-0.3793266763849491 +0.5360708308798297 +0.8126597322523152 +0.6210042788614667 +-1.0161536172497563 +1.392256346814862 +0.19691974692923064 +1.8221748936621691 +0.40656977435764163 +2.0306771113706605 +-0.02736054203859306 +0.45898618302116934 +0.3069597970241615 +0.21975964985767998 +-0.7947977501789688 +0.9887418777808616 +-1.2825512519753688 +-0.25895424406122386 +-0.7126778121467918 +0.7785674202118006 +-1.5655324542129618 +-0.4886311055894328 +-0.8059403197325703 +0.8772577815662045 +-0.3585216802273876 +0.9725836724670401 +0.061049072169750446 +0.036870058353884766 +-0.34628197502983304 +0.7904323109962521 +-0.02201353752864177 +-1.221345630086332 +0.5001478726538497 +-0.5726902465313886 +1.7843907887428083 +-1.734850125325094 +0.08391965794006936 +0.056748337460987425 +1.2111900591290237 +0.2577459451062921 +1.5215197015164463 +-0.343335973785057 +0.5804500793596217 +1.1558441425604464 +-0.08579693358383222 +0.7373147645561309 +1.4523606776063618 +2.5810392118411167 +-1.457296669079773 +0.6125525573833919 +0.0616673747267876 +1.6212838626394726 +0.9321271116250711 +0.07183903203374795 +0.42981016030581337 +1.128678870289832 +1.9876212626759162 +1.7469032014932424 +-1.927727592249891 +0.20768068996502548 +-0.05535352476439798 +-1.3619127224832492 +0.12793727782705985 +-0.5375736649062056 +0.6327977235218263 +0.509511098708328 +-1.7060721699496553 +0.9575002258490836 +1.4775312194273373 +0.2976058562822328 +-0.39608459148172703 +-0.16496961797337373 +-0.6825550087638497 +-0.8983742039358675 +-0.8278174425457174 +0.14602893542632994 +0.4955145427308621 +0.6814050845247153 +-1.660019512412794 +0.6255315195433548 +-0.6153695531626405 +1.5866252886003347 +1.4415701056706853 +-0.6517307288354767 +0.0988365466404955 +-0.5622030192102443 +-1.9717452589977518 +0.019668270869736465 +-2.0332677709550167 +1.2255183315597393 +2.0624542049488293 +-0.18702349383686812 +1.3771562188217976 +1.157976044846877 +0.47554349746260854 +0.6829544631179906 +0.1208285678075511 +1.184632631320179 +0.378144329553867 +1.3007656479138578 +0.4129365797577975 +0.37538025157644195 +-0.847972503077038 +-0.9648470991674984 +2.4380289313664854 +-1.272557325172425 +1.4810177009747825 +-0.2950714701471087 +2.3407642706615723 +1.0739946335697832 +-1.3974881259203171 +0.23134580628849094 +-1.7234015815280066 +1.8253091380490942 +-0.7296124422547103 +-0.6514491447986372 +-0.298495962726599 +-0.9632625926487759 +0.6101406059151587 +2.1308105592689817 +0.21492292443410002 +-0.6252626542665131 +0.7403464039150386 +0.4370527875418825 +3.3411563171233736 +0.17644151055842522 +1.4808335356670095 +0.048751957600273205 +0.6647212528653372 +-0.09998210193309204 +-1.5119339904846631 +-0.46541731967291444 +-1.3241381772095158 +-0.488065222055296 +-0.028864527706136123 +0.6635462474929759 +-0.019210778723023708 +0.8508119576440499 +0.1925169956776205 +-1.3417995164527359 +0.6025557480716488 +-0.46012602936096025 +0.038908402102884904 +-0.6217486046968986 +1.6973090493175615 +0.7373914743240669 +0.5145003886773607 +0.8665371126718037 +1.3622236887149028 +-0.22172512299386615 +-0.41963867927863596 +0.6714930640066329 +-0.6484533782158172 +1.64063868969409 +0.6086273447411491 +-0.5396852979189923 +2.4272773137670276 +-0.6049064835978252 +-0.6088777697287929 +0.34962879250619805 +2.535445692118138 +0.5876822091886782 +0.05279243681617918 +1.4611263270767656 +-0.9417681686460371 +1.479875336054064 +-1.3142175562994562 +-1.3162535952118095 +0.8568612514218854 +1.0732465005325547 +0.61606646172662 +-0.8530545062977652 +0.3159296549255468 +0.5357718555198763 +-0.18903629680678524 +-0.9647977575142705 +-0.9747982110512166 +0.5595772825712026 +-0.22921312007366162 +-1.2684255054576732 +1.0622883754037002 +-1.3877328833245943 +0.7112753137414857 +0.4967693904461396 +-0.4447415568384746 +0.744459263272112 +-0.8867216389190455 +-0.8027195806064259 +2.2159970850261184 +1.4622719128958441 +0.24564503396438456 +-0.548054988662048 +-1.5581919403032718 +2.005764505381067 +0.1690138494861152 +0.28380164136286934 +-1.452034079888736 +0.033544397956097594 +-0.4290490909286422 +1.4779844993962985 +0.32574965104947295 +-1.3574829677936966 +-1.138576288817797 +0.39831751438895613 +0.33951372105659045 +1.1701394693288756 +-1.29756246117952 +-1.4691865836098486 +0.43722690354085425 +-1.102775310768499 +-0.4158210703291849 +-0.30777044203627546 +1.1328752220809282 +-0.9210890958336804 +-1.640839941454587 +-0.3667181617356038 +2.096882576185715 +0.4770708008056486 +-1.4588514331152234 +0.5797705341935799 +0.7642655239916951 +-1.2193934234037733 +0.14261084907745386 +-0.08503710243638252 +0.7129797640882629 +-0.6795064863624014 +1.8702831663225952 +0.7606903682542412 +-0.2284825738800449 +1.0915176291689799 +0.8669772385309241 +-0.11047983965721037 +-1.1693399238269424 +1.3417444233032465 +0.6815357918792005 +0.6470311918381413 +-0.6031668921607377 +-1.8166110514844258 +1.760302098291604 +-1.2323345538416108 +-1.4033236886076679 +0.768448541486551 +1.5119334147616934 +-0.9350690631208545 +0.19008242267006029 +-0.955130249075415 +0.7326867385083907 +0.016730868126284187 +-0.9441737991756696 +-0.3828062231000249 +-0.08152020782366065 +-0.5022211447218126 +0.04208062377261412 +-0.13127482092400317 +-0.21483297242837296 +1.712037986162943 +-0.08265780928324284 +0.11844157045562571 +0.8907923560542391 +0.03146841898192099 +-0.5919774538895607 +-0.8006658190377774 +1.8579608046760716 +1.0982683810996414 +0.7944949678765404 +-1.4851249880703468 +1.0031783472062203 +0.5722135516612603 +0.5262914505467016 +2.2889122317317625 +-0.7634922650707462 +-1.073978739266046 +1.3881038171847002 +-0.6406982674904819 +-1.0898402210772489 +0.6192643955353326 +-0.37457113121596264 +1.8048683427388643 +0.37233892615928116 +-0.1876313369620889 +0.5137440414280559 +0.41046763739553604 +-0.4768943759876777 +0.6220860373184542 +-0.6501370518480376 +-0.5189784678405732 +-0.4828877676542598 +1.0027350182763053 +2.0774226129589213 +-0.5138492925910971 +1.3539832088131296 +1.6118695528345512 +0.6299339828967534 +0.030122049993206584 +0.7699695760619661 +-0.191737305210406 +0.7000623847150933 +-1.2431435835462146 +0.2719004413092697 +-0.8109905954899432 +2.1473075023443924 +-0.31425368236828355 +-0.18807739420118846 +1.3213478988101237 +0.702242910508013 +-0.062290136281198116 +0.707329025355364 +-0.5682325143893578 +1.9438024249369423 +1.2007759035493946 +1.7036180373073797 +0.3498327566496791 +1.874680287849774 +0.23639881700800747 +0.9357579059684239 +0.26100012420981245 +0.6671853006138581 +-0.190527852968137 +-2.227165811613448 +-0.9922151199750289 +1.4532395531654174 +-0.046782115976259864 +0.10829737700573372 +1.6739369042807601 +0.3534404345534631 +0.8423317199154041 +0.20009361632442133 +-0.14855641716542228 +-0.3212064647221008 +1.5792472703148956 +1.073307541886471 +1.8562180886093815 +-1.2652918046445663 +1.391353189706275 +-1.8794783033056468 +2.1088915281949205 +0.09401485763939568 +0.8165505785357291 +1.5887501213332078 +-1.7722171588604372 +-0.22144697773070893 +-1.2938152356074024 +0.48268569615681556 +-0.5375989292163981 +1.0911139640884502 +0.1698716874918963 +-0.10171814302456877 +1.5586589585610178 +0.26535485631396516 +0.39148231730558425 +-0.7745625717460368 +0.8679185651808713 +0.9427096502634669 +-0.29636582194527494 +1.374296689501818 +-0.02561363632250785 +-0.5473946107945576 +-1.3954859853898611 +-1.1089390135858879 +-1.0368644870209298 +2.2209573380616963 +0.8132278899014825 +0.41414025722270653 +0.5757798756530206 +0.8449107668412675 +-0.17363750807337708 +1.7410503424440633 +-1.4879088971145007 +-1.2495625836745843 +0.8420304033711112 +0.5809583098638639 +1.3991784202419961 +-0.9396947150612129 +0.3670577836897946 +0.4633128657756747 +-0.21847627919223572 +-0.7521554493582632 +0.4466313212472867 +0.31130361292554126 +-0.21525099030960282 +0.24554477719064455 +1.1867077537903858 +0.8600717387696246 +-0.4681796819339994 +0.6842506165166371 +-0.7764585463536416 +-0.8934303934087948 +0.8190715546528756 +0.10336398940048175 +-1.024054393395088 +0.7823412493569867 +-0.5961429537621016 +-0.05256449225256782 +0.12672461972430615 +0.941247529374149 +-0.3615794264589721 +-0.9596046504320781 +0.8742743899913249 +-0.3717430155871255 +-0.4363738873406341 +-1.0627922248208028 +1.5303235370365658 +-0.5032993485841818 +0.8545027001406711 +0.10287524331490248 +1.2387885259698872 +-0.05129727176663204 +-2.0692031759774903 +-0.7138339461254446 +0.8217351426646788 +0.14928511226516694 +-0.18990874668450514 +-0.4041228269892416 +-0.8026880284991447 +1.102718714680544 +0.6402667298041864 +0.2517941804482199 +-0.02408667419906868 +1.3996952756316017 +1.0244872523359567 +0.13700268346220534 +-0.31756793859198584 +0.22071728509159988 +0.13706770581827726 +-0.7421828576453114 +0.5446449368403312 +1.2467383413556272 +0.5565752928288266 +0.047769873943517005 +1.9815410446935895 +0.3761171213612433 +-1.6044718289783269 +-2.0947211055124555 +-0.9250033334793617 +2.0387063590129575 +1.2463878110577526 +0.10147401214072124 +-1.4765169484541887 +1.7922057196385746 +-0.3673095288116647 +-1.205374445283422 +-0.9441373871715075 +-1.2778140921260073 +-1.3918925382786276 +-0.787968248958409 +0.1607492191697285 +-0.49012147689087937 +-0.9774703731627159 +0.25776446950299114 +-1.4258007766482252 +0.1483235255521746 +0.5416587830815824 +0.9782641487829176 +0.06474286963632704 +0.62547420705687 +0.2179454267449247 +-2.3253800730741707 +-0.5113840295878241 +-1.2423883736563988 +1.333092632188741 +1.5972076979584628 +0.6196149421994548 +1.106685643322094 +1.2544209908183424 +1.1155392112254026 +0.1885744993371681 +0.6765618202434955 +-0.4492618836984493 +1.8720100568621107 +1.1272512883308476 +0.08532437064709342 +1.1013750968383018 +1.2122522659028336 +-1.273214060701584 +1.6591442067374695 +0.9401071493163867 +-0.19024856078015273 +2.0363738686278112 +1.7150937399569761 +-0.3047372655168651 +1.8098323042234121 +-0.6002736638496922 +-0.9018332397309119 +0.5400099809190406 +-0.03161298202350199 +-0.48232581754571835 +-0.19100971408960382 +0.10139958107856091 +1.1630843352293538 +1.8206552835507728 +-0.36016537313994856 +-1.6313882676045293 +-0.003883031913486462 +-0.33534779210168697 +-0.8667214297458177 +-0.7184086519790478 +-0.9273387752184039 +-0.20786696228894902 +1.718297368870471 +1.7184989742433128 +-1.5241228444017563 +0.7764779984553867 +1.1065451454736355 +0.028583604442159433 +-0.31907392624332376 +0.5444120368247931 +0.2159215602358029 +1.3778137015100207 +-0.050161634916398135 +-0.32225820678377637 +-0.3895059785509364 +-0.4895604121813464 +-1.3570439812857626 +-0.2643719198252031 +-0.16172143772711278 +-0.30459719289161086 +0.9201124098481693 +-0.8157226029610598 +0.7129104292185738 +1.2811856584837753 +-1.0691774018174407 +-1.1416886630784528 +-0.8654165437840329 +-0.2106295017881682 +-0.7548436927006045 +0.6228414353127307 +1.878610139106758 +-1.2042978497177586 +-0.8865956761331817 +0.5316311108405114 +0.07317618852480841 +1.3503803639357919 +0.5464888296959514 +-0.7410769327207017 +-0.4094664578760038 +-1.2384689476179482 +-0.8602508514396456 +0.4082633134603373 +0.9648779887679307 +0.6718638672510118 +-0.380945400081949 +-1.0846350737307262 +0.38513415238929644 +-0.41778473561387786 +-1.6752955851754439 +0.12921173333116803 +-1.074406945339614 +-0.305848915606318 +-2.1965849216684292 +-0.6757913698585005 +1.2837382658783218 +1.0294810510919339 +1.1989219238096824 +-0.5200137977174021 +0.17533527500620746 +0.24226204036068022 +1.4400384837950222 +0.44690670683270034 +1.1659775714357186 +0.045701417459360516 +-1.1660170164299128 +-1.7538625665289809 +0.4133122105028211 +1.2898774294873654 +-0.4580437099760326 +0.510440436214603 +-0.9293470434870204 +-0.348575112527138 +-0.30604480747763624 +-0.27131196697230225 +0.6697200641683064 +0.1796835470569691 +0.02188848297740653 +-1.4910397852164363 +0.4322525970564232 +-0.31659356766616176 +1.6763748841397097 +-0.06391271181415592 +-0.10718519730727122 +-0.9879484158046163 +-0.3808227860307217 +-0.27772471230571516 +-1.5796643611695056 +-1.1138138343450465 +-0.6552444430043213 +2.289016056971038 +0.26138848275235377 +0.32800479924085213 +1.345768306915638 +-1.9506298132134543 +1.452362282855328 +-0.2342425402130886 +-1.3286731854513738 +1.3929843117608636 +0.1125122334891134 +0.5460069626916202 +0.527963092450606 +0.557680600426965 +-1.892550242720916 +0.7293235063740622 +1.3686572995865363 +2.3086959640016547 +0.6504217868112931 +-1.3355999399399106 +-0.048597158483394465 +-1.4108228747951348 +-0.29225916225344245 +1.4231961617800428 +-0.5767834737166059 +1.0584438921293233 +-0.03408490573987577 +-0.5959908556223402 +0.8653999451324862 +1.5234603395272863 +1.480377856695763 +-0.3749676127207541 +-0.27992484556426517 +0.8177012061343986 +0.801878405044666 +1.77152110509731 +1.0522183463602757 +0.5813920915245894 +1.137210402139152 +-1.3097093694697681 +0.20745824453788447 +-2.359881088311522 +-0.3479456918766728 +1.5014888837809826 +-0.15176341173193775 +0.18551231307130825 +0.9576173087465989 +0.6788740187637254 +0.9234486130640991 +0.617405863373278 +2.0599379266922018 +0.4404193815736114 +0.3072080067082125 +0.18757706846998712 +-1.2982238830999087 +-1.640037025276268 +-0.1775051410603783 +-1.0867029350466082 +0.6052230640479492 +0.9337064365046672 +1.8390746327253429 +-0.18528737371335724 +0.05916482423403979 +0.19517942217738368 +2.1593866724314106 +1.3029574199735383 +0.7915613702398859 +0.08167357937284411 +2.2302189214090617 +0.699587188626604 +0.9138067962475209 +0.9595013545817455 +2.0590366894423724 +0.8224705722257941 +0.7506425486683297 +-1.3709027007272994 +-0.38985726135523224 +0.8271838830154606 +0.7247261180523193 +0.8361954325646234 +-0.30922013997645686 +-1.8201373033835038 +0.868672868147114 +-0.6633327126129447 +0.09911813232328597 +0.6763453197591627 +1.320036875607884 +-2.013299559087936 +-1.307600567878796 +-1.4318027317654256 +-0.9099914385045105 +0.9340914808364509 +0.5134482435562077 +2.745670710680617 +-0.0709025448312024 +-0.17984923330905744 +1.9658361145161867 +-1.6410720412193378 +-1.5520251469794346 +0.38743630035921356 +-0.397703940248339 +0.7582526767630952 +-0.13490548773024363 +1.359699443275172 +-0.29447211502217013 +0.0177443537065953 +-1.3050022982783516 +-1.4560655696229852 +-0.182312389759902 +0.2391648310343088 +0.06586815174573528 +-0.37970913580740273 +-0.7949397945631532 +-0.39459054946210204 +1.0202737788044782 +-0.6939750145599884 +-0.30691352385324355 +1.0325023188961213 +-1.4646885874510258 +0.22246122974010812 +1.457040342666715 +-0.05678624740927746 +0.9829973363960512 +0.9409464579672082 +-0.2924939768061884 +0.7927627790026943 +0.791331691466735 +-1.0519158535910818 +0.0140545051291939 +0.22035311288989015 +0.0223836500031796 +0.8689626819370084 +-0.4925077677380393 +1.1865335890818594 +-0.10754146582505175 +1.6184507610940533 +-0.9949816574248425 +0.5235516337654146 +-1.207358272628297 +-0.8002343123690238 +-0.858949883352681 +-0.4771567914963244 +0.34712678598585867 +1.3241845475324614 +0.15965941254148822 +-0.20530550526043012 +1.1349325512672421 +0.30653321725118243 +-0.1926344156894142 +-1.379816974466837 +-0.921068051484041 +0.683959653199113 +0.6920756547484345 +-0.33588528876869805 +-1.280471966518406 +1.6903081251286796 +0.21418824091104405 +-1.1305845518682696 +0.6147418229570067 +1.0575606230830483 +-0.3120047307525712 +0.4335040418902366 +0.7065735616131191 +0.23018960175344508 +1.1345823053669037 +-0.3630640222713848 +-0.8287583868133761 +-0.5121111423361784 +-0.6565925136387623 +0.01816268697437895 +1.4732071971427598 +1.2395033582327 +0.04798783317351574 +-0.3437135238192718 +-0.5810576333075448 +-0.8469918749544725 +0.05584183856017849 +1.3279931355317078 +0.15084494548538419 +0.8542029707471042 +1.3874421815372155 +-0.8680616386570348 +0.8056318285559377 +1.6404398732832417 +-0.9898734483689928 +1.3101404371237486 +1.0063654486661575 +0.0010593062670503361 +0.28211633422261695 +0.497963938430455 +0.029940060970704035 +1.2912921748378428 +-0.22926080580895158 +1.6395868423620956 +-1.50525586000008 +2.5498650177514364 +-0.4879596018433575 +1.5604340569419608 +-1.7736242780613323 +-0.5177564189246827 +0.5280879975553043 +0.21990751259210406 +-0.05689533000739003 +0.16580797889743093 +-0.3322380954391515 +1.0721504959610613 +-0.12903096690699745 +-0.12800972598538746 +-0.010470918991349942 +-0.9857211979864005 +1.1537797196924382 +0.2088931375944896 +0.9385646108363899 +-0.10956479531335878 +-0.640551855962357 +-0.5133035073728148 +-0.4944989292300338 +-0.13560109412130117 +0.7304219720746368 +0.5817599155797972 +0.5031378696833222 +0.562587216845194 +0.2329746049532391 +1.0139354406876653 +-0.5678559121173097 +-0.24548532762509256 +-1.209362387180273 +1.6733659104817262 +-0.6781495083484073 +-0.14618330808672325 +0.8075945535536622 +0.8200950104371931 +2.280013455203232 +-0.813033624544921 +0.6356056769440646 +2.579740329515957 +-0.6837043550289481 +-0.6194361904563022 +0.034483911754381535 +-0.09958153643306389 +-0.6838936364642986 +0.30002305796375456 +0.13708165864929767 +-1.0218995404664182 +-0.7199409792186646 +1.7443888351009573 +-0.16792914525667174 +0.4497832978519205 +-0.9863526193413898 +1.6301516394720112 +0.796679646551754 +-0.2580333033942081 +0.3725365211402264 +0.09205000128452046 +-0.8607751591386639 +0.5890163714891737 +1.2278753273614922 +0.5470733852876393 +2.6185558456492055 +-0.4619614472065229 +0.9033753846939053 +0.11561273652061985 +0.2515631073543385 +1.857615172625083 +-0.43926884130074184 +0.15135506208627825 +0.4676796628626666 +-1.51894178906342 +-0.4750592426524276 +-0.3764156527236264 +1.7055366220889625 +1.5003947552678178 +-0.945846565828391 +0.12714117160961752 +-0.9144193182131157 +-0.6300128325820588 +0.9052410510288189 +0.627778570341039 +0.7025373466652173 +-0.3205341411032855 +-0.5580608710079624 +1.3360146798159875 +-0.8220347903830596 +0.6668721152453295 +0.20452459474714077 +0.6633268347850321 +-0.09826425947687467 +-0.5107303564169435 +0.9761323121336706 +-0.8206495839169765 +0.023634360774693997 +1.1563946279212827 +-0.9615299730962079 +0.6270235537866162 +-0.31037378446280256 +-0.980322335592698 +0.3320884743333653 +0.2774655442096933 +0.16532598325139763 +-0.10953634340402096 +0.7043615640784678 +-0.7765838638911513 +-0.634267360076366 +0.2281569593862236 +1.7999449522558344 +-0.5931808781701544 +1.1881251705749205 +-0.4132367312377402 +-0.5133603392289734 +0.5258395907696602 +-0.328892009128136 +1.689439740427955 +1.1897716646899514 +-0.2690727285307384 +0.06835853246686209 +-0.10813208352299686 +0.13972839366652268 +1.776516187588702 +-0.05455646234684264 +-0.9963923609383083 +0.5219787336313714 +0.48698435265160667 +-0.338269771381262 +0.03834216631159118 +-0.14781763173542511 +-0.0846168513443672 +-0.5313960392055992 +1.034123036098124 +1.4531776264808305 +0.7376090750197843 +1.037066780070535 +1.0818989345067824 +-0.1886754212389013 +-0.03433054178608455 +1.3356834713251382 +2.0484094538587683 +0.025820672537921585 +-1.095155621559718 +-0.1399380752496665 +-0.18394211448663872 +0.9595091359161991 +0.7835321954383465 +-1.4834720375006825 +2.0660277946064878 +0.07356154876767768 +-0.09149502200804382 +1.3925409644501132 +0.40059999870909474 +0.3943204799962443 +-0.7330811766405696 +0.0649558253750766 +1.8675773169177317 +-1.479612478694913 +-0.16528071628465796 +1.1885125005258552 +0.051035999464953324 +0.16460575214488943 +-0.04424763112578273 +0.3032975603165259 +-0.223590069476238 +-1.37103521336031 +-1.9587240474217864 +0.5834920578088794 +-1.2143501153408194 +-0.1738409898125297 +-2.3666670781127994 +0.5657001079632307 +-0.48142428876256393 +0.13998771801299587 +0.1997799847077868 +0.29212591568852064 +0.5045200515021979 +-0.7931402674092912 +0.7985977148027582 +1.7902309768213758 +0.9167503105256893 +2.264131353353 +-0.5966572107658159 +0.5215841092334498 +-0.46027880040417557 +1.5585981325864213 +-0.4145508182168173 +-0.6350785313899003 +-0.6286167251784132 +-0.8175124877628663 +1.62448315506752 +0.6205708640437031 +0.5639189715859989 +-1.2001296293799928 +0.3482273169521186 +-2.7543392259715445 +0.6464912949199115 +0.3808126915271779 +0.6832945313558818 +0.40725803746984157 +0.7729102659971442 +-0.3072286811852653 +1.1174568887956755 +0.925514896331927 +0.39178541674180134 +-1.194131318424715 +-0.867247705761919 +0.5642185693747004 +0.4132865453733835 +-1.4421117808184323 +0.21945834982130094 +1.4509841475386718 +1.5889099271815588 +-1.6764548753009672 +0.32355384232539797 +-1.3718761579118792 +0.40986905971223353 +-0.3887922778118408 +1.1904812040293773 +-0.13179087059520206 +0.1370588493488526 +-0.049983648031828865 +0.1168711516932349 +-1.3408061183850382 +0.15621274126627907 +-0.9063779676990198 +1.394701096974176 +-0.746555207836222 +1.2694742746792518 +1.194895947180708 +-0.5389450219087809 +0.526847096380525 +-0.9388042777523686 +1.493016287790803 +-1.3553327238932285 +0.6655621790991426 +0.3920743901695499 +-1.9910863504765313 +-1.2655397504849573 +0.6641887334781187 +-0.706687904483404 +0.3218415436310236 +-0.8590671624136612 +0.2462310190417926 +0.19930073379494853 +0.11626182296876639 +-0.6292236766036204 +-2.4742816787235444 +0.9945312180014825 +-0.8256080551359759 +0.9625840645244625 +-0.24353263089327637 +1.5298569500914656 +1.0069576517508052 +-0.6791943662087887 +-0.4978991056655079 +-0.9456900661925354 +-0.39630788260629324 +1.119790954281704 +0.5821770305681951 +0.6517640134526159 +0.8299579007844078 +1.1175569079991932 +1.0089235348836212 +1.1204019871368045 +0.2372388645970008 +2.140884436784794 +0.16717276437324546 +0.3555796789113812 +-1.042172753689866 +-1.0139398998112445 +-1.8861785108715987 +1.7026294753459335 +1.5282235071615062 +0.17571148529873193 +0.6843881853695217 +1.3286080527206852 +1.5969899948329371 +0.6622014116755236 +0.5841647158630606 +-1.6606597671142322 +-1.4357771201417902 +0.3547218906319311 +0.18728961342469072 +0.23021484475353954 +2.1959483379545457 +0.3007305405641982 +-0.1046582530544114 +1.6361612888469332 +0.1821589010962961 +1.4876143563662112 +2.1039933988822463 +-0.499473833143808 +1.7765320021092974 +0.12035071875964283 +-0.7484533487692088 +-0.6179386468401467 +-1.5948322605180443 +1.0737229881885548 +0.49737683219708745 +-0.1945746216446536 +0.04772240492422489 +-0.7105566214206027 +0.8537578621278598 +-0.4177629879375344 +1.6366828831032307 +-0.7092759306472197 +0.531485651305827 +1.475078081798118 +-0.6821875822494506 +1.4916171238274671 +-0.019944876309265863 +-0.2561435542435612 +0.07318211131145243 +-0.00976799522999297 +1.355904850183318 +-0.4977013591619599 +-1.1930613827800014 +-0.852078462317077 +0.6332142360154283 +1.7250919157654048 +-0.4592757989973717 +0.4020184781401637 +0.14213417490259747 +-0.7955081287995989 +0.7790563408865 +-0.3436083834059256 +1.2467743814187737 +0.23657797005614775 +1.0037570271582732 +0.6134127655114145 +1.6622529983070617 +-0.7904163305208595 +-0.047470856787408366 +-0.35376984586133675 +0.7624694293021619 +0.4620575923294458 +0.02269727904720817 +0.25174231373925093 +-1.5143822489966043 +1.1038687871592279 +-0.20920939652989085 +-0.26206693689723803 +-1.865653799886686 +0.18878304582520838 +0.6946301886406521 +0.5734808618863869 +-0.4250760747189114 +0.1697990113088118 +-0.8602260609206296 +0.7203506949226789 +-0.23724609279620013 +1.3909135963004968 +1.0124042317070057 +-0.23611303125221106 +0.13289497862837868 +1.6300367239623874 +0.3747498403875746 +1.7395454001548092 +-0.7790860374133082 +-0.038819242931902836 +-1.1282797605179218 +0.9251211272109577 +-1.270145208096469 +1.8380529723702628 +-0.6444447680979029 +-1.3640419352496456 +-0.062218152973370355 +1.4423550371833618 +-0.08500350429404757 +-0.014969775676171637 +-0.9936502289390707 +0.16969078101743648 +0.2487358114574331 +-1.4640349943963056 +-0.40616426511600223 +0.7468260751082857 +0.8535122258832282 +-1.1438698624628016 +-0.9041704676010596 +1.8062687996437625 +-0.5401699838498474 +0.1674808939221977 +1.783438588861682 +1.2717095637097773 +1.6146527322868944 +0.2762634019921481 +0.5402064274246279 +0.5394750530580377 +0.24708584488018365 +0.9570629699591058 +0.419764169472779 +0.4025125528844481 +-0.3466529168600515 +-1.5100350566573046 +-0.35786176253850643 +0.15274864325668705 +-0.9353691086106726 +1.1566586637828002 +0.20414616080219158 +0.02313849514828964 +1.3302426134419165 +-0.2383703511454907 +1.9773556973828181 +0.27963963638251754 +1.105427075771226 +-0.5267909629197604 +0.914390651241842 +1.0233891676207683 +0.6589721353126546 +1.036316497819456 +0.5591600163890482 +2.134736985971143 +1.9783855786613074 +-0.3928868791314112 +0.8838568625527284 +2.0103689427783555 +0.9953164375118925 +-0.20937620668623225 +-1.1732171098534254 +-0.7910329112971713 +0.37289413603785543 +1.1453579795188396 +0.5576220850672067 +0.5524081183514765 +0.2251488806284519 +-1.3042128798271468 +-0.7210939231658511 +1.0987984575852905 +0.9215445801014962 +-0.741046417332307 +0.8175268177605205 +1.6678051569716057 +1.0108783910578825 +0.5624426603259012 +-0.9379114264795871 +-0.7238991643737599 +-0.5803813556500457 +0.29712829258842377 +-0.4613715734560867 +1.6784707718905787 +-0.5734872999850709 +1.08388895678392 +-0.011178182997688718 +-1.998102211588926 +1.4651629952691323 +-0.4110117283177632 +-0.1334446303263146 +0.041675587073378734 +-1.0120098896415082 +-1.586777826702473 +0.011328519515649532 +0.8230709950121643 +-0.19855258381871338 +-2.1921428579909232 +-1.039333159298878 +-0.5215392024669983 +1.9085005235767494 +-0.41767270432161363 +-0.12219158393416096 +0.21175296456941547 +-0.6541815281693866 +-1.035200599330072 +1.9512416922953824 +1.4741447766875293 +-1.7100036906454354 +0.37001963698605095 +1.2813514987722192 +0.510527765509992 +0.18026398766685278 +1.3653380714784091 +1.3131642021952883 +-0.43490903921865876 +-1.663143834382452 +0.8327296368245926 +-1.1187206588844225 +0.36522945776228327 +1.5268030934363086 +0.5918255197173077 +0.8229273816862719 +0.6540085530204726 +0.6764805983247617 +-0.12040437500060874 +1.0518598522451632 +0.5083910693768483 +-0.9477221028564418 +0.23802292124759727 +0.4107437719745798 +-0.43230382669361866 +-0.617907651755641 +1.277401316525236 +0.4356357682040378 +-0.5257716485332494 +-1.4753647669288814 +1.1718681718474055 +1.3760463852766345 +1.051875820892668 +1.6393817452081636 +-0.7097410300469855 +0.07421100672642983 +-1.3962960699431377 +-2.3689888605684786 +1.2444880948536183 +0.8536679302032048 +0.178573656447173 +0.6894617661780036 +2.9382330511515695 +-0.4192412193336753 +0.9931054400275033 +0.8629411798016035 +1.3397083954890978 +-0.7296472907926981 +-0.697006104333357 +0.5843031931110007 +0.6037803315297474 +-1.5938203772053166 +1.2827743131017826 +-1.016827042850221 +-1.1396576671046736 +1.3713064351150694 +-0.8016710777716743 +0.3382132030651309 +1.1704780958199943 +2.961912601871566 +0.2969911910897105 +0.385246343109823 +0.040205625024756775 +-0.1267461621189641 +0.5099335838437549 +-0.16367305253227715 +1.9050654153162585 +-2.1610476426924947 +0.23123403983758853 +-2.323200335556365 +0.5285290409544369 +0.47173674553721456 +-0.9603636171263881 +-0.47462528568561857 +0.1185664517511554 +-0.09503239108635758 +0.31801164753873645 +0.22433576621236123 +0.6411904314966449 +0.15641275615519057 +0.6735150020303938 +-0.8303348578257044 +0.5000402665730527 +0.381930958315017 +-2.1975731593003953 +-0.40766055846348304 +-0.07501537696270161 +-0.20281974376669226 +0.8798621808810743 +-1.1788364426633244 +0.804132812403254 +-0.22708841934308144 +0.5103335598855219 +0.3190541733183466 +-0.9539633594995798 +0.10965246903916107 +-0.9249585625356411 +-1.4913088066623086 +-0.3106852751630145 +-1.9019024972793275 +-1.04863341137811 +1.1116192105011367 +1.034258567730269 +0.5212247379636581 +0.36388342383820405 +1.7850501727281642 +1.226725050675546 +-0.5213170749943287 +-0.6413861868303042 +1.3873822572370225 +3.105573630507438 +1.4264816368258744 +1.0577277149638962 +0.5185209622218894 +0.22733217145997264 +0.7394583405632421 +0.08175215850251628 +-0.1726897761877756 +-0.7312209189998021 +-0.29522592572923434 +0.08100388353817825 +-0.30516470899698983 +0.8569201853064713 +1.6630753059776282 +0.4703793240951193 +0.9441659261391667 +1.6871594530724838 +0.26526016993012624 +0.8078784528013755 +-1.2924325421666831 +0.16414361663105115 +0.28075706868938854 +-1.0314052618088185 +-1.6526214613473407 +1.251539849343449 +1.0573760274801414 +0.8595459131490355 +1.495870023689733 +0.8616936558897622 +1.1887408987540509 +-0.4080439797117501 +0.9471866211041071 +0.19865129198475112 +-0.7427837800767021 +0.3328278812186022 +0.3766997975751307 +-0.14549534416702614 +0.6199743777136947 +0.6999520084766161 +-0.019785427669209266 +2.521714210846662 +-0.24130804388086619 +-0.8012659068673872 +-0.3740768737055312 +0.2858424291164375 +1.438865009010542 +0.9792631077410975 +0.6798723666712538 +1.9591065818665296 +1.5649085251909405 +0.5458900153705478 +1.5325028659046063 +-0.45151732998128447 +-1.2995833663103311 +1.3765156361850903 +-0.23731825769617892 +-1.1765904230341588 +1.4047831579527916 +0.6596684518626579 +0.27606655811129654 +0.24468256727477977 +0.198124603200795 +0.22608856006681932 +1.0788823082074483 +-0.8439238382880885 +0.1008103335717571 +0.7386697446388495 +0.34437154421802574 +-0.262536039329864 +-1.2247393876730313 +0.8812411313004225 +0.2529998342330793 +-0.6175076332875994 +1.1521523274524057 +-0.7847748690721243 +1.0217024470383824 +0.01909525880244295 +-0.1189253204647206 +-0.37766823084989876 +-0.767326912884355 +-1.4666124733465713 +-0.05567568719074753 +1.1949430036048128 +0.5744700939717313 +-0.8289814353117153 +0.28022421437349254 +2.07254695851333 +1.0355930125893522 +-0.27094026440004887 +-0.23728562049169577 +-0.04744844000772455 +0.911395959348468 +1.3934030067174799 +0.8493581162051017 +0.38885997047055243 +0.486045845147015 +1.2383098227784612 +0.14946481176142448 +1.987741994700814 +0.21464743264956396 +0.35107814532687664 +-0.45339625101975356 +-1.4040891510303843 +0.6935429796665831 +1.283840804307126 +-0.0607123045894119 +-0.920434853757963 +0.09991710973264241 +0.6623581511011758 +0.6485356667377635 +-0.8224115986555329 +-2.227667102746687 +-1.3735641664238505 +1.9342870679477941 +-1.31117805368489 +0.3861890082839594 +0.16569493610063551 +0.235120232926058 +1.8495961631127575 +0.6993407093927551 +2.0290412149258272 +-0.8496151326954369 +-1.5139768884018567 +-0.1944627721654345 +-1.0598058272877293 +1.3872264712590734 +-0.4331364351809548 +0.08186776336786644 +-0.28037487445115067 +0.5708766256793634 +-1.0913199820865602 +2.6350208405116113 +-1.2417459854782644 +0.09687074136640784 +-0.5836448690999256 +1.026072477554158 +-0.6810986991548711 +1.3192082248942905 +0.5378774497626568 +-0.7548658433605415 +1.17867610920249 +0.4785111666025638 +0.621805566728659 +-0.7439211865805899 +0.3227221168894964 +0.6285774184190838 +0.37180898848084615 +-0.7225965729397669 +0.5733421000407216 +0.42297715301830074 +0.6644943269610444 +1.107235271634151 +0.1408742004149007 +-0.5626675822187677 +-0.07392036419515813 +0.27906600916755875 +1.4287746424893568 +-0.14796192310565892 +0.18819211576933173 +0.23603917338498398 +1.3019299764245307 +0.37376017045784565 +1.4090724782002633 +0.19567350552080345 +1.4159940020695718 +-0.24300242366752473 +-1.3964612175415023 +-1.1140461611070454 +2.3439174761814066 +0.28099621436429667 +-0.9869489863523884 +-1.4745507151844506 +-1.4386902127884384 +-0.48665482185672104 +0.14774938005446683 +-0.2976002840536494 +-0.1319155350371674 +-1.1477194516884615 +0.011716041092344004 +0.7974503821898079 +-0.33038930044856385 +1.8673909830088424 +1.2007909478257157 +-0.20951641249439906 +-1.7480281380211833 +-0.2081547923121574 +-1.4345336745518382 +0.822729702333271 +1.5989557529997143 +-1.5520059771151242 +-1.4684445201004588 +-0.8430449152835762 +-1.8961437277986521 +1.4159843855002299 +1.2659823987254313 +0.714579644149559 +0.24913783861158542 +-1.5885910906110143 +-0.1535916699292254 +1.2189825954961646 +1.137482090025186 +0.4320905970878795 +1.8404463243405873 +0.33834228411962985 +-0.5628234818230414 +0.5012646131837426 +1.6296729811651836 +-1.066195824571896 +1.478240877625184 +1.342345733667123 +-0.15825835346560668 +-1.0705879237169407 +-0.2933718444693986 +-0.19232376660590111 +1.6238764047011967 +-1.2210600570420467 +1.8165145668137281 +-0.3870804393581798 +1.362591630125569 +1.3001259981682078 +0.1593416480104564 +0.7040391180246228 +1.7090327330630442 +1.6342408782036448 +1.5384518596730177 +-0.22331504535734242 +0.9450020710128103 +0.10164669007978729 +1.298004729838883 +2.188591956659545 +0.9678445666527893 +-0.9241437628466778 +0.09394377812448977 +-0.12569852417879235 +-0.39210821256472395 +0.5881532507770708 +0.48491261921671985 +0.2006128759398269 +0.5680342953284345 +0.7614324881519818 +-0.3077509184693323 +-0.08377442723447476 +1.8157973113008803 +0.14481030225120328 +-0.14274258520304806 +0.05618625941561983 +-1.303096643278292 +-0.9584381925582568 +-1.190111221691659 +-0.20774143337395556 +1.734198978036265 +0.8289036281791442 +1.4681814429918543 +-0.0054954594564212145 +-0.09841089054329233 +0.42907953722600356 +0.8899211328086682 +1.319313314327042 +0.0013130672671821386 +1.088442274370523 +-1.1787120404339597 +0.6596234660638082 +1.1370408073273919 +-0.3274343890848549 +0.6060876865374271 +-0.7726065379416063 +0.3895451922065647 +1.5658602912533357 +1.3237949625219099 +0.9973200446076765 +0.1442461439595356 +0.32641561354960946 +0.22425028602376207 +0.6057550272510187 +-1.2073431780262427 +0.5828112850522766 +0.9645593574424589 +-0.14941968936250605 +-0.2499590089190724 +-0.1090941828638925 +-0.6036176556519792 +0.24540232893120156 +1.8294766333777224 +-0.07369778373806035 +0.17217627877889324 +3.7949383073214147 +-0.15928715430595225 +-0.01903150960269029 +0.5630069609522164 +0.6841404185257954 +0.7226807374153351 +-0.3650086694594943 +-0.35925773634682245 +-0.9486973632457816 +1.3693975293767007 +-0.12628773319564135 +0.6345187485275304 +1.725977721588366 +0.5531804666003 +0.8184730727395684 +0.3027508635270485 +-0.10231477548481738 +-0.8448685563502905 +1.103770364526492 +0.9361753745115011 +0.532421190405516 +2.380471942667289 +-2.5040973215208666 +0.553005464913497 +-1.3485312904582079 +2.1281795180918746 +1.0867139281556868 +0.6931406317470974 +1.4439527295235375 +0.2572794115294971 +1.3928599802772126 +0.6272666008101822 +1.0409506435346638 +1.381693571518166 +-0.25347418165641306 +1.5518601849648899 +1.269902738066085 +-0.7775051435314402 +0.8757382396098483 +1.2386862741626408 +-2.0573337913799357 +1.5567923588790236 +1.0179298940839683 +-1.6073778670692713 +-1.4705344503443454 +-0.25441751793210016 +1.8294427991015332 +1.695478042144156 +1.2325301055751792 +0.2633753575778295 +0.3509104135840675 +-0.16137290664112663 +0.11157114836982213 +2.6657250444256055 +1.1899453706644132 +0.6371766957773805 +1.3056660325253955 +1.0685866618871436 +0.25184136842807586 +0.34066446360989966 +2.029086749330785 +0.3564417256267346 +-0.057330323158705704 +0.7374190448114625 +2.675376077238414 +0.07990266394585692 +1.6623232991635148 +-0.6704968490605684 +1.4226839669747413 +0.42612037075299525 +-2.7920584616614983 +-1.4166954245993428 +-1.355155970631996 +0.2861218641843788 +-0.44032926088768964 +2.466940572270543 +1.3422144203782154 +-0.609801638400084 +1.6551589872147492 +1.5778583151469834 +2.9091833534302616 +0.04285256769851514 +1.1620547525786162 +-0.2908637000416618 +-0.669075524154352 +-0.5020084521309621 +1.0952418152742236 +0.17565193666767942 +1.0411274117902396 +1.0315581124379989 +-0.17851185558805976 +0.026328011543065022 +0.3072207970988099 +0.8603810458050326 +0.10499219395166451 +-0.5999542039576634 +-2.375486178638652 +0.452729464333793 +2.318068347990458 +0.07393294023483275 +-2.2424893281806684 +-0.07600655421203117 +-1.9008596085189524 +1.2434437714171949 +1.0832063003973795 +0.9488133561198199 +-1.6437034843647287 +1.078506903974319 +1.237439257102859 +1.2395247938593692 +0.043039997088589826 +2.9187286677194155 +-0.14187386136372532 +2.734992693501403 +-0.6316685030959204 +1.4282800254122836 +0.922913013858676 +-0.0732408482457238 +0.4215339764955095 +0.18788812565848492 +2.3145138220894497 +-1.9163649573334405 +-0.0008051077677666274 +1.5592203520200927 +-0.08310374132485454 +-1.3869861868158488 +0.20461682324658342 +0.9172250588720979 +-1.7254296492107721 +0.1410657738038331 +2.5431254679730984 +-0.3911415583816511 +0.7759143202788553 +1.6017562444621745 +0.34591492613704705 +-1.054122832173228 +-0.43046468643339464 +-0.20134128809288832 +-1.095219316496816 +-0.289101581879348 +-0.4752776383131736 +-0.023318346479924562 +0.32738783632930574 +-0.02069468752220266 +0.5996389164638158 +0.6759768103378627 +-1.3963041239705463 +-1.450141304407074 +0.9262489089346576 +0.41920825849404253 +0.7566372994796392 +1.298574379432211 +0.46028274467179753 +-0.3685568293926538 +-1.302828324504403 +1.019624605045132 +-0.9680143192583106 +-0.020684930269797563 +0.7444965357297688 +0.18791508372073396 +1.3887214448127096 +1.9133811838793797 +0.3904210395534625 +-0.4254393295512654 +-0.7778484648930404 +1.1871105761874343 +1.1463857330969103 +0.5730241503713088 +1.2260495893915355 +-0.5592195628414821 +-1.0302930438894906 +2.3911604951051233 +1.0178988919307645 +0.9139792432243412 +0.49383262490922397 +1.0723482331299565 +0.8488049977193342 +-0.4500466977684353 +1.7131086186208577 +0.4498343105215671 +0.7448634119261787 +-0.2716974293227804 +-1.3260613693191259 +0.4838664501277701 +0.10119411051269146 +1.4541841012121441 +0.5317602708222441 +0.47620381778999166 +-0.4625920375121837 +0.6442679950838376 +-1.3079781477014776 +-1.55034085465704 +-0.17867644181926456 +-0.24255197989637256 +-0.32101940171747134 +0.26652906150073485 +-1.6725131646615148 +0.07428190087396062 +0.17873450793720183 +1.442206746588422 +0.09932861376198882 +0.646041637789167 +-1.2200908203973828 +0.48413675331989686 +-0.08385425061545176 +-0.558304802966499 +1.2842435539473185 +-0.06560108310863155 +-0.5902059273063794 +0.4319269974069788 +-1.0507998042982745 +1.3804734810134802 +0.45463311924512817 +0.10302095748270418 +0.700133797106159 +-0.8549336640285001 +2.309764126078779 +-0.7600591739847193 +1.2066170186861658 +0.1113361731771329 +-1.9896617011048596 +-0.982797207801539 +0.7019395471606489 +-0.10386765863164982 +0.4358408833590275 +-0.6172112942562289 +0.7790877118349813 +-0.6514677588225067 +-0.974997236930552 +0.2654035191234496 +1.6251706083484838 +-0.21608502404737462 +-0.8326656023193264 +0.43621886406416843 +0.7036063516084708 +-0.3587387927244863 +-0.8966479965773908 +0.3340860821361288 +0.36984612300217456 +1.1648942294777433 +0.9008469700596696 +0.4955470320447602 +-0.18347627090590884 +-2.464768730611328 +-0.13273479374952352 +-0.254644658029836 +1.816077712758787 +1.2336236983458366 +0.5669329370572045 +0.3936881946175229 +1.4546304922578661 +0.8012730698860364 +-0.8467793445628848 +0.15585373456869728 +1.273378440042486 +0.6277346823879659 +0.10348069047339653 +0.8461241763249892 +-2.2831114567583297 +1.3436723928474863 +-1.9056149184520634 +0.0057294263291425285 +-0.2304812741201619 +-1.0678203300900126 +-2.7047602997763605 +-0.6936094862371411 +0.42065297817206226 +0.3322188050206277 +0.6787343943600945 +1.7080253530845915 +1.3795405034606565 +-0.5746131125873327 +0.09163622202969772 +1.2108137001516275 +0.25027099435398875 +0.4731993434440104 +2.0295744923216366 +1.7605230719368743 +1.000009939839073 +0.9381425253242374 +-0.8474920032049249 +0.76303128276364 +-0.5020216453709219 +-0.3200711046482758 +3.0729260398064833 +0.8843990410639989 +0.2132260070370065 +0.8352224630739621 +-1.2672970290605734 +0.4313279198433818 +-0.42557828698574496 +0.2575704054400757 +1.1323669619006864 +-1.75818672253006 +1.3852294259939297 +-1.5697419322646216 +0.7591434244059171 +-1.361619507659585 +0.3886612160487663 +0.9182812875456278 +-0.8841770948377032 +0.7580800307105886 +-0.5274591296354724 +0.40626502814496146 +0.41747417090899175 +0.4010506943454897 +-0.87410237875934 +-0.8136968530253408 +1.0722095671890113 +0.08919059625032735 +-0.7059853964676924 +-0.9040538761941472 +-0.2607919730191271 +-2.903054709761583 +0.2223955749174442 +-1.0139295176836787 +-1.0112173904843604 +1.003136362550702 +1.889458998155602 +-0.06322737751324314 +0.028330066598794307 +-0.5686709370886536 +-0.30303852845687906 +0.8790288264369791 +-1.3442619834106124 +2.5318436956229604 +-1.1466543990770333 +0.3036547015967411 +-2.2057725121363667 +0.8105404854515265 +0.2052315265792118 +1.4613460567637926 +-0.2202390928015227 +-0.39528541793831884 +0.910017204507663 +-2.0756623480334992 +-0.8759347576848793 +-0.2576063304003868 +-0.08164420346764906 +0.2841373829648496 +0.7660503479407803 +-0.5008815923507329 +-0.6061747609506503 +0.03292170723427357 +0.24362119566286763 +0.39053395396527557 +-0.026566643830483128 +0.4980954537210563 +1.627964028715392 +1.7737715461648627 +-1.1893952302578747 +-0.17285762112891095 +-0.5259871177244544 +-1.4568034244672328 +-0.03462399289164106 +0.319406138447692 +-1.1624674592762987 +0.883246383265618 +-1.3706925296447527 +-0.16213602936603294 +1.2661298882783458 +0.4484797929114466 +-0.10289539171635276 +0.17550364496328075 +1.2681065657566144 +0.8209004749413236 +0.0801979448251197 +-0.5495970942196697 +-0.45778275143532154 +1.821677600447471 +-1.022465694372524 +-0.4547622147741658 +-0.5836821822663985 +2.094591559796947 +-0.5497734619093327 +-0.1298712104173111 +-0.2985368492755876 +0.3917357012280269 +1.3163091159695757 +-0.6842158975938002 +0.6836244738118828 +1.3115415094658207 +0.7477218683638457 +-0.958785079489215 +0.7681528419704207 +0.5011785379446716 +1.2942507061299524 +-1.5995885881298735 +0.176454385200318 +0.1609299154151636 +0.14256477020454073 +0.8481398918971516 +0.46579663790978804 +0.370248100695346 +-1.0358642878080424 +-0.10223539484891558 +-0.32191289151297287 +-1.0705453216412 +-0.49606840162490784 +-0.4352861475168197 +-1.6571107873670499 +-2.1214760707228004 +-0.8669867753499678 +-0.5435096910538 +-0.17634571894851714 +0.038520043034445284 +0.908117423151357 +-0.28774917165733455 +-0.36799904506419046 +0.05700622641313266 +-0.8572783052129236 +0.20410930799902313 +-0.6208592713509855 +0.20582768352815273 +-0.6862438149251237 +-0.18769216675749784 +1.6498123067065562 +0.6614275744487674 +1.489824158821772 +-0.4896070264195964 +-0.5108795101241798 +0.20567802655412426 +0.8292110105391818 +0.1932763262067024 +-0.2761141336807619 +-1.163116197069357 +0.056606929249444465 +-0.9736434031398986 +-0.7336509773309016 +-1.3019696077357161 +0.667759532721579 +-0.11284126464708205 +1.464385033502714 +-0.4592668327325463 +0.8871896810985562 +0.87827435816543 +0.35617153264388796 +0.9228915904669938 +0.4493897907975648 +-0.3069392599225692 +0.2857359349538817 +-0.4194850087426787 +-0.1369465899743439 +2.421810986755097 +0.3332265133000364 +1.1930108756232887 +-0.4589746576863277 +1.6464522531933843 +1.194920852805113 +-0.10634630872785478 +-0.23220099924278198 +1.4349197017521147 +-0.4107453958549615 +1.3036807612214594 +0.42862120444139973 +1.084735027153143 +-1.9428372090802928 +-0.06381208324217652 +2.1589528761616803 +1.470061615315896 +0.6549380003813624 +0.27290455537063607 +0.28321834443337035 +-1.2449639149485932 +-0.04140440886783839 +0.6141179606100563 +0.8473117937448739 +0.04434751048991406 +0.9998150381609779 +0.14522295131231444 +-1.3876857830208411 +-0.09698372317079529 +-1.218363134607081 +1.4541039752347928 +-0.9671532863029033 +0.0011343836843301647 +-1.2081446443635282 +-0.89963388038485 +0.6922603818949897 +1.2535337307501364 +0.9868648575283225 +-1.0466229502462956 +-0.05095083987246046 +1.199827060234204 +-0.6373262618232812 +1.0372930338655157 +0.8071415214794921 +-1.1109023465040402 +1.7517740750692918 +1.9534091841010137 +1.4222141024691282 +-0.7440705692917007 +-0.33985317871173537 +-0.45679334976192687 +0.8797628667178605 +1.2506211365106181 +1.2414843064063081 +0.998562265239485 +-0.22753087905748742 +-0.5978839778271713 +0.021017624603982737 +1.8747849498774292 +0.25754510961257016 +1.4124476461398534 +-0.7421443155531428 +1.3652946508048125 +0.48996789149535064 +0.9860407143230946 +-0.7835811724261145 +-0.4815103891755803 +-1.3695322533770438 +-0.11681307292717241 +0.9969728142963991 +-2.45061813090397 +1.0906965826551045 +0.25759464188162906 +1.649180630787329 +0.7236968811150226 +0.9645922582379047 +-0.2995963671082836 +2.440326967306465 +0.9511510558003972 +0.9045089461250815 +0.7669909635667742 +0.3415190304658261 +-0.647854207553221 +1.2194322694666677 +-0.9326985910966323 +0.5201768355937686 +-0.5601126779918039 +2.225057656514771 +1.098210928684789 +-0.23996603817663165 +1.0456057748818262 +0.35445208855796706 +0.4820906779233735 +2.435743724262756 +1.1158945947574797 +-0.3028013960034932 +1.773003573764693 +1.4444487535083377 +0.8789668417946562 +-0.3293798715237526 +-0.3324354805284473 +-1.1951649933120447 +-1.0383966505341355 +0.23951703985861705 +0.34809323548836435 +1.3835988966807864 +0.7191380653745171 +0.020692898755533318 +-0.3125443411867651 +0.9904154484703355 +0.13064240854589068 +-0.022030908493016754 +-0.7106136957657889 +-2.1550172888580015 +-1.7240320096135748 +0.4083495491417444 +-0.6967305895868569 +-0.09893261843202317 +1.3575062590346512 +1.2598816974856293 +1.2891106220169364 +-0.2924160695899492 +0.6323521774138297 +-1.5801593755726 +1.077820815972116 +-0.34279116745841853 +0.5086238455710201 +0.3269650905178285 +0.10310490191483039 +-0.9095042718190403 +-0.8131866054125549 +-0.5645498214417737 +-1.9905016296044467 +0.1165113910346144 +0.2145275452550661 +0.3329491807520125 +0.09111940603377665 +3.0809470390304865 +1.2957339178831788 +2.5634591599656558 +-0.2476011530453462 +-0.24150321081208975 +-0.26851011600737107 +-0.1787426909243926 +1.628216343480337 +1.424073804988091 +0.5313782171838051 +0.41872507596566044 +-1.3381272266101452 +1.4608174485701084 +-0.20640172131921614 +-0.6896461441625659 +-0.2912496464964759 +2.4816931109398723 +0.815362895979695 +-0.2120237978075285 +0.1584547176120776 +0.17099413394143664 +-0.42091032873186685 +1.877893702228225 +-2.35827162535856 +-1.3671357204058214 +0.8075822949860931 +0.032891387253618315 +2.410481244556829 +0.0503958018102969 +-0.9046604873050248 +0.19729060890119787 +0.9333619289471164 +-0.19391966373396907 +-0.7832657432051874 +1.3527064827997382 +0.8136177937045463 +0.3311216599378296 +1.9420375564906367 +1.5251890978933997 +-0.8841934746210978 +1.1525684711604822 +1.4160438618169486 +-0.34305222834762505 +3.1036285729502913 +1.225677408592554 +0.33080284868611176 +0.279115273183959 +0.1793982656450738 +-0.04489941087220381 +0.6586730794909601 +-1.31463453149617 +-0.5011136573375548 +0.8753788571080556 +-1.125165820442272 +-0.5898611496391646 +0.09873694980074357 +0.2145740179035615 +2.3043264757186552 +-2.1266253681671206 +0.12831467290009455 +0.9051699240031221 +0.9161700785946324 +0.07994725101015825 +0.5236798668263256 +-0.9079750576854038 +1.9501953900990625 +0.8040880410117435 +0.3082765527709315 +-0.45538053413348356 +-0.4006359616417632 +-0.044631366369905084 +-0.0019193588936645134 +-0.9056095976446763 +-0.7072505114608804 +1.8267627980002428 +1.1796219580843332 +-0.9647379818428861 +0.696155471777447 +0.766097866234959 +-0.96622547960011 +1.5088792218045683 +1.1457613870676675 +1.6522076853801018 +0.23836189151113224 +-0.27736513586427786 +2.6375423761182946 +0.16388935054758508 +0.3870468863098335 +2.4526039966643696 +-2.1303864639823393 +-1.5286533340697654 +0.2582097623086193 +-0.8103033801673738 +-0.5055956477994954 +0.06200301144135628 +1.0605361302916736 +-0.6303108910696477 +0.08594189793295705 +-0.6938242208705662 +0.5460672261232307 +0.3688589905618084 +0.3022471698251696 +-0.6963981754093597 +0.09297684170828963 +0.22320207643310275 +1.139310801095999 +0.21402841342153167 +1.2342701173061335 +-1.3151258383285813 +-0.8589524381111766 +1.2691077424715693 +1.2052280766519283 +0.800872027136392 +1.452173339943604 +1.67842554416665 +-1.2106233913086968 +0.9931119336868605 +-1.1644132846497666 +0.1237706657072489 +-0.1315905416078424 +1.401231486420975 +-0.42037281679861427 +1.5636130311915835 +0.5176739591996188 +-0.6015717979333427 +-0.513313091521782 +-1.6762197577865745 +1.2581604643965965 +1.5490281317435028 +-0.5179343315481336 +-0.4532950353506586 +1.6092003448980419 +0.49958957769153994 +-0.5593983505016985 +-1.4751666544629507 +-0.3284767986141147 +-0.09186222292265833 +0.6674674363521016 +-1.0798587457787927 +0.6236350397102983 +-0.9485394994798069 +1.5370537083526494 +-0.07887156705158954 +2.3546468302864785 +-0.49703582194638674 +0.4129110047658656 +0.005648460410288547 +-0.05391845973775833 +0.9518750909896192 +1.0926930751504713 +0.30375754890192974 +1.7403065030090872 +-0.582220270381627 +0.38590662474173854 +1.1764775580607096 +1.0019972338577343 +-0.46831318484647744 +-1.1719348773708373 +1.6949686988421522 +0.7266889682296116 +0.0326049150008893 +0.8534818470177303 +2.125493507933524 +0.41248793902547665 +-0.4130713436087352 +1.2079780895329582 +1.5872781077043905 +0.6456953727779484 +0.002371613431566333 +0.7767096327680236 +-0.9416746271022916 +0.28759509465355015 +-0.20600220064623287 +-1.1572544416139086 +0.29245322251547423 +-0.9614079843977537 +-1.2200725558500478 +1.2149695095973683 +-0.496686825169082 +1.5177796442495128 +-0.32060112676378405 +-0.9302495464653404 +-0.08523235015534697 +1.300778406841158 +1.1217079961921845 +0.4203331535083778 +0.8106879976644689 +0.11762102106277045 +0.0894563135307097 +0.966410890058823 +-1.1957266106507263 +1.0173039604027005 +1.1436620424389772 +-0.5153134680728456 +-0.4308591886073093 +0.6227679856938841 +1.1563092590429003 +-0.6331105287067077 +0.28777065253214323 +0.8911601903817098 +-1.177800859104574 +-0.18534577193975305 +-0.8345363799336749 +-0.40336422680228656 +-0.269395145152949 +-1.2476924894241321 +-1.461461877197099 +1.8308446540138694 +-0.23040164377538275 +-0.38309262204595607 +-1.1054299437870017 +-0.4040587278679477 +1.5180063179249985 +-0.5718055675345044 +1.099458171853282 +0.45714723869181617 +-1.3262551098114592 +0.37943651486341456 +0.7134145061366024 +1.0130351769961279 +1.404264288446382 +2.167751510779852 +0.297328275985547 +-1.7246459882500522 +2.2904340179429026 +-0.9217607550802105 +-0.11697511841721331 +-0.5389754243047756 +-0.9182383642994649 +1.5085979456709344 +-0.16831235931726746 +0.5082175173189585 +0.8252748939395532 +-0.3010856701604726 +-0.0014576509300233687 +0.34996533108853817 +-1.640926080261362 +0.9909750805063805 +1.7363083402611548 +1.1333263768620339 +-0.002352609050833787 +-0.6586963060210368 +1.987514734704109 +-1.6637756778080006 +-0.027157193879346536 +0.31188046590038043 +1.8875364133363823 +0.6139553947239119 +0.4414967992401523 +-0.47782685027639704 +-2.9102338147695583 +-0.023411020076703315 +0.007047862488012341 +0.2163525641644825 +0.04177570146679918 +0.8586425607171417 +-0.38259026678782004 +0.17066153773807488 +-0.8706003295189706 +-0.8714703420407233 +-0.021607992928903252 +-0.3735182048157857 +-0.9864826652540246 +1.4113742419666322 +1.4865406104172976 +0.8188254341897984 +0.11673988539038471 +-0.7187155125645309 +0.9677312432734696 +-0.3480615006737132 +0.8695282901704957 +-0.4116649324414713 +0.5838351187643956 +0.3216849025306453 +0.2760725222113813 +0.15938401096373644 +0.3217939837657888 +1.0130243339109537 +1.9627026520806825 +0.05641274471179353 +-1.5596978915966044 +-1.0253892603828174 +1.5178803767457634 +1.0337683429442115 +0.1381601108825597 +-0.7811110754704346 +-0.0803567943309697 +0.5541907039747771 +-0.059588321541128475 +1.3253889598413622 +-0.6948420661078136 +2.252975108579051 +1.371293400611175 +-0.9865407536234339 +0.18072894659155214 +-1.6559113358482327 +0.32552991905828693 +0.7408217141763853 +-1.358400106626451 +-1.3165919869522134 +1.6362632806409156 +0.05273662268364754 +0.5655454519871312 +-0.5445935471754932 +-0.6432864772922485 +1.1272279475820226 +-2.1821457681684846 +-0.30735170132983075 +0.25859780767927154 +-1.7290785258896408 +-0.24673345729515306 +0.24017576396254792 +0.07410754188276318 +2.8262390356907794 +0.3362081597434361 +0.8276833220758496 +-0.02460048281179919 +0.6283803983061906 +-1.4600860904453035 +-0.7149831668613129 +0.12233460045440353 +0.0033321243255929056 +0.01859939599869742 +-1.1215642206797023 +-0.7980041772876838 +-0.8191543933737947 +0.43328067910779744 +0.41351354307585764 +-0.35538505045612934 +-1.8829581725672337 +0.12926924057800027 +-1.2036491779078133 +-1.4121815611494508 +-0.5199026978700891 +-1.7286290691362929 +-0.9272273266426524 +-3.0618357468162305 +-1.5568511876477493 +0.18395988289002313 +-0.5178652990922499 +-1.6642150552654924 +-0.5116586182773535 +-1.0807326650649773 +0.17123249078293534 +0.06907090051279358 +0.8381720205524201 +-0.5716378946460405 +-1.1043313046682537 +1.71202456475811 +1.1077388073419123 +-1.8890487224948198 +1.613142392324331 +-0.9000811594461972 +-0.7065876322225005 +-2.431251023522986 +-0.8335176549754953 +-0.3627206812992297 +-0.007116847654763503 +1.194970062982587 +0.27436678906976114 +-0.07688869695459069 +-0.7965089661068977 +-0.3545439155872201 +1.37829137356014 +0.21642807403007286 +0.9257127207892508 +-2.321051390513423 +-0.4278970682645424 +-1.6421102322383125 +-0.4505713690759077 +-0.6847331468507121 +-0.04374078903734824 +-1.4375754610744629 +1.6981970403196927 +-2.8484078785260802 +-0.5507326464643504 +-0.5245791517865377 +1.2677076882561857 +0.8107230092867668 +-0.08254412154570921 +1.6975657026853679 +0.8601023620876163 +0.5878751010590288 +0.03400750146972081 +0.1440996595797454 +-1.5909891803067153 +-1.2198565993782478 +0.6184637576055411 +-1.1957778564972188 +-0.046519769085608065 +0.746088342189616 +0.21503348970942732 +-1.2345921340216 +-1.3380563124460767 +0.4414725321516577 +0.7842583994970285 +-0.14986794381300514 +0.19587550909112666 +0.061539461485076774 +0.09322299585939464 +-0.0967121865424705 +-1.5512202215961959 +-1.4028623517303576 +-0.9901406168475619 +0.07686636508162698 +-1.0723545444506302 +-0.5822578610711322 +-1.6488076406175434 +-0.034076327928854344 +1.4999911249044624 +0.5659421656531032 +-1.2449369234634633 +0.24426160290861426 +-0.8271138555284232 +1.1675812897691875 +0.5863630149750069 +-1.3637406347002339 +-1.5093891085430153 +-1.0509252632198018 +-1.3243244181738547 +-0.1260463235556284 +-1.1418863680153613 +1.0209956414231536 +1.6170697666248528 +-0.09700026764816723 +1.1384666616155863 +-0.5291000221229304 +2.0709394950628415 +-1.3681839865234604 +-0.21660540825881214 +-0.058232293765342585 +0.008929277209600378 +-0.5793624974715121 +1.876842481439579 +0.35310550119808715 +-0.34709029188656115 +-0.2592880880206686 +0.5815399595681017 +-0.1999893454072299 +-1.0615004962852352 +0.16135791712248204 +2.45701024485434 +0.6998611517414023 +-0.7331098909203525 +-0.695900764807608 +0.13308231076297422 +-1.5748905602498438 +0.8898325718301652 +0.8938519635001123 +-0.444370820450136 +-0.24432195172109417 +0.25018267204094824 +0.41191844193975646 +-0.006325051062871817 +-0.035798936644472396 +1.240943990974859 +-0.5506508841349235 +-2.573987812060362 +0.3252445335945332 +0.41124689789039637 +0.4598121196132875 +0.496169743780398 +0.899282600314449 +0.14565761495688107 +1.7097964425336245 +-0.47086902237662864 +-0.21467264044258358 +-0.7263358193659305 +-0.22056358595308434 +-0.20937671205667663 +-0.07669742946161968 +-0.7339261682172668 +0.48212640560190434 +-0.6494041737977194 +0.39274255093944443 +1.2215620795208784 +0.5049439294977723 +-0.5158760007430456 +0.42620816607891576 +-0.8941025239610579 +-0.3786194992389138 +0.7353733693851894 +-0.18025710357320585 +-0.47091835916421665 +-0.6833002289751853 +-1.3861835368923017 +-0.18546751470731504 +-1.3738076809407287 +-1.0926561962926018 +-1.015375562988036 +0.6528201889651672 +-1.2722580639005785 +1.03782901539655 +0.5518146274468929 +0.3399684675021045 +0.1714591471207958 +-0.6098934155983466 +0.6997211886857572 +-0.7606272119825161 +-0.33052764536689117 +2.267634311912345 +-1.1010245731656958 +0.9924558226751583 +-1.952642310103916 +-2.0885998164701594 +1.2098969473029166 +-0.04644102309478104 +-0.38360295140881684 +-1.3944057069502664 +1.0758393903160817 +-0.32042113410668904 +0.8939040722879354 +-0.988109144524996 +-0.6850895628707265 +-0.39563309401998004 +0.4655422966820433 +-0.7133088799866104 +0.6898758264122878 +0.16900554883056051 +-2.2054783090810695 +1.1229003487185683 +1.1414026779918198 +-0.716027357907616 +-0.21146123420692725 +0.9050322076754216 +-1.237778218167496 +0.9290201560410583 +-0.8658437317016295 +0.5329390111324757 +-1.1947484322967021 +-0.7376982039620994 +-0.6336875342646728 +-1.6155947280316143 +-0.5897786955023514 +0.5341747134733327 +-0.5760806032184245 +-1.1681974050228643 +-1.7330725688525643 +-1.0588974439978265 +-0.08445142664132266 +0.7683557186647314 +-0.26945329264331885 +-0.21055816613460981 +-0.7395289596915877 +-1.16654950837437 +-1.0201481559142087 +-1.1524567451464258 +-1.3798586269048896 +-1.5787507110068206 +-0.2811433986477702 +0.08871384853455139 +-0.5366752616221386 +-1.0072784410657976 +0.19979319180799582 +1.713090602282254 +-0.6340169858591163 +1.4507991182241537 +-2.3183189072981465 +0.24828642302804693 +-0.3036714391627156 +0.1089996368923356 +-1.1123539988536093 +-2.216094331719037 +0.5018243114326929 +-0.2291382934886284 +2.2106977131281864 +-1.2596421373948716 +1.2118249338666554 +-0.6097525132272128 +-0.04549331870082238 +-0.34505220129753 +0.40144603072398743 +-1.2308716174970042 +-0.10308517641300315 +-0.6459037130737424 +-1.431692670946572 +0.6472412679805053 +0.6176250473319645 +-1.2011650961869753 +-0.16269440953223255 +-0.46231401995427224 +0.8253335111778735 +0.17421582519142054 +0.14521714183070517 +-0.19229146703137726 +-0.9451036755142699 +-0.12218918104792004 +-1.077874069107812 +0.12214042404938558 +0.1375581218277977 +-0.3622273403322493 +-0.12250017684374996 +-0.8395240482344362 +0.3792531507471304 +0.529462533294301 +-0.31271857997626024 +-0.7042106776491929 +1.5227344060954444 +0.07736046424575255 +0.34075544130119684 +-1.7633748159414737 +1.0655393194936198 +2.276677152293604 +0.30588477616655135 +-0.4444060227426224 +0.7414399977442822 +-1.269418820139246 +-0.42566086727293934 +-1.2574614706343972 +-1.1054903004123608 +1.3321801502925956 +-0.8209765786162079 +0.7234332394934513 +-0.20820818548766784 +0.592151919499979 +3.2170407434772894 +1.355033753780594 +-1.1195409859180647 +0.31974274571673933 +-2.258589211102037 +0.32968188203603854 +-0.716809235979197 +-0.4346072856373978 +-0.19759268024825383 +-1.349990341948865 +-0.3606009995573896 +0.0727812696896013 +0.41406382826456567 +-2.0901904746506412 +-1.069792952520425 +0.8353047296452216 +-0.14265232555098217 +0.5258033170754549 +0.16461656514457174 +-0.8513061294403697 +-1.6061801424969626 +-1.7675354290541347 +0.2055815241473689 +-0.9804967397128352 +-0.23315792517114997 +-0.5841368797523143 +-0.17408986685002428 +1.2839836528612645 +-0.9013890873244286 +1.0986441166734005 +-0.24588621372389086 +-0.27237181521784476 +-1.037494163151057 +0.2603422116358486 +0.40066721408185024 +-0.05174484667825352 +1.2134753197656714 +1.0672560904446213 +-0.2745018633145475 +1.471324771290552 +-0.9300196696184376 +-0.08526830952053531 +0.4556274563412751 +1.3717836481440102 +0.8002069540737424 +-0.17537579342761597 +-0.03788623188496518 +-1.5197844425985878 +1.0096009644836392 +0.8660938244750642 +-1.2639749550568176 +0.9729934797633257 +0.9766712659244643 +1.6031986195281254 +-0.6313076392583519 +1.1129826451654958 +-0.6060772086623376 +0.00025283746498702686 +-1.2428084375139485 +-0.3732291749040076 +0.895202554928406 +1.087113011725791 +0.013468249724925302 +0.6081778759306085 +-0.9587287465031342 +-0.016995263693190904 +0.3986497708203669 +0.2737084246385405 +0.01071305687547111 +0.9009127144297089 +0.5203242789805835 +0.925387782640567 +0.18298447390377792 +-0.4692459872799249 +0.565504186070676 +-0.05663192505143788 +-0.0535316419688841 +1.7014436966465405 +0.689495027264182 +-0.843245783045855 +0.6993693025808576 +-1.651919046005432 +0.43554814519698726 +-0.6790373350773069 +-0.7977408573108742 +0.5761376706241028 +-0.20283447076562547 +0.5416366179211013 +1.0741411186922327 +-0.5000266078297597 +-0.07885572788594457 +0.6655915252550306 +-2.233408112626572 +1.436525598341936 +-0.2638516661548222 +-2.3870001806760595 +-0.07435091369406067 +1.4163366812444627 +-0.4107411059321591 +0.40992725883565195 +0.4516722983127178 +-1.052873983471056 +-1.2349760797299336 +1.5851456609953027 +0.11928113148200159 +0.509371262010074 +1.2085508938437297 +1.583976093808063 +-1.2475034757376935 +-2.104817417821501 +-1.190230859659118 +0.9725601679975722 +-0.6499070998820405 +0.7318484661370985 +0.6212261784727499 +-0.9158201821389896 +0.09242956759142362 +-0.22290969869060243 +0.3133187203063178 +1.178866797570563 +-0.25095423340605527 +0.7134938314353065 +-0.13497030974313795 +-0.14529894843576915 +0.42284406945969344 +1.057018738720987 +-0.916082270585854 +3.321863072452028 +0.43566754992658896 +-0.8020078782280166 +0.7732348957679065 +0.5508230467167478 +-0.8551140651374262 +0.15542468812250765 +-1.9613903138039477 +-1.3393553415812538 +-0.8683712757416925 +-0.5300697221513098 +-1.8418473616807545 +0.8031209397915254 +-0.8441030528374414 +-0.3852524397752042 +-0.4294105537680321 +-1.1391483738614308 +0.49474909825582725 +-1.4947964720111702 +0.012497812035102807 +0.5122607584800077 +-0.4449881586664327 +-2.002343346527703 +-0.10657280829806828 +0.11135314783404182 +-0.24579358499539136 +0.38231932555755466 +-1.2728073488825138 +-0.4704026515137036 +0.5551442448790551 +1.0520399893298034 +1.3621566323501477 +-0.532801793983334 +0.63587184245535 +1.2840604517863654 +-0.30188552610388164 +1.694814782844542 +-1.4551627685621515 +-0.7293388278964048 +1.1756788330210606 +-0.3664528982717207 +0.2880322145541254 +-0.86067881809761 +1.1704617652324165 +-1.394816658892283 +0.33377334010642357 +0.08739007362628404 +-0.6408472695080709 +-0.19814040099971103 +-1.2019403886739128 +-0.08525754592388578 +1.54360088262733 +2.854068535004016 +-1.8681943317126166 +-1.6196119418008614 +-1.302484792597769 +0.8768638500262194 +0.0850466058939513 +-0.2067111439066743 +-0.220821692396727 +1.9752874210749385 +-0.44537181229626865 +-0.2730284253127251 +-0.9335303395873579 +2.9779548944995575 +-0.09197935458067832 +-0.1918794367667514 +-0.06945077806799203 +-1.5114302009580776 +0.4500064332839411 +-1.2938429541782683 +0.34112821570257656 +1.9873411283937255 +-1.2926882669776585 +-0.7625032875076124 +-0.9730845679601606 +0.33702868127449037 +-1.0559507710974279 +0.3879777482526854 +0.3897493918013447 +0.2957149098769265 +1.804125491919261 +2.273018545655302 +0.32459768058694494 +-0.5153364289012035 +0.9518734358930301 +0.8856874813992499 +-0.301752540079327 +1.6460441995447128 +-2.1546022346924927 +0.09562478680945474 +-0.27508501820643416 +-0.18346250803213254 +-0.6371609350097982 +0.4173545795945244 +-1.5327080640477717 +-2.9570727154362784 +0.3970366642360105 +0.199494518703341 +-0.46388337922656114 +-0.4309401174123661 +-0.8880238110692076 +-0.11066197202868495 +0.35254882918369135 +-0.49708190160306 +-2.549019302852421 +0.3994513777337403 +1.965612115728366 +-0.05949742066181313 +0.6861327788073939 +0.19516726631584386 +0.298059145922872 +0.5450030478420633 +-0.19378645600721017 +-1.6926581263117817 +-0.31630475376678024 +0.6927899171041934 +-0.3990290243794454 +-0.17522239333605405 +-0.443924054422962 +-0.9656974706433077 +-2.492329522297764 +0.22634446031496364 +1.2943380313093018 +-0.24842139071673183 +1.3536238967265761 +-0.7133688056056462 +0.4809325731666151 +0.17182399740920418 +-0.29734511831637267 +-0.34303214194832077 +-0.5055259556516044 +0.354965983396047 +-0.21680946972002177 +-0.46530757680008933 +0.42858543745156663 +0.017805275290902728 +-1.111092499048369 +-1.3588888493473903 +0.5018002318206464 +0.13665622629069252 +-0.49408732907938246 +-0.3614071351895636 +1.237191272122078 +0.014255583328500104 +-0.44474776168719143 +-0.11698413873578997 +1.0858081030583508 +0.22789294941087168 +0.24349808664797534 +-0.21530359783472253 +-0.7518844410603481 +-1.2317545233122307 +-1.703182531387335 +-0.61331308393324 +1.7929608854200494 +0.4946588476627283 +-0.5605590317179447 +1.108070295471876 +0.41046042934017823 +-0.5875716952105692 +-1.1786865821937713 +0.18249966881539031 +0.5432058157009474 +-3.2081350615511006 +0.9856690512424502 +-0.4699090598735873 +-0.7309749118471113 +-1.3268112423941325 +0.1731710333795911 +0.2828723772808437 +-1.3300382356749787 +-0.49353434685027425 +-0.5116654555142219 +-1.0605973730313645 +-0.9486629681615544 +0.7279100835469935 +0.3924097736226182 +0.5479853255662365 +0.8958435994841345 +-0.5932752667865052 +-0.07245859924226687 +-0.7080357728779031 +-0.5840001172885985 +-2.1778725952509954 +-0.4572613518147426 +-0.33719459570908805 +-2.5214048414497565 +-0.15059080696171062 +0.4161042054000349 +0.8148274334333456 +-0.6377051089775381 +-0.47067865361684097 +-0.5742333186729223 +-0.5122084662684149 +-0.6140082661738187 +-0.08716516322688124 +0.9059723761275913 +-1.2920758525877436 +-0.6299638455163852 +-1.3237084214476262 +-0.14310127722239868 +0.15641881115137118 +-0.9100544175873676 +-0.6448207227391332 +-1.0579626298492988 +-2.0704305792996482 +0.3893520085133785 +-0.667058252262615 +-0.42245937795209676 +-0.04550202367386624 +1.1572672859675484 +0.3722939510035068 +-2.063321091283162 +0.3024054484104057 +-0.700291773488686 +1.1000011171529624 +1.2052330297486284 +-2.0931058311113535 +-0.6388150683616918 +-0.42003045989914023 +0.545249743568139 +0.3653186317493472 +-0.5648922586354896 +1.056254943613555 +-0.23061556967622643 +-1.3215805895749282 +-0.4606842748307508 +0.05245629528665194 +-0.22409471222138827 +-1.6950240710531366 +-1.5660077675786535 +-1.0248358360505823 +0.6217455803580404 +-0.9172296974158916 +0.7806257474151329 +-0.5013388503289389 +-1.351374356483556 +-0.46250309228483094 +-0.07511646726764885 +0.44402805033275883 +0.09507441916555281 +-1.1218921652668277 +0.2933808729955312 +1.5418775350156795 +1.0562836643466311 +-1.2911501401093355 +-0.2803833831692364 +-0.4762480827047481 +-2.2712248181945744 +0.05988292206322643 +-1.3821569884184832 +-0.20895981470030842 +-0.03138888812217061 +1.3345443800759311 +-0.16896864310075216 +0.8412315084713184 +-0.19474410090923644 +-0.7630430883390302 +2.140675425515239 +0.400243297237176 +-0.2281817469548963 +-0.485401903499863 +-0.044603367357153756 +0.8128217088486858 +0.10070640266378544 +1.365150997178593 +-1.3882108653485594 +-1.4653684466127075 +-0.7037188651268435 +-0.429106407660411 +-0.7270871075587874 +-0.5706416318403528 +1.0624765208298113 +1.570119331151273 +-0.960472611009175 +-0.6936688924790022 +1.177767659508761 +0.5072640998459993 +0.5776662347445676 +-1.8108157860105005 +0.04958613449603996 +-0.12964171933361363 +0.14571404383605613 +-0.15660318702953038 +-1.4610084245363706 +-1.5578071186693114 +-0.5453132072475275 +-1.6035091537361383 +-0.5759211539727266 +-0.9194729623351613 +0.30504212112658863 +-0.6079451938385118 +-1.8252090130439724 +0.7473665841123117 +-0.33901442281279 +-1.4767395093731481 +0.7481392692795489 +-0.9954575496391265 +0.127108649142195 +0.21570821187519157 +-1.0181811140257322 +-1.4570002818004082 +-0.28031068408498694 +0.3903016435464338 +0.2825971071035759 +0.5280689793357782 +0.28322643002923203 +-0.640944532271325 +-0.2507057433744972 +-0.14216033506116552 +-2.0987219080393533 +-1.7133307599384815 +-0.7053598588860208 +-0.5277419564590984 +-0.3119051995931621 +-1.088819318292433 +-0.13666520591307982 +-0.5195013600654814 +-2.0052243621412993 +-0.43379215963878653 +1.3677280050523848 +-0.23644667646081483 +-0.028090436226725968 +-1.1826799863800055 +-0.9415981892058791 +-0.08695864421830124 +0.6910292804498204 +-1.6857391372569326 +-0.8671535359281468 +-0.41329378693218854 +1.321292600439497 +-0.9372222931884244 +-1.2953637475998794 +-0.05030492089702382 +-0.7141823812796749 +0.652278430437196 +0.9124618480894029 +0.24325392491968173 +0.8549237851720934 +0.46876570476903956 +-0.22626198140597678 +0.7703427676560508 +-1.4870678290323622 +0.21188714377152817 +-1.5264160418620796 +1.875228513804218 +-0.4107366179536251 +-0.48420210953000803 +-0.7298234580377781 +-1.4996904035187757 +1.1086404885114585 +0.8026891147008685 +0.17308648427467754 +-1.3626691349764588 +-0.23936651691252087 +-0.3956622608928295 +-0.16593680021699317 +-1.0606514746971754 +-2.2921539425327797 +0.7717209133794058 +0.6578152436595118 +0.26284196447293406 +1.4634586200063295 +-0.02222316290882595 +0.6879793620869371 +-0.6071774732338964 +1.0665537504681508 +0.6563429206306709 +-1.083838351019648 +1.2741097025920243 +2.478512059117868 +-0.743373612406418 +-0.08085810348022143 +-2.462354717032646 +-1.8028435233777067 +-1.9907170865273112 +-0.3485586735305523 +0.37406576574292616 +-1.0371053167045718 +-1.6490716715983 +-1.746714185776434 +-0.5438171793231474 +0.8954333636349339 +0.9911742743779106 +-2.6253065551782573 +-0.16660463301844333 +-0.9185108906859387 +2.4186770376715225 +-0.4805315790073687 +-1.2746850797561387 +-0.9904097394020842 +0.16347549287352592 +0.5372409774521764 +0.6725495997371392 +0.15313719430496164 +0.8517572712303072 +-0.4308489479164756 +1.2712943572733266 +0.2995780210341545 +0.45278339429421477 +0.13558198588419662 +-2.486177305174052 +-0.5532033617714922 +0.28841243110907155 +-0.24431353079563856 +-2.095825086449289 +1.9449312393734457 +-1.516775894557876 +-0.9660178714003314 +-0.8779248799168988 +-2.065762785271952 +-0.12843148981251878 +-0.9025401953370394 +-0.7100327866192145 +-1.7920908474227222 +0.6083921513149825 +-1.6790408953470781 +0.9192001975724085 +-0.23574865140420023 +1.1718674157200366 +-0.31989075149941393 +-1.1777719271106744 +-0.3680735362851025 +-1.194120857248142 +-0.7492328593583727 +-0.8501026373385839 +0.7659155257616421 +-0.9159775835738616 +-1.2392651522821314 +0.2462726193042814 +0.8080555981572963 +-0.8365541233768239 +-1.497932997177817 +-0.8488487100622226 +-1.399764383761647 +0.2595374322736104 +-0.7483123958960954 +0.37909263025132334 +-0.8496113611572829 +-0.6028860435770784 +0.7976352630709432 +0.12416545463085077 +0.6084107943336736 +-0.12428722083335869 +0.3970358865259217 +-2.0849970608051516 +-0.9911339306142896 +1.1847197473206639 +-0.04559776600066209 +0.3577343795766076 +0.921285491993564 +-0.3771154706181314 +-2.016287360509775 +-0.3067514504399191 +0.31898694707574937 +-0.27525715018819297 +-0.15241389906138678 +-1.1142997014791525 +0.625501100918591 +1.627829975295175 +-0.4132807524013949 +0.16682008558217387 +-0.9484678969307107 +0.4872216527275075 +-0.7530038415649103 +0.2963496677214782 +0.1650156172475833 +1.250721695308706 +0.06336871607943212 +-0.8333853634791066 +-0.9631082685778117 +-1.3066963066449604 +0.5219607640324508 +-0.6505591536316091 +-1.131074122686389 +-1.0702011114181098 +-1.3123477439438578 +-0.2632125358544848 +-0.9478088289139514 +-0.3125549951962573 +0.031062279438700574 +-0.14843426542124113 +-0.6368168913575227 +-0.7755165153832855 +-0.2540329868987584 +-1.3655604307599902 +1.5290289768563836 +-1.3755083266732422 +0.4430832418588837 +-1.4125094115444061 +-0.575418135196299 +0.2480699441210093 +-1.1004094057432479 +0.860356985962728 +-1.0890334965190145 +-1.2035710133340787 +-0.13099306413245052 +0.3327621253170542 +-2.525793974670913 +-0.09680120303824818 +-0.19954397811399308 +-0.8375183644309835 +1.2661358304529482 +0.028874527130682504 +0.5023641413659764 +0.03812048199116924 +0.243356732764951 +-0.04715551581340921 +-0.7977175365264867 +-0.02986396008242323 +0.7198338560054137 +0.4094454651383804 +-0.43066220746120365 +0.10355670942732886 +0.5331935969134488 +-0.5334667205690047 +1.0981852409260942 +1.2468829550474574 +-0.3120446675728998 +-1.654942412892756 +-1.0382960844123441 +-1.7402559428840545 +0.9194185587573303 +-0.03512614878052461 +0.7336152301394919 +1.152081520293718 +-2.158393994839072 +-1.8234223717968767 +0.7267084965293035 +0.06409557293289514 +0.49263040736312136 +-0.08672860636842157 +0.19910469694624605 +-0.4461485878778357 +0.9414140590015219 +-0.5740246034673816 +-0.4564192730810323 +-1.210974362138516 +-0.5498722938869682 +0.7066735833076894 +0.8515477430833078 +0.5359653044699326 +-0.0860278133422742 +-0.5448392347799349 +-0.8995513724266492 +-0.304198737170698 +0.2557614019628058 +-1.7626498428165047 +-0.3881848099708584 +0.3210366539832842 +-1.0711934856149403 +0.020366220643908806 +-1.6278215794603808 +0.8182846369448373 +0.551377078209017 +-0.11385643137336439 +-0.7008176871923261 +0.31631275961436667 +0.5439923572698733 +-0.9703825818808504 +-0.5254586453100896 +-0.1418054994318974 +-0.38375549877137693 +-0.6480064351906603 +-0.22932031162867694 +-0.34031433193107974 +-1.3384146079862318 +-1.3484669092198416 +-0.4842240690220444 +0.795406183512517 +0.6355540619346645 +0.19917186221097932 +0.3476913101036274 +0.6865800051893245 +1.7268222370722635 +-1.2073527634192995 +-0.5258438290969034 +-1.1203140217403562 +-1.5989654709428747 +2.5911673634274015 +0.988722049255695 +-0.3230684933315423 +-0.9346839103504466 +-0.33230701581362243 +0.10945451177812032 +-0.24549972218047286 +-0.13942668449990003 +-0.6074764736475948 +-1.5943687856388309 +0.574725714618835 +0.524807177282081 +0.4691046863913819 +0.9403586035315656 +-0.7352919378592128 +-1.4717770986191598 +-1.1554074232704332 +0.6333991828549429 +0.4511050985359627 +-1.0629098714642042 +-0.7436640980589222 +0.10729825375993096 +-0.2568070682274068 +0.3213652679120196 +0.5202585924598655 +1.7020306856820022 +-1.890535287889752 +-0.4259895958581235 +0.20945522751877937 +-1.1980240134733104 +0.6979532625066532 +-1.7030925862990833 +-0.6528091170033885 +0.35780991073529955 +-0.3691546318854974 +-0.47309259919590335 +0.7031537013022564 +0.7076889107260775 +-1.2531500026777427 +1.0466490923277245 +-1.1535235487319477 +-1.3625823983769296 +0.8641458153595551 +0.06762106107745858 +0.02972222402624705 +1.7289261054534655 +1.0074785195764624 +-2.00541876952755 +-0.47560003633156933 +0.5961720846654052 +-0.6630434248972245 +-0.10442821094510238 +-1.2264187346778037 +-0.7820355069681394 +-0.22694051407488 +0.30515790128989567 +0.009757819896865527 +-0.014944541762866193 +0.22390860853991384 +1.3238223669649245 +-0.11813332488030402 +-0.280255615913469 +-0.3822732390881708 +0.1944785968734331 +0.05198445438126292 +-0.5664788033534122 +-0.26034800597063 +-1.6479426808489308 +-1.3220137197190558 +-0.1881634568652983 +0.21102193095534466 +-1.21963500714856 +-0.18183776242976316 +-1.317418052183747 +-1.295842049962646 +-0.7350238863756289 +-0.24167945832228768 +0.139755599470887 +-2.0180222695157264 +0.0005846050464974051 +1.2366226143830736 +1.713318412562053 +-0.7954452081567077 +0.8882314680638164 +1.7871657899767048 +0.2593765300055616 +-1.270257191217519 +0.42049958132484644 +-2.1700195351381217 +-0.1790748638483784 +-1.0713936838121265 +0.32876644827490087 +-1.3247714787956337 +1.6364605249511888 +0.4367100968664205 +-1.3042197981637387 +0.8171206054593756 +-0.3771815375479596 +-1.0835691771814586 +0.3322083877304456 +0.21564088642302776 +1.6512917563914684 +-1.5835400814630616 +-1.1838523765811766 +-1.2962390392946879 +-0.8371789865658613 +-0.9941988993940014 +0.3984367192059566 +0.40512212096261335 +0.8297124357034467 +0.21325252530650168 +0.41772688884554554 +-0.84915981358114 +-0.23449882187033014 +-2.5361515905643843 +1.1323000773373593 +-0.7863670075932726 +0.21808227347546816 +0.9490679566873921 +-0.900531024385327 +0.8322235157492583 +-1.7448810152408893 +1.572137181978058 +0.477524844062886 +0.7549179563746176 +1.1044903698161783 +-0.10776174159049404 +0.40470847134582166 +1.3798280876238822 +0.23977419498854863 +-0.24705503726205538 +1.1391180748332237 +-0.5957048028612009 +1.3886283130034467 +0.48244658951476227 +-0.29586773957052787 +-1.3581437285384377 +-0.04354241520209562 +3.5632478778501993 +1.8853146270250416 +0.6599596500364152 +-0.6649493290878816 +-1.1516443807114263 +1.31635416551257 +-1.1130369448288044 +0.15681770433570008 +1.0753812928981774 +-1.1314399507346597 +-0.6326268136912789 +-0.41567783707199346 +-0.40811773600791945 +0.7876991702402487 +0.11233439407916063 +1.6229611676004918 +-1.0706746565070664 +-0.8760982592490217 +0.5385918228030676 +-0.9393458335478398 +-2.159299333026354 +0.16031833221977843 +0.014728343814164602 +-0.7460232678973372 +-1.4289926162014706 +-0.5733193737323257 +0.9615476065268915 +-1.630379906823947 +-0.449777385433024 +-0.21209047135094636 +0.39857970081974337 +-2.3965490205720634 +-1.7575364659144614 +-0.8894765781590848 +0.6977554234767904 +-0.8542834055969898 +1.0409059321192173 +-0.08463624665621898 +0.5582654070521057 +-0.301550991312976 +-0.15013544061239437 +-1.2085354627604594 +-0.02373519134888688 +-0.2356960572315609 +-0.8504710896103725 +0.66386230563097 +0.7593568560082878 +0.34316173871087474 +0.4478221726734025 +-0.564843717900352 +0.8331216713034253 +-1.367271237083117 +2.979407502611756 +1.1190008587077869 +-2.159099625352588 +0.8972862939521635 +-0.12461312266503874 +-1.5581974185809913 +-1.4153906196260926 +0.3366097029927262 +-0.2842585801419673 +-0.5822396328260045 +-1.1679741794172716 +-0.49408514223237504 +0.7750681360631211 +-0.02996592410474086 +-0.3616238743648891 +1.3431294817625952 +1.5567600490628257 +0.3160546078582821 +-0.9399500063399322 +0.9856726053050888 +-0.4056217263413337 +1.7227648515908518 +-1.0380884976183729 +-0.9131633894727688 +-1.037785834591435 +1.755234645091972 +0.12509102681796108 +0.9932082224470142 +-1.13543544313903 +1.1412444295928554 +-0.8040902643831184 +0.29138533010506906 +0.17031987368832013 +0.5912844654311283 +-0.21854396253711075 +-2.749381029481146 +0.35982914468598026 +-1.6995215539356503 +-0.8618474309571733 +0.2063329395293661 +-0.9131656352495441 +0.9070106844987944 +0.7479255787299492 +-0.997552540623617 +0.8219391329442456 +-1.1876978756984686 +-0.24979595155201317 +-0.019561766256200236 +-0.20368299024026446 +-1.4404837476414776 +1.2841338647731955 +-1.0929958038417438 +1.0566946026263961 +-0.33454243448265175 +-1.191243896247595 +-0.24426130575970745 +0.15832336839611955 +-1.4725331373597286 +0.19423139910249376 +-0.3306169038689033 +-0.927305215744065 +0.4849322312889832 +-0.820564601277947 +-1.3374865927904807 +-0.0962396314356765 +-0.44852377876711397 +-0.7337619008714876 +0.8206952810877193 +-0.3318357684333637 +0.1104807485631667 +0.8639211896097003 +0.3891335251809991 +-0.802600932317808 +-0.6873613058384025 +-0.6567434696747212 +0.3635984448317582 +-2.7582619775260566 +0.07341842750458627 +-0.8496829299740982 +0.05593577608370759 +-1.7172811034768058 +0.7803150148325588 +-0.6261721308176595 +-1.0873901862357203 +-1.2146114529254415 +-0.508222216267711 +0.9579706433498405 +-0.843954003706589 +-1.5765790179963461 +-0.766635078167746 +0.497797226915654 +0.8594698636648233 +-0.5888337764518472 +-1.3863079839282655 +2.065749621291266 +-1.5213981123310234 +-0.6249539248500215 +1.3233710198152606 +-0.2474893445956393 +-1.0945998858065593 +1.7468069477637345 +1.6974790208440949 +-2.3530459981510488 +0.6762283399533059 +-0.7530862635295341 +1.290776775935304 +-1.0036572542798254 +-0.1905280528162265 +-0.8800626387329882 +0.5454229205209716 +0.19832858660739267 +-1.591559463846585 +0.21289149580119215 +-0.6985223945442138 +0.2563597677167787 +-0.8378866687973489 +0.04718842130520465 +0.12393251836355673 +-0.9488860164935158 +-0.5412302566366006 +0.9161931466818829 +-1.1423027468355587 +-0.7483933426205971 +-0.618275101624971 +-0.7399467382768412 +-1.4052528566335387 +0.38979213095833465 +-0.9638067754647005 +-0.4663663005781761 +0.8001774340469945 +0.03372096822381607 +0.5198081792659877 +1.322114734652013 +0.37455101858512063 +-1.5824834907662908 +0.2167301066771466 +-0.735505337444645 +0.8139551663249252 +0.3657290097969004 +0.45014798651933063 +-0.4414905627383413 +0.3099969142726889 +-1.5279927772081512 +-0.32060920262851106 +0.19086137225691513 +-0.37051608900935507 +0.3779129293860948 +-0.16139700218211603 +-0.03367284943692361 +-2.1581880865586562 +0.1068107947718468 +-0.018417692301850502 +1.432669225550967 +-0.7127449150248419 +-0.21756058784484997 +0.12865989077385936 +-1.2948619245083963 +0.5281401695347729 +0.6894666010428886 +-0.25225818557535695 +0.649754413615886 +-0.9328659362568735 +0.5293867434812509 +0.6705227554031884 +-2.9161646276326714 +-0.042026113158767225 +2.407875150387752 +-1.0056711802219764 +-0.35621061304544965 +0.3671799943963122 +0.8949159139660614 +0.27617380225724275 +2.7159449561708913 +0.2626555203855548 +2.427427998397344 +-1.8436436361949917 +-2.351243694210182 +0.05021209750455971 +-0.3921002880150871 +0.7037332288832171 +-1.7864016382462353 +0.8312503158350093 +-1.207640766800524 +-0.9005519102588776 +-0.04045336367218408 +1.6359162810080203 +2.048479389059442 +0.12287795405390356 +-2.2939249370619965 +0.8203396966578937 +-0.580138629976931 +0.9494075276325562 +-0.7814962393088907 +-0.25397095982834383 +-0.7793781046162893 +0.30168342901590073 +-1.068116719492402 +0.598145397347043 +-0.5038309121435713 +0.41190782956462724 +0.11329982257828686 +-1.6777600609924228 +1.088222485648992 +0.7474633010028072 +-0.5177693742669783 +-0.38257477978995097 +0.64386432627865 +0.10425612816686619 +0.503602052480853 +0.44883369960574393 +0.09189781876337105 +-0.9867779678977429 +0.5691035684819035 +0.08089027691154838 +-1.0730799592117872 +0.6159627292687722 +0.23659153867224691 +1.3267009013461286 +-0.12377162590576359 +-0.8779443495121002 +0.3048246648407983 +0.0758267699899633 +-0.4430898456487769 +-0.4970920176962062 +0.2430579150840272 +-0.7718673786342733 +-0.22383372204267463 +0.951689901640862 +0.24100341517657015 +-1.5416724970027937 +1.7500055978003728 +0.4893931018480544 +1.1007667047934133 +1.6290954174675694 +1.2425113450389065 +-0.48451418162858334 +-0.3690491943129217 +1.0366194250172345 +-0.30237390173695133 +-1.12814598726899 +0.1570525732865643 +1.174379382396115 +0.35168836168659756 +0.23882857667339785 +0.04621795526907102 +0.5865538235964006 +-0.9419820645976578 +0.7489223378193548 +0.30202297723721017 +-0.6859587496919939 +2.265478596696637 +-0.7966742790944523 +-0.606555976762257 +0.10324887786000042 +0.7529849802758501 +1.2631466755854321 +0.23760498657974083 +-0.7996460632845526 +-0.4732740638794045 +-0.5410279987236954 +-1.5006167305699931 +-1.1913499439946067 +-1.0369415151654429 +1.2251589154811084 +-0.4267612273171211 +0.5030660576899803 +0.5970161814795646 +1.1198637121848252 +-0.7681140859364674 +0.21206433299393385 +-0.2266366680198363 +-0.0914224495820837 +0.7427750116087792 +0.39972426387013915 +-1.9905723400313828 +-1.0313556573179805 +0.22863789815390673 +-1.6622581270031753 +-1.1963720377116365 +1.1618353391678466 +-0.9181000813311989 +2.040056339534261 +-0.1217599966011715 +-0.45899298659227294 +0.9478897268462205 +-2.111128112483919 +-1.5915685871345842 +-0.5070758213425767 +0.42381863293048827 +-0.5939157140699656 +1.286271985619625 +-0.22839782330800035 +1.1413121008032048 +-0.3628874883878575 +-0.13260494470118053 +-1.2062999081073622 +-0.12234919742735222 +-1.0003462468236588 +0.4645244650012158 +-0.23983112374382437 +-0.5759951827124907 +-0.14510041947581956 +-0.9804876319824404 +-0.7826416033182262 +-1.660022457604261 +0.2563399299201878 +-0.2876774753190361 +-1.0301709905511833 +-1.4032341929147722 +-0.19840843415697265 +0.27693431146808756 +0.16312788912820364 +-0.1845788255264212 +2.6712828139130256 +-0.03595510334765181 +-1.2808121707741489 +-0.422590221670059 +0.2275558450970141 +0.166423845100375 +-1.0320070789445706 +-1.5213829939529173 +-0.58959736368923 +0.3199524147109185 +1.9887568659285153 +-0.39038899843957375 +0.4635426543347386 +-0.1883966197183137 +-0.5687597277374441 +-0.9123589351395479 +0.40473404261419754 +-1.892801299890621 +0.869457400380961 +-0.5482192359242459 +-0.0978689509947029 +-0.3642751263328745 +0.4317044832999123 +-1.2023540263550223 +-0.605960144464991 +-0.642546175123017 +1.6441562303327892 +0.7361785647102694 +-0.7885050519315134 +0.21162830070760535 +1.0575111143036977 +-0.6521064197498241 +-1.5661858883767061 +-0.2282374433693459 +1.1944275377068987 +1.0439831131128987 +-1.840975483373095 +1.2092504196741214 +-0.41322874982557123 +0.6015706849263532 +0.8223501963880886 +-1.7899456147607091 +-1.2713763591187026 +0.3879786944328981 +-1.0632975708107675 +0.36026356787698843 +2.2792058892173293 +-1.2752938140890584 +-1.903090200325068 +-1.3823057491097561 +-1.796522632596494 +-1.6055724208988695 +1.2616204812823806 +-1.0627273881242978 +0.8953727456399667 +0.9827662482161861 +-0.7742938775580835 +-0.03518322543130131 +-0.05865697422669092 +0.15121711965391188 +-0.994166724096983 +-0.8052739979627893 +0.5020860521667773 +-1.1323756675395389 +0.6128870977886972 +1.3713495336804546 +0.5939727565947236 +1.2681898731173464 +0.9431344904866239 +-0.1547287098876136 +0.6347572569052626 +-1.2132255799557157 +1.462822789167987 +-0.4037830723146584 +1.622864453944396 +0.027846384139583125 +0.8208519439676296 +-1.0448678302650856 +-2.299143828930248 +-1.1503646700874148 +-1.3063920760134728 +-0.07733962894490501 +0.46652398239864556 +-0.40870563626493 +0.35727694390673015 +-1.072625724736982 +-0.09358467172685604 +0.6074663286720187 +1.0380672179972639 +-1.0475241755667 +-2.2236777270068577 +-0.33930899811712234 +0.13082993146876948 +-0.3488198040975682 +-0.5538221065550712 +0.794921554853817 +-0.6198947977714324 +0.3643205709700993 +-1.181810068339646 +0.6428811639883445 +-0.1531007935924602 +0.7105988181333667 +-0.5610424052582695 +-1.7411147412015138 +-2.0046399115824762 +-0.8698872483901487 +-0.3537815971561089 +1.4332050229334043 +-0.16349162568549813 +-1.2154959886078762 +0.3580784225475525 +-0.9943397916887924 +-1.7269166441228696 +-0.18536597903804736 +-1.3860062930631158 +-0.6451664302390321 +-1.7815339080887738 +-0.01839115985976275 +-1.4853405334413698 +-0.47028154870058264 +0.7403503758560616 +-0.8162523157011645 +-0.4798823473759429 +0.8142688778553693 +0.013055640752185488 +-0.9059605887493304 +-0.5145498017748538 +-0.23683415310146388 +1.694335986134775 +0.2139670589524234 +-0.21638284869256713 +0.3574066218160701 +-0.18470011491586608 +-0.910972243754756 +-0.11678680393918303 +-1.7794526447452013 +-1.0118557603272689 +0.29137103002569137 +-1.4626521331559816 +-0.2080564086800033 +0.027473433342594722 +-1.401702424476833 +0.7290545474746487 +-1.5276716157782857 +-0.29642375148670563 +1.0557788049585661 +-2.1860632928964057 +0.9483887104007755 +0.3667019593528761 +0.2912026137769021 +0.23280880085370087 +2.037103942623058 +0.5599471697135849 +-0.44073486919526994 +1.918473919800438 +-1.369021374548868 +1.357655855244384 +-1.507304748312681 +-0.4248468844958976 +-0.8442950308349461 +0.47851428615535796 +-0.7421567946869745 +-1.2097128694192782 +0.7679596642821048 +1.3311762004295267 +0.18274548490805448 +-1.011424153214732 +-1.2530659405603128 +-0.5004249537932253 +-0.7462090306883007 +-0.4419393319101959 +-0.11288850926591443 +-0.1200762714726744 +0.4410651674096069 +-0.7427650880328427 +-0.34098589593531115 +-0.01763715504997157 +0.4361886528466212 +1.3614576186470588 +-0.2384131348524848 +-1.257875219223736 +1.7013068426172089 +-0.9945396499503976 +-0.22286437774043028 +-0.4351824916157052 +-1.0697021793770078 +-0.44449355423832093 +-0.14410938083737543 +-1.4319980411288373 +-2.0450448091822695 +-1.7323705246231627 +0.22466764814052814 +-0.9929363398124791 +-1.078618439144614 +-0.46214791835449304 +-0.3000240946091115 +0.20181974850847895 +1.1557554623734552 +-0.9600653828089902 +0.21437906991036032 +0.16475831244254524 +0.10430622012452218 +-0.15891835640451024 +-0.5988330456639129 +-0.924664572425478 +-0.9059891585717318 +-0.6237080498075719 +-2.039515061320368 +-0.5402078564969776 +-0.6533723149517663 +0.059750543499416386 +-2.0006119815527352 +-1.2356324249004622 +0.352068754012278 +0.682249026936741 +-0.46503779728364386 +-0.5282290306937005 +-1.785921656032224 +-1.3712670848513113 +0.21009154395167695 +-1.045365711807869 +0.6805610917025467 +1.8369004076266504 +1.515686866853454 +-2.3178847628421444 +0.6346919832927149 +-0.3317764051740858 +-1.3650662889299319 +1.121035733547873 +0.22984823199809673 +-0.955565697963394 +-0.969510464371505 +0.5655970790459957 +-0.8763757718792603 +-1.1160393286125008 +0.4191108577067013 +-0.9306040154442035 +-1.343148170125647 +-0.3689336062225982 +-0.03573287538779066 +-0.4561480122016106 +0.34440172339681796 +-0.6727999190503826 +-2.2194323474650135 +-0.5100061265929429 +1.9088198966773076 +0.045747415603164754 +-0.41308318167397995 +0.010007710334960035 +-1.2943938049474004 +0.32231639764026854 +0.6389047194162121 +-0.7459307055675729 +1.2795521524881412 +-0.6900062655399584 +-1.062956610956196 +-1.847635144245307 +0.10289765175497195 +1.0429313936363707 +0.12183848142918818 +-2.0582096879196285 +-1.2563160998919092 +-2.8030938168921713 +-0.15399425825989538 +0.7293236626194616 +-0.48921735023833907 +-0.6020400905442528 +-0.7036085598082763 +-0.2121958417075185 +-0.758657487208609 +-0.31813219720331853 +-0.9996710052948755 +0.1021950572472668 +1.9021870213264005 +-0.8182155778071376 +-0.4807572495054099 +0.384211932889458 +0.2647384789705633 +-1.892159135138419 +-0.5552075217678197 +1.3016338586065468 +1.06885785862528 +-1.0561578835470016 +-0.19248290544253654 +1.7776395182050466 +-1.9082541562150745 +1.627021246879945 +-2.5178526187000694 +-0.8355375124812834 +0.5194368938927376 +1.2779225910391698 +-0.561475494268782 +0.9928250322023768 +-0.5617969214595252 +-0.4508951721697754 +-0.6699388193445318 +-0.6964387827495008 +-0.5376797680657428 +-0.2789715866482353 +0.24731038224882052 +-0.6173999426114269 +-0.17863023785401314 +-0.9998008228690717 +-0.16178735585511886 +0.2912402084118832 +-0.24725558944824524 +0.07210100479003717 +0.6988126759520144 +1.3714596330192494 +-0.9347588606437827 +-0.5467382243301043 +0.5952441915843552 +0.7312555482467834 +0.8212127678247156 +-1.0457976342923514 +0.27464457805510334 +-1.0308945809847712 +-0.0925520546642483 +-0.3352276159313238 +1.1879447464118693 +-0.48698789032441936 +0.026849854847905114 +1.3478224637849532 +0.7124985081183862 +1.3476421574702768 +-0.6708800418501233 +0.7414669128157311 +0.10550606202833235 +1.0550356356839228 +0.4175817337638208 +-0.8740693987023469 +-0.8585787028482871 +-0.0659205631906056 +0.2155536249565434 +-0.9403186045791526 +-0.23618361443276828 +0.012498861558122132 +0.5002663470525951 +-0.36946520927549165 +1.4603134934426008 +0.6282994991649007 +-0.3367027004651365 +-1.358944471067653 +0.14211832630194976 +0.13060973517314362 +1.1595204371884473 +0.03416110632810121 +-1.9255359308445081 +-1.9187754053963735 +-1.8400672074710873 +0.7187156339146302 +-1.103392544605807 +-2.2822554027798967 +-0.5572860104110791 +0.1726975895506997 +-1.5775451063636632 +-1.0967364576630507 +-1.1782082837023538 +-1.3750462518902515 +-0.5189167710015172 +-1.263822738703791 +-1.6677230734018718 +0.26348208562683945 +0.23616585334666435 +-0.4358528001168416 +-0.8359761760133982 +0.6160778339835071 +1.043223994238776 +-1.2331177963949687 +0.7479914616439051 +-2.42195498872928 +0.7150199955976222 +0.027794178160713612 +-0.9539489375636706 +-1.2412466967369513 +2.004239804130518 +0.21265504642897987 +-0.7151193132381695 +1.4932838170578695 +-1.3669820518338527 +0.25633158637011433 +0.7547194280466083 +-1.6757663633473785 +-0.3074261400297914 +-1.0087687712394233 +-1.1842936517703122 +-1.2833882163618384 +0.30161223946177596 +0.09727219589308528 +0.9413665114033751 +0.7664290242097105 +-1.648578887544653 +0.09687993704112974 +-0.3114091761899967 +0.16619261840664445 +-1.101788415425081 +-0.4869241528144538 +-0.3081844941904411 +0.04022844723861663 +0.6441174140677366 +-1.9594828433079714 +0.610040870982901 +0.9543973702928987 +-0.6214895884142471 +-0.6750994217747 +-0.1784594536274006 +-1.4207388585643932 +1.7422549492296837 +0.4036825345501026 +0.005640794569612723 +-0.015027232321311146 +-0.5418968944917459 +0.16905355899952362 +-2.2631481112933836 +-0.07429985953340917 +-0.832222346377557 +0.7258886044330269 +-2.212896916491447 +-0.2558456180969366 +-0.4766444951092505 +-0.8197978869926268 +-0.982737154792622 +1.6601208239529148 +0.07604591853676279 +-1.5105270215593505 +-0.5201293561769396 +-0.4500567207936854 +0.71804238349813 +-1.2682175506381743 +0.9237096423021269 +-0.5170637082253913 +-0.7271938649144968 +0.7171947184822947 +-0.031222338806331185 +-0.3127161992725801 +0.6283803539618851 +0.37108064253255224 +-0.23980954335537058 +-1.4757484708789923 +0.457703537610039 +2.089489982651645 +-0.47827806612937007 +-0.45409366316232563 +-0.6169881311518404 +0.32222094794417844 +-0.5731961515336224 +-0.733958836356902 +1.6517024117149117 +-0.891995333981032 +-0.27740311206026497 +-0.6764068676769555 +-0.1148965267482539 +-0.8736742523528537 +-0.4596003604687651 +0.9222679194511274 +0.3808545767180107 +0.670932618669033 +0.8601759507031737 +-2.137803236175894 +0.3446407036102892 +-0.3273496155022917 +0.31926879266025954 +0.4504795394897513 +0.19122604277042948 +1.210161579069504 +0.11950410472953765 +0.014139862165900657 +-1.1400789063345003 +-0.8979741526985248 +-1.63239413969507 +-0.8721870916926957 +0.9990277788577653 +-0.8771482163045252 +-0.7265296184945748 +1.6057792160159314 +0.6012801999934229 +-0.05734668626395423 +2.083149844958357 +-0.6380390611149446 +0.38819504132207117 +0.17659890092968816 +0.020561319270549716 +0.28713151855168845 +0.046134093143127886 +-0.44888227277497655 +-0.13992676368940687 +1.3782128599794445 +0.6404114584396627 +-0.13874089421343683 +0.06340751077156637 +1.1516015084950266 +0.7415740282766257 +1.2963686332816806 +-0.39946743978845184 +-1.5403950933843455 +0.30563666567231446 +1.4658434461621095 +0.01735224570253291 +-2.0694982949287937 +-1.1540384397572019 +-0.0506007115643812 +0.4727914850443725 +-0.24872734482353734 +-1.0067264905906546 +-0.3445933760748916 +-0.24461938985620899 +-0.1741784872300101 +1.09048401382364 +-2.811577215344994 +1.240323114686649 +-0.013507308345303504 +0.016732234323570183 +-0.37898375095466363 +-0.2748707045596091 +0.27118404022907 +2.099309359644299 +-1.2706009128026499 +-0.3464767940627186 +-0.2933676732243083 +-0.4079450921773563 +-1.398958734377734 +-0.3555639451547934 +-0.2836662444891627 +-1.4064457318494863 +0.7741234584674677 +0.5139263154760148 +0.07667552325890459 +-0.110637984771668 +0.9186237120067864 +1.624890883302646 +0.5377291090889208 +-1.4415826647022691 +-1.1380313836815614 +0.7182881754954321 +0.8545191672690915 +0.7970173583008271 +-0.7076301175726878 +0.4180748500664957 +0.2943404208581519 +-0.7637055513169798 +0.12817992864985117 +0.8893001992360086 +0.96069346470952 +1.0799865177314423 +-1.0248165473780841 +-2.7766111098303163 +-0.34691744485563103 +-0.7032065442505019 +0.28478394203450036 +-0.6030317866285885 +-1.4564789744429019 +-0.8766062026913357 +-1.1852182128388338 +0.03860852342039742 +-3.0826679076084798 +0.0424121235627572 +-1.3850733984372352 +-1.4302099676710742 +-1.7622638322606505 +-0.9552112459750055 +-0.1880019153415771 +0.20084304935368946 +-0.21109998126852259 +1.830089501950156 +-0.8161220478622051 +-1.823355255064003 +1.0399269644499551 +0.1881276764219797 +-0.6830162471566019 +-1.1014884975153092 +1.5501637929696936 +0.17116219408814798 +1.2866572918895414 +-0.5277719318857246 +-1.1181656737816117 +-0.01071287397023546 +0.39352528585552093 +-0.3222002214251817 +-1.0127742197852894 +-0.5610819155149762 +0.19257995443577403 +-1.4121344535286147 +-1.9285134959316967 +-0.3335661191834974 +1.6171913346897542 +-0.28737007071810144 +-1.6851260097801946 +-0.39161538958426556 +0.909012480847647 +-0.8153471544330475 +-0.9790424832218033 +-1.3342033144804535 +0.0811277034422882 +0.23136697945229068 +-0.888912365645463 +-1.0546793203859188 +-1.3929113613592354 +-0.13258352923181993 +-0.48002259300969424 +-0.7188790519838365 +1.6370137038857213 +1.3005690932036875 +-1.0804423408989172 +0.7405747494058541 +-1.3715121959816947 +0.1160167802523076 +-0.6330902348238776 +0.22910025276095508 +-0.9249323013651282 +-0.6426025733414735 +-1.1808589065297603 +1.1313985104043565 +-0.4661683834653531 +0.5766690371857687 +-0.1081343239232433 +-2.642405478535496 +0.6370931473927226 +-0.36134429220341846 +1.5202401759640707 +2.086280493779057 +2.0650563899748464 +-1.2379618258197873 +0.2684798741289653 +1.2837524567017213 +0.49374752351400153 +1.6732483196344994 +0.6382352360979433 +-0.7669404591867421 +-1.3314915121140258 +0.9150201038017876 +-0.19921834967344987 +0.7700397590334774 +0.2642967077582339 +-2.916664926708947 +0.6175073877440906 +1.3064089288249325 +-0.3299857079629202 +0.6283979074637659 +-0.9713767083463335 +-0.003006348382744356 +-0.5929299300671591 +-3.3543692025073577 +-0.3255729044068847 +-1.47381298668609 +-0.15247018002560284 +-1.51724376140373 +1.1041713343474857 +0.26000744527764436 +0.039552020428223505 +-1.370326758638305 +0.2261643089973676 +0.9004148227438977 +-0.7750123198835086 +-0.061688340142468795 +-0.26022748485681174 +-0.5240787919567615 +-0.15960033071476074 +-1.441904330970349 +0.10129008378047893 +-1.504970228652604 +-0.2967038268328482 +-0.6232821537366191 +-0.935023770885235 +-1.523399488028381 +0.6217823003810254 +0.6838720800575977 +-0.6615585155775008 +-0.7165208799288265 +0.10947210721257644 +0.7974973441620953 +-1.4564531335881015 +1.5958211458195866 +-0.11674568781469813 +-1.4587948311920136 +2.1545803778054093 +0.5744650235092882 +-1.2911516235683094 +0.3846604360878888 +1.1565174308084536 +0.11462838692809135 +-1.4699920083692195 +-0.6549179442554928 +-1.4558750248949697 +-2.7308422581338734 +-2.0144693599455348 +-0.5505861868513434 +0.0034855470415915413 +-1.0476916162163554 +0.41634861982697113 +0.8612189653800806 +0.4865520940535125 +0.6261054018142126 +0.9198306192842087 +1.1554045642373834 +-0.655642635939721 +0.5555033265742271 +-1.3589049930005972 +1.2093021414916714 +0.6968574153872129 +-0.6312941859522978 +-2.1165729140460146 +-0.041606905629676755 +-0.9091328412476386 +-0.8618255151660561 +0.8016965325079719 +-0.2003951836701499 +-0.8068795367011111 +1.1042919369504263 +-1.3138022768005169 +-0.8944846541921476 +0.30675037730907295 +2.4416834370253007 +-0.4853729850721811 +1.1986756289986245 +-1.8553593591556847 +0.519017367618534 +-0.13370108171908632 +0.9553800676315027 +-0.22091755613060643 +0.06596629657140851 +0.41939642515664677 +-0.656594676824346 +0.6374318286650927 +0.668140038820131 +0.2306595724552299 +0.6894557533909634 +-0.3939735080072491 +1.0155167379065642 +0.7749568040547203 +-1.0251428496024917 +-0.49556766563513316 +0.8736816917227113 +0.3747457450874515 +-0.927068225221655 +0.770696433387897 +-1.360399850293356 +-0.18086268901003796 +-0.6129426736109153 +-0.7437971342185916 +-1.440724741676569 +-0.5441317400528987 +-0.9258710785594703 +0.7058268403784255 +-0.6326167691498684 +1.9366846341330943 +-1.217020108140362 +-0.21745659741894333 +2.964353648343711 +-1.3709593813325778 +-1.349190814759849 +0.006987818872316309 +0.35673603875134585 +-0.7160993709229032 +0.06845350323863619 +-0.6294711844982044 +0.603527294323014 +-1.084039850666679 +-0.3251908739196548 +0.702862673145339 +-0.372605767000794 +-0.16958865422667252 +0.034741180181248305 +0.017634735612116564 +-1.0629923478422767 +-0.07425412690453718 +0.16588605620191765 +-2.1119220703267345 +0.08150844106137739 +-0.17309268368482988 +1.1392607443188905 +0.17473285687014617 +-0.5609755593187612 +-0.6877213240934101 +-0.8390425641469814 +1.661275541542151 +-0.9522815491612179 +-1.3651428130088046 +0.1994795026911606 +0.15182732416533246 +1.5960169784301754 +-0.09414366362281806 +-0.8330465880932504 +0.2314281134331745 +-0.3678445144635362 +-1.9294422914893496 +0.3007822200026867 +-1.0107073706041225 +1.6590461087087593 +-1.0396883315831031 +-0.5219413363462879 +1.4970875475780185 +0.13284362384107873 +0.5877632693941384 +0.5131160856291562 +-0.24482893865788757 +-0.3559412780058726 +0.9042388929107263 +0.06176446734595048 +-0.027895870765777625 +1.0104689097711625 +-0.7917510479451202 +1.113196290891145 +0.9429202914210719 +-0.6161551807567135 +0.502003929809907 +-1.0357799841877284 +-0.5611769396238092 +0.2331115601151174 +-0.15754539781944765 +-1.0457751698907303 +-1.8342077831533266 +-0.8516583038078641 +-1.1254175196110596 +0.35420269416059225 +-1.958066171250726 +-0.3749764013181224 +0.08403144096591325 +0.6527415327098425 +-2.9162535589845895 +-0.5677188970101282 +0.11577225432104787 +-0.9065821807233782 +1.30956053847228 +0.8930403261301416 +-0.06923903675840665 +-0.39122478061319643 +1.7750045031810149 +0.5595009173898837 +0.9252421120404701 +-2.358083926017816 +-0.24704979172163646 +-0.2492994237599802 +0.10236456128506222 +1.0986908380719824 +0.03286353792207408 +-0.6557365695777332 +0.3189474584370101 +0.10486780293656284 +0.44897581624214133 +-0.2509334351687043 +1.0467530101326754 +0.5193572599199942 +-0.544184056123497 +1.3446334679697984 +0.7263577218066567 +0.4018676403158411 +0.5529455684743526 +-1.9582632410268517 +-1.0938178772609377 +1.1056768189916133 +-0.8444898002355123 +1.4012445047728956 +0.47328408540452993 +-0.15055388467367845 +0.5437468403671301 +0.7982688587823957 +-0.5693020271759562 +1.3268578686620802 +0.656351904725035 +-0.1557606369983058 +-1.6529831553889984 +0.34460766446503344 +0.7675476380847245 +-0.1197937094204504 +-0.039480725156342156 +-1.4452980776248572 +0.24196509586173487 +-0.2984074835188621 +0.3992452747741396 +0.21523185550297058 +0.5079210980824156 +0.8041634888182585 +0.1149325507265826 +-1.2226897241599464 +0.2514808707810854 +1.1088491993100211 +-0.36546415843453717 +0.640531158973919 +1.087979394963793 +-0.5563822553965629 +-0.15775207188878 +0.006200221397158562 +-0.0783737774607207 +-0.6175262004521521 +0.4437270876422006 +-0.4670746196712082 +-0.5843757191054015 +-1.8934278182618263 +-0.4813328489694604 +-0.8907227285421261 +1.036259649467289 +1.843792921843727 +-0.7624319924810284 +-0.9174607290082711 +0.03435698712640317 +-0.11384972665852994 +-1.3101053015775639 +0.1637573999888291 +-0.06101683176448239 +0.008603899931604653 +-0.8673580313584444 +-2.1168150437270175 +-0.08380987239973317 +0.23922528927489822 +-0.8159704271818852 +-2.0821978182979084 +-0.028677895186391522 +-0.48697010670248203 +-2.562331184822387 +1.2638491690159004 +-0.16322736449578204 +-0.0281475548848642 +0.19179072035962352 +-0.5115121113457611 +-1.216092581961743 +-0.37197101085161866 +-1.1228891986564684 +1.530611279935868 +-1.645293593751148 +-0.31966288913526786 +-0.3224022425207107 +0.6876822411274209 +0.8588838908835899 +1.1858781473089388 +0.21214946660153766 +-2.2777942239405977 +0.0793702492319372 +-0.9635649918497059 +-0.22811427889122537 +-1.3476682815484173 +-0.16330628035763295 +0.06688221857923565 +-0.2854520860006716 +0.00313509644922913 +-1.2422407282854009 +0.7917309242705692 +-1.0495146728759188 +-1.1364600190133456 +1.6549605133795324 +1.136662949582947 +-1.408548323742787 +-0.8020504286287846 +-0.4141973192340182 +-0.08399395786473313 +-1.4969409472035287 +-0.3650113514655534 +-1.5404277557487365 +1.3871726694086501 +-1.125068068277399 +0.43790383024794544 +1.0876860298735977 +-1.2992009746671975 +-0.7013900857207577 +-1.2600698829199635 +0.9583260506370499 +0.20250143618885236 +-0.1445613616786014 +-0.5282385889848432 +-0.05873029673618199 +-0.14979080483730775 +0.6962617761938527 +0.16438272515827557 +0.8311917265582294 +-1.1818611326916204 +-0.7450089824074639 +0.3761583533648629 +1.1846018038222124 +-1.4537038579997095 +-0.3016022731499668 +-0.7000498208578896 +-0.9794561936775553 +0.06346652314524298 +-0.3869109830073247 +1.407268581018489 +1.4388428052334346 +-1.9727458415639785 +1.81673384196293 +0.4821244332600986 +0.21334786981074738 +0.9113050050239608 +0.04715888249686487 +-0.9802718439397652 +-0.2527314263795757 +0.18033805740743886 +-0.5136936101560146 +0.44054055476975207 +-1.353539974948879 +0.040219509921977314 +-0.606337537252817 +-0.7291432691478267 +-1.2493523727071993 +0.2832688467918175 +1.1974098828140367 +0.9335277070801307 +0.5305613314103012 +-1.091650484775249 +1.0545132468827392 +0.9832868448772132 +-0.9935607567540136 +-0.6625741771928879 +-0.21629688534159539 +-0.23091487139574535 +-1.3949278994923766 +-1.4568475108202432 +-1.531860962340051 +0.5729206682833685 +0.12066840408864232 +-0.3937448246985331 +-0.08373725906458072 +1.0541631981034625 +-0.21561860211052947 +-0.8189116193542829 +-0.03476672759971988 +-1.295237630748267 +-0.472203251092988 +-1.6549359850403753 +1.2886445109728386 +1.4266248892677265 +0.3051018163779958 +-2.433864029298202 +2.805863847926351 +-0.2825074669223043 +1.2003008251425562 +0.5350895936175615 +-1.0503423150031082 +0.22214561240497938 +-0.37320095000827497 +0.9987738969820863 +-0.08844537791986672 +0.2928367997372638 +0.777418976776762 +-0.3677138078054827 +0.1501371355267377 +-1.146058131988791 +-0.4152692490452542 +0.22165199076279524 +1.5419029332151202 +0.45650772921049365 +-0.8321906327971222 +-0.10109974055272189 +2.2518275936524255 +-0.4613464737298429 +0.14765997031608352 +1.8601322797281992 +-0.4662756653722047 +-0.01775760231090287 +-1.819017822635981 +-0.26962119914745497 +0.4121141629276801 +-1.29122468385404 +0.10908690962565465 +-0.8528281823762462 +-1.1436752458033772 +-0.5561452786230205 +1.8663411590190362 +0.3858722701262194 +-0.9181987745978514 +-1.005625360355789 +-1.9020135134256293 +-0.5624527295538069 +-1.2322941519187065 +0.7415397661317503 +1.7949825023398511 +0.7325191066880591 +0.060600342128112605 +-0.4348781202983969 +-0.47628722749183094 +-0.0549715083505416 +1.7957295686966575 +-0.8609766804785224 +-1.0813345356930004 +0.23205279683122731 +0.2549945532260841 +0.5892041689311452 +-0.028450442192351683 +-1.739639707186091 +-0.12896330285598662 +-0.2945746722508282 +0.8352205173842351 +-1.295851924643467 +0.7089033702346619 +-1.3424480084758683 +-0.1304391226523049 +0.21844480682159617 +0.6347101362879037 +0.12082498122265145 +-1.5209623217353925 +0.6576733703515673 +-1.5139188066503373 +0.8898866623027515 +-0.6123912600436103 +-0.9086539564050832 +-0.30589573072444687 +-0.6937003781621187 +0.1971808588282038 +0.521980510257675 +-1.4799018638460257 +0.4592407386213434 +-1.2157649187291333 +-1.3743399477365936 +0.7336692162553451 +1.1266858187340605 +-1.1954225676474064 +-0.4386347826773802 +0.030572039578748517 +-0.7187112862933294 +-0.11447820273666419 +0.3623254396439908 +-0.31323733750910054 +-0.16041579735710326 +-0.19916989112989708 +-0.380489404546473 +-1.1350904936050843 +-1.7844172602876738 +1.7595088190424077 +-0.8157955800472592 +-1.0751216101512697 +-3.249475474093238 +-0.11290813694621908 +0.7041354308177792 +1.2778115951087965 +-0.8461191016709886 +0.1401156569341639 +0.11646534811580572 +0.08818338079999599 +1.5878983602585817 +-0.5880207730997167 +-0.08539533832547752 +-0.3967156815146442 +0.47540126768446866 +-0.11001869549660792 +0.20730885009297417 +1.5966060756116895 +1.133261480806282 +-1.2870853869720449 +-1.8688012311464524 +0.5728994862128641 +-0.04345844747734698 +0.4872834177429859 +-0.9837047989250444 +0.46252105837110324 +0.20253402724221048 +-1.437776668615327 +1.2779076897015225 +1.1107791321698044 +0.11926741757482823 +1.251574957628737 +-0.9369130394471155 +-0.8478205083391929 +-0.4234753115419799 +0.28695080422753405 +-1.7087227497545472 +-0.05247647304444236 +0.23976697539584196 +0.2812288730459196 +-0.6411108103259731 +-0.7201521215884661 +-1.6029147590962998 +0.1480987535071297 +0.48762944557647747 +0.09153263812231821 +0.440924652858367 +1.2882188115237507 +-0.17541684287397616 +-1.4016282866004621 +-0.2165117714661539 +-0.9395703242680025 +-0.3976873911538641 +-0.6899066039494114 +1.0762894402932321 +2.0464077136331174 +0.7428408951271105 +-0.8326386743534622 +-0.9780374303109143 +0.24627509571872308 +0.9239541038135999 +-2.354515366078923 +0.9265655329295563 +-0.7089370606253024 +0.8737005833666667 +-0.278099543950329 +-1.6251056700319892 +0.730815604226913 +-2.095722201631115 +-0.1766421703015406 +0.5937206885072928 +-0.03369354039446629 +0.46474344135191503 +-0.7553366505717349 +-0.2626178309746296 +-1.7268911000246325 +0.05412630147675557 +-1.001372072575218 +1.4469610090071934 +-0.0639340894959178 +0.5516264100216354 +-0.13053787012443557 +-0.10911940290423064 +-0.21524415379245773 +-1.14184755535829 +0.4776162282983648 +0.559538393049549 +0.2885629913064308 +-0.7411717175458925 +1.5234944412128337 +-0.8875691437911327 +-1.5376809442843538 +-1.4911172584249326 +-1.5689830162921743 +-0.2345010099221812 +1.4910886260743683 +0.14848741757194228 +0.6208485861098582 +-0.9626539855771553 +2.1256652702611403 +0.007860318291271207 +-0.8524878623680743 +-1.0481540238453029 +-0.4306114474122479 +-0.4370631980655601 +0.7083626341901221 +-2.432283649821194 +-0.19505793818115763 +1.2311150311423569 +0.623679159117066 +-0.4696552920099294 +-1.7948264901974995 +-1.5287394123144358 +1.3532565465590076 +-0.7796388901619321 +-2.2095151966293747 +0.0958526898418206 +-0.6442067248740477 +0.598561556089742 +-1.9941197830893458 +0.9476128483185884 +0.6499835073365386 +0.9063144240220418 +-1.5878788468376472 +1.5445700851937203 +-1.4518006564543013 +0.9798575305382231 +-0.44724761364503296 +0.5525843629539976 +-1.4964528886625175 +-0.6020519974856624 +-0.8888593024689784 +-0.37344745385030725 +-1.9465415164665434 +-0.9526900761936526 +1.8561651604964575 +1.1421371808667309 +-2.277506136036976 +-0.1807001818666239 +-0.21779984872297087 +-0.9112742729840142 +0.026414576140739526 +-1.8259751308104502 +-0.9379804563650959 +-0.007439043661947448 +1.6686780251441697 +-0.32255143456772034 +1.0252161252783374 +-0.6697749913652873 +-1.086086878243179 +-0.37763783927342076 +-0.057301466784810545 +-0.5226939064313767 +-0.7047946033277296 +-0.4634213031725821 +0.573115608490927 +1.299427055802589 +0.5546116898085908 +-2.3523856611058704 +-0.03779144614858079 +-1.7871393031008174 +-1.3151748073994143 +0.040260021433942195 +0.53078602164831 +1.175767460017178 +0.8989419795467091 +-0.7801593662451566 +0.6354153674998418 +-1.2919432944729075 +0.13646699072934482 +0.4628814829452915 +2.035289562758771 +-0.002034193191187389 +-1.412770173563923 +-0.5005155249945892 +0.7538290555231432 +-0.15027773287885735 +-0.1593932008694905 +-0.2850789256205771 +1.4274700040525314 +-0.7782385087434543 +1.7112669461937642 +-0.7002183868593574 +-0.19137686402190127 +0.09536205743381793 +-0.4225734506208435 +-0.5498989341927063 +-0.5960640468177167 +0.4430018376270618 +-0.7146644431373576 +-2.112248343978446 +0.5850847880254454 +-0.4422632477633438 +0.16646134897415205 +-1.583204324561666 +-1.5026192340867202 +-1.3791110909741633 +-2.232158301677708 +-0.10510392023123587 +0.9781492291981704 +-2.1902115567544973 +0.5775135137038445 +1.869435932142972 +-0.6991396276621802 +-1.4839547710482726 +0.7697394448905402 +-1.7225192063732893 +-0.04247608006634493 +-0.0569771039586883 +1.485489236257864 +-0.20620788202868842 +1.4760602495697872 +0.18632563945060177 +-0.19292587081685092 +0.42446160251641374 +-0.20727059503465295 +-0.609762497173177 +-0.3350543312905352 +-0.29485882165145894 +-0.5800964899028798 +1.195728310798129 +0.44211131003395565 +0.81398480316185 +0.7913655018458251 +0.14651936995117104 +0.08929500652554173 +0.4810040244900955 +-1.6334250764863696 +1.1800401274220778 +-0.8058072329306383 +-0.08585884861684784 +0.5612314886307731 +-2.1064966258655984 +1.18241130554363 +-1.5714069451900292 +-0.6193492267703844 +-1.190486337712071 +0.09818296717425568 +-0.16663622534744701 +-1.586235726090922 +-0.017394450075083556 +-1.4354995959214811 +-1.1950284520176568 +0.12807122718406988 +0.5595855161403548 +-1.3207633508258338 +0.0644263198568949 +-1.986354265395907 +0.5774728517995346 +-1.475031679014968 +-0.18179015948954697 +-0.08639964494288392 +0.23329978948760288 +0.3585136861745153 +-1.313150761585055 +-0.37661091787605805 +0.4973419323217091 +-0.6149937053205474 +-1.1897613548677182 +0.13113456490805286 +-0.9627838088715064 +0.9050025376102531 +1.300866781432874 +-0.21577737855714269 +-2.2230002533638684 +0.40533458340261364 +-0.8613472182035112 +-0.36802961556377745 +1.556865315048536 +-1.6966715348158645 +0.6073364133450517 +-0.5486516305992009 +0.25464641168063046 +-1.4970736114103929 +0.010431366983904705 +0.050684873981325096 +1.5284581761650118 +1.33443707857094 +1.0090809124202942 +0.2875633351362131 +-1.2181091508487136 +-0.5118560326299231 +0.9069819512883719 +0.9995225688507845 +-0.39905428823396316 +-1.0414137390658578 +0.029134013343068504 +0.1242209702213703 +-0.6974966604917628 +1.0402166341787429 +-1.4598964108657244 +0.5161223341195424 +-0.33857566305210407 +1.0375836167595303 +-1.2074231741515247 +-1.2987150651008326 +-0.4928338076801051 +-0.327876223600739 +-0.29703128608783935 +-1.038937369165508 +-0.23492038049467942 +-0.10036455006093285 +-0.7967333964948587 +-0.6391394891771747 +-0.7634336142411765 +-1.2056334580580406 +-0.7399589078619205 +1.156625412846026 +-0.6332473037886217 +1.287149368303167 +-0.36281504858889335 +-1.3576919745765224 +1.2572418685718787 +-0.2029129641244042 +-1.4103591513656017 +-0.30113923024100053 +0.6085354641896854 +0.35524942846392205 +-0.10582460357805189 +1.932408712141833 +0.38816716724983413 +-0.5367588852458962 +-1.0468142882712712 +-0.6786109832732925 +0.29448182514735816 +-3.043636780438897 +-0.4053788132235965 +0.7924860767989383 +0.6281454509023587 +-0.5751382361115827 +-0.004662075056424908 +-0.1707031922622208 +-1.0044250340201297 +1.2173604136431793 +-1.2480254448002905 +-0.7147562273114726 +0.04795323952083072 +0.19047863689413336 +0.5567982675081186 +0.11871626081618636 +0.5345378785213579 +0.0684689459375204 +-1.0653883417850172 +0.11016172983310074 +-0.9617496848316895 +-0.05438144939896836 +0.23097722089257366 +0.38360167987186755 +0.18562022547940343 +-2.276109852926031 +-0.5207010533292511 +-0.287266344319173 +0.26881866071327815 +0.6821904384114088 +-1.8203148682599297 +-2.611416799228609 +-0.4430042279846862 +-0.16858270542270656 +-0.43060115690757045 +-1.3184391660501955 +-0.7268904690477757 +-1.1829923014819101 +-0.24979578849507472 +-0.6774635441263221 +0.2769002549152712 +1.297784286539689 +-0.7178897208011531 +1.6284949955287094 +-0.3528459127538463 +0.10640664305109693 +-0.4534465836434587 +1.7184027393304577 +-0.22469796532548483 +-0.04317371532946607 +0.12144518472175109 +-0.1488299991336489 +-0.33351047743925233 +-0.4915471562782807 +0.9706358561181727 +-0.5977676471297282 +-0.9132164850272964 +0.700109087912856 +0.06329060306494927 +0.4015603873819422 +-0.9149345697593133 +0.840772605749555 +0.18791453264869473 +-1.8034624901999388 +0.2807455166331584 +1.0994163185490524 +0.14419540366865796 +-1.7828177299233583 +-1.3886404134436527 +-0.9936378181757314 +0.6929566806545132 +-1.0900990130784556 +-0.19244734274907327 +-0.621633360319985 +-1.378959888044851 +0.46808272015261565 +-0.16203099875108914 +-0.41595015819926173 +-0.5959667209197752 +0.5458126468229565 +1.0143942952614862 +-0.1743951759282862 +-0.2533166696084833 +0.40221700217098133 +-1.463343983801706 +-0.9069663832226552 +-0.29507098431723916 +-0.7456875458454121 +0.7690073871227928 +-0.6707040220046343 +-0.2989177878114936 +-0.4261920742215888 +-1.3168332934877982 +-0.360288748500612 +1.33248803390787 +0.4982221259551699 +1.1720475829200794 +-0.30114037626680035 +-0.977765416894781 +0.18680870724062965 +0.11978602084230161 +-2.011469994198622 +-0.8937951061560906 +1.3903246912928289 +-0.08422940385825659 +1.688142722397871 +0.4936649372554711 +-1.5622516158657844 +-0.052686300306615114 +-2.13131597161847 +-0.8449831027004446 +-0.9505737746584851 +-0.7004739879774315 +0.362319145816954 +1.3539151321984668 +-0.5255932336996932 +0.40420127563615205 +-0.01896012498329458 +1.7148613140354187 +-1.8811152207593942 +1.0520661840616583 +1.00835374142407 +-1.4698192627951538 +0.4984911010027021 +-1.1565964736200058 +0.333702304561156 +1.2454396531162597 +-0.09443359114621422 +-1.335564290496113 +-0.7599248372020617 +0.4602613257646875 +0.8881090810262631 +0.9017224174611942 +-0.6121539818215034 +1.5767675221247146 +-1.3344730673707852 +1.322967582961102 +-0.056649169381079556 +0.1440121105498643 +-1.1864610094628318 +-0.48124607955903503 +-1.14846936387521 +-1.1056297811502511 +-1.3706238901787404 +-0.20047419444399056 +-0.010196223435075202 +-0.8754743576259397 +1.221350883036168 +0.517093327077931 +-1.4619352776177814 +1.0555857820371242 +0.7626667772155785 +0.7540427780368589 +-0.6609016588212644 +0.02162646185285816 +0.8290043202009589 +-0.37857869087795804 +0.2456219034960101 +0.23040394994474273 +-0.4846783908003308 +-1.4303206025490163 +-0.4451177241021445 +-0.296315495979574 +0.02938449398483678 +-0.25404491742738505 +1.6486553677179463 +0.3019536759473401 +-0.5207766902592625 +-1.1017882316489191 +-2.2397061828657856 +-0.0696070673876238 +-0.020632285766544023 +0.8585937126182122 +-0.09006375000329393 +-0.5500986577322263 +-1.8029910388277206 +1.2793167918446147 +-1.3398529748850718 +0.5468634161766063 +-0.4889727455083073 +-2.3842540686870377 +-0.34433097484434566 +-0.14904650944729164 +-0.1920643219299434 +0.09903862752599807 +-0.03552292880973454 +-2.4272778974206872 +-0.20867328025319282 +0.24273140776686636 +0.39354300827064725 +-1.0419994994665975 +1.9929503207546284 +0.593463143225543 +0.5243523884240251 +0.28552179691815915 +-1.2747439115101507 +-0.7889465929637272 +-0.08765318835957499 +-0.8782780716686579 +-0.9463246112964029 +-0.6538864851472388 +-1.9082785899334347 +2.552233227421098 +0.041250774659824074 +0.7329734873827719 +-0.8505979447248122 +1.105204786817467 +-0.5217530482004511 +-0.23836711273886946 +-0.1906183345948253 +-0.2179936538271439 +0.01012200244220543 +-0.20382002721651746 +-1.6452547516976834 +-0.9875282621949066 +-0.24249790077417144 +-0.7910456885407356 +-0.328349221415132 +0.35385662326284184 +1.4528730563140964 +-0.6572594405622925 +1.511374902300063 +-0.8822390263268783 +-0.8657844445322564 +-1.73701556002488 +-1.0971905158757338 +-0.1704196712416656 +1.179079997449402 +0.5086514448970549 +0.4632135984309723 +0.512379412600454 +-0.7560961000932244 +0.41779308818865935 +0.4071403026153537 +0.9360524778151298 +0.2080371537548648 +-1.1124012591414714 +-0.5344770554586633 +-1.5276396449424157 +-1.1087508797598353 +0.5004922114529198 +-0.7123809902009781 +-0.06261268013946181 +1.0854374611564384 +-0.26060023242073005 +0.15780396332366192 +-0.5690937049545814 +-0.7516297466302132 +-1.4548669165908732 +-0.397139847131835 +0.2832291346464465 +1.7380448021162522 +0.7774603687999034 +0.5384117623028832 +-0.5703629813707924 +-1.202576241708606 +-1.9140380937486292 +-0.12182955925463897 +-0.7769765977265003 +0.8391785199498247 +-0.009706641159253793 +-1.5209193065956397 +-0.33100748531100527 +-0.6050899187563581 +0.37801516583232786 +1.0838797961840638 +0.8860859018357552 +0.8167304555181485 +-0.4569701982000472 +-0.23414450638010448 +0.08456469229552743 +-0.31314542562746356 +0.891932775244094 +-2.9023026111519368 +0.5383876638754227 +-0.09941737454918713 +-0.5617939027218304 +-0.0305023489554197 +-0.07166265720214884 +0.5267959226443932 +-1.526997498756762 +-1.2189299168786085 +0.31294198690024766 +-1.3049298395583016 +0.45618029052315523 +0.07365359473411259 +0.9994998307603384 +-1.148726154093095 +-1.4578855837378377 +1.8781373940782797 +0.24732529106728218 +-1.3501149504586654 +1.0304877968429917 +-0.45687854530156036 +-0.6359163694474709 +-0.6568249247355415 +-1.4204055751034175 +1.3448641722808417 +0.1830823260950475 +0.46492946804157564 +2.527593759154481 +-1.5572199389109864 +0.9168749750104448 +-1.565089835757598 +0.20675323282909686 +-0.4756348031773189 +-0.8307771932901811 +0.9060043707748411 +0.3253233930884257 +-0.6423198721124651 +-0.7698059631510906 +0.9789997279351472 +1.5157157049859875 +0.745306590922413 +-1.1430094465383789 +0.7935785047867563 +0.1610421574135661 +0.4023257957674591 +-0.7808114753492034 +-1.320430004449756 +0.16058875721562044 +-1.4309235775473401 +-0.24263374702600216 +0.3208170129800688 +-0.8219398709884063 +-0.23382828347418907 +0.5245489305616184 +-0.9342280086830683 +-0.5130904883040777 +-0.8407537063435591 +0.596297275312319 +-3.0473684435688844 +-0.8325698442356687 +-0.7934051917812307 +-0.8260650495982004 +-1.0278476102064857 +-0.32169019625857825 +1.439495947562741 +-0.2979914523461771 +-1.3628576629257119 +-1.348395345993469 +1.5811528720779464 +-0.6557728277315376 +-1.1312817048053354 +-0.8472279163592117 +0.675079726821688 +-0.5163414948441412 +-0.021361227244695052 +-0.1929062573227877 +0.3657315648265953 +-0.36029679730955705 +0.06117773857253589 +-0.7562198527694924 +0.1863504873729362 +-1.4981271793467774 +1.8165559000897578 +-0.5048110049080912 +0.8211938676973325 +-1.0605526986445935 +-0.06933898657001893 +0.265137755775302 +-1.5171354881853718 +0.3166327070538737 +-0.322379607686529 +-0.5198056938483939 +-0.14387846539100124 +-0.9127347456142317 +-1.0900510428804817 +-0.0929300241285483 +0.40134524064279464 +1.3264249180939645 +-0.5796262838474324 +0.330287220771596 +0.33913905094964025 +-0.8407450188308838 +1.7302036411578265 +0.49714360977726235 +-0.008170512358351367 +-0.15654757789846824 +-1.0107593717930172 +-0.8725899837914657 +1.4461453674099403 +-2.256287602885373 +-1.1166602868775115 +-1.5028321597085876 +-1.1940714297943256 +-1.4758084721055134 +-0.7770955529720226 +0.7776550901004162 +-1.0922699675282586 +-0.2768065385995611 +-0.5287737328756013 +-2.089970170573957 +0.19654715792260247 +1.4836950868362175 +1.3422301269999715 +1.7302180825377864 +0.6100314885766583 +-0.9874672786641797 +1.2008767516956222 +1.4874022793549955 +2.715515603980254 +-2.6023398904423 +-0.056551233368690224 +-0.31334911980421143 +0.4614229071274344 +0.3845352911699855 +1.3695314425267782 +-0.485710220490662 +0.13929493997040943 +-0.2103810855552281 +-1.1822852115045013 +-2.109627852211506 +1.7707400861753533 +0.06957651649614416 +0.7822819543842012 +-0.015600603236556876 +-0.613453222737449 +0.037128367144034446 +-0.02273785709980608 +-1.5633815617842841 +-0.6093599150092834 +0.06138458138117886 +-0.29275034535519606 +0.3362937500532457 +-0.7360573545188009 +-0.6044632324338898 +0.5309568697472467 +-1.1305832746634183 +0.8439072424104364 +0.058595235104205945 +-2.496475301341518 +-0.25631291608435 +-0.2578268967947494 +0.05557133702501171 +1.060050509375589 +-0.2587477901872881 +-0.0522732119493409 +0.025279956616611254 +-1.4334881709064762 +-1.168716604205711 +-0.3522764319323958 +0.024200186159046566 +0.11865085279433618 +-0.5689801525642927 +-0.1381591194276279 +0.041838608450123466 +-0.45608778275086065 +-0.12377541319483382 +-1.1547356645116502 +-0.22669415491618872 +-1.9126076090933348 +-2.9650736592162135 +0.8678607032925929 +-0.9353757797787722 +0.046394576488213796 +-0.01847359390611361 +-0.86334730504568 +0.37549221815888223 +0.4483895475885905 +-0.029764301849169783 +-0.3859749702344575 +0.10765003063484463 +-0.5856264075243944 +0.9820127902301927 +0.7676547221818123 +0.11748128081550913 +-0.1377630183182014 +-0.7090643998695998 +0.23357134543199098 +-0.7282511349125055 +0.4115821348902253 +0.04190376209332397 +-1.2119385088632577 +0.5333515027325112 +0.5926388251825154 +0.7586455742296204 +-0.4761664785796674 +-0.16883806450535796 +0.6376018879041222 +0.961764954101076 +-0.1760443238435498 +0.27713139960382893 +-0.3748074485720251 +1.0281029691859938 +0.9830130838462332 +1.616937163500639 +0.9046209527771849 +-1.0203371939363983 +-0.47302555036353977 +0.7283498005781732 +-0.5294000604408515 +-0.3948731461361614 +0.31438351847567436 +0.7606763047789505 +-2.090759988715677 +-1.8611000829035478 +-0.7545143369193448 +-1.691207266109225 +-0.20176928942655095 +-1.1330443123445537 +0.1929500342096141 +-1.619258391847175 +-1.3037703421092 +-0.9366475430829034 +0.03075415015128985 +0.8252809558416723 +-0.8853729876550895 +0.2715447554657882 +-1.377783741362088 +-0.35254348255855705 +-0.5266587144823349 +0.7638973968525938 +-1.7828444232862017 +0.500085070504374 +-1.5980059803906033 +1.4213864212874148 +-0.6174046135332192 +0.8569992117112957 +0.4607421357407412 +-0.786267999249157 +0.5588490041255523 +-0.5683889778910207 +0.5041457672609317 +1.021630853307196 +-0.308773848771226 +0.2960362851979556 +0.7970814599918816 +0.5708441953045098 +-1.7687865899716404 +0.47014885273114504 +-1.390549113198971 +0.3248929898459063 +0.6466611234419433 +0.4545464920543295 +1.6268704450814893 +-0.697275971364129 +-0.30773037579620366 +-1.6335144614539605 +0.054947279203898 +0.5651315901140322 +-1.1013511790787585 +-0.25511332661760505 +-1.5158053407400693 +-0.16439030504421845 +-2.1170295457955763 +0.565402384677245 +-1.5753458556119218 +0.9723645446461808 +-0.7452812784776812 +-1.4707169731900502 +-1.3117023650171198 +0.4574807910705839 +-1.6795113063873748 +-0.0858150077053238 +-0.5596332735164263 +-0.6568306630471109 +-0.7704971834905208 +0.9311068377011915 +0.4712412381903629 +0.7368103407302887 +-0.9933830929274942 +-0.15134552562087825 +0.4614922975239423 +1.2527639162375483 +-0.06690530721199364 +-1.16106892348221 +-1.235357995389731 +-1.3194159285427873 +1.0208292640843966 +-1.2175854529822467 +-0.5173431952641502 +-0.6381351911006803 +0.8848837346809875 +-0.11394463708943194 +-1.4341318710052888 +-0.4157220768393288 +-0.003910742339254786 +-0.11553444957979116 +-0.40593069140190907 +-0.3530855998322703 +0.09458930958740308 +0.9417220801966095 +-0.6288395049375399 +0.24648829919162724 +0.08044873268725328 +-0.24862853938170476 +0.38627098372065005 +-0.07718618221992578 +-0.762841926934619 +-0.6884127919961165 +-1.50098882990373 +1.1715107083129817 +0.758773893063477 +0.5187888081282658 +1.4506145658723648 +-1.3720208158056828 +-0.7240087017051069 +-0.9586614250618539 +0.17442005380737702 +0.3914457259889491 +1.4384632458971207 +0.270061982467562 +-1.6875898700119119 +-1.5901003737224924 +-0.24628193454579964 +-1.4900152514325573 +0.4113750827457282 +0.1976486792262785 +-1.87215866771435 +-0.7087330994499172 +1.5986447917441586 +0.7142422545386216 +-0.4254146333603285 +-1.5561437413060626 +-1.3524581064320813 +3.086224137464513 +-2.8072112259645037 +0.15711580403464115 +-0.19325362335072124 +0.42599665298456735 +-1.0617207972106102 +-1.1571403381943786 +-0.26595594245868176 +-1.18823698563071 +-0.36154800440667834 +0.25725597085448826 +-0.26917010128676433 +-0.497590476408843 +-0.8685717877781709 +0.46816644702848176 +0.15196615271316777 +-0.8612268640400913 +-1.8045826245429424 +-0.6012713701618343 +0.6790873163434467 +-1.7551206683969347 +-1.7559928438566803 +-0.9425623455812824 +-1.4943571390893584 +-0.6052327663890181 +0.36751997067916087 +-0.3840017683840248 +-1.382637757151524 +-0.05854716397965862 +0.26290599349132804 +-1.9669749874821725 +-0.21040970928851124 +-0.8045552411325279 +0.16028683752881995 +1.7931388394000065 +-1.1314252553893285 +0.036280813494500186 +0.8497109655062125 +-0.09531915220257384 +0.7470346469421143 +0.7107143686928078 +-0.9422873812174043 +0.26971558974547344 +0.7058059913185473 +-0.4179220902973746 +-0.43150034367224627 +-0.7115602217024287 +-0.42501479932411507 +-1.4235890274566256 +-2.316429843220857 +0.156880394887837 +-0.8214259813198929 +-0.4270281020415292 +1.2844241451680019 +0.15379433171567847 +1.0268133913816664 +0.10443144327389625 +1.1452356912735995 +0.08270394124135116 +-0.2601455993132917 +0.09694968711435609 +0.7797223636048055 +0.7268289930008472 +0.23772378351064866 +0.6183835292085454 +-0.9808224716559094 +0.29670952766961234 +-0.08254143287551047 +-1.0206237293794547 +-1.6940773778940283 +1.154868378874594 +0.9413801346744943 +-1.9432537101614769 +1.1418872840958412 +0.9867056513771693 +-0.9252808325981103 +-0.40737543711982743 +-2.1828385431819104 +1.0412740299145131 +0.11489326327671212 +-1.2814076210077074 +-0.5715159412659772 +1.484659809276309 +1.1808926159245923 +0.02423719627096438 +1.1729827094673089 +-0.19588535697587584 +-0.6086021174804288 +-0.2711090281921026 +0.2333458416163609 +0.5354194361092384 +1.15767027850335 +-0.1129436604343529 +-1.355189505111472 +0.055148921681024476 +1.975520552329442 +1.2259218502091243 +0.2289341357631367 +0.7484434507340016 +0.9904919319492864 +-0.1767617828914444 +-2.6108494305116823 +0.22936439999633929 +1.68187709574696 +-0.7357784488186089 +1.1468273823871253 +0.2583846235328432 +0.23925519895237407 +-0.6994861948249753 +0.4726079955867425 +2.9268647805121955 +-0.00991382827629611 +0.555178591227263 +-1.9736054706417783 +-1.27376881520058 +-0.7863193041996693 +0.4702182634724359 +-0.6946750936484918 +0.4731972886113678 +-0.939230774943658 +-1.7980208806111944 +0.49800686364376845 +-0.8469171476095663 +0.4370793269059212 +0.6196324512057119 +0.8037259852882771 +0.9639919688359526 +0.40491500691865656 +0.22171562961441094 +-0.8555783451265943 +1.4876609800589826 +-0.24733927533965944 +0.6404196483181417 +-1.4457647728068448 +-1.0675578072076528 +-1.2229672967131415 +-0.2453293001942472 +-1.7432997273381854 +0.5763606995858834 +-1.4698917621542806 +-0.2359136466246813 +-0.3999043303372685 +0.883660722516781 +0.9507743310934484 +0.8798201537000718 +-1.3821252728501827 +0.6816640024574853 +-0.2153452464761386 +-0.6106877625874965 +-1.6937911836468627 +0.9272941771630865 +0.13915170839131263 +1.195136113773425 +1.3301974355615678 +-0.5422909335025696 +0.42722381676879895 +0.6261084227582653 +-1.0735977176217713 +0.4795777155513896 +0.6244011176993527 +0.4497753285132884 +-0.2698024962793968 +-0.4330704957300914 +-0.7043951344480153 +-1.0975793682494088 +-0.6397188871012365 +0.7010574058423693 +0.05957394174339006 +-0.39866737462427526 +-1.5922470061026033 +-0.09817942803015797 +0.29575679496035406 +-1.182461823704034 +-1.2929970800114878 +-0.17012386043659625 +-0.015739025495248166 +1.2071150942736415 +-0.7522710257654472 +0.11982858788734252 +0.811265802247052 +1.0286820423480145 +-1.1906237329009906 +-0.9797211244210796 +0.4153651195298068 +-1.5449234707753332 +0.8672149542261796 +0.5602167498268816 +-0.3881021216684415 +0.4299549664665263 +0.09083077246757554 +-1.5173483015012248 +-0.10299843819226881 +0.3259466824449625 +-1.1973863793792052 +1.2597772623296883 +-0.6692258337935308 +2.100769405410592 +-0.6383987876579421 +0.7288572264087906 +0.3413961985776983 +0.16559917051705209 +-0.35565174447702697 +-0.8250796139000143 +0.25733299906922324 +-0.8855556299077152 +-1.0013081408125606 +0.222588219497598 +-1.0144313523147899 +-0.4519909083044866 +-1.1362234227030135 +-1.9441133060229732 +-0.5978400750813458 +-1.651436698945158 +0.7268865082751652 +0.4149997982479874 +-0.1537236746073783 +-0.5036405897543841 +0.7355646002944153 +-1.2656243419996096 +-0.6942181539545585 +-1.0419715405731997 +-1.6795452632458607 +0.3035641147906926 +-0.3783947722981099 +-1.0674575407815914 +-0.6061780890863644 +0.977762372981283 +-1.2164390854884672 +1.5653485072440305 +-0.38873526094603333 +-1.567807718273953 +-0.5620504531471695 +-0.02382326613518515 +-2.889185310183975 +-0.4595066085395619 +0.4565367086784581 +-0.586238093566043 +-2.481458566823333 +-4.629288765628514e-05 +0.3332327951568438 +-0.07223505818925878 +-0.24005288713058934 +0.8768494363157369 +-0.4870028799997523 +-0.6931372849250399 +-0.24643649933094705 +-0.5738108802126709 +0.5745194740981637 +-0.09151384475047894 +0.2916572571928455 +0.49018248006102216 +0.36326517847102324 +-0.932578325193456 +-0.9634383588162886 +-1.6457179634326953 +-0.6922346487091204 +0.24046575516990532 +-0.26686076943188364 +0.24721543814614716 +0.2433410935068147 +-0.28332202118251 +-0.5983760289458442 +-1.5019046557032685 +-2.153098255245384 +-1.474488191667656 +-0.036690922559119404 +-0.6868304381553301 +0.09349061255043195 +0.015120448905443784 +0.799889206580091 +-0.7245755133115368 +-0.4711266426065429 +-2.0763743850869743 +-0.4616512874907712 +0.48451924983385963 +0.3147963461097567 +-0.040344065229834164 +-1.2622674949373738 +-0.08515678982677927 +1.686041386870572 +-0.9194415410388961 +-0.15575973801724938 +0.786106144217328 +1.3467453546480845 +-2.0530926548446704 +1.35110081748984 +-1.8510702992326944 +0.33516246489001533 +-0.28008291674730657 +-0.4397846751823654 +-0.22211608037403152 +0.9499929966484268 +-0.41140954751241327 +-1.214783451413488 +-0.44867975715223063 +0.21633768209853138 +-0.4716685969058245 +-0.16984626144866205 +0.5307559026974367 +-0.7121789787450382 +-0.9142931250310352 +0.03859792620423319 +1.1712561681307465 +-0.13859241065163344 +-0.785113981591501 +1.5982533477218783 +-1.309682580065397 +1.1125633211656785 +0.12263112709730001 +-2.692106109979636 +1.5419165853030994 +-1.44929323530895 +-1.8543495636313791 +0.3700201575887012 +-1.158160536889976 +-1.6056258690390337 +2.0238677858667646 +0.9854270578881394 +-0.7373282425146647 +-0.11650228090299154 +1.0023919344522254 +1.6975947611931754 +-0.4527536734501653 +-0.3257488331462113 +-1.3789117296683449 +-0.8773512275530334 +-0.6032207705827685 +-0.7255730088432996 +1.3690962044533979 +-0.31189600979179066 +0.7275418782086742 +0.28453258285667654 +-0.08286911467537547 +-0.6826905874714331 +0.0793694485078153 +-0.4910089584163958 +-1.542964508770462 +-0.0564779803630841 +-2.4708446346525985 +-0.18501562071743058 +-0.06350727231655434 +-1.998568125059844 +0.2807281848567677 +0.7286948918708911 +0.2885909361565546 +-0.5764513998587237 +-0.04627937206147356 +0.7567051505548409 +-0.11182825648688219 +0.35522800549100275 +-0.3995296024956345 +0.6726836178147788 +-0.8047665356982018 +-1.608074794953116 +-0.521080390270724 +-0.7921292575623186 +0.430979406925342 +0.5435429706549625 +-2.8095182540436907 +-1.4297185593416628 +0.7367759792097397 +-0.6784961178905673 +0.5011705825497351 +-0.5462227113750269 +-1.0688204295407426 +0.2122632838027524 +0.30309967134334653 +-0.44115146739856986 +-2.8492513713626533 +-2.3339779038021335 +0.12104151183159867 +-0.4275551359822489 +-1.5125803273869889 +0.5484929022028407 +0.3338995738133935 +0.586666605405285 +-0.5298965471839951 +0.5462709694488687 +-0.9488777879824258 +-0.3270483213074797 +-0.9494878998339236 +1.0430988496018856 +-0.1472857831745118 +0.5842905956636592 +0.014204210007452034 +0.0078069551128781 +-0.21549702242920693 +1.1678239115554907 +-0.625390440660448 +1.3511021950053976 +-1.554425584840543 +-0.8271758676721596 +-0.5823899578142254 +0.9639983919713215 +0.08901643312073632 +-1.3409706670572088 +0.5964524310612603 +-0.7869381778294696 +-0.5246501927693339 +0.8389610088574786 +-0.5233624002093205 +0.6359960518946526 +0.015910999619248356 +-1.3418354767115586 +1.1269998300063016 +-0.08584077932067836 +-0.4677770373709801 +0.07180367274916688 +0.5021550598976916 +-2.0667895161792718 +-0.44819922478836555 +-0.5962871570007688 +0.132953208675807 +-0.5836532746385351 +0.7709592396699259 +1.026303271467577 +-1.2616730442996185 +1.3324247573271175 +-1.6238761471802916 +-0.715896715250673 +-1.134867149923318 +-1.416152132945864 +-1.1971297110888204 +-0.29077915089505113 +-0.6032217300898974 +1.4641946616453276 +0.2141103158047799 +0.845312782727405 +-1.2225293787156881 +-0.3208784040195324 +-0.043323194043350166 +0.26677782706942493 +-1.1804184772545505 +0.7034165931005523 +0.9263060329538959 +-1.0803739371976238 +0.4726286931326179 diff --git a/examples/autopoint/userDefinedFunction_autopoint.cpp b/examples/autopoint/userDefinedFunction_autopoint.cpp new file mode 100755 index 000000000..9762bd751 --- /dev/null +++ b/examples/autopoint/userDefinedFunction_autopoint.cpp @@ -0,0 +1,111 @@ +// Use forward-mode automatic differentiation using Autodiff Library +// sampling from log-density equal to f(x) = x^4 -2 * x^2; +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2020-2020 Marios Papachristou +// Copyright (c) 2022-2022 Zhang zhuyan + +// Contributed and/or modified by Zhang zhuyan, as part of Google Summer of Code 2022 program. + +// Licensed under GNU LGPL.3, see LICENCE file + +#include +#include +#include +#include +#include +#include +#include + +#include "Eigen/Eigen" + +#include "ode_solvers/ode_solvers.hpp" +#include "random.hpp" +#include "random/uniform_int.hpp" +#include "random/normal_distribution.hpp" +#include "random/uniform_real_distribution.hpp" +#include "random_walks/random_walks.hpp" +#include "volume/volume_sequence_of_balls.hpp" +#include "volume/volume_cooling_gaussians.hpp" +#include "volume/volume_cooling_balls.hpp" +#include "generators/known_polytope_generators.h" +#include +#include +#include "diagnostics/diagnostics.hpp" + +template +void run_main() +{ + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef std::vector pts; + typedef HPolytope Hpolytope; + typedef BoostRandomNumberGenerator RandomNumberGenerator; + typedef AutoDiffFunctor::GradientFunctor NegativeGradientFunctor; + typedef AutoDiffFunctor::FunctionFunctor NegativeLogprobFunctor; + typedef LeapfrogODESolver Solver; + typedef typename Hpolytope::MT MT; + typedef typename Hpolytope::VT VT; + + AutoDiffFunctor::parameters params; + + NegativeGradientFunctor F(params); + NegativeLogprobFunctor f(params); + RandomNumberGenerator rng(1); + unsigned int dim = 2; + + HamiltonianMonteCarloWalk::parameters hmc_params(F, dim); + + Hpolytope P = generate_cube(dim, false); + + Point x0 = -0.25 * Point::all_ones(dim); + + // In the first argument put in the address of an H-Polytope + // for truncated sampling and NULL for untruncated + HamiltonianMonteCarloWalk::Walk + hmc(&P, x0, F, f, hmc_params); + std::chrono::time_point start, stop; + int n_samples = 50000; // Half will be burned + int max_actual_draws = n_samples / 2; + unsigned int min_ess = 0; + MT samples; + samples.resize(dim, max_actual_draws); + + for (int i = 0; i < n_samples - max_actual_draws; i++) { + hmc.apply(rng, 3); + } + start = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < max_actual_draws; i++) { + std::cout << hmc.x.getCoefficients().transpose() << std::endl; + hmc.apply(rng, 3); + samples.col(i) = hmc.x.getCoefficients(); + } + stop = std::chrono::high_resolution_clock::now(); + long ETA = (long)std::chrono::duration_cast(stop - start).count(); + std::cerr << "total time taken " << ETA << std::endl; + std::cerr << std::endl; + print_diagnostics(samples, min_ess, std::cerr); + std::cerr << "min ess " << min_ess << "us" << std::endl; + std::cerr << "Average time per sample: " << ETA / max_actual_draws << "us" << std::endl; + std::cerr << "Average time per independent sample: " << ETA / min_ess << "us" << std::endl; + std::cerr << "Average number of reflections: " << (1.0 * hmc.solver->num_reflections) / hmc.solver->num_steps << std::endl; + std::cerr << "Step size (final): " << hmc.solver->eta << std::endl; + std::cerr << "PSRF: " << multivariate_psrf(samples) << std::endl; + std::cerr << std::endl; +} +using TT=double; +typedef Eigen::Matrix EigenMatrix; +typename autopoint::FT pdf_(const autopoint& x,const EigenMatrix& data_) { + // define your function here, + return x.pow(4).sum() - 2 * x.pow(2).sum() + (autopoint::FT)(2 * 0.795); +} + +template <> std::function::FT(const autopoint&,const EigenMatrix&)> AutoDiffFunctor::FunctionFunctor_internal::pdf=pdf_; + +int main() { + run_main(); + + return 0; +} diff --git a/examples/autopoint/userDefinedFunction_manual_gradient.cpp b/examples/autopoint/userDefinedFunction_manual_gradient.cpp new file mode 100644 index 000000000..d4d40b10d --- /dev/null +++ b/examples/autopoint/userDefinedFunction_manual_gradient.cpp @@ -0,0 +1,154 @@ +// Use manual gradient function in existing sampling method +// sampling from log-density equal to f(x) = x^4 -2 * x^2; + +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2020 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2020-2020 Marios Papachristou +// Copyright (c) 2022-2022 Zhang zhuyan + +// Licensed under GNU LGPL.3, see LICENCE file + +#include +#include +#include +#include +#include +#include +#include + +#include "Eigen/Eigen" + +#include "ode_solvers/ode_solvers.hpp" +#include "random.hpp" +#include "random/uniform_int.hpp" +#include "random/normal_distribution.hpp" +#include "random/uniform_real_distribution.hpp" +#include "random_walks/random_walks.hpp" +#include "volume/volume_sequence_of_balls.hpp" +#include "volume/volume_cooling_gaussians.hpp" +#include "volume/volume_cooling_balls.hpp" +#include "generators/known_polytope_generators.h" +#include "diagnostics/diagnostics.hpp" + +struct CustomFunctor { + + template < + typename NT> + struct parameters { + unsigned int order; + NT L; // Lipschitz constant for gradient + NT m; // Strong convexity constant + NT kappa; // Condition number + + parameters() : order(2), L(4), m(4), kappa(1){}; + }; + + template < + typename Point> + struct GradientFunctor { + typedef typename Point::FT NT; + typedef std::vector pts; + + parameters ¶ms; + + GradientFunctor(parameters ¶ms_) : params(params_){}; + + // The index i represents the state vector index + Point operator()(unsigned int const &i, pts const &xs, NT const &t) const { + if (i == params.order - 1) { + auto temp = xs[0].getCoefficients().array(); + auto result = -4 * temp.pow(3) + 4 * temp; + Point y(result); + return y; + } + else { + return xs[i + 1]; // returns derivative + } + } + }; + + template < + typename Point> + struct FunctionFunctor { + typedef typename Point::FT NT; + + parameters ¶ms; + + FunctionFunctor(parameters ¶ms_) : params(params_){}; + + // The index i represents the state vector index + NT operator()(Point const &x) const { + auto temp = x.getCoefficients().array(); + NT y = temp.pow(4).sum() - 2 * temp.pow(2).sum() + 2 * 0.795; + return y; + } + }; +}; + +template +void run_main() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef std::vector pts; + typedef HPolytope Hpolytope; + typedef BoostRandomNumberGenerator RandomNumberGenerator; + typedef CustomFunctor::GradientFunctor NegativeGradientFunctor; + typedef CustomFunctor::FunctionFunctor NegativeLogprobFunctor; + typedef LeapfrogODESolver Solver; + + typedef typename Hpolytope::MT MT; + typedef typename Hpolytope::VT VT; + CustomFunctor::parameters params; + + NegativeGradientFunctor F(params); + NegativeLogprobFunctor f(params); + + RandomNumberGenerator rng(1); + unsigned int dim = 2; + + HamiltonianMonteCarloWalk::parameters hmc_params(F, dim); + + Hpolytope P = generate_cube(dim, false); + + Point x0 = -0.25 * Point::all_ones(dim); + + // In the first argument put in the address of an H-Polytope + // for truncated sampling and NULL for untruncated + HamiltonianMonteCarloWalk::Walk + hmc(&P, x0, F, f, hmc_params); + std::chrono::time_point start, stop; + + int n_samples = 50000; // Half will be burned + int max_actual_draws = n_samples / 2; + unsigned int min_ess = 0; + MT samples; + samples.resize(dim, max_actual_draws); + + for (int i = 0; i < n_samples - max_actual_draws; i++) { + hmc.apply(rng, 3); + } + start = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < max_actual_draws; i++) { + std::cout << hmc.x.getCoefficients().transpose() << std::endl; + hmc.apply(rng, 3); + samples.col(i) = hmc.x.getCoefficients(); + } + stop = std::chrono::high_resolution_clock::now(); + long ETA = (long)std::chrono::duration_cast(stop - start).count(); + std::cerr << "total time taken " << ETA << std::endl; + std::cerr << std::endl; + print_diagnostics(samples, min_ess, std::cerr); + std::cerr << "min ess " << min_ess << "us" << std::endl; + std::cerr << "Average time per sample: " << ETA / max_actual_draws << "us" << std::endl; + std::cerr << "Average time per independent sample: " << ETA / min_ess << "us" << std::endl; + std::cerr << "Average number of reflections: " << (1.0 * hmc.solver->num_reflections) / hmc.solver->num_steps << std::endl; + std::cerr << "Step size (final): " << hmc.solver->eta << std::endl; + std::cerr << "PSRF: " << multivariate_psrf(samples) << std::endl; +} + +int main() { + run_main(); + return 0; +} diff --git a/external/cmake-files/Autodiff.cmake b/external/cmake-files/Autodiff.cmake new file mode 100644 index 000000000..06e593548 --- /dev/null +++ b/external/cmake-files/Autodiff.cmake @@ -0,0 +1,31 @@ +set(AUTODIFF_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) +function(GetAutodiff) + find_path(AUTODIFF_DIR NAMES autodiff PATHS ${AUTODIFF_CMAKE_DIR}/../_deps/autodiff-src) + + if (NOT AUTODIFF_DIR ) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR "${AUTODIFF_CMAKE_DIR}/../_deps") + FetchContent_Declare(autodiff + GIT_REPOSITORY https://github.com/autodiff/autodiff.git + GIT_TAG v0.6.12 + ) + + FetchContent_GetProperties(autodiff) + + if(NOT autodiff_POPULATED) + message(STATUS "Autodiff library not found locally, downloading it.") + FetchContent_Populate(autodiff) + endif() + + set(AUTODIFF_DIR ${autodiff_SOURCE_DIR}) + message(STATUS "Using downloaded Autodiff library at: ${AUTODIFF_DIR}") + + else () + + message(STATUS "Autodiff Library found: ${AUTODIFF_DIR}") + + endif() + + include_directories(${AUTODIFF_DIR}) + +endfunction() \ No newline at end of file diff --git a/include/cartesian_geom/autopoint.h b/include/cartesian_geom/autopoint.h new file mode 100644 index 000000000..e1d73f222 --- /dev/null +++ b/include/cartesian_geom/autopoint.h @@ -0,0 +1,311 @@ +#ifndef AB9D4FD9_C418_44AC_8276_CC42540EF027 +#define AB9D4FD9_C418_44AC_8276_CC42540EF027 +#include +#include + +template +class autopoint +{ + public: + unsigned int d; + Eigen::Matrix, Eigen::Dynamic,1> coeffs; + typedef typename std::vector>::iterator iter; + typedef typename autodiff::detail::Real<1, T> FT; + typedef Eigen::Matrix coeff; + typedef Eigen::Matrix, Eigen::Dynamic,1> Coeff; + autopoint() {} + + autopoint(const unsigned int dim) + { + d = dim; + coeffs.setZero(d); + } + + autopoint(const unsigned int dim, iter begin, iter endit) + { + d = dim; + coeffs.resize(d); + int i = 0; + + for (iter it=begin ; it != endit ; it++) + coeffs(i++) = *it; + } + FT operator()(int i,int j) + { + return coeffs(i,j); + } + + autopoint(const Coeff& coeffs) + { + d = coeffs.rows(); + this->coeffs = coeffs; + } + + autopoint(const coeff& coeffs) + { + d = coeffs.rows(); + // Coeff temp= coeffs; + this->coeffs = (Coeff)coeffs; + } + + + autopoint(const unsigned int dim, std::vector> cofs) + { + d = dim; + coeffs.resize(d); + iter it = cofs.begin(); + int i=0; + + for (; it != cofs.end(); it++,i++) + coeffs(i) = *it; + + } + + void add(const Coeff& coeffs) + { + this->coeffs += coeffs; + } + + const Coeff& getCoefficients() const + { + return coeffs; + } + + int dimension() const + { + return d; + } + + void set_dimension(const unsigned int dim) + { + d = dim; + coeffs.setZero(d); + } + + void set_coord(const unsigned int i, FT coord) + { + coeffs(i) = coord; + } + + void set_coeffs (const Coeff& coeffs2) { + d = coeffs2.rows(); + coeffs = coeffs2; + } + + void set_to_origin() { + coeffs.setZero(d); + } + + FT operator[] (const unsigned int i) const + { + return coeffs(i); + } + + FT* pointerToData() + { + return coeffs.data(); + } + + FT sum() const { + return coeffs.sum(); + } + autopoint head(int n) const + { + return autopoint((Coeff)coeffs.head(n)); + } + + autopoint tail(int n) const + { + return autopoint((Coeff)coeffs.tail(n)); + } + + autopoint pow(int n) const { + autopoint temp; + temp.d = d; + temp.coeffs=coeffs.array().pow(n).matrix(); + return temp; + } + + + autopoint log() const { + autopoint temp; + temp.d = d; + temp.coeffs=coeffs.array().log().matrix(); + return temp; + } + + autopoint exp() const { + autopoint temp; + temp.d = d; + temp.coeffs=coeffs.array().exp().matrix(); + return temp; + } + void operator+= (const autopoint& p) + { + coeffs += p.getCoefficients(); + } + + void operator+= (const Coeff& coeffs) + { + this->coeffs += coeffs ; + } + + void operator-= (const autopoint& p) + { + coeffs -= p.getCoefficients(); + } + + void operator-= (const Coeff& coeffs) + { + this->coeffs -= coeffs ; + } + + + void operator= (const Coeff& coeffs) + { + this->coeffs = coeffs; + d = coeffs.rows(); + } + + // copy assignment + autopoint& operator=(const autopoint& coeffs) + { + // Guard self assignment + if (this == &coeffs) + return *this; + this->coeffs = coeffs; + d = coeffs.rows(); + return *this; + } + autopoint transpose() const + { + return autopoint((Coeff)coeffs.transpose()); + } + + autopoint operator+ (const autopoint& p) const + { + return autopoint((Coeff)(coeffs+p.getCoefficients())); + } + autopoint operator- (const autopoint& p) const + { + return autopoint((Coeff)(coeffs-p.getCoefficients())); + } + + autopoint operator- (const FT p) const + { + autopoint temp_auto; + temp_auto.d=d; + auto temp=coeffs.array(); + temp_auto.coeffs=(temp-p).matrix(); + return temp_auto; + } + autopoint operator- (T p) const + { + autopoint temp_auto; + temp_auto.d=d; + auto temp=coeffs.array(); + temp_auto.coeffs=(temp-p).matrix(); + return temp_auto; + } + + autopoint operator* (const FT k) + { + return autopoint(coeffs * k); + } + + autopoint operator* (T k) const + { + return autopoint((Coeff)(coeffs * ((FT)k))); + } + + autopoint operator* (T k) + { + return autopoint((Coeff)(coeffs * ((FT)k))); + } + // matrix multiplication + autopoint operator* (const autopoint& autopoint_) + { + return autopoint((Coeff)(coeffs * autopoint_.getCoefficients())); + } + // matrix multiplication with normal matrix + autopoint operator* (const coeff& matrix_) + { + return autopoint(( autopoint(matrix_) * autopoint(coeffs) )); + } + + void operator*= (const FT k) + { + coeffs *= k; + } + + void operator*= (const T k) + { + FT k_=k; + coeffs *= k_; + } + + + void operator/= (const FT k) + { + coeffs /= k; + } + + + FT distance(const autopoint& p) const + { + return (this->coeffs - p.coeffs).norm(); + } + + FT dot(const autopoint& p) const + { + return coeffs.dot(p.getCoefficients()); + } + + FT dot(const Coeff& coeffs) const + { + return this->coeffs.dot(coeffs); + } + + FT squared_length() const { + FT lsq = length(); + return lsq * lsq; + } + + FT length() const { + return coeffs.norm(); + } + + void print() const + { + for(unsigned int i=0; i +autopoint operator* ( K k, autopoint const& p) +{ + return p * k; +} + +// matrix times autopoint +template +autopoint operator* ( Eigen::Matrix matrix_, autopoint const& p) +{ + Eigen::Matrix, Eigen::Dynamic,1> temp= matrix_*p.getCoefficients(); + return autopoint(temp); +} + + + +#endif /* AB9D4FD9_C418_44AC_8276_CC42540EF027 */ diff --git a/include/diagnostics/print_diagnostics.hpp b/include/diagnostics/print_diagnostics.hpp index b009d6d0c..9e27f0bc7 100644 --- a/include/diagnostics/print_diagnostics.hpp +++ b/include/diagnostics/print_diagnostics.hpp @@ -49,7 +49,7 @@ void print_diagnostics(MT const& samples, unsigned int &min_ess, StreamType &str } vt.print(stream); - std::cout << "interval_psrf = " << intv_psrf.maxCoeff() << "us" << std::endl; + stream << "interval_psrf = " << intv_psrf.maxCoeff() << "us" << std::endl; } diff --git a/include/generators/known_polytope_generators.h b/include/generators/known_polytope_generators.h index 050918ad0..8d014621d 100644 --- a/include/generators/known_polytope_generators.h +++ b/include/generators/known_polytope_generators.h @@ -17,7 +17,7 @@ /// The result can be either in V-representation (Vpoly=true) or in H-representation (V-poly-false) /// @tparam Polytope Type of returned polytope template -Polytope generate_cube(const unsigned int& dim, const bool& Vpoly) { +Polytope generate_cube(const unsigned int& dim, const bool& Vpoly,typename Polytope::NT scale=1) { typedef typename Polytope::MT MT; typedef typename Polytope::VT VT; @@ -30,7 +30,7 @@ Polytope generate_cube(const unsigned int& dim, const bool& Vpoly) { A.resize(2 * dim, dim); b.resize(2 * dim); for (unsigned int i = 0; i < dim; ++i) { - b(i) = 1.0; + b(i) = scale; for (unsigned int j = 0; j < dim; ++j) { if (i == j) { A(i, j) = 1.0; @@ -40,7 +40,7 @@ Polytope generate_cube(const unsigned int& dim, const bool& Vpoly) { } } for (unsigned int i = 0; i < dim; ++i) { - b(i + dim) = 1.0; + b(i + dim) = scale; for (unsigned int j = 0; j < dim; ++j) { if (i == j) { A(i + dim, j) = -1.0; diff --git a/include/ode_solvers/oracle_functors.hpp b/include/ode_solvers/oracle_functors.hpp index 35fc8887b..80da6d425 100644 --- a/include/ode_solvers/oracle_functors.hpp +++ b/include/ode_solvers/oracle_functors.hpp @@ -10,6 +10,12 @@ #ifndef ODE_SOLVERS_ORACLE_FUNCTORS_HPP #define ODE_SOLVERS_ORACLE_FUNCTORS_HPP +#include "Eigen/Eigen" +#include +#include +#include "cartesian_geom/cartesian_kernel.h" +#include "cartesian_geom/autopoint.h" + struct OptimizationFunctor { template < @@ -394,4 +400,84 @@ struct HessianFunctor { }; +struct AutoDiffFunctor { +template < + typename NT> +struct parameters { + unsigned int order; + NT L; + // Lipschitz constant for gradient + NT m; + // Strong convexity constant + NT kappa; // Condition number + Eigen::Matrix data; + parameters() : order(2), L(4), m(4), kappa(1){}; +}; + +template < + typename NT> +struct FunctionFunctor_internal { + using Autopoint =autopoint; + using Coeff=typename autopoint::Coeff; + using FT =typename autopoint::FT; + using Kernel=Cartesian; + using Point=typename Kernel::Point; + static std::function &)> pdf; + // static std::function f; + FT static result_internal(const Coeff &x, const Eigen::Matrix &data){ + return pdf(x, data); // + } + // external interface + Point static differentiate(Point const &x0, const Eigen::Matrix &data) { + Autopoint x = Autopoint(x0.getCoefficients()); // cast into autopoint + auto x1 = x.getCoefficients(); + Coeff y = autodiff::gradient(result_internal, autodiff::wrt(x1), autodiff::at(x1, data)); + auto result = y.template cast(); + return -1 * Point(result); + } + + NT static result(Point const &x0, const Eigen::Matrix &data) { + Autopoint x = Autopoint(x0.getCoefficients()); // cast to autopoint + auto x1 = x.getCoefficients(); + return result_internal(x1, data).val(); + } +}; + +template < + typename Point> +struct GradientFunctor { + typedef typename Point::FT NT; + typedef std::vector pts; + typedef FunctionFunctor_internal NegativeLogprobFunctor; + NegativeLogprobFunctor F; + parameters ¶ms; + GradientFunctor(parameters ¶ms_) : params(params_){}; + // The index i represents the state vector index + Point operator()(unsigned int const &i, pts const &xs, NT const &t) const { + // std::cout<<"calling gradient functor"< +struct FunctionFunctor { + typedef typename Point::FT NT; + parameters ¶ms; + FunctionFunctor(parameters ¶ms_) : params(params_){}; + // The index i represents the state vector index + typedef FunctionFunctor_internal NegativeLogprobFunctor; + NegativeLogprobFunctor F; + NT operator()(Point const &x) const { + NT temp = F.result(x, params.data); + // std::cout< Date: Wed, 6 Mar 2024 13:02:29 +0200 Subject: [PATCH 15/44] Enable c++17 support in tests and fix saxpy calls (#292) * Enable c++17 support in tests and fix saxpy calls * Fix structure, code style and tests in autodiff --- examples/autopoint/CMakeLists.txt | 18 ++-- .../autopoint/Gaussian_mixture_autopoint.cpp | 1 + ...idimensionalGaussian_mixture_autopoint.cpp | 3 +- .../userDefinedFunction_autopoint.cpp | 3 +- .../userDefinedFunction_manual_gradient.cpp | 3 +- examples/correlation_matrices/CMakeLists.txt | 11 ++- .../CMakeLists.txt | 2 - include/cartesian_geom/autopoint.h | 28 ++++-- .../ode_solvers/oracle_autodiff_functors.hpp | 94 +++++++++++++++++++ include/ode_solvers/oracle_functors.hpp | 86 ----------------- include/preprocess/crhmc/crhmc_utils.h | 2 +- include/preprocess/crhmc/two_sided_barrier.h | 4 +- .../crhmc/weighted_two_sided_barrier.h | 4 +- test/CMakeLists.txt | 1 + 14 files changed, 146 insertions(+), 114 deletions(-) create mode 100644 include/ode_solvers/oracle_autodiff_functors.hpp diff --git a/examples/autopoint/CMakeLists.txt b/examples/autopoint/CMakeLists.txt index d96e6dac2..77e592dd0 100644 --- a/examples/autopoint/CMakeLists.txt +++ b/examples/autopoint/CMakeLists.txt @@ -11,8 +11,7 @@ project( VolEsti ) option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON) option(BUILTIN_EIGEN "Use eigen from ../external" OFF) -option(BUILTIN_AUTODIFF "Use eigen from ../external" OFF) -option(USE_MKL "Use MKL library to build eigen" ON) +option(USE_MKL "Use MKL library to build eigen" OFF) CMAKE_MINIMUM_REQUIRED(VERSION 3.17) @@ -61,8 +60,15 @@ else() endif(DISABLE_NLP_ORACLES) +option(BUILTIN_AUTODIFF "Use autodiff from ../external" OFF) include("../../external/cmake-files/Autodiff.cmake") GetAutodiff() +if (BUILTIN_AUTODIFF) + include_directories (BEFORE ../../external/_deps/Autodiff) +else () + include_directories(BEFORE /usr/local/include) +endif(BUILTIN_AUTODIFF) + include("../../external/cmake-files/Eigen.cmake") GetEigen() @@ -77,11 +83,7 @@ if (BUILTIN_EIGEN) else () include_directories(BEFORE /usr/include/eigen3) endif(BUILTIN_EIGEN) -if (BUILTIN_AUTODIFF) - include_directories (BEFORE ../../external/_deps/Autodiff) -else () - include_directories(BEFORE /usr/local/include) -endif(BUILTIN_AUTODIFF) + if (USE_MKL) find_library(BLAS @@ -141,7 +143,7 @@ endif() add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++14 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler add_definitions(${CMAKE_CXX_FLAGS} "-pthread") # optimization of the compiler - + #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") add_definitions(${CMAKE_CXX_FLAGS} "-DMKL_ILP64") diff --git a/examples/autopoint/Gaussian_mixture_autopoint.cpp b/examples/autopoint/Gaussian_mixture_autopoint.cpp index b0d4f2b96..44dbbd539 100644 --- a/examples/autopoint/Gaussian_mixture_autopoint.cpp +++ b/examples/autopoint/Gaussian_mixture_autopoint.cpp @@ -26,6 +26,7 @@ #include "Eigen/Eigen" #include "ode_solvers/ode_solvers.hpp" +#include "ode_solvers/oracle_autodiff_functors.hpp" #include "random.hpp" #include "random/uniform_int.hpp" #include "random/normal_distribution.hpp" diff --git a/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp b/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp index 0db40c544..432b7141a 100644 --- a/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp +++ b/examples/autopoint/MultidimensionalGaussian_mixture_autopoint.cpp @@ -24,6 +24,7 @@ #include "Eigen/Eigen" #include "ode_solvers/ode_solvers.hpp" +#include "ode_solvers/oracle_autodiff_functors.hpp" #include "random.hpp" #include "random/uniform_int.hpp" #include "random/normal_distribution.hpp" @@ -79,7 +80,7 @@ void run_main() } start = std::chrono::high_resolution_clock::now(); std::cerr << (long)std::chrono::duration_cast(start - stop).count(); - for (int i = 0; i < max_actual_draws; i++) { + for (int i = 0; i < max_actual_draws; i++) { std::cout << hmc.x.getCoefficients().transpose() << std::endl; hmc.apply(rng, 3); samples.col(i) = hmc.x.getCoefficients(); diff --git a/examples/autopoint/userDefinedFunction_autopoint.cpp b/examples/autopoint/userDefinedFunction_autopoint.cpp index 9762bd751..f0f7a734a 100755 --- a/examples/autopoint/userDefinedFunction_autopoint.cpp +++ b/examples/autopoint/userDefinedFunction_autopoint.cpp @@ -22,6 +22,7 @@ #include "Eigen/Eigen" #include "ode_solvers/ode_solvers.hpp" +#include "ode_solvers/oracle_autodiff_functors.hpp" #include "random.hpp" #include "random/uniform_int.hpp" #include "random/normal_distribution.hpp" @@ -77,7 +78,7 @@ void run_main() hmc.apply(rng, 3); } start = std::chrono::high_resolution_clock::now(); - for (int i = 0; i < max_actual_draws; i++) { + for (int i = 0; i < max_actual_draws; i++) { std::cout << hmc.x.getCoefficients().transpose() << std::endl; hmc.apply(rng, 3); samples.col(i) = hmc.x.getCoefficients(); diff --git a/examples/autopoint/userDefinedFunction_manual_gradient.cpp b/examples/autopoint/userDefinedFunction_manual_gradient.cpp index d4d40b10d..5224b3759 100644 --- a/examples/autopoint/userDefinedFunction_manual_gradient.cpp +++ b/examples/autopoint/userDefinedFunction_manual_gradient.cpp @@ -21,6 +21,7 @@ #include "Eigen/Eigen" #include "ode_solvers/ode_solvers.hpp" +#include "ode_solvers/oracle_autodiff_functors.hpp" #include "random.hpp" #include "random/uniform_int.hpp" #include "random/normal_distribution.hpp" @@ -130,7 +131,7 @@ void run_main() { hmc.apply(rng, 3); } start = std::chrono::high_resolution_clock::now(); - for (int i = 0; i < max_actual_draws; i++) { + for (int i = 0; i < max_actual_draws; i++) { std::cout << hmc.x.getCoefficients().transpose() << std::endl; hmc.apply(rng, 3); samples.col(i) = hmc.x.getCoefficients(); diff --git a/examples/correlation_matrices/CMakeLists.txt b/examples/correlation_matrices/CMakeLists.txt index 7871ba5fa..bfc4b513c 100644 --- a/examples/correlation_matrices/CMakeLists.txt +++ b/examples/correlation_matrices/CMakeLists.txt @@ -62,6 +62,16 @@ else() endif(DISABLE_NLP_ORACLES) +option(BUILTIN_AUTODIFF "Use autodiff from ../external" OFF) +include("../../external/cmake-files/Autodiff.cmake") +GetAutodiff() +if (BUILTIN_AUTODIFF) + include_directories (BEFORE ../../external/_deps/Autodiff) +else () + include_directories(BEFORE /usr/local/include) +endif(BUILTIN_AUTODIFF) +add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") #enable the c++17 support needed by autodiff + include("../../external/cmake-files/Eigen.cmake") GetEigen() @@ -125,7 +135,6 @@ else () add_compile_definitions("EIGEN_NO_DEBUG") endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt b/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt index d42d2b7a8..f3e66b634 100644 --- a/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt +++ b/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt @@ -98,8 +98,6 @@ else () add_compile_definitions("EIGEN_NO_DEBUG") endif () - - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/include/cartesian_geom/autopoint.h b/include/cartesian_geom/autopoint.h index e1d73f222..41dccf47e 100644 --- a/include/cartesian_geom/autopoint.h +++ b/include/cartesian_geom/autopoint.h @@ -1,8 +1,18 @@ -#ifndef AB9D4FD9_C418_44AC_8276_CC42540EF027 -#define AB9D4FD9_C418_44AC_8276_CC42540EF027 +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2024 Vissarion Fisikopoulos + +// Licensed under GNU LGPL.3, see LICENCE file + +#ifndef CARTESIAN_KERNEL_AUTOPOINT_H +#define CARTESIAN_KERNEL_AUTOPOINT_H + #include #include +/// This class manipulates a point used for automatic differentation +/// parameterized by a number type e.g. double +/// \tparam T Numerical Type template class autopoint { @@ -133,7 +143,7 @@ class autopoint temp.coeffs=coeffs.array().log().matrix(); return temp; } - + autopoint exp() const { autopoint temp; temp.d = d; @@ -217,7 +227,7 @@ class autopoint { return autopoint((Coeff)(coeffs * ((FT)k))); } - + autopoint operator* (T k) { return autopoint((Coeff)(coeffs * ((FT)k))); @@ -225,12 +235,12 @@ class autopoint // matrix multiplication autopoint operator* (const autopoint& autopoint_) { - return autopoint((Coeff)(coeffs * autopoint_.getCoefficients())); + return autopoint((Coeff)(coeffs * autopoint_.getCoefficients())); } // matrix multiplication with normal matrix autopoint operator* (const coeff& matrix_) { - return autopoint(( autopoint(matrix_) * autopoint(coeffs) )); + return autopoint(( autopoint(matrix_) * autopoint(coeffs) )); } void operator*= (const FT k) @@ -283,7 +293,7 @@ class autopoint std::cout<<"\n"; } - static autopoint all_ones(int dim) + static autopoint all_ones(int dim) { autopoint p(dim); for (int i = 0; i < dim; i++) p.set_coord(i, 1.0); @@ -298,7 +308,7 @@ autopoint operator* ( K k, autopoint const& p) return p * k; } -// matrix times autopoint +// matrix times autopoint template autopoint operator* ( Eigen::Matrix matrix_, autopoint const& p) { @@ -308,4 +318,4 @@ autopoint operator* ( Eigen::Matrix matrix -#endif /* AB9D4FD9_C418_44AC_8276_CC42540EF027 */ +#endif // CARTESIAN_KERNEL_AUTOPOINT_H diff --git a/include/ode_solvers/oracle_autodiff_functors.hpp b/include/ode_solvers/oracle_autodiff_functors.hpp new file mode 100644 index 000000000..20500141f --- /dev/null +++ b/include/ode_solvers/oracle_autodiff_functors.hpp @@ -0,0 +1,94 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2024 Vissarion Fisikopoulos +// Copyright (c) 2018-2020 Apostolos Chalkis + +// Licensed under GNU LGPL.3, see LICENCE file + +#ifndef ODE_SOLVERS_ORACLE_AUTODIFF_FUNCTORS_HPP +#define ODE_SOLVERS_ORACLE_AUTODIFF_FUNCTORS_HPP + +#include "Eigen/Eigen" +#include +#include +#include "cartesian_geom/cartesian_kernel.h" +#include "cartesian_geom/autopoint.h" + +struct AutoDiffFunctor { + + template + struct parameters { + unsigned int order; + NT L; // Lipschitz constant for gradient + NT m; // Strong convexity constant + NT kappa; // Condition number + Eigen::Matrix data; + parameters() : order(2), L(4), m(4), kappa(1){}; + }; + + template + struct FunctionFunctor_internal { + using Autopoint = autopoint; + using Coeff = typename autopoint::Coeff; + using FT = typename autopoint::FT; + using Point = typename Cartesian::Point; + + static std::function &)> pdf; + + FT static result_internal(const Coeff &x, const Eigen::Matrix &data){ + return pdf(x, data); // + } + + // external interface + Point static differentiate(Point const &x0, const Eigen::Matrix &data) { + Autopoint x = Autopoint(x0.getCoefficients()); // cast into autopoint + auto x1 = x.getCoefficients(); + Coeff y = autodiff::gradient(result_internal, autodiff::wrt(x1), autodiff::at(x1, data)); + auto result = y.template cast(); + return -1 * Point(result); + } + + NT static result(Point const &x0, const Eigen::Matrix &data) { + Autopoint x = Autopoint(x0.getCoefficients()); // cast to autopoint + auto x1 = x.getCoefficients(); + return result_internal(x1, data).val(); + } + }; + + template + struct GradientFunctor { + using NT = typename Point::FT; + + FunctionFunctor_internal F; + parameters ¶ms; + + GradientFunctor(parameters ¶ms_) : params(params_){}; + + // The index i represents the state vector index + Point operator()(unsigned int const &i, std::vector const &xs, NT const &t) const { + // std::cout<<"calling gradient functor"< + struct FunctionFunctor { + using NT = typename Point::FT; + parameters ¶ms; + + FunctionFunctor(parameters ¶ms_) : params(params_){}; + // The index i represents the state vector index + FunctionFunctor_internal F; + + NT operator()(Point const &x) const { + return F.result(x, params.data); + } + }; +}; + +#endif //ODE_SOLVERS_ORACLE_AUTODIFF_FUNCTORS_HPP \ No newline at end of file diff --git a/include/ode_solvers/oracle_functors.hpp b/include/ode_solvers/oracle_functors.hpp index 80da6d425..35fc8887b 100644 --- a/include/ode_solvers/oracle_functors.hpp +++ b/include/ode_solvers/oracle_functors.hpp @@ -10,12 +10,6 @@ #ifndef ODE_SOLVERS_ORACLE_FUNCTORS_HPP #define ODE_SOLVERS_ORACLE_FUNCTORS_HPP -#include "Eigen/Eigen" -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include "cartesian_geom/autopoint.h" - struct OptimizationFunctor { template < @@ -400,84 +394,4 @@ struct HessianFunctor { }; -struct AutoDiffFunctor { -template < - typename NT> -struct parameters { - unsigned int order; - NT L; - // Lipschitz constant for gradient - NT m; - // Strong convexity constant - NT kappa; // Condition number - Eigen::Matrix data; - parameters() : order(2), L(4), m(4), kappa(1){}; -}; - -template < - typename NT> -struct FunctionFunctor_internal { - using Autopoint =autopoint; - using Coeff=typename autopoint::Coeff; - using FT =typename autopoint::FT; - using Kernel=Cartesian; - using Point=typename Kernel::Point; - static std::function &)> pdf; - // static std::function f; - FT static result_internal(const Coeff &x, const Eigen::Matrix &data){ - return pdf(x, data); // - } - // external interface - Point static differentiate(Point const &x0, const Eigen::Matrix &data) { - Autopoint x = Autopoint(x0.getCoefficients()); // cast into autopoint - auto x1 = x.getCoefficients(); - Coeff y = autodiff::gradient(result_internal, autodiff::wrt(x1), autodiff::at(x1, data)); - auto result = y.template cast(); - return -1 * Point(result); - } - - NT static result(Point const &x0, const Eigen::Matrix &data) { - Autopoint x = Autopoint(x0.getCoefficients()); // cast to autopoint - auto x1 = x.getCoefficients(); - return result_internal(x1, data).val(); - } -}; - -template < - typename Point> -struct GradientFunctor { - typedef typename Point::FT NT; - typedef std::vector pts; - typedef FunctionFunctor_internal NegativeLogprobFunctor; - NegativeLogprobFunctor F; - parameters ¶ms; - GradientFunctor(parameters ¶ms_) : params(params_){}; - // The index i represents the state vector index - Point operator()(unsigned int const &i, pts const &xs, NT const &t) const { - // std::cout<<"calling gradient functor"< -struct FunctionFunctor { - typedef typename Point::FT NT; - parameters ¶ms; - FunctionFunctor(parameters ¶ms_) : params(params_){}; - // The index i represents the state vector index - typedef FunctionFunctor_internal NegativeLogprobFunctor; - NegativeLogprobFunctor F; - NT operator()(Point const &x) const { - NT temp = F.result(x, params.data); - // std::cout<const & idx, const Type c){ } } template -void saxpy(MatrixType &a,MatrixType const &b,MatrixType const& c, std::vectorconst & a_idx, std::vectorconst & b_idx){ +void volesti_saxpy(MatrixType &a,MatrixType const &b,MatrixType const& c, std::vectorconst & a_idx, std::vectorconst & b_idx){ for(int i=0;i class two_sided_barrier { VT c = (ub + lb) / 2; VT bias1=VT::Ones(x2, 1) * unbounded_center_coord; - saxpy(c,lb,bias1,lowerIdx,lowerIdx); + volesti_saxpy(c,lb,bias1,lowerIdx,lowerIdx); VT bias2=-VT::Ones(x1, 1) * unbounded_center_coord; - saxpy(c,ub,bias2,upperIdx,upperIdx); + volesti_saxpy(c,ub,bias2,upperIdx,upperIdx); set(c, freeIdx, 0.0); center = c; diff --git a/include/preprocess/crhmc/weighted_two_sided_barrier.h b/include/preprocess/crhmc/weighted_two_sided_barrier.h index 09f5eb798..4df8cc967 100644 --- a/include/preprocess/crhmc/weighted_two_sided_barrier.h +++ b/include/preprocess/crhmc/weighted_two_sided_barrier.h @@ -143,9 +143,9 @@ template class weighted_two_sided_barrier { VT c = (ub + lb) / 2; VT bias1=VT::Ones(x2, 1) * unbounded_center_coord; - saxpy(c,lb,bias1,lowerIdx,lowerIdx); + volesti_saxpy(c,lb,bias1,lowerIdx,lowerIdx); VT bias2=-VT::Ones(x1, 1) * unbounded_center_coord; - saxpy(c,ub,bias2,upperIdx,upperIdx); + volesti_saxpy(c,ub,bias2,upperIdx,upperIdx); set(c, freeIdx, 0.0); center = c; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4482d3b9d..3bde869d2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -191,6 +191,7 @@ add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger #add_definitions(${CMAKE_CXX_FLAGS} "-Wall") add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler +add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") #enable the c++17 support needed by autodiff #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") From acad38a684bbd7a152205d29b8328cc2652aa97f Mon Sep 17 00:00:00 2001 From: Elias Tsigaridas Date: Wed, 6 Mar 2024 12:05:59 +0100 Subject: [PATCH 16/44] Refactor/eliminate include directives (#244) * correcting the includes to point the boost library directory * modifs to include only the include/ and external/ directories * modifs * Update CMakeLists.txt --------- Co-authored-by: Vissarion Fisikopoulos Co-authored-by: vfisikop <160006479+vfisikop@users.noreply.github.com> --- include/integration/simple_MC_integration.hpp | 7 ++++--- .../min_sampling_covering_ellipsoid_rounding.hpp | 2 +- test/CMakeLists.txt | 15 --------------- test/benchmarks_cb.cpp | 2 +- test/benchmarks_cg.cpp | 2 +- test/benchmarks_sob.cpp | 2 +- test/boundary_oracles_test.cpp | 9 +++++---- test/logconcave_sampling_test.cpp | 12 +++++++----- test/max_ellipsoid_rounding_test.cpp | 14 ++++++++------ test/mcmc_diagnostics_test.cpp | 14 ++++++++------ test/new_rounding_test.cpp | 13 +++++++------ test/new_volume_example.cpp | 12 ++++++++---- test/ode_solvers_test.cpp | 14 ++++++++------ test/order_polytope.cpp | 15 +++++++++++---- test/sampling_test.cpp | 15 +++++++++------ test/simple_mc_integration.cpp | 12 +++++++----- test/volume_cb_hpolytope.cpp | 14 ++++++++------ test/volume_cb_vpoly_intersection_vpoly.cpp | 16 +++++++++------- test/volume_cb_vpolytope.cpp | 15 +++++++++------ test/volume_cb_zonotopes.cpp | 15 ++++++++------- test/volume_cg_hpolytope.cpp | 14 ++++++++------ test/volume_cg_vpolytope.cpp | 14 ++++++++------ test/volume_sob_hpolytope.cpp | 14 ++++++++------ test/volume_sob_vpolytope.cpp | 14 ++++++++------ 24 files changed, 152 insertions(+), 124 deletions(-) diff --git a/include/integration/simple_MC_integration.hpp b/include/integration/simple_MC_integration.hpp index 58739650d..75f60a1c0 100644 --- a/include/integration/simple_MC_integration.hpp +++ b/include/integration/simple_MC_integration.hpp @@ -16,16 +16,17 @@ #include #include #include -#include "convex_bodies/hpolytope.h" + #include "Eigen/Eigen" +#include "convex_bodies/hpolytope.h" #include "generators/known_polytope_generators.h" -#include "boost_random_number_generator.hpp" +#include "generators/boost_random_number_generator.hpp" #include "cartesian_geom/cartesian_kernel.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "misc.h" +#include "misc/misc.h" typedef double NT; typedef Cartesian Kernel; diff --git a/include/preprocess/min_sampling_covering_ellipsoid_rounding.hpp b/include/preprocess/min_sampling_covering_ellipsoid_rounding.hpp index 1e97835d9..0a2aba7c5 100644 --- a/include/preprocess/min_sampling_covering_ellipsoid_rounding.hpp +++ b/include/preprocess/min_sampling_covering_ellipsoid_rounding.hpp @@ -11,7 +11,7 @@ #define MIN_ELLIPSOID_ROUNDING_HPP #include -#include "khach.h" +#include "minimum_ellipsoid/khach.h" #include "sampling/random_point_generators.hpp" #include "volume/sampling_policies.hpp" diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3bde869d2..a3f8f03d1 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -153,7 +153,6 @@ if (USE_MKL) find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) - include_directories (BEFORE ${MKLROOT}/include) set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") @@ -163,21 +162,7 @@ else() endif(USE_MKL) include_directories (BEFORE ../external) -include_directories (BEFORE ../external/minimum_ellipsoid) -include_directories (BEFORE ../include/generators) -include_directories (BEFORE ../include/volume) include_directories (BEFORE ../include) -include_directories (BEFORE ../include/integration) -include_directories (BEFORE ../include/convex_bodies) -include_directories (BEFORE ../include/convex_bodies/spectrahedra) -include_directories (BEFORE ../include/annealing) -include_directories (BEFORE ../include/ode_solvers) -include_directories (BEFORE ../include/root_finders) -include_directories (BEFORE ../include/samplers) -include_directories (BEFORE ../include/lp_oracles) -include_directories (BEFORE ../include/nlp_oracles) -include_directories (BEFORE ../include/misc) -include_directories (BEFORE ../test) #for Eigen if (${CMAKE_VERSION} VERSION_LESS "3.12.0") diff --git a/test/benchmarks_cb.cpp b/test/benchmarks_cb.cpp index 5837109e3..6d6c95a6d 100644 --- a/test/benchmarks_cb.cpp +++ b/test/benchmarks_cb.cpp @@ -21,7 +21,7 @@ #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "exact_vols.h" +#include "volume/exact_vols.h" #include "generators/known_polytope_generators.h" int main() diff --git a/test/benchmarks_cg.cpp b/test/benchmarks_cg.cpp index d9c6964d9..4a6a91198 100644 --- a/test/benchmarks_cg.cpp +++ b/test/benchmarks_cg.cpp @@ -21,7 +21,7 @@ #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "exact_vols.h" +#include "volume/exact_vols.h" #include "generators/known_polytope_generators.h" int main() diff --git a/test/benchmarks_sob.cpp b/test/benchmarks_sob.cpp index 5fe46e209..44350a1c2 100644 --- a/test/benchmarks_sob.cpp +++ b/test/benchmarks_sob.cpp @@ -21,7 +21,7 @@ #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "exact_vols.h" +#include "volume/exact_vols.h" #include "generators/known_polytope_generators.h" int main() diff --git a/test/boundary_oracles_test.cpp b/test/boundary_oracles_test.cpp index 62cbdf86e..b0a043602 100755 --- a/test/boundary_oracles_test.cpp +++ b/test/boundary_oracles_test.cpp @@ -22,10 +22,11 @@ #include "Eigen/Eigen" #include "doctest.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" +#include +#include +#include +#include + #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" diff --git a/test/logconcave_sampling_test.cpp b/test/logconcave_sampling_test.cpp index 1f67b2851..f0f7fab97 100644 --- a/test/logconcave_sampling_test.cpp +++ b/test/logconcave_sampling_test.cpp @@ -23,13 +23,15 @@ #include "doctest.h" #include "Eigen/Eigen" -#include "ode_solvers.hpp" + +#include +#include +#include +#include + +#include "ode_solvers/ode_solvers.hpp" #include "diagnostics/diagnostics.hpp" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" diff --git a/test/max_ellipsoid_rounding_test.cpp b/test/max_ellipsoid_rounding_test.cpp index 086dcabe5..a9c25b8c1 100644 --- a/test/max_ellipsoid_rounding_test.cpp +++ b/test/max_ellipsoid_rounding_test.cpp @@ -8,11 +8,13 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" @@ -22,7 +24,7 @@ #include "preprocess/max_inscribed_ellipsoid_rounding.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/mcmc_diagnostics_test.cpp b/test/mcmc_diagnostics_test.cpp index 4d303004b..93f4cbbb6 100644 --- a/test/mcmc_diagnostics_test.cpp +++ b/test/mcmc_diagnostics_test.cpp @@ -10,18 +10,20 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" #include "sampling/sampling.hpp" #include "diagnostics/effective_sample_size.hpp" diff --git a/test/new_rounding_test.cpp b/test/new_rounding_test.cpp index b3f6a2adf..87c63a32a 100644 --- a/test/new_rounding_test.cpp +++ b/test/new_rounding_test.cpp @@ -8,12 +8,13 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" @@ -24,7 +25,7 @@ #include "preprocess/max_inscribed_ellipsoid_rounding.hpp" #include "preprocess/svd_rounding.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/new_volume_example.cpp b/test/new_volume_example.cpp index 205316559..b2838f04e 100644 --- a/test/new_volume_example.cpp +++ b/test/new_volume_example.cpp @@ -10,10 +10,14 @@ #include "Eigen/Eigen" //#define VOLESTI_DEBUG #include + + #include -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" +#include +#include +#include + + #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" @@ -21,7 +25,7 @@ #include "misc/misc.h" #include "misc/linear_extensions.h" #include "sampling/sampling.hpp" -#include "exact_vols.h" +#include "volume/exact_vols.h" #include "generators/known_polytope_generators.h" #include "generators/z_polytopes_generators.h" diff --git a/test/ode_solvers_test.cpp b/test/ode_solvers_test.cpp index 735afdef0..4a82472d8 100644 --- a/test/ode_solvers_test.cpp +++ b/test/ode_solvers_test.cpp @@ -18,17 +18,19 @@ #include #include -#include "Eigen/Eigen" #include "doctest.h" +#include "Eigen/Eigen" + +#include +#include +#include +#include + #include "generators/known_polytope_generators.h" -#include "ode_solvers.hpp" +#include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" #include "preprocess/crhmc/crhmc_problem.h" -#include "random.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_int.hpp" -#include "random/uniform_real_distribution.hpp" #include "random_walks/random_walks.hpp" #include "volume/volume_cooling_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" diff --git a/test/order_polytope.cpp b/test/order_polytope.cpp index ddc7b54f3..e2ad4300d 100644 --- a/test/order_polytope.cpp +++ b/test/order_polytope.cpp @@ -11,12 +11,19 @@ #include "doctest.h" #include #include + + +#include +#include +#include +#include + #include "cartesian_geom/cartesian_kernel.h" #include "cartesian_geom/point.h" -#include "poset.h" -#include "orderpolytope.h" -#include "misc.h" -#include "random.hpp" +#include "convex_bodies/orderpolytope.h" +#include "misc/poset.h" +#include "misc/misc.h" + template diff --git a/test/sampling_test.cpp b/test/sampling_test.cpp index 3831e1ea4..8e82e5818 100644 --- a/test/sampling_test.cpp +++ b/test/sampling_test.cpp @@ -11,16 +11,19 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" #include "sampling/sampling.hpp" #include "diagnostics/univariate_psrf.hpp" diff --git a/test/simple_mc_integration.cpp b/test/simple_mc_integration.cpp index ca633f8f6..c1b6b9ecd 100644 --- a/test/simple_mc_integration.cpp +++ b/test/simple_mc_integration.cpp @@ -10,18 +10,20 @@ // Link to the Latte-Integrale Software: https://www.math.ucdavis.edu/~latte/software.php // Link to the tests: https://github.com/surajchoubey/latte-integrale-checks +#include +#include +#include + #include "doctest.h" -#include "simple_MC_integration.hpp" + #include "Eigen/Eigen" -#include +#include "integration/simple_MC_integration.hpp" #include "cartesian_geom/cartesian_kernel.h" #include "convex_bodies/hpolytope.h" #include "generators/known_polytope_generators.h" #include "ode_solvers/oracle_functors.hpp" #include "random_walks/random_walks.hpp" -#include -#include -#include "misc.h" +#include "misc/misc.h" template NT exp_normsq(Point X) { diff --git a/test/volume_cb_hpolytope.cpp b/test/volume_cb_hpolytope.cpp index cd0df2d83..e938cc255 100644 --- a/test/volume_cb_hpolytope.cpp +++ b/test/volume_cb_hpolytope.cpp @@ -10,18 +10,20 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/volume_cb_vpoly_intersection_vpoly.cpp b/test/volume_cb_vpoly_intersection_vpoly.cpp index a9f7d9cb6..204a560bf 100644 --- a/test/volume_cb_vpoly_intersection_vpoly.cpp +++ b/test/volume_cb_vpoly_intersection_vpoly.cpp @@ -8,20 +8,22 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" -#include "v_polytopes_generators.h" +#include "generators/known_polytope_generators.h" +#include "generators/v_polytopes_generators.h" template NT factorial(NT n) diff --git a/test/volume_cb_vpolytope.cpp b/test/volume_cb_vpolytope.cpp index eb32dd4dc..7b261ac18 100644 --- a/test/volume_cb_vpolytope.cpp +++ b/test/volume_cb_vpolytope.cpp @@ -8,18 +8,21 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/volume_cb_zonotopes.cpp b/test/volume_cb_zonotopes.cpp index 77bc6db20..a6b40d7d3 100644 --- a/test/volume_cb_zonotopes.cpp +++ b/test/volume_cb_zonotopes.cpp @@ -8,12 +8,13 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" @@ -21,8 +22,8 @@ #include "volume/volume_cooling_balls.hpp" #include "volume/volume_cooling_hpoly.hpp" -#include "exact_vols.h" -#include "z_polytopes_generators.h" +#include "volume/exact_vols.h" +#include "generators/z_polytopes_generators.h" template NT factorial(NT n) diff --git a/test/volume_cg_hpolytope.cpp b/test/volume_cg_hpolytope.cpp index 2d2f5bb97..2e9060e45 100644 --- a/test/volume_cg_hpolytope.cpp +++ b/test/volume_cg_hpolytope.cpp @@ -8,18 +8,20 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/volume_cg_vpolytope.cpp b/test/volume_cg_vpolytope.cpp index 7809199ff..eac97d976 100644 --- a/test/volume_cg_vpolytope.cpp +++ b/test/volume_cg_vpolytope.cpp @@ -8,18 +8,20 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/volume_sob_hpolytope.cpp b/test/volume_sob_hpolytope.cpp index 18fa28bb0..0d2ea5c85 100644 --- a/test/volume_sob_hpolytope.cpp +++ b/test/volume_sob_hpolytope.cpp @@ -8,18 +8,20 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) diff --git a/test/volume_sob_vpolytope.cpp b/test/volume_sob_vpolytope.cpp index 41b963be2..76b3c784a 100644 --- a/test/volume_sob_vpolytope.cpp +++ b/test/volume_sob_vpolytope.cpp @@ -8,18 +8,20 @@ #include "doctest.h" #include #include -#include "misc.h" -#include "random.hpp" -#include "random/uniform_int.hpp" -#include "random/normal_distribution.hpp" -#include "random/uniform_real_distribution.hpp" + +#include +#include +#include +#include + +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "volume/volume_sequence_of_balls.hpp" #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "known_polytope_generators.h" +#include "generators/known_polytope_generators.h" template NT factorial(NT n) From 8f7a9f25c2af3b3722644c9d3de137e4cb9fce00 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Wed, 6 Mar 2024 12:17:45 +0200 Subject: [PATCH 17/44] Remove R interface and update CI to test Rvolesti repository with current develop --- .github/workflows/R-CMD-check-macOS.yml | 11 +- .github/workflows/R-CMD-check-ubuntu.yml | 11 +- .github/workflows/R-CMD-check-windows.yml | 11 +- R-proj/DESCRIPTION | 23 - R-proj/NAMESPACE | 42 - R-proj/R/RcppExports.R | 459 -------- R-proj/R/compute_indicators.R | 104 -- R-proj/R/estimate_lipschitz_constant.R | 53 - R-proj/R/file_to_polytope.R | 113 -- R-proj/R/gen_birkhoff.R | 28 - R-proj/R/gen_cross.R | 41 - R-proj/R/gen_cube.R | 41 - R-proj/R/gen_prod_simplex.R | 29 - R-proj/R/gen_rand_hpoly.R | 28 - R-proj/R/gen_rand_vpoly.R | 36 - R-proj/R/gen_rand_zonotope.R | 40 - R-proj/R/gen_simplex.R | 41 - R-proj/R/gen_skinny_cube.R | 28 - R-proj/R/read_sdpa_file.R | 26 - R-proj/R/rotate_polytope.R | 57 - R-proj/R/round_polytope.R | 60 - R-proj/R/zonotope_approximation.R | 42 - R-proj/R/zzz.R | 11 - .../logconcave/data/polytope_e_coli.mat | Bin 19249 -> 0 bytes .../logconcave/generalized_hyperbolic.R | 65 -- R-proj/examples/logconcave/metabolic.R | 111 -- R-proj/examples/logconcave/nuts_rand_poly.R | 55 - R-proj/examples/logconcave/simple_crhmc.R | 49 - R-proj/examples/logconcave/simple_hmc.R | 61 - .../logconcave/simple_hmc_rand_poly.R | 58 - R-proj/examples/logconcave/simple_ode.R | 31 - .../logconcave/simple_ode_truncated.R | 34 - R-proj/examples/logconcave/sparse_crhmc.R | 98 -- R-proj/inst/AUTHORS | 4 - R-proj/inst/COPYRIGHTS | 6 - R-proj/inst/checks/README.md | 31 - R-proj/inst/extdata/birk4.ine | 22 - R-proj/inst/extdata/birk5.ine | 31 - R-proj/inst/extdata/cross_10.ext | 27 - R-proj/inst/extdata/cross_10.ine | 1030 ---------------- R-proj/inst/extdata/cube10.ine | 26 - R-proj/inst/extdata/cube_10.ext | 1031 ----------------- .../inst/extdata/linear_extensions/simple.txt | 2 - .../linear_extensions/simple_poset.txt | 2 - R-proj/inst/extdata/prod_simplex_10_10.ine | 28 - R-proj/inst/extdata/sdpa_n2m3.txt | 13 - R-proj/inst/extdata/simplex10.ext | 18 - R-proj/inst/extdata/simplex10.ine | 17 - R-proj/inst/extdata/skinny_cube10.ine | 26 - R-proj/man/Hpolytope.Rd | 19 - R-proj/man/Rcpp_Hpolytope.Rd | 28 - R-proj/man/Rcpp_Spectrahedron.Rd | 21 - R-proj/man/Rcpp_Vpolytope.Rd | 26 - R-proj/man/Rcpp_VpolytopeIntersection.Rd | 28 - R-proj/man/Rcpp_Zonotope.Rd | 26 - R-proj/man/Rcpp_sparse_constraint_problem.Rd | 34 - R-proj/man/Spectrahedron.Rd | 12 - R-proj/man/Vpolytope.Rd | 17 - R-proj/man/VpolytopeIntersection.Rd | 19 - R-proj/man/Zonotope.Rd | 17 - R-proj/man/compute_indicators.Rd | 49 - R-proj/man/copula.Rd | 48 - R-proj/man/dinvweibull_with_loc.Rd | 23 - R-proj/man/direct_sampling.Rd | 37 - R-proj/man/ess.Rd | 24 - R-proj/man/estimtate_lipschitz_constant.Rd | 25 - R-proj/man/exact_vol.Rd | 38 - R-proj/man/file_to_polytope.Rd | 20 - R-proj/man/frustum_of_simplex.Rd | 32 - R-proj/man/gen_birkhoff.Rd | 22 - R-proj/man/gen_cross.Rd | 26 - R-proj/man/gen_cube.Rd | 26 - R-proj/man/gen_prod_simplex.Rd | 21 - R-proj/man/gen_rand_hpoly.Rd | 25 - R-proj/man/gen_rand_vpoly.Rd | 27 - R-proj/man/gen_rand_zonotope.Rd | 28 - R-proj/man/gen_simplex.Rd | 26 - R-proj/man/gen_skinny_cube.Rd | 21 - R-proj/man/geweke.Rd | 25 - R-proj/man/inner_ball.Rd | 29 - R-proj/man/loadSdpaFormatFile.Rd | 21 - R-proj/man/ode_solve.Rd | 47 - R-proj/man/pinvweibull_with_loc.Rd | 23 - R-proj/man/poly_gen.Rd | 28 - R-proj/man/psrf_multivariate.Rd | 24 - R-proj/man/psrf_univariate.Rd | 26 - R-proj/man/raftery.Rd | 27 - R-proj/man/readSdpaFormatFile.Rd | 24 - R-proj/man/rotate_polytope.Rd | 43 - R-proj/man/rotating.Rd | 22 - R-proj/man/round_polytope.Rd | 47 - R-proj/man/rounding.Rd | 22 - R-proj/man/sample_points.Rd | 82 -- R-proj/man/sparse_constraint_problem.Rd | 26 - R-proj/man/volume.Rd | 55 - R-proj/man/writeSdpaFormatFile.Rd | 34 - R-proj/man/zono_approx.Rd | 24 - R-proj/man/zonotope_approximation.Rd | 39 - R-proj/src/Makevars | 17 - R-proj/src/Makevars.win | 17 - R-proj/src/copula.cpp | 114 -- R-proj/src/direct_sampling.cpp | 126 -- R-proj/src/ess.cpp | 44 - R-proj/src/exact_vol.cpp | 104 -- R-proj/src/extractMatPoly.h | 37 - R-proj/src/frustum_of_simplex.cpp | 41 - R-proj/src/geweke.cpp | 47 - R-proj/src/inner_ball.cpp | 98 -- R-proj/src/ode_solve.cpp | 205 ---- R-proj/src/oracle_functors_rcpp.h | 160 --- R-proj/src/poly_gen.cpp | 114 -- R-proj/src/polytopes_modules.cpp | 240 ---- R-proj/src/psrf_multivariate.cpp | 41 - R-proj/src/psrf_univariate.cpp | 59 - R-proj/src/raftery.cpp | 51 - R-proj/src/rotating.cpp | 102 -- R-proj/src/rounding.cpp | 142 --- R-proj/src/sample_points.cpp | 795 ------------- R-proj/src/spectrahedron.cpp | 117 -- R-proj/src/spectrahedron_module.cpp | 48 - R-proj/src/volume.cpp | 407 ------- R-proj/src/zonotope_approximation.cpp | 102 -- R-proj/tests/testthat.R | 3 - R-proj/tests/testthat/test_Hvol.R | 66 -- R-proj/tests/testthat/test_InnerBall.R | 135 --- R-proj/tests/testthat/test_Vvol.R | 44 - R-proj/tests/testthat/test_Zvol.R | 45 - R-proj/tests/testthat/test_copulas.R | 23 - R-proj/tests/testthat/test_rounding.R | 49 - R-proj/tests/testthat/test_sampling.R | 91 -- R-proj/vignettes/Arxiv.Rnw | 7 - R-proj/vignettes/volesti_arxiv.pdf | Bin 1880824 -> 0 bytes R-proj/volesti.Rproj | 17 - cran_gen/.Rbuildignore | 4 - cran_gen/Makefile | 23 - cran_gen/Makevars | 16 - cran_gen/Makevars.win | 17 - cran_gen/NEWS.md | 31 - cran_gen/README.md | 35 - cran_gen/genCRANpkg.R | 186 --- include/ode_solvers/oracle_functors_rcpp.hpp | 159 --- 141 files changed, 24 insertions(+), 9799 deletions(-) delete mode 100644 R-proj/DESCRIPTION delete mode 100644 R-proj/NAMESPACE delete mode 100644 R-proj/R/RcppExports.R delete mode 100644 R-proj/R/compute_indicators.R delete mode 100644 R-proj/R/estimate_lipschitz_constant.R delete mode 100644 R-proj/R/file_to_polytope.R delete mode 100644 R-proj/R/gen_birkhoff.R delete mode 100644 R-proj/R/gen_cross.R delete mode 100644 R-proj/R/gen_cube.R delete mode 100644 R-proj/R/gen_prod_simplex.R delete mode 100644 R-proj/R/gen_rand_hpoly.R delete mode 100644 R-proj/R/gen_rand_vpoly.R delete mode 100644 R-proj/R/gen_rand_zonotope.R delete mode 100644 R-proj/R/gen_simplex.R delete mode 100644 R-proj/R/gen_skinny_cube.R delete mode 100644 R-proj/R/read_sdpa_file.R delete mode 100644 R-proj/R/rotate_polytope.R delete mode 100644 R-proj/R/round_polytope.R delete mode 100644 R-proj/R/zonotope_approximation.R delete mode 100644 R-proj/R/zzz.R delete mode 100644 R-proj/examples/logconcave/data/polytope_e_coli.mat delete mode 100644 R-proj/examples/logconcave/generalized_hyperbolic.R delete mode 100644 R-proj/examples/logconcave/metabolic.R delete mode 100644 R-proj/examples/logconcave/nuts_rand_poly.R delete mode 100644 R-proj/examples/logconcave/simple_crhmc.R delete mode 100644 R-proj/examples/logconcave/simple_hmc.R delete mode 100644 R-proj/examples/logconcave/simple_hmc_rand_poly.R delete mode 100644 R-proj/examples/logconcave/simple_ode.R delete mode 100644 R-proj/examples/logconcave/simple_ode_truncated.R delete mode 100644 R-proj/examples/logconcave/sparse_crhmc.R delete mode 100644 R-proj/inst/AUTHORS delete mode 100644 R-proj/inst/COPYRIGHTS delete mode 100644 R-proj/inst/checks/README.md delete mode 100644 R-proj/inst/extdata/birk4.ine delete mode 100644 R-proj/inst/extdata/birk5.ine delete mode 100644 R-proj/inst/extdata/cross_10.ext delete mode 100644 R-proj/inst/extdata/cross_10.ine delete mode 100644 R-proj/inst/extdata/cube10.ine delete mode 100644 R-proj/inst/extdata/cube_10.ext delete mode 100644 R-proj/inst/extdata/linear_extensions/simple.txt delete mode 100644 R-proj/inst/extdata/linear_extensions/simple_poset.txt delete mode 100644 R-proj/inst/extdata/prod_simplex_10_10.ine delete mode 100644 R-proj/inst/extdata/sdpa_n2m3.txt delete mode 100644 R-proj/inst/extdata/simplex10.ext delete mode 100644 R-proj/inst/extdata/simplex10.ine delete mode 100644 R-proj/inst/extdata/skinny_cube10.ine delete mode 100644 R-proj/man/Hpolytope.Rd delete mode 100644 R-proj/man/Rcpp_Hpolytope.Rd delete mode 100644 R-proj/man/Rcpp_Spectrahedron.Rd delete mode 100644 R-proj/man/Rcpp_Vpolytope.Rd delete mode 100644 R-proj/man/Rcpp_VpolytopeIntersection.Rd delete mode 100644 R-proj/man/Rcpp_Zonotope.Rd delete mode 100644 R-proj/man/Rcpp_sparse_constraint_problem.Rd delete mode 100644 R-proj/man/Spectrahedron.Rd delete mode 100644 R-proj/man/Vpolytope.Rd delete mode 100644 R-proj/man/VpolytopeIntersection.Rd delete mode 100644 R-proj/man/Zonotope.Rd delete mode 100644 R-proj/man/compute_indicators.Rd delete mode 100644 R-proj/man/copula.Rd delete mode 100644 R-proj/man/dinvweibull_with_loc.Rd delete mode 100644 R-proj/man/direct_sampling.Rd delete mode 100644 R-proj/man/ess.Rd delete mode 100644 R-proj/man/estimtate_lipschitz_constant.Rd delete mode 100644 R-proj/man/exact_vol.Rd delete mode 100644 R-proj/man/file_to_polytope.Rd delete mode 100644 R-proj/man/frustum_of_simplex.Rd delete mode 100644 R-proj/man/gen_birkhoff.Rd delete mode 100644 R-proj/man/gen_cross.Rd delete mode 100644 R-proj/man/gen_cube.Rd delete mode 100644 R-proj/man/gen_prod_simplex.Rd delete mode 100644 R-proj/man/gen_rand_hpoly.Rd delete mode 100644 R-proj/man/gen_rand_vpoly.Rd delete mode 100644 R-proj/man/gen_rand_zonotope.Rd delete mode 100644 R-proj/man/gen_simplex.Rd delete mode 100644 R-proj/man/gen_skinny_cube.Rd delete mode 100644 R-proj/man/geweke.Rd delete mode 100644 R-proj/man/inner_ball.Rd delete mode 100644 R-proj/man/loadSdpaFormatFile.Rd delete mode 100644 R-proj/man/ode_solve.Rd delete mode 100644 R-proj/man/pinvweibull_with_loc.Rd delete mode 100644 R-proj/man/poly_gen.Rd delete mode 100644 R-proj/man/psrf_multivariate.Rd delete mode 100644 R-proj/man/psrf_univariate.Rd delete mode 100644 R-proj/man/raftery.Rd delete mode 100644 R-proj/man/readSdpaFormatFile.Rd delete mode 100644 R-proj/man/rotate_polytope.Rd delete mode 100644 R-proj/man/rotating.Rd delete mode 100644 R-proj/man/round_polytope.Rd delete mode 100644 R-proj/man/rounding.Rd delete mode 100644 R-proj/man/sample_points.Rd delete mode 100644 R-proj/man/sparse_constraint_problem.Rd delete mode 100644 R-proj/man/volume.Rd delete mode 100644 R-proj/man/writeSdpaFormatFile.Rd delete mode 100644 R-proj/man/zono_approx.Rd delete mode 100644 R-proj/man/zonotope_approximation.Rd delete mode 100644 R-proj/src/Makevars delete mode 100644 R-proj/src/Makevars.win delete mode 100644 R-proj/src/copula.cpp delete mode 100644 R-proj/src/direct_sampling.cpp delete mode 100644 R-proj/src/ess.cpp delete mode 100644 R-proj/src/exact_vol.cpp delete mode 100644 R-proj/src/extractMatPoly.h delete mode 100644 R-proj/src/frustum_of_simplex.cpp delete mode 100644 R-proj/src/geweke.cpp delete mode 100644 R-proj/src/inner_ball.cpp delete mode 100644 R-proj/src/ode_solve.cpp delete mode 100644 R-proj/src/oracle_functors_rcpp.h delete mode 100644 R-proj/src/poly_gen.cpp delete mode 100644 R-proj/src/polytopes_modules.cpp delete mode 100644 R-proj/src/psrf_multivariate.cpp delete mode 100644 R-proj/src/psrf_univariate.cpp delete mode 100644 R-proj/src/raftery.cpp delete mode 100644 R-proj/src/rotating.cpp delete mode 100644 R-proj/src/rounding.cpp delete mode 100644 R-proj/src/sample_points.cpp delete mode 100644 R-proj/src/spectrahedron.cpp delete mode 100644 R-proj/src/spectrahedron_module.cpp delete mode 100644 R-proj/src/volume.cpp delete mode 100644 R-proj/src/zonotope_approximation.cpp delete mode 100644 R-proj/tests/testthat.R delete mode 100644 R-proj/tests/testthat/test_Hvol.R delete mode 100644 R-proj/tests/testthat/test_InnerBall.R delete mode 100644 R-proj/tests/testthat/test_Vvol.R delete mode 100644 R-proj/tests/testthat/test_Zvol.R delete mode 100644 R-proj/tests/testthat/test_copulas.R delete mode 100644 R-proj/tests/testthat/test_rounding.R delete mode 100644 R-proj/tests/testthat/test_sampling.R delete mode 100644 R-proj/vignettes/Arxiv.Rnw delete mode 100644 R-proj/vignettes/volesti_arxiv.pdf delete mode 100644 R-proj/volesti.Rproj delete mode 100644 cran_gen/.Rbuildignore delete mode 100644 cran_gen/Makefile delete mode 100644 cran_gen/Makevars delete mode 100644 cran_gen/Makevars.win delete mode 100644 cran_gen/NEWS.md delete mode 100644 cran_gen/README.md delete mode 100644 cran_gen/genCRANpkg.R delete mode 100644 include/ode_solvers/oracle_functors_rcpp.hpp diff --git a/.github/workflows/R-CMD-check-macOS.yml b/.github/workflows/R-CMD-check-macOS.yml index 23ac6d616..b1ac281c3 100644 --- a/.github/workflows/R-CMD-check-macOS.yml +++ b/.github/workflows/R-CMD-check-macOS.yml @@ -41,12 +41,17 @@ jobs: - name: Install dependencies run: Rscript -e "install.packages(c('devtools', dependencies=TRUE))" -e "install.packages(c('rcmdcheck', 'devtools', 'Rcpp', 'RcppEigen', 'BH', 'testthat', 'downloader', 'xfun'))"; + - name: Checkout Rvolesti repository + run: git clone https://github.com/GeomScale/Rvolesti.git; + + - name: Upgrade with current develop of volesti + run: cp -rf include Rvolesti/src/volesti; + cp -rf external Rvolesti/src; + - name: Check env: _R_CHECK_CRAN_INCOMING_REMOTE_: false - run: cd cran_gen/; - Rscript genCRANpkg.R; - cd cran_package; + run: cd Rvolesti/; Rscript -e "library(rcmdcheck)" -e "rcmdcheck::rcmdcheck(args = c('--no-manual'), error_on = 'warning', check_dir = 'check')" - name: Upload check results diff --git a/.github/workflows/R-CMD-check-ubuntu.yml b/.github/workflows/R-CMD-check-ubuntu.yml index 9fe81de99..753ee114a 100644 --- a/.github/workflows/R-CMD-check-ubuntu.yml +++ b/.github/workflows/R-CMD-check-ubuntu.yml @@ -44,12 +44,17 @@ jobs: - name: Install dependencies run: Rscript -e "install.packages(c('testthat', 'pkgload', 'rcmdcheck', 'devtools', 'Rcpp', 'RcppEigen', 'BH', 'downloader', 'xfun', dependencies=TRUE))"; + - name: Checkout Rvolesti repository + run: git clone https://github.com/GeomScale/Rvolesti.git; + + - name: Upgrade with current develop of volesti + run: cp -rf include Rvolesti/src/volesti; + cp -rf external Rvolesti/src; + - name: Check env: _R_CHECK_CRAN_INCOMING_REMOTE_: false - run: cd cran_gen/; - Rscript genCRANpkg.R; - cd cran_package; + run: cd Rvolesti/; Rscript -e "library(rcmdcheck)" -e "rcmdcheck::rcmdcheck(args = c('--no-manual'), error_on = 'warning', check_dir = 'check')" - name: Upload check results diff --git a/.github/workflows/R-CMD-check-windows.yml b/.github/workflows/R-CMD-check-windows.yml index ad56a7170..e5c1cf7b3 100644 --- a/.github/workflows/R-CMD-check-windows.yml +++ b/.github/workflows/R-CMD-check-windows.yml @@ -40,12 +40,17 @@ jobs: - name: Install dependencies run: Rscript -e "install.packages(c('devtools', dependencies=TRUE))" -e "install.packages(c('rcmdcheck', 'devtools', 'Rcpp', 'RcppEigen', 'BH', 'testthat', 'downloader', 'xfun'))" + - name: Checkout Rvolesti repository + run: git clone https://github.com/GeomScale/Rvolesti.git; + + - name: Upgrade with current develop of volesti + run: cp -rf include Rvolesti/src/volesti; + cp -rf external Rvolesti/src; + - name: Check env: _R_CHECK_CRAN_INCOMING_REMOTE_: false - run: cd cran_gen/; - Rscript genCRANpkg.R; - cd cran_package; + run: cd Rvolesti/; Rscript -e "library(rcmdcheck)" -e "rcmdcheck::rcmdcheck(args = c('--no-manual'), error_on = 'warning', check_dir = 'check')" - name: Upload check results diff --git a/R-proj/DESCRIPTION b/R-proj/DESCRIPTION deleted file mode 100644 index ce188ad22..000000000 --- a/R-proj/DESCRIPTION +++ /dev/null @@ -1,23 +0,0 @@ -Package: volesti -Type: Package -License: LGPL-3 -Title: Volume Approximation and Sampling of Convex Polytopes -Author: Vissarion Fisikopoulos [aut, cph, cre], - Apostolos Chalkis [cph, aut], - contributors in file inst/AUTHORS -Copyright: file inst/COPYRIGHTS -Description: Provides an R interface for 'volesti' C++ package. 'volesti' computes estimations of volume - of polytopes given by (i) a set of points, (ii) linear inequalities or (iii) Minkowski sum of segments - (a.k.a. zonotopes). There are three algorithms for volume estimation as well as algorithms - for sampling, rounding and rotating polytopes. Moreover, 'volesti' provides algorithms for - estimating copulas useful in computational finance. -Version: 1.1.2 -Date: 2020-10-24 -Maintainer: Vissarion Fisikopoulos -Depends: Rcpp (>= 0.12.17) -Imports: methods, stats -LinkingTo: Rcpp, RcppEigen, BH -Suggests: testthat -Encoding: UTF-8 -RoxygenNote: 7.1.1 -BugReports: https://github.com/GeomScale/volume_approximation/issues diff --git a/R-proj/NAMESPACE b/R-proj/NAMESPACE deleted file mode 100644 index 085d9ed9f..000000000 --- a/R-proj/NAMESPACE +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by roxygen2: do not edit by hand - -export(compute_indicators) -export(copula) -export(dinvweibull_with_loc) -export(direct_sampling) -export(ess) -export(estimtate_lipschitz_constant) -export(exact_vol) -export(file_to_polytope) -export(frustum_of_simplex) -export(gen_birkhoff) -export(gen_cross) -export(gen_cube) -export(gen_prod_simplex) -export(gen_rand_hpoly) -export(gen_rand_vpoly) -export(gen_rand_zonotope) -export(gen_simplex) -export(gen_skinny_cube) -export(geweke) -export(inner_ball) -export(loadSdpaFormatFile) -export(ode_solve) -export(pinvweibull_with_loc) -export(psrf_multivariate) -export(psrf_univariate) -export(raftery) -export(readSdpaFormatFile) -export(rotate_polytope) -export(round_polytope) -export(sample_points) -export(volume) -export(writeSdpaFormatFile) -export(zonotope_approximation) -exportPattern("^[[:alpha:]]+") -importFrom("methods","new") -importFrom("stats","cov") -importFrom("utils","read.csv") -importFrom(Rcpp,evalCpp) -importFrom(Rcpp,loadModule) -useDynLib(volesti, .registration=TRUE) diff --git a/R-proj/R/RcppExports.R b/R-proj/R/RcppExports.R deleted file mode 100644 index c3f192aee..000000000 --- a/R-proj/R/RcppExports.R +++ /dev/null @@ -1,459 +0,0 @@ -# Generated by using Rcpp::compileAttributes() -> do not edit by hand -# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -#' Construct a copula using uniform sampling from the unit simplex -#' -#' Given two families of parallel hyperplanes or a family of parallel hyperplanes and a family of concentric ellispoids centered at the origin intersecting the canonical simplex, this function uniformly samples from the canonical simplex and construct an approximation of the bivariate probability distribution, called copula (see \url{https://en.wikipedia.org/wiki/Copula_(probability_theory)}). -#' At least two families of hyperplanes or one family of hyperplanes and one family of ellipsoids have to be given as input. -#' -#' @param r1 The \eqn{d}-dimensional normal vector of the first family of parallel hyperplanes. -#' @param r2 Optional. The \eqn{d}-dimensional normal vector of the second family of parallel hyperplanes. -#' @param sigma Optional. The \eqn{d\times d} symmetric positive semidefine matrix that describes the family of concentric ellipsoids centered at the origin. -#' @param m The number of the slices for the copula. The default value is 100. -#' @param n The number of points to sample. The default value is \eqn{5\cdot 10^5}. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @references \cite{L. Cales, A. Chalkis, I.Z. Emiris, V. Fisikopoulos, -#' \dQuote{Practical volume computation of structured convex bodies, and an application to modeling portfolio dependencies and financial crises,} \emph{Proc. of Symposium on Computational Geometry, Budapest, Hungary,} 2018.} -#' -#' @return A \eqn{m\times m} numerical matrix that corresponds to a copula. -#' @examples -#' # compute a copula for two random families of parallel hyperplanes -#' h1 = runif(n = 10, min = 1, max = 1000) -#' h1 = h1 / 1000 -#' h2=runif(n = 10, min = 1, max = 1000) -#' h2 = h2 / 1000 -#' cop = copula(r1 = h1, r2 = h2, m = 10, n = 100000) -#' -#' # compute a copula for a family of parallel hyperplanes and a family of conentric ellipsoids -#' h = runif(n = 10, min = 1, max = 1000) -#' h = h / 1000 -#' E = replicate(10, rnorm(20)) -#' E = cov(E) -#' cop = copula(r1 = h, sigma = E, m = 10, n = 100000) -#' -#' @export -copula <- function(r1, r2 = NULL, sigma = NULL, m = NULL, n = NULL, seed = NULL) { - .Call(`_volesti_copula`, r1, r2, sigma, m, n, seed) -} - -#' Sample perfect uniformly distributed points from well known convex bodies: (a) the unit simplex, (b) the canonical simplex, (c) the boundary of a hypersphere or (d) the interior of a hypersphere. -#' -#' The \eqn{d}-dimensional unit simplex is the set of points \eqn{\vec{x}\in \R^d}, s.t.: \eqn{\sum_i x_i\leq 1}, \eqn{x_i\geq 0}. The \eqn{d}-dimensional canonical simplex is the set of points \eqn{\vec{x}\in \R^d}, s.t.: \eqn{\sum_i x_i = 1}, \eqn{x_i\geq 0}. -#' -#' @param body A list to request exact uniform sampling from special well known convex bodies through the following input parameters: -#' \itemize{ -#' \item{\code{type} }{ A string that declares the type of the body for the exact sampling: a) \code{'unit_simplex'} for the unit simplex, b) \code{'canonical_simplex'} for the canonical simplex, c) \code{'hypersphere'} for the boundary of a hypersphere centered at the origin, d) \code{'ball'} for the interior of a hypersphere centered at the origin.} -#' \item{\code{dimension} }{ An integer that declares the dimension when exact sampling is enabled for a simplex or a hypersphere.} -#' \item{\code{radius} }{ The radius of the \eqn{d}-dimensional hypersphere. The default value is \eqn{1}.} -#' } -#' @param n The number of points that the function is going to sample. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @references \cite{R.Y. Rubinstein and B. Melamed, -#' \dQuote{Modern simulation and modeling} \emph{ Wiley Series in Probability and Statistics,} 1998.} -#' @references \cite{A Smith, Noah and W Tromble, Roy, -#' \dQuote{Sampling Uniformly from the Unit Simplex,} \emph{ Center for Language and Speech Processing Johns Hopkins University,} 2004.} -#' -#' @return A \eqn{d\times n} matrix that contains, column-wise, the sampled points from the convex polytope P. -#' @examples -#' # 100 uniform points from the 2-d unit ball -#' points = direct_sampling(n = 100, body = list("type" = "ball", "dimension" = 2)) -#' @export -direct_sampling <- function(body, n, seed = NULL) { - .Call(`_volesti_direct_sampling`, body, n, seed) -} - -#' Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal -#' -#' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -#' -#' @references \cite{Gelman, A. and Rubin, D. B., -#' \dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} -#' -#' @references \cite{Brooks, S. and Gelman, A., -#' \dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -#' -#' @return A vector that contains the values of PSRF for each coordinate -#' -#' @export -ess <- function(samples) { - .Call(`_volesti_ess`, samples) -} - -#' Compute the exact volume of (a) a zonotope (b) an arbitrary simplex in V-representation or (c) if the volume is known and declared by the input object. -#' -#' Given a zonotope (as an object of class Zonotope), this function computes the sum of the absolute values of the determinants of all the \eqn{d \times d} submatrices of the \eqn{m\times d} matrix \eqn{G} that contains row-wise the \eqn{m} \eqn{d}-dimensional segments that define the zonotope. -#' For an arbitrary simplex that is given in V-representation this function computes the absolute value of the determinant formed by the simplex's points assuming it is shifted to the origin. -#' -#' @param P A polytope -#' -#' @references \cite{E. Gover and N. Krikorian, -#' \dQuote{Determinants and the Volumes of Parallelotopes and Zonotopes,} \emph{Linear Algebra and its Applications, 433(1), 28 - 40,} 2010.} -#' -#' @return The exact volume of the input polytope, for zonotopes, simplices in V-representation and polytopes with known exact volume -#' @examples -#' -#' # compute the exact volume of a 5-dimensional zonotope defined by the Minkowski sum of 10 segments -#' Z = gen_rand_zonotope(2, 5) -#' vol = exact_vol(Z) -#' -#' \donttest{# compute the exact volume of a 2-d arbitrary simplex -#' V = matrix(c(2,3,-1,7,0,0),ncol = 2, nrow = 3, byrow = TRUE) -#' P = Vpolytope$new(V) -#' vol = exact_vol(P) -#' } -#' -#' # compute the exact volume the 10-dimensional cross polytope -#' P = gen_cross(10,'V') -#' vol = exact_vol(P) -#' @export -exact_vol <- function(P) { - .Call(`_volesti_exact_vol`, P) -} - -#' Compute the percentage of the volume of the simplex that is contained in the intersection of a half-space and the simplex. -#' -#' A half-space \eqn{H} is given as a pair of a vector \eqn{a\in R^d} and a scalar \eqn{z0\in R} s.t.: \eqn{a^Tx\leq z0}. This function calls the Ali's version of the Varsi formula to compute a frustum of the simplex. -#' -#' @param a A \eqn{d}-dimensional vector that defines the direction of the hyperplane. -#' @param z0 The scalar that defines the half-space. -#' -#' @references \cite{Varsi, Giulio, -#' \dQuote{The multidimensional content of the frustum of the simplex,} \emph{Pacific J. Math. 46, no. 1, 303--314,} 1973.} -#' -#' @references \cite{Ali, Mir M., -#' \dQuote{Content of the frustum of a simplex,} \emph{ Pacific J. Math. 48, no. 2, 313--322,} 1973.} -#' -#' @return The percentage of the volume of the simplex that is contained in the intersection of a given half-space and the simplex. -#' -#' @examples -#' # compute the frustum of H: -x1+x2<=0 -#' a=c(-1,1) -#' z0=0 -#' frustum = frustum_of_simplex(a, z0) -#' @export -frustum_of_simplex <- function(a, z0) { - .Call(`_volesti_frustum_of_simplex`, a, z0) -} - -#' Geweke's MCMC diagnostic -#' -#' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -#' @param frac_first Optional. The portion of the first in order points in matrix samples. -#' @param frac_last Optional. The portion of the last in order points in matrix samples. -#' -#' @references \cite{Geweke, J., -#' \dQuote{Evaluating the accuracy of sampling-based approaches to the calculation of posterior moments,} \emph{ In Bayesian Statistics 4. Proceedings of the Fourth Valencia International Meeting,} 1992.} -#' -#' @return A boolean to denote if the result of Geweke diagnostic: (i) false if the null hypothesis is rejected, (ii) true if the null hypothesis is not rejected. -#' -#' @export -geweke <- function(samples, frac_first = NULL, frac_last = NULL) { - .Call(`_volesti_geweke`, samples, frac_first, frac_last) -} - -#' Compute an inscribed ball of a convex polytope -#' -#' For a H-polytope described by a \eqn{m\times d} matrix \eqn{A} and a \eqn{m}-dimensional vector \eqn{b}, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }, this function computes the largest inscribed ball (Chebychev ball) by solving the corresponding linear program. -#' For both zonotopes and V-polytopes the function computes the minimum \eqn{r} s.t.: \eqn{ r e_i \in P} for all \eqn{i=1, \dots ,d}. Then the ball centered at the origin with radius \eqn{r/ \sqrt{d}} is an inscribed ball. -#' -#' @param P A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection. -#' @param lpsolve Optional. A boolean variable to compute the Chebychev ball of an H-polytope using the lpsolve library. -#' -#' @return A \eqn{(d+1)}-dimensional vector that describes the inscribed ball. The first \eqn{d} coordinates corresponds to the center of the ball and the last one to the radius. -#' -#' @examples -#' # compute the Chebychev ball of the 2d unit simplex -#' P = gen_cube(10,'H') -#' ball_vec = inner_ball(P) -#' -#' # compute an inscribed ball of the 3-dimensional unit cube in V-representation -#' P = gen_cube(3, 'V') -#' ball_vec = inner_ball(P, lpsolve = TRUE) -#' @export -inner_ball <- function(P, lpsolve = NULL) { - .Call(`_volesti_inner_ball`, P, lpsolve) -} - -#' Solve an ODE of the form dx^n / dt^n = F(x, t) -#' -#' @param n The number of steps. -#' @param step_size The step size. -#' @param order The ODE order (default is n = 1) -#' @param dimension The dimension of each derivative -#' @param initial_time The initial time -#' @param F The function oracle F(x, t) in the ODE. -#' @param method The method to be used -#' @param initial_conditions The initial conditions provided to the solver. Must be provided in a list with keys "x_1", ..., "x_n" and column vectors as values. The state "x_n" represents the (n-1)-th order derivative with respect to time -#' @param domains A list of n H-polytopes with keys "P_1", "P_2", ..., "P_n" that correspond to each derivative's domain -#' -#' @return A list which contains elements "x_1", ..., "x_n" representing each derivative results. Each "x_i" corresponds to a d x n matrix where each column represents a certain timestep of the solver. -#' -#' @examples -#' # Please visit the examples directory on examples demonstrating usage of the ODE solvers. -#' -#' @export -ode_solve <- function(n, step_size, order, dimension, initial_time, F, method, domains = NULL, initial_conditions = NULL) { - .Call(`_volesti_ode_solve`, n, step_size, order, dimension, initial_time, F, method, domains, initial_conditions) -} - -#' An internal Rccp function as a polytope generator -#' -#' @param kind_gen An integer to declare the type of the polytope. -#' @param Vpoly_gen A boolean parameter to declare if the requested polytope has to be in V-representation. -#' @param Zono_gen A boolean parameter to declare if the requested polytope has to be a zonotope. -#' @param dim_gen An integer to declare the dimension of the requested polytope. -#' @param m_gen An integer to declare the number of generators for the requested random zonotope or the number of vertices for a V-polytope. -#' @param seed Optional. A fixed seed for the random polytope generator. -#' -#' @keywords internal -#' -#' @return A numerical matrix describing the requested polytope -poly_gen <- function(kind_gen, Vpoly_gen, Zono_gen, dim_gen, m_gen, seed = NULL) { - .Call(`_volesti_poly_gen`, kind_gen, Vpoly_gen, Zono_gen, dim_gen, m_gen, seed) -} - -#' Gelman-Rubin Potential Scale Reduction Factor (PSRF) -#' -#' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -#' -#' @references \cite{Gelman, A. and Rubin, D. B., -#' \dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} -#' -#' @references \cite{Brooks, S. and Gelman, A., -#' \dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -#' -#' @return The value of multivariate PSRF by S. Brooks and A. Gelman. -#' -#' @export -psrf_multivariate <- function(samples) { - .Call(`_volesti_psrf_multivariate`, samples) -} - -#' Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal -#' -#' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -#' @param method A string to reauest diagnostic: (i) \code{'normal'} for psrf of Gelman-Rubin and (ii) \code{'interval'} for psrf of Brooks-Gelman. -#' -#' @references \cite{Gelman, A. and Rubin, D. B., -#' \dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} -#' -#' @references \cite{Brooks, S. and Gelman, A., -#' \dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -#' -#' @return A vector that contains the values of PSRF for each coordinate -#' -#' @export -psrf_univariate <- function(samples, method = NULL) { - .Call(`_volesti_psrf_univariate`, samples, method) -} - -#' Raftery and Lewis MCMC diagnostic -#' -#' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -#' @param q Optional. The quantile of the quantity of interest. The default value is 0.025. -#' @param r Optional. The level of precision desired. The default value is 0.01. -#' @param s Optional. The probability associated with r. The default value is 0.95. -#' -#' @references \cite{Raftery, A. E. and Lewis, S. M., -#' \dQuote{How many iterations in the Gibbs sampler?,} \emph{Bayesian Statistics 4. Proceedings of the Fourth Valencia International Meeting,} 1992.} -#' -#' @return (i) The number of draws required for burn-in, (ii) the skip parameter for 1st-order Markov chain, (iii) the skip parameter sufficient to get independence chain, (iv) the number of draws required to achieve r precision, (v) the number of draws if the chain is white noise, (vi) the I-statistic from Raftery and Lewis (1992). -#' -#' @export -raftery <- function(samples, q = NULL, r = NULL, s = NULL) { - .Call(`_volesti_raftery`, samples, q, r, s) -} - -#' An internal Rccp function for the random rotation of a convex polytope -#' -#' @param P A convex polytope (H-, V-polytope or a zonotope). -#' @param T Optional. A rotation matrix. -#' @param seed Optional. A fixed seed for the random linear map generator. -#' -#' @keywords internal -#' -#' @return A matrix that describes the rotated polytope -rotating <- function(P, T = NULL, seed = NULL) { - .Call(`_volesti_rotating`, P, T, seed) -} - -#' Internal rcpp function for the rounding of a convex polytope -#' -#' @param P A convex polytope (H- or V-representation or zonotope). -#' @param method Optional. The method to use for rounding, a) \code{'min_ellipsoid'} for the method based on mimimmum volume enclosing ellipsoid of a uniform sample from P, b) \code{'max_ellipsoid'} for the method based on maximum volume enclosed ellipsoid in P, (c) \code{'isotropy'} for the method based on isotropy. The default method is \code{'min_ellipsoid'} for all the representations. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @keywords internal -#' -#' @return A numerical matrix that describes the rounded polytope, a numerical matrix of the inverse linear transofmation that is applied on the input polytope, the numerical vector the the input polytope is shifted and the determinant of the matrix of the linear transformation that is applied on the input polytope. -rounding <- function(P, method = NULL, seed = NULL) { - .Call(`_volesti_rounding`, P, method, seed) -} - -#' Sample uniformly, normally distributed, or logconcave distributed points from a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes). -#' -#' @param P A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection. -#' @param n The number of points that the function is going to sample from the convex polytope. -#' @param random_walk Optional. A list that declares the random walk and some related parameters as follows: -#' \itemize{ -#' \item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR x) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities) xi) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method xii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). The default walk is \code{'aBiW'} for the uniform distribution or \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes.} -#' \item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} -#' \item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} -#' \item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} -#' \item{\code{BaW_rad} }{ The radius for the ball walk.} -#' \item{\code{L} }{ The maximum length of the billiard trajectory or the radius for the step of dikin, vaidya or john walk.} -#' \item{\code{solver} }{ Specify ODE solver for logconcave sampling. Options are i) leapfrog, ii) euler iii) runge-kutta iv) richardson} -#' \item{\code{step_size }{ Optionally chosen step size for logconcave sampling. Defaults to a theoretical value if not provided.} -#' } -#' @param distribution Optional. A list that declares the target density and some related parameters as follows: -#' \itemize{ -#' \item{\code{density} }{ A string: (a) \code{'uniform'} for the uniform distribution or b) \code{'gaussian'} for the multidimensional spherical distribution c) \code{logconcave} with form proportional to exp(-f(x)) where f(x) is L-smooth and m-strongly-convex d) \code{'exponential'} for the exponential distribution. The default target distribution is the uniform distribution.} -#' \item{\code{variance} }{ The variance of the multidimensional spherical gaussian or the exponential distribution. The default value is 1.} -#' \item{\code{mode} }{ A \eqn{d}-dimensional numerical vector that declares the mode of the Gaussian distribution. The default choice is the center of the as that one computed by the function \code{inner_ball()}.} -#' \item{\code{bias} }{ The bias vector for the exponential distribution. The default vector is \eqn{c_1 = 1} and \eqn{c_i = 0} for \eqn{i \neq 1}.} -#' \item{\code{L_} }{ Smoothness constant (for logconcave). } -#' \item{\code{m} }{ Strong-convexity constant (for logconcave). } -#' \item{\code{negative_logprob} }{ Negative log-probability (for logconcave). } -#' \item{\code{negative_logprob_gradient} }{ Negative log-probability gradient (for logconcave). } -#' } -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @references \cite{Robert L. Smith, -#' \dQuote{Efficient Monte Carlo Procedures for Generating Points Uniformly Distributed Over Bounded Regions,} \emph{Operations Research,} 1984.}, -#' -#' @references \cite{B.T. Polyak, E.N. Gryazina, -#' \dQuote{Billiard walk - a new sampling algorithm for control and optimization,} \emph{IFAC Proceedings Volumes,} 2014.}, -#' -#' @references \cite{Y. Chen, R. Dwivedi, M. J. Wainwright and B. Yu, -#' \dQuote{Fast MCMC Sampling Algorithms on Polytopes,} \emph{Journal of Machine Learning Research,} 2018.} -#' -#' @references \cite{Lee, Yin Tat, Ruoqi Shen, and Kevin Tian, -#' \dQuote{"Logsmooth Gradient Concentration and Tighter Runtimes for Metropolized Hamiltonian Monte Carlo,"} \emph{arXiv preprint arXiv:2002.04121}, 2020.} -#' -#' @references \cite{Shen, Ruoqi, and Yin Tat Lee, -#' \dQuote{"The randomized midpoint method for log-concave sampling.",} \emph{Advances in Neural Information Processing Systems}, 2019.} -#' -#' @references \cite{Augustin Chevallier, Sylvain Pion, Frederic Cazals, -#' \dQuote{"Hamiltonian Monte Carlo with boundary reflections, and application to polytope volume calculations,"} \emph{Research Report preprint hal-01919855}, 2018.} -#' -#' @return A \eqn{d\times n} matrix that contains, column-wise, the sampled points from the convex polytope P. -#' @examples -#' # uniform distribution from the 3d unit cube in H-representation using ball walk -#' P = gen_cube(3, 'H') -#' points = sample_points(P, n = 100, random_walk = list("walk" = "BaW", "walk_length" = 5)) -#' -#' # gaussian distribution from the 2d unit simplex in H-representation with variance = 2 -#' A = matrix(c(-1,0,0,-1,1,1), ncol=2, nrow=3, byrow=TRUE) -#' b = c(0,0,1) -#' P = Hpolytope$new(A,b) -#' points = sample_points(P, n = 100, distribution = list("density" = "gaussian", "variance" = 2)) -#' -#' # uniform points from the boundary of a 2-dimensional random H-polytope -#' P = gen_rand_hpoly(2,20) -#' points = sample_points(P, n = 100, random_walk = list("walk" = "BRDHR")) -#' -#' # For sampling from logconcave densities see the examples directory -#' -#' @export -sample_points <- function(P, n, random_walk = NULL, distribution = NULL, seed = NULL) { - .Call(`_volesti_sample_points`, P, n, random_walk, distribution, seed) -} - -#' Write a SDPA format file -#' -#' Outputs a spectrahedron (the matrices defining a linear matrix inequality) and a vector (the objective function) -#' to a SDPA format file. -#' -#' @param spectrahedron A spectrahedron in n dimensions; must be an object of class Spectrahedron -#' @param objectiveFunction A numerical vector of length n -#' @param outputFile Name of the output file -#' -#' @examples -#' \dontrun{ -#' A0 = matrix(c(-1,0,0,0,-2,1,0,1,-2), nrow=3, ncol=3, byrow = TRUE) -#' A1 = matrix(c(-1,0,0,0,0,1,0,1,0), nrow=3, ncol=3, byrow = TRUE) -#' A2 = matrix(c(0,0,-1,0,0,0,-1,0,0), nrow=3, ncol=3, byrow = TRUE) -#' lmi = list(A0, A1, A2) -#' S = Spectrahedron$new(lmi); -#' objFunction = c(1,1) -#' writeSdpaFormatFile(S, objFunction, "output.txt") -#' } -#' @export -writeSdpaFormatFile <- function(spectrahedron = NULL, objectiveFunction = NULL, outputFile = NULL) { - invisible(.Call(`_volesti_writeSdpaFormatFile`, spectrahedron, objectiveFunction, outputFile)) -} - -#' Read a SDPA format file -#' -#' @param inputFile Name of the input file -#' -#' @return A list with two named items: an item "matrices" which is a list of the matrices and an vector "objFunction" -#' -#' @examples -#' path = system.file('extdata', package = 'volesti') -#' l = loadSdpaFormatFile(paste0(path,'/sdpa_n2m3.txt')) -#' @export -loadSdpaFormatFile <- function(inputFile = NULL) { - .Call(`_volesti_loadSdpaFormatFile`, inputFile) -} - -#' The main function for volume approximation of a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes). It returns a list with two elements: (a) the logarithm of the estimated volume and (b) the estimated volume -#' -#' For the volume approximation can be used three algorithms. Either CoolingBodies (CB) or SequenceOfBalls (SOB) or CoolingGaussian (CG). An H-polytope with \eqn{m} facets is described by a \eqn{m\times d} matrix \eqn{A} and a \eqn{m}-dimensional vector \eqn{b}, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }. A V-polytope is defined as the convex hull of \eqn{m} \eqn{d}-dimensional points which correspond to the vertices of P. A zonotope is desrcibed by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -#' -#' @param P A convex polytope. It is an object from class a) Hpolytope or b) Vpolytope or c) Zonotope or d) VpolytopeIntersection. -#' @param settings Optional. A list that declares which algorithm, random walk and values of parameters to use, as follows: -#' \itemize{ -#' \item{\code{algorithm} }{ A string to set the algorithm to use: a) \code{'CB'} for CB algorithm, b) \code{'SoB'} for SOB algorithm or b) \code{'CG'} for CG algorithm. The defalut algorithm is \code{'CB'}.} -#' \item{\code{error} }{ A numeric value to set the upper bound for the approximation error. The default value is \eqn{1} for SOB algorithm and \eqn{0.1} otherwise.} -#' \item{\code{random_walk} }{ A string that declares the random walk method: a) \code{'CDHR'} for Coordinate Directions Hit-and-Run, b) \code{'RDHR'} for Random Directions Hit-and-Run, c) \code{'BaW'} for Ball Walk, or \code{'BiW'} for Billiard walk. For CB algorithm the default walk is \code{'BiW'}. For CG and SOB algorithms the default walk is \code{'CDHR'} for H-polytopes and \code{'RDHR'} for the other representations.} -#' \item{\code{walk_length} }{ An integer to set the number of the steps for the random walk. The default value is \eqn{\lfloor 10 + d/10\rfloor} for \code{'SOB'} and \eqn{1} otherwise.} -#' \item{\code{win_len} }{ The length of the sliding window for CB or CG algorithm. The default value is \eqn{250} for CB with BiW and \eqn{400+3d^2} for CB and any other random walk and \eqn{500+4d^2} for CG.} -#' \item{\code{hpoly} }{ A boolean parameter to use H-polytopes in MMC of CB algorithm when the input polytope is a zonotope. The default value is \code{TRUE} when the order of the zonotope is \eqn{<5}, otherwise it is \code{FALSE}.} -#' } -#' @param rounding Optional. A string parameter to request a rounding method to be applied in the input polytope before volume computation: a) \code{'min_ellipsoid'}, b) \code{'svd'}, c) \code{'max_ellipsoid'} and d) \code{'none'} for no rounding. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @references \cite{I.Z.Emiris and V. Fisikopoulos, -#' \dQuote{Practical polytope volume approximation,} \emph{ACM Trans. Math. Soft.,} 2018.}, -#' @references \cite{A. Chalkis and I.Z.Emiris and V. Fisikopoulos, -#' \dQuote{Practical Volume Estimation by a New Annealing Schedule for Cooling Convex Bodies,} \emph{CoRR, abs/1905.05494,} 2019.}, -#' @references \cite{B. Cousins and S. Vempala, \dQuote{A practical volume algorithm,} \emph{Springer-Verlag Berlin Heidelberg and The Mathematical Programming Society,} 2015.} -#' -#' -#' @return The approximation of the volume of a convex polytope. -#' @examples -#' -#' # calling SOB algorithm for a H-polytope (5d unit simplex) -#' HP = gen_cube(5,'H') -#' pair_vol = volume(HP) -#' -#' # calling CG algorithm for a V-polytope (3d simplex) -#' VP = gen_simplex(3,'V') -#' pair_vol = volume(VP, settings = list("algorithm" = "CG")) -#' -#' # calling CG algorithm for a 2-dimensional zonotope defined as the Minkowski sum of 4 segments -#' Z = gen_rand_zonotope(2, 4) -#' pair_vol = volume(Z, settings = list("random_walk" = "RDHR", "walk_length" = 2)) -#' -#' @export -volume <- function(P, settings = NULL, rounding = NULL, seed = NULL) { - .Call(`_volesti_volume`, P, settings, rounding, seed) -} - -#' An internal Rccp function for the over-approximation of a zonotope -#' -#' @param Z A zonotope. -#' @param fit_ratio Optional. A boolean parameter to request the computation of the ratio of fitness. -#' @param settings Optional. A list that declares the values of the parameters of CB algorithm. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @keywords internal -#' -#' @return A List that contains a numerical matrix that describes the PCA approximation as a H-polytope and the ratio of fitness. -zono_approx <- function(Z, fit_ratio = NULL, settings = NULL, seed = NULL) { - .Call(`_volesti_zono_approx`, Z, fit_ratio, settings, seed) -} - diff --git a/R-proj/R/compute_indicators.R b/R-proj/R/compute_indicators.R deleted file mode 100644 index fe82cdee3..000000000 --- a/R-proj/R/compute_indicators.R +++ /dev/null @@ -1,104 +0,0 @@ -#' Compute an indicator for each time period that describes the state of a market. -#' -#' Given a matrix that contains row-wise the assets' returns and a sliding window \code{win_length}, this function computes an approximation of the joint distribution (copula, e.g. see \url{https://en.wikipedia.org/wiki/Copula_(probability_theory)}) between portfolios' return and volatility in each time period defined by \code{win_len}. -#' For each copula it computes an indicator: If the indicator is large it corresponds to a crisis period and if it is small it corresponds to a normal period. -#' In particular, the periods over which the indicator is greater than 1 for more than 60 consecutive sliding windows are warnings and for more than 100 are crisis. The sliding window is shifted by one day. -#' -#' @param returns A \eqn{d}-dimensional vector that describes the direction of the first family of parallel hyperplanes. -#' @param win_length Optional. The length of the sliding window. The default value is 60. -#' @param m Optional. The number of slices for the copula. The default value is 100. -#' @param n Optional. The number of points to sample. The default value is \eqn{5\cdot 10^5}. -#' @param nwarning Optional. The number of consecutive indicators larger than 1 required to declare a warning period. The default value is 60. -#' @param ncrisis Optional. The number of consecutive indicators larger than 1 required to declare a crisis period. The default value is 100. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @references \cite{L. Cales, A. Chalkis, I.Z. Emiris, V. Fisikopoulos, -#' \dQuote{Practical volume computation of structured convex bodies, and an application to modeling portfolio dependencies and financial crises,} \emph{Proc. of Symposium on Computational Geometry, Budapest, Hungary,} 2018.} -#' -#' @return A list that contains the indicators and the corresponding vector that label each time period with respect to the market state: a) normal, b) crisis, c) warning. -#' -#' @examples -#' # simple example on random asset returns -#' asset_returns = replicate(10, rnorm(14)) -#' market_states_and_indicators = compute_indicators(asset_returns, 10, 10, 10000, 2, 3) -#' -#' @export -compute_indicators <- function(returns, win_length = NULL, m = NULL, n = NULL, nwarning = NULL, ncrisis = NULL, seed = NULL) { - - if (is.null(win_length)) win_length = 60 - if (is.null(m)) m = 100 - if (is.null(n)) n = 500000 - if (is.null(nwarning)) nwarning = 60 - if (is.null(ncrisis)) ncrisis = 100 - - nrows = dim(returns)[1] - nassets = dim(returns)[2] - wl = win_length-1 - - indicators = c() - for (i in 1:(nrows-wl)) { - - Win=i:(i+wl) - E = cov(returns[Win,]) - - compRet = rep(1,nassets) - for (j in 1:nassets) { - for (k in Win) { - compRet[j] = compRet[j] * (1 + returns[k, j]) - } - compRet[j] = compRet[j] - 1 - } - - cop = copula(r1 = compRet, sigma = E, m = m, n = n, seed = seed) - blue_mass = 0 - red_mass = 0 - - for (row in 1:m) { - for (col in 1:m) { - if (row-col<=0.2*m && row-col>=-0.2*m) { - if (row+col<0.8*m || row+col>1.2*m) { - red_mass = red_mass + cop[row,col] - } - } else { - if (row+col>=0.8*m+1 && row+col<=1.2*m+1) { - blue_mass = blue_mass + cop[row,col] - } - } - } - } - indicators = c(indicators, blue_mass / red_mass) - } - - N = length(indicators) - - index = 0 - set_index = FALSE - col = rep("normal", N) - - for (i in 1:N) { - - if(indicators[i]>1 && !set_index){ - index = i - set_index = TRUE - } else if (indicators[i]<1) { - if(set_index){ - if(i-index > nwarning-1 && i-index <= ncrisis-1){ - col[index:(i-1)] = "warning" - } else if(i-index > ncrisis-1) { - col[index:(i-1)] = "crisis" - } - } - set_index = FALSE - } - } - if(set_index){ - if(N-index+1 > nwarning-1 && N-index+1 <= ncrisis-1){ - col[index:i] = "warning" - } else if(N-index+1 > ncrisis-1) { - col[index:i] = "crisis" - } - } - - return(list("indicators" = indicators, market_states = col)) - -} diff --git a/R-proj/R/estimate_lipschitz_constant.R b/R-proj/R/estimate_lipschitz_constant.R deleted file mode 100644 index c1fac15e0..000000000 --- a/R-proj/R/estimate_lipschitz_constant.R +++ /dev/null @@ -1,53 +0,0 @@ -#' Inverse weibull distribution PDF with location parameter -#' @param x The argument of the PDF -#' @param k The shape parameter -#' @param lambda The scale parameter -#' @param theta The location parameter -#' -#' @return The value of the PDF of an Inverse Weibull distribution with parameters k, lambda, theta evaluated at x -#' @export -dinvweibull_with_loc <- function (x, k, lambda, theta) { - return ((k / lambda) * ((x - theta) / lambda)^(k - 1) * exp(- ((x - theta) / lambda)^k) * as.double(x >= 0)) -} - -#' Inverse weibull distribution CDF with location parameter -#' @param q The argument of the CDF -#' @param k The shape parameter -#' @param lambda The scale parameter -#' @param theta The location parameter -#' -#' @return The value of the CDF of an Inverse Weibull distribution with parameters k, lambda, theta evaluated at q -#' @export -pinvweibull_with_loc <- function (q, k, lambda, theta) { - return ((1 - exp(-((q - theta) / lambda)^k)) * as.double(q >= 0)) -} - - -#' Estimate the Lipschitz Constant of a function f -#' -#' @param f Function whose Lipschitz constant is to be estimated -#' @param P Domain of f (a convex polytope) -#' @param n Number of samples to take -#' -#' The procedure draws n uniform samples from P and evaluates the Lipschitz -#' constant at subsequent samples (where the sampler moves to a new point), -#' It then returns the maximum observation -#' -#' @return An estimate of the Lipschitz constant -#' -#' @export -estimtate_lipschitz_constant <- function (f, P, n) { - points = volesti::sample_points(P, n = 1000, random_walk = list("walk" = "BaW", "walk_length" = 1)) - l = matrix(0, 1, n-1) - - for (i in seq(n-1)) { - l[1, i] <- norm(as.matrix(f(points[,i+1])) - as.matrix(f(points[,i])), type='F') / norm(as.matrix(points[,i+1]) - as.matrix(points[,i]), type='F') - } - - na_cols <- is.nan(l[1,]) - - l <- as.matrix(l[1, !na_cols]) - - # TODO Implement weibull distribution fitting method to estimate the Lipschitz constant - return(max(l)) -} \ No newline at end of file diff --git a/R-proj/R/file_to_polytope.R b/R-proj/R/file_to_polytope.R deleted file mode 100644 index 19dd61acf..000000000 --- a/R-proj/R/file_to_polytope.R +++ /dev/null @@ -1,113 +0,0 @@ -#' function to get an ine or an ext file and returns the corresponding polytope -#' -#' For an ".ine" file it generates the corresponding H-polytope. For an ".ext" file it generates the corresponding V-polytope or zonotope. -#' For more details on those file formats see \url{https://github.com/GeomScale/volume_approximation/blob/develop/doc/cpp_interface.md#polytope-input}. -#' -#' @param path A string that containes the path to an ine or a ext file. The ine file desrcibes a H-polytope and ext file describes a V-polytope or a zonotope. -#' @param zonotope A boolean parameter. It has to be TRUE when the path leads to an .ext file that describes a zonotope. -#' -#' @return A polytope class. If the path corresponds to an ine file then the return value represents a H-polytope. If it corresponds to an ext file the return value represents a V-polytope (default choice) or a zonotope if the second argument is TRUE. -#' -#' @export -#' @useDynLib volesti, .registration=TRUE -#' @importFrom Rcpp evalCpp -#' @importFrom Rcpp loadModule -#' @importFrom "utils" "read.csv" -#' @importFrom "stats" "cov" -#' @importFrom "methods" "new" -#' @exportPattern "^[[:alpha:]]+" -file_to_polytope <- function(path, zonotope = FALSE){ - - ineorext=substr(path, start = nchar(path) - 2, stop = nchar(path)) - if(ineorext!="ine" && ineorext!="ext") { - stop("Only ine or ext files can be handled by this function!") - } - P = read.csv(path) - r = as.character(P[3,1]) - count_sp = 1 - str = "" - beg = 0 - for (j in 1:nchar(r)) { - if (substr(r, start=j, stop=j) == " ") { - beg = beg + 1 - } else { - break - } - } - for (i in seq(from= beg + 1, to=nchar(r), by=1)) { - if (substr(r, start=i, stop=i) == " ") { - if (count_sp == 1) { - m = as.numeric(str) - str = "" - count_sp = count_sp + 1 - } else { - d = as.numeric(str) - str = "" - break - } - } else { - str = paste0(str, substr(r, start=i, stop=i)) - } - } - A = rep(0,d) - A[1] = m - A[2] = d - newrow = rep(0,d) - for (i in 4:(dim(P)[1] - 2)) { - r = P[i,1] - r = as.character(r) - str = "" - count = 1 - beg = 0 - for (j in 1:nchar(r)) { - if(substr(r, start=j, stop=j)==" "){ - beg = beg + 1 - } else { - break - } - } - sp_bef = FALSE - for (j in seq(from=beg + 1, to=nchar(r), by=1)) { - if (substr(r, start=j, stop=j) == " "){ - if (sp_bef) { - next - } - sp_bef = TRUE - newrow[count] = as.numeric(str) - str = "" - count = count + 1 - } else { - str = paste0(str, substr(r, start=j, stop=j)) - sp_bef = FALSE - if (j == nchar(r)) { - newrow[count] = as.numeric(str) - } - } - } - A = rbind(A,newrow) - newrow = rep(0,d) - } - A = matrix(A, ncol=dim(A)[2]) # now matrix A is in ine or ext format - - # remove first row - A = A[-c(1),] - - # first column is the vector b - b = A[,1] - - # remove first column - A2 = A[,-c(1)] - - if(ineorext=="ine") { - P = Hpolytope$new(-A2,b) - } else { - if(!missing(zonotope)){ - if(zonotope) { - P = Zonotope$new(A2) - return(P) - } - } - P = Vpolytope$new(A2) - } - return(P) -} diff --git a/R-proj/R/gen_birkhoff.R b/R-proj/R/gen_birkhoff.R deleted file mode 100644 index 935f637e2..000000000 --- a/R-proj/R/gen_birkhoff.R +++ /dev/null @@ -1,28 +0,0 @@ -#' Generator function for Birkhoff polytope -#' -#' This function can be used to generate the full dimensional \eqn{n}-Birkhoff polytope in H-representation. -#' The dimension of the generated polytope is \eqn{(n-1)^2}. -#' -#' @param n The order of the Birkhoff polytope -#' -#' @return A polytope class representing the full dimensional \eqn{n}-Birkhoff polytope in H-representation. -#' @examples -#' # generate the Birkhoff polytope of order 5 -#' P = gen_birkhoff(5) -#' @export -gen_birkhoff <- function(n) { - - kind_gen = 7 - m_gen = 0 - - Mat = poly_gen(kind_gen, FALSE, FALSE, n, m_gen) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - P = Hpolytope$new(Mat, b) - - return(P) - -} diff --git a/R-proj/R/gen_cross.R b/R-proj/R/gen_cross.R deleted file mode 100644 index d782f3991..000000000 --- a/R-proj/R/gen_cross.R +++ /dev/null @@ -1,41 +0,0 @@ -#' Generator function for cross polytopes -#' -#' This function generates the \eqn{d}-dimensional cross polytope in H- or V-representation. -#' -#' @param dimension The dimension of the cross polytope. -#' @param representation A string to declare the representation. It has to be \code{'H'} for H-representation or \code{'V'} for V-representation. -#' -#' @return A polytope class representing a cross polytope in H- or V-representation. -#' @examples -#' # generate a 10-dimensional cross polytope in H-representation -#' P = gen_cross(5, 'H') -#' -#' # generate a 15-dimension cross polytope in V-representation -#' P = gen_cross(15, 'V') -#' @export -gen_cross <- function(dimension, representation) { - - kind_gen = 2 - m_gen = 0 - if (representation == "V") { - Vpoly_gen = TRUE - } else if (representation == "H") { - Vpoly_gen = FALSE - } else { - stop('Not a known representation.') - } - - Mat = poly_gen(kind_gen, Vpoly_gen, FALSE, dimension, m_gen) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - if (Vpoly_gen) { - P = Vpolytope$new(Mat, 2^dimension / prod(1:dimension)) - } else { - P = Hpolytope$new(-Mat, b, 2^dimension / prod(1:dimension)) - } - - return(P) -} diff --git a/R-proj/R/gen_cube.R b/R-proj/R/gen_cube.R deleted file mode 100644 index bcbf1f025..000000000 --- a/R-proj/R/gen_cube.R +++ /dev/null @@ -1,41 +0,0 @@ -#' Generator function for hypercubes -#' -#' This function generates the \eqn{d}-dimensional unit hypercube \eqn{[-1,1]^d} in H- or V-representation. -#' -#' @param dimension The dimension of the hypercube -#' @param representation A string to declare the representation. It has to be \code{'H'} for H-representation or \code{'V'} for V-representation. -#' -#' @return A polytope class representing the unit \eqn{d}-dimensional hypercube in H- or V-representation. -#' @examples -#' # generate a 10-dimensional hypercube in H-representation -#' P = gen_cube(10, 'H') -#' -#' # generate a 15-dimension hypercube in V-representation -#' P = gen_cube(5, 'V') -#' @export -gen_cube <- function(dimension, representation) { - - kind_gen = 1 - m_gen = 0 - if (representation == "V") { - Vpoly_gen = TRUE - } else if (representation == "H") { - Vpoly_gen = FALSE - } else { - stop('Not a known representation.') - } - - Mat = poly_gen(kind_gen, Vpoly_gen, FALSE, dimension, m_gen) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - if (Vpoly_gen) { - P = Vpolytope$new(Mat, 2^dimension) - } else { - P = Hpolytope$new(-Mat, b, 2^dimension) - } - - return(P) - -} diff --git a/R-proj/R/gen_prod_simplex.R b/R-proj/R/gen_prod_simplex.R deleted file mode 100644 index a0505880c..000000000 --- a/R-proj/R/gen_prod_simplex.R +++ /dev/null @@ -1,29 +0,0 @@ -#' Generator function for product of simplices -#' -#' This function generates a \eqn{2d}-dimensional polytope that is defined as the product of two \eqn{d}-dimensional unit simplices in H-representation. -#' -#' @param dimension The dimension of the simplices. -#' -#' @return A polytope class representing the product of the two \eqn{d}-dimensional unit simplices in H-representation. -#' -#' @examples -#' # generate a product of two 5-dimensional simplices. -#' P = gen_prod_simplex(5) -#' @export -gen_prod_simplex <- function(dimension) { - - kind_gen = 4 - m_gen = 0 - Vpoly_gen = FALSE - - Mat = poly_gen(kind_gen, Vpoly_gen, FALSE, dimension, m_gen) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - P = Hpolytope$new(-Mat, b, (1/prod(1:dimension))^2) - - return(P) - -} diff --git a/R-proj/R/gen_rand_hpoly.R b/R-proj/R/gen_rand_hpoly.R deleted file mode 100644 index 2785a28b4..000000000 --- a/R-proj/R/gen_rand_hpoly.R +++ /dev/null @@ -1,28 +0,0 @@ -#' Generator function for random H-polytopes -#' -#' This function generates a \eqn{d}-dimensional polytope in H-representation with \eqn{m} facets. We pick \eqn{m} random hyperplanes tangent on the \eqn{d}-dimensional unit hypersphere as facets. -#' -#' @param dimension The dimension of the convex polytope. -#' @param nfacets The number of the facets. -#' @param seed Optional. A fixed seed for the generator. -#' -#' @return A polytope class representing a H-polytope. -#' @examples -#' # generate a 10-dimensional polytope with 50 facets -#' P = gen_rand_hpoly(10, 50) -#' @export -gen_rand_hpoly <- function(dimension, nfacets, seed = NULL) { - - kind_gen = 6 - Vpoly_gen = FALSE - - Mat = poly_gen(kind_gen, Vpoly_gen, FALSE, dimension, nfacets, seed) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - P = Hpolytope$new(Mat, b) - - return(P) -} diff --git a/R-proj/R/gen_rand_vpoly.R b/R-proj/R/gen_rand_vpoly.R deleted file mode 100644 index 31cc561c0..000000000 --- a/R-proj/R/gen_rand_vpoly.R +++ /dev/null @@ -1,36 +0,0 @@ -#' Generator function for random V-polytopes -#' -#' This function generates a \eqn{d}-dimensional polytope in V-representation with \eqn{m} vertices. We pick \eqn{m} random points from the boundary of the \eqn{d}-dimensional unit hypersphere as vertices. -#' -#' @param dimension The dimension of the convex polytope. -#' @param nvertices The number of the vertices. -#' @param generator The body that the generator samples uniformly the vertices from: (a) 'cube' or (b) 'sphere'. -#' @param seed Optional. A fixed seed for the generator. -#' -#' @return A polytope class representing a V-polytope. -#' @examples -#' # generate a 10-dimensional polytope defined as the convex hull of 25 random vertices -#' P = gen_rand_vpoly(10, 25) -#' @export -gen_rand_vpoly <- function(dimension, nvertices, generator = NULL, seed = NULL) { - - kind_gen = 4 - - if(!is.null(generator)){ - if (generator == 'cube'){ - kind_gen = 5 - } else if (generator != 'sphere') { - stop("Wrong generator!") - } - } - - Mat = poly_gen(kind_gen, TRUE, FALSE, dimension, nvertices, seed) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - P = Vpolytope$new(Mat) - - return(P) -} diff --git a/R-proj/R/gen_rand_zonotope.R b/R-proj/R/gen_rand_zonotope.R deleted file mode 100644 index 3a2c8c1b2..000000000 --- a/R-proj/R/gen_rand_zonotope.R +++ /dev/null @@ -1,40 +0,0 @@ -#' Generator function for zonotopes -#' -#' This function generates a random \eqn{d}-dimensional zonotope defined by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -#' The function considers \eqn{m} random directions in \eqn{R^d}. There are three strategies to pick the length of each segment: a) it is uniformly sampled from \eqn{[0,100]}, b) it is random from \eqn{\mathcal{N}(50,(50/3)^2)} truncated to \eqn{[0,100]}, c) it is random from \eqn{Exp(1/30)} truncated to \eqn{[0,100]}. -#' -#' @param dimension The dimension of the zonotope. -#' @param nsegments The number of segments that generate the zonotope. -#' @param generator The distribution to pick the length of each segment from \eqn{[0,100]}: (a) 'uniform', (b) 'gaussian' or (c) 'exponential'. -#' @param seed Optional. A fixed seed for the generator. -#' -#' @return A polytope class representing a zonotope. -#' -#' @examples -#' # generate a 10-dimensional zonotope defined by the Minkowski sum of 20 segments -#' P = gen_rand_zonotope(10, 20) -#' @export -gen_rand_zonotope <- function(dimension, nsegments, generator = NULL, seed = NULL) { - - kind_gen = 1 - - if (!is.null(generator)) { - if (generator == 'gaussian') { - kind_gen = 2 - } else if (generator == 'exponential') { - kind_gen = 3 - } else if (generator != 'uniform'){ - stop("Wrong generator!") - } - } - - Mat = poly_gen(kind_gen, FALSE, TRUE, dimension, nsegments, seed) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - P = Zonotope$new(Mat) - - return(P) -} diff --git a/R-proj/R/gen_simplex.R b/R-proj/R/gen_simplex.R deleted file mode 100644 index aa2ca4a6a..000000000 --- a/R-proj/R/gen_simplex.R +++ /dev/null @@ -1,41 +0,0 @@ -#' Generator function for simplices -#' -#' This function generates the \eqn{d}-dimensional unit simplex in H- or V-representation. -#' -#' @param dimension The dimension of the unit simplex. -#' @param representation A string to declare the representation. It has to be \code{'H'} for H-representation or \code{'V'} for V-representation. -#' -#' @return A polytope class representing the \eqn{d}-dimensional unit simplex in H- or V-representation. -#' @examples -#' # generate a 10-dimensional simplex in H-representation -#' PolyList = gen_simplex(10, 'H') -#' -#' # generate a 20-dimensional simplex in V-representation -#' P = gen_simplex(20, 'V') -#' @export -gen_simplex <- function(dimension, representation) { - - kind_gen = 3 - m_gen = 0 - if (representation == "V") { - Vpoly_gen = TRUE - } else if (representation == "H") { - Vpoly_gen = FALSE - } else { - stop('Not a known representation.') - } - - Mat = poly_gen(kind_gen, Vpoly_gen, FALSE, dimension, m_gen) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - if (Vpoly_gen) { - P = Vpolytope$new(Mat, 1/prod(1:dimension)) - } else { - P = Hpolytope$new(-Mat, b, 1/prod(1:dimension)) - } - - return(P) -} diff --git a/R-proj/R/gen_skinny_cube.R b/R-proj/R/gen_skinny_cube.R deleted file mode 100644 index 0a1df0eb0..000000000 --- a/R-proj/R/gen_skinny_cube.R +++ /dev/null @@ -1,28 +0,0 @@ -#' Generator function for skinny hypercubes -#' -#' This function generates a \eqn{d}-dimensional skinny hypercube \eqn{[-1,1]^{d-1}\times [-100,100]}. -#' -#' @param dimension The dimension of the skinny hypercube. -#' -#' @return A polytope class representing the \eqn{d}-dimensional skinny hypercube in H-representation. -#' -#' @examples -#' # generate a 10-dimensional skinny hypercube. -#' P = gen_skinny_cube(10) -#' @export -gen_skinny_cube <- function(dimension) { - - kind_gen = 5 - m_gen = 0 - Vpoly_gen = FALSE - - Mat = poly_gen(kind_gen, Vpoly_gen, FALSE, dimension, m_gen) - - # first column is the vector b - b = Mat[,1] - Mat = Mat[,-c(1)] - - P = Hpolytope$new(-Mat, b, 2^(dimension -1)*200) - - return(P) -} diff --git a/R-proj/R/read_sdpa_file.R b/R-proj/R/read_sdpa_file.R deleted file mode 100644 index 83c10c528..000000000 --- a/R-proj/R/read_sdpa_file.R +++ /dev/null @@ -1,26 +0,0 @@ -#' Read a SDPA format file -#' -#' Read a SDPA format file and return a spectrahedron (an object of class Spectrahedron) which is defined by -#' the linear matrix inequality in the input file, and the objective function. -#' -#' @param path Name of the input file -#' -#' @return A list with two named items: an item "matrices" which is an object of class Spectrahedron and an vector "objFunction" -#' -#' @examples -#' path = system.file('extdata', package = 'volesti') -#' l = readSdpaFormatFile(paste0(path,'/sdpa_n2m3.txt')) -#' Spectrahedron = l$spectrahedron -#' objFunction = l$objFunction -#' @export -#' @useDynLib volesti, .registration=TRUE -#' @importFrom Rcpp evalCpp -#' @importFrom Rcpp loadModule -#' @importFrom "methods" "new" -#' @exportPattern "^[[:alpha:]]+" -readSdpaFormatFile <- function(path){ - l = loadSdpaFormatFile(path) - S = Spectrahedron$new(l$matrices) - - return(list("spectrahedron"=S, "objFunction"= l$objFunction)) -} diff --git a/R-proj/R/rotate_polytope.R b/R-proj/R/rotate_polytope.R deleted file mode 100644 index 12ce246b8..000000000 --- a/R-proj/R/rotate_polytope.R +++ /dev/null @@ -1,57 +0,0 @@ -#' Apply a random rotation to a convex polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes) -#' -#' Given a convex H- or V- polytope or a zonotope or an intersection of two V-polytopes as input, this function applies (a) a random rotation or (b) a given rotation by an input matrix \eqn{T}. -#' -#' @param P A convex polytope. It is an object from class (a) Hpolytope, (b) Vpolytope, (c) Zonotope, (d) intersection of two V-polytopes. -#' @param T Optional. A \eqn{d\times d} rotation matrix. -#' @param seed Optional. A fixed seed for the random linear map generator. -#' -#' @return A list that contains the rotated polytope and the matrix \eqn{T} of the linear transformation. -#' -#' @details Let \eqn{P} be the given polytope and \eqn{Q} the rotated one and \eqn{T} be the matrix of the linear transformation. -#' \itemize{ -#' \item{If \eqn{P} is in H-representation and \eqn{A} is the matrix that contains the normal vectors of the facets of \eqn{Q} then \eqn{AT} contains the normal vactors of the facets of \eqn{P}.} -#' \item{If \eqn{P} is in V-representation and \eqn{V} is the matrix that contains column-wise the vertices of \eqn{Q} then \eqn{T^TV} contains the vertices of \eqn{P}.} -#' \item{If \eqn{P} is a zonotope and \eqn{G} is the matrix that contains column-wise the generators of \eqn{Q} then \eqn{T^TG} contains the generators of \eqn{P}.} -#' \item{If \eqn{M} is a matrix that contains column-wise points in \eqn{Q} then \eqn{T^TM} contains points in \eqn{P}.} -#' } -#' @examples -#' # rotate a H-polytope (2d unit simplex) -#' P = gen_simplex(2,'H') -#' poly_matrix_list = rotate_polytope(P) -#' -#' # rotate a V-polytope (3d cube) -#' P = gen_cube(3, 'V') -#' poly_matrix_list = rotate_polytope(P) -#' -#' # rotate a 5-dimensional zonotope defined by the Minkowski sum of 15 segments -#' Z = gen_rand_zonotope(3,6) -#' poly_matrix_list = rotate_polytope(Z) -#' @export -rotate_polytope <- function(P, T = NULL, seed = NULL){ - - #call rcpp rotating function - Mat = rotating(P, T, seed) - - n = P$dimension - m=dim(Mat)[2]-n - Tr = Mat[,-c(1:(dim(Mat)[2]-n))] - Tr = Tr[1:n, 1:n] - Mat = t(Mat[,1:m]) - - # first column is the vector b - b = Mat[,1] - - # remove first column - A = Mat[,-c(1)] - - type = P$type - if (type == 2) { - PP = Vpolytope$new(A) - }else if (type == 3) { - PP = Zonotope$new(A) - } else { - PP = Hpolytope$new(A, b) - } - return(list("P" = PP, "T" = Tr)) -} diff --git a/R-proj/R/round_polytope.R b/R-proj/R/round_polytope.R deleted file mode 100644 index f95649c66..000000000 --- a/R-proj/R/round_polytope.R +++ /dev/null @@ -1,60 +0,0 @@ -#' Apply rounding to a convex polytope (H-polytope, V-polytope or a zonotope) -#' -#' Given a convex H or V polytope or a zonotope as input this function brings the polytope in rounded position based on minimum volume enclosing ellipsoid of a pointset. -#' -#' @param P A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope. -#' @param method Optional. The method to use for rounding, a) \code{'min_ellipsoid'} for the method based on mimimmum volume enclosing ellipsoid of a dataset, b) \code{'max_ellipsoid'} for the method based on maximum volume enclosed ellipsoid, (c) \code{'isotropy'} for the method based on svd decomposition. The default method is \code{'mee'} for all the representations. -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @return A list with 4 elements: (a) a polytope of the same class as the input polytope class and (b) the element "T" which is the matrix of the inverse linear transformation that is applied on the input polytope, (c) the element "shift" which is the opposite vector of that which has shifted the input polytope, (d) the element "round_value" which is the determinant of the square matrix of the linear transformation that is applied on the input polytope. -#' -#' @references \cite{I.Z.Emiris and V. Fisikopoulos, -#' \dQuote{Practical polytope volume approximation,} \emph{ACM Trans. Math. Soft.,} 2018.}, -#' @references \cite{Michael J. Todd and E. Alper Yildirim, -#' \dQuote{On Khachiyan’s Algorithm for the Computation of Minimum Volume Enclosing Ellipsoids,} \emph{Discrete Applied Mathematics,} 2007.} -#' @references \cite{B. Cousins and S. Vempala, -#' \dQuote{A practical volume algorithm,} \emph{Math. Prog. Comp.,} 2016.}, -#' @references \cite{Yin Zhang and Liyan Gao, -#' \dQuote{On Numerical Solution of the Maximum Volume Ellipsoid Problem,} \emph{SIAM Journal on Optimization,} 2003.}, -#' -#' -#' @examples -#' # round a 5d skinny cube -#' P = gen_skinny_cube(5) -#' listHpoly = round_polytope(P) -#' -#' # round a V-polytope (3d unit cube) -#' P = gen_cube(3, 'V') -#' ListVpoly = round_polytope(P) -#' -#' # round a 2-dimensional zonotope defined by 6 generators -#' Z = gen_rand_zonotope(2,6) -#' ListZono = round_polytope(Z) -#' @export -round_polytope <- function(P, method = NULL, seed = NULL){ - - ret_list = rounding(P, method, seed) - - #get the matrix that describes the polytope - Mat = ret_list$Mat - - # first column is the vector b - b = Mat[,1] - - # remove first column - A = Mat[,-c(1)] - - type = P$type - if (type == 2) { - PP = list("P" = Vpolytope$new(A), "T" = ret_list$T, "shift" = ret_list$shift, "round_value" = ret_list$round_value) - }else if (type == 3) { - PP = list("P" = Zonotope$new(A), "T" = ret_list$T, "shift" = ret_list$shift, "round_value" = ret_list$round_value) - } else { - if (dim(P$Aeq)[1] > 0){ - PP = list("P" = Hpolytope$new(A,b), "T" = ret_list$T, "shift" = ret_list$shift, "round_value" = ret_list$round_value, "N" = ret_list$N, "N_shift" = ret_list$N_shift, "svd_prod" = ret_list$svd_prod) - } else { - PP = list("P" = Hpolytope$new(A,b), "T" = ret_list$T, "shift" = ret_list$shift, "round_value" = ret_list$round_value) - } - } - return(PP) -} diff --git a/R-proj/R/zonotope_approximation.R b/R-proj/R/zonotope_approximation.R deleted file mode 100644 index 8c56f6d23..000000000 --- a/R-proj/R/zonotope_approximation.R +++ /dev/null @@ -1,42 +0,0 @@ -#' A function to over-approximate a zonotope with PCA method and to evaluate the approximation by computing a ratio of fitness. -#' -#' For the evaluation of the PCA method the exact volume of the approximation body is computed and the volume of the input zonotope is computed by CoolingBodies algorithm. The ratio of fitness is \eqn{R=vol(P) / vol(P_{red})}, where \eqn{P_{red}} is the approximate polytope. -#' -#' @param Z A zonotope. -#' @param fit_ratio Optional. A boolean parameter to request the computation of the ratio of fitness. -#' @param settings Optional. A list that declares the values of the parameters of CB algorithm as follows: -#' \itemize{ -#' \item{\code{error} }{ A numeric value to set the upper bound for the approximation error. The default value is \eqn{0.1}.} -#' \item{\code{walk_length} }{ An integer to set the number of the steps for the random walk. The default value is \eqn{1}.} -#' \item{\code{win_len} }{ The length of the sliding window for CB algorithm. The default value is \eqn{200}.} -#' \item{\code{hpoly} }{ A boolean parameter to use H-polytopes in MMC of CB algorithm. The default value is \code{TRUE} when the order of the zonotope is \eqn{<5}, otherwise it is \code{FALSE}.} -#' } -#' @param seed Optional. A fixed seed for the number generator. -#' -#' @return A list that contains the approximation body in H-representation and the ratio of fitness -#' -#' @references \cite{A.K. Kopetzki and B. Schurmann and M. Althoff, -#' \dQuote{Methods for Order Reduction of Zonotopes,} \emph{IEEE Conference on Decision and Control,} 2017.} -#' -#' @examples -#' # over-approximate a 2-dimensional zonotope with 10 generators and compute the ratio of fitness -#' Z = gen_rand_zonotope(2,12) -#' retList = zonotope_approximation(Z = Z) -#' -#' @export -zonotope_approximation <- function(Z, fit_ratio = NULL, settings = NULL, seed = NULL){ - - ret_list = zono_approx(Z, fit_ratio, settings, seed) - - Mat = ret_list$Mat - - # first column is the vector b - b = Mat[,1] - - # remove first column - A = Mat[,-c(1)] - PP = list("P" = Hpolytope$new(A,b), "fit_ratio" = ret_list$fit_ratio) - - return(PP) - -} diff --git a/R-proj/R/zzz.R b/R-proj/R/zzz.R deleted file mode 100644 index 564a20b9c..000000000 --- a/R-proj/R/zzz.R +++ /dev/null @@ -1,11 +0,0 @@ -## Up until R 2.15.0, the require("methods") is needed but (now) -## triggers an warning from R CMD check -#.onLoad <- function(libname, pkgname){ -# #require("methods") ## needed with R <= 2.15.0 -# loadRcppModules() - -## For R 2.15.1 and later this also works. Note that calling loadModule() triggers -## a load action, so this does not have to be placed in .onLoad() or evalqOnLoad(). - -loadModule("polytopes", TRUE) -loadModule("spectrahedron", TRUE) diff --git a/R-proj/examples/logconcave/data/polytope_e_coli.mat b/R-proj/examples/logconcave/data/polytope_e_coli.mat deleted file mode 100644 index cc0dee3ef3704839a7fb5dbf0d738bd650d1249d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19249 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 diff --git a/R-proj/examples/logconcave/generalized_hyperbolic.R b/R-proj/examples/logconcave/generalized_hyperbolic.R deleted file mode 100644 index e0f9b90ce..000000000 --- a/R-proj/examples/logconcave/generalized_hyperbolic.R +++ /dev/null @@ -1,65 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for sampling from a Generalized Hyperbolic density - -# Import required libraries -library(ggplot2) -library(volesti) -library(numDeriv) -library(GeneralizedHyperbolic) - -A = matrix(c(1, -1), ncol=1, nrow=2, byrow=TRUE) -b = c(4,4) - -f <- function(x) (-log(dghyp(x))) -grad_f <- function(x) (-ddghyp(x)/dghyp(x)) - -x_min = matrix(0, 1, 1) - -# Create domain of truncation -P <- volesti::Hpolytope$new(A, b) - -# Smoothness and strong-convexity -L <- estimtate_lipschitz_constant(grad_f, P, 1000) -m <- L - -# Warm start point from truncated Gaussian -warm_start <- sample_points(P, n = 1, random_walk = list("nburns" = 5000), distribution = list("density" = "gaussian", "variance" = 1/L, "mode" = x_min)) - -# Sample points -n_samples <- 10000 -n_burns <- n_samples / 2 - -pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "HMC", "step_size" = 0.5, "nburns" = n_burns, "walk_length" = 1, "solver" = "leapfrog", "starting_point" = warm_start[,1]), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) - -# Plot histogram -hist(pts, - probability=TRUE, - breaks = 100, - border="blue", - main="Genrealized Hyperbolic Density with lambda = 1, alpha = 1, beta = 0, delta = 1, mu = 0", - xlab="Samples", - ylab="Density" -) - -cat("Sample mean is: ") -sample_mean <- mean(pts) -cat(sample_mean) -cat("\n") -cat("Sample variance is: ") -sample_variance <- mean((pts - sample_mean)^2) -cat(sample_variance) - -n_ess = min(ess(pts)) -psrf = max(psrf_univariate(pts)) - -cat("\nEffective sample size: ", n_ess, append=TRUE) -cat("\nPSRF: ", psrf, append=TRUE) diff --git a/R-proj/examples/logconcave/metabolic.R b/R-proj/examples/logconcave/metabolic.R deleted file mode 100644 index 7785de0d7..000000000 --- a/R-proj/examples/logconcave/metabolic.R +++ /dev/null @@ -1,111 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for using the logconcave sampling methods - -# Import required libraries -library(ggplot2) -library(volesti) -library(R.matlab) - -# Sampling from logconcave density example - -# Helper function -norm_vec <- function(x) sqrt(sum(x^2)) - - -# Load polytopes from mat file -metabolic_polytope_mat <- readMat('./data/polytope_e_coli.mat') -A <- as.matrix(metabolic_polytope_mat$polytope[[1]]) -b <- as.matrix(metabolic_polytope_mat$polytope[[2]]) -center <- as.matrix(metabolic_polytope_mat$polytope[[3]]) -radius <- as.numeric(metabolic_polytope_mat$polytope[[4]]) -sigma <- 1 -dimension <- dim(A)[2] - - -# Negative log-probability oracle -f <- function(x) (norm_vec(x)^2 / (2 * sigma^2)) - -# Negative log-probability gradient oracle -grad_f <- function(x) (x / sigma^2) - - -# Smoothness and strong-convexity -L <- 1 / sigma^2 -m <- 1 / sigma^2 - -# Center polytope -b_new <- b - A %*% center - -# Create volesti polytope -P <- Hpolytope$new(A = A, b = c(b_new)) - -# Rounding -#Tr <- rounding(H) - -#P <- Hpolytope$new(A = Tr$Mat[1:nrow(Tr$Mat), 2:ncol(Tr$Mat)], b = Tr$Mat[,1]) - -# Center is origin (after shift) -x_min = matrix(0, dimension, 1) - -# Generate samples with HNR -start_time <- Sys.time() -rdhr_samples <- sample_points(P, n = 10, random_walk = list("walk" = "RDHR", "nburns" = 10, "walk_length" = 1), distribution = list("density" = "gaussian", "variance" = 1/L, "mode" = x_min)) -end_time <- Sys.time() - -# Calculate Effective Sample size -rdhr_ess = ess(rdhr_samples) -min_ess <- min(rdhr_ess) - -# Calculate PSRF -rdhr_psrfs = psrf_univariate(rdhr_samples) -max_psrf = max(rdhr_psrfs) -elapsed_time <- end_time - start_time - -# Print results -cat('Min Effective Sample Size: ') -cat(min_ess) -cat('\n') -cat('Maximum PSRF: ') -cat(max_psrf) -cat('\n') -cat('Time per independent sample: ') -cat(elapsed_time / min_ess) -cat('sec') - -outfile <- '/home/marios/samples_hnr_iAB_PLT_283.txt' - -write.table(rdhr_samples, file=outfile, row.names=FALSE, col.names=FALSE) - -start_time <- Sys.time() -hmc_samples <- sample_points(P, n = 10, random_walk = list("walk" = "HMC", "step_size" = 0.07, "nburns" = 10, "walk_length" = 30, "solver" = "leapfrog", "starting_point" = rdhr_samples[, ncol(rdhr_samples)]), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) -end_time <- Sys.time() - -# Calculate Effective Sample size -hmc_ess = ess(hmc_samples) -min_ess <- min(hmc_ess) - -# Calculate PSRF -hmc_psrfs = psrf_univariate(hmc_samples) -max_psrf = max(hmc_psrfs) -elapsed_time <- end_time - start_time - -# Print results -cat('HMC\n') -cat('Min Effective Sample Size: ') -cat(min_ess) -cat('\n') -cat('Maximum PSRF: ') -cat(max_psrf) -cat('\n') -cat('Time per independent sample: ') -cat(elapsed_time / min_ess) -cat('sec') diff --git a/R-proj/examples/logconcave/nuts_rand_poly.R b/R-proj/examples/logconcave/nuts_rand_poly.R deleted file mode 100644 index 00400ba72..000000000 --- a/R-proj/examples/logconcave/nuts_rand_poly.R +++ /dev/null @@ -1,55 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for using the logconcave sampling methods - -# Import required libraries -library(ggplot2) -library(volesti) - -# Sampling from logconcave density example - -# Helper function -norm_vec <- function(x) sqrt(sum(x^2)) - -# Negative log-probability oracle -f <- function(x) (norm_vec(x)^2 + sum(x)) - -# Negative log-probability gradient oracle -grad_f <- function(x) (2 * x + 1) - -dimension <- 50 -facets <- 200 - -# Create domain of truncation -H <- gen_rand_hpoly(dimension, facets, seed = 15) - -# Rounding -Tr <- rounding(H, seed = 127) - -P <- Hpolytope$new(A = Tr$Mat[1:nrow(Tr$Mat), 2:ncol(Tr$Mat)], b = Tr$Mat[,1]) - -x_min = matrix(0, dimension, 1) - -# Warm start point from truncated Gaussian -warm_start <- sample_points(P, n = 1, random_walk = list("nburns" = 5000), distribution = list("density" = "gaussian", "variance" = 1/2, "mode" = x_min)) - -# Sample points -n_samples <- 20000 - -samples <- sample_points(P, n = n_samples, random_walk = list("walk" = "NUTS", "solver" = "leapfrog", "starting_point" = warm_start[,1]), - distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f)) - -# Plot histogram -hist(samples[1,], probability=TRUE, breaks = 100) - -psrfs <- psrf_univariate(samples) -n_ess <- ess(samples) - diff --git a/R-proj/examples/logconcave/simple_crhmc.R b/R-proj/examples/logconcave/simple_crhmc.R deleted file mode 100644 index 5fee2b8b8..000000000 --- a/R-proj/examples/logconcave/simple_crhmc.R +++ /dev/null @@ -1,49 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou -# Copyright (c) 2022-2022 Ioannis Iakovidis - -# Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of Code 2022 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for using the logconcave sampling methods - -# Import required libraries -library(volesti) - -# Sampling from uniform density example - -logconcave_sample<- function(P,distribution, n_samples ,n_burns){ - if (distribution == "uniform"){ - f <- function(x) (0) - grad_f <- function(x) (0) - L=1 - m=1 - pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) - return(max(psrf_univariate(pts, "interval"))) - } - else if(distribution == "gaussian"){ - pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "variance"=8)) - return(max(psrf_univariate(pts, "interval"))) - } -} - -for (i in 1:2) { - - if (i==1) { - distribution = 'gaussian' - cat("Gaussian ") - } else { - distribution = 'uniform' - cat("Uniform ") - } - - P = gen_simplex(10, 'H') - psrf = logconcave_sample(P,distribution,5000,2000) - cat("psrf = ") - cat(psrf) - cat("\n") -} diff --git a/R-proj/examples/logconcave/simple_hmc.R b/R-proj/examples/logconcave/simple_hmc.R deleted file mode 100644 index 860677468..000000000 --- a/R-proj/examples/logconcave/simple_hmc.R +++ /dev/null @@ -1,61 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for using the logconcave sampling methods - -# Import required libraries -library(ggplot2) -library(volesti) - -# Sampling from logconcave density example - -# Helper function -norm_vec <- function(x) sqrt(sum(x^2)) - -# Negative log-probability oracle -f <- function(x) (norm_vec(x)^2 + sum(x)) - -# Negative log-probability gradient oracle -grad_f <- function(x) (2 * x + 1) - -# Interval [-1, 1] -A = matrix(c(1, -1), ncol=1, nrow=2, byrow=TRUE) -b = c(2,1) - -# Create domain of truncation -P <- volesti::Hpolytope$new(A, b) - -# Mode of logconcave density -x_min <- c(-0.5) - -# Smoothness and strong-convexity -L <- 2 -m <- 2 - -# Warm start point from truncated Gaussian -warm_start <- sample_points(P, n = 1, random_walk = list("nburns" = 5000), distribution = list("density" = "gaussian", "variance" = 1/L, "mode" = x_min)) - -# Sample points -n_samples <- 20000 -n_burns <- n_samples / 2 - -pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "HMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 3, "solver" = "leapfrog", "starting_point" = warm_start[,1]), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) -# pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "HMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 3, "solver" = "leapfrog", "starting_point" = warm_start[,1]), distribution = list("density" = "logconcave", "mode" = x_min, "variance" = 1)) - -# Plot histogram -hist(pts, probability=TRUE, breaks = 100) - -cat("Sample mean is: ") -sample_mean <- mean(pts) -cat(sample_mean) -cat("\n") -cat("Sample variance is: ") -sample_variance <- mean((pts - sample_mean)^2) -cat(sample_variance) diff --git a/R-proj/examples/logconcave/simple_hmc_rand_poly.R b/R-proj/examples/logconcave/simple_hmc_rand_poly.R deleted file mode 100644 index b352c9a16..000000000 --- a/R-proj/examples/logconcave/simple_hmc_rand_poly.R +++ /dev/null @@ -1,58 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for using the logconcave sampling methods - -# Import required libraries -library(ggplot2) -library(volesti) - -# Sampling from logconcave density example - -# Helper function -norm_vec <- function(x) sqrt(sum(x^2)) - -# Negative log-probability oracle -f <- function(x) (norm_vec(x)^2 + sum(x)) - -# Negative log-probability gradient oracle -grad_f <- function(x) (2 * x + 1) - -dimension <- 50 -facets <- 200 - -# Create domain of truncation -H <- gen_rand_hpoly(dimension, facets, seed = 15) - -# Rounding -Tr <- rounding(H, seed = 127) - -P <- Hpolytope$new(A = Tr$Mat[1:nrow(Tr$Mat), 2:ncol(Tr$Mat)], b = Tr$Mat[,1]) - -x_min = matrix(0, dimension, 1) - -# Smoothness and strong-convexity -L <- 2 -m <- 2 - -# Warm start point from truncated Gaussian -warm_start <- sample_points(P, n = 1, random_walk = list("nburns" = 5000), distribution = list("density" = "gaussian", "variance" = 1/L, "mode" = x_min)) - -# Sample points -n_samples <- 20000 -n_burns <- n_samples / 2 - -samples <- sample_points(P, n = n_samples, random_walk = list("walk" = "HMC", "step_size" = 0.03, "nburns" = n_burns, "walk_length" = 3, "solver" = "leapfrog", "starting_point" = warm_start[,1]), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) - -# Plot histogram -hist(samples[1,], probability=TRUE, breaks = 100) - -psrfs <- psrf_univariate(samples) -n_ess <- ess(samples) \ No newline at end of file diff --git a/R-proj/examples/logconcave/simple_ode.R b/R-proj/examples/logconcave/simple_ode.R deleted file mode 100644 index 10d0c6d88..000000000 --- a/R-proj/examples/logconcave/simple_ode.R +++ /dev/null @@ -1,31 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for ODE solvers -library(volesti) - -F <- function (x) (-x) -order <- 2 -step_size <- 0.01 -n <- 1000 -initial_conditions <- list("x_1" = c(0), "x_2" = c(1)) -initial_time <- 0 - -# Do not impose constraints -domains <- list() - -# Call the ode solver -states <- volesti::ode_solve(dimension=1, n=n, F=F, initial_time=initial_time, step_size=step_size, order=order, method="leapfrog", initial_conditions=initial_conditions, domains = list()) - -x <- states[["x_1"]] -v <- states[["x_2"]] - -plot(x, v) - diff --git a/R-proj/examples/logconcave/simple_ode_truncated.R b/R-proj/examples/logconcave/simple_ode_truncated.R deleted file mode 100644 index be2706c46..000000000 --- a/R-proj/examples/logconcave/simple_ode_truncated.R +++ /dev/null @@ -1,34 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou - -# Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for truncated ODE solvers -library(volesti) - -F <- function (x) (x) -order <- 1 -step_size <- 0.01 -n <- 1000 -initial_conditions <- list("x_1" = c(0.1)) -initial_time <- 0 - -A <- matrix(c(1, -1), ncol=1, nrow=2, byrow=TRUE) -b <- c(1, 0) - -# Create domain of truncation -P_1 <- volesti::Hpolytope$new(A, b) -domains <- list("P_1" = P_1) - -# Call the ode solver -states <- volesti::ode_solve(dimension=1, n=n, F=F, initial_time=initial_time, step_size=step_size, order=order, method="euler", initial_conditions=initial_conditions, domains = domains) - -x <- states[["x_1"]] -t <- step_size * seq(0, n - 1) - -plot(t, x) diff --git a/R-proj/examples/logconcave/sparse_crhmc.R b/R-proj/examples/logconcave/sparse_crhmc.R deleted file mode 100644 index 373371986..000000000 --- a/R-proj/examples/logconcave/sparse_crhmc.R +++ /dev/null @@ -1,98 +0,0 @@ -# VolEsti (volume computation and sampling library) - -# Copyright (c) 2012-2020 Vissarion Fisikopoulos -# Copyright (c) 2018-2020 Apostolos Chalkis -# Copyright (c) 2020-2020 Marios Papachristou -# Copyright (c) 2022-2022 Ioannis Iakovidis - -# Contributed and/or modified by Ioannis Iakovidis, as part of Google Summer of Code 2022 program. - -# Licensed under GNU LGPL.3, see LICENCE file - -# Example script for using the logconcave sampling methods - -# Import required libraries -library(ggplot2) -library(volesti) - -# Sampling from logconcave density example - -# Helper function -norm_vec <- function(x) sqrt(sum(x^2)) - -# Negative log-probability oracle -f <- function(x) (norm_vec(x)^2 + sum(x)) - -# Negative log-probability gradient oracle -grad_f <- function(x) (2 * x + 1) - -# Interval [-1, 1] -A = matrix(c(1, -1), ncol=1, nrow=2, byrow=TRUE) -b = c(2,1) - -# Create domain of truncation -P <- volesti::Hpolytope$new(A, b) - -# Mode of logconcave density -x_min <- c(-0.5) - -# Smoothness and strong-convexity -L <- 2 -m <- 2 - -# Sample points -n_samples <- 80000 -n_burns <- n_samples / 2 -cat("---Sampling without hessian\n") -pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) -jpeg("histogram_without_hessian.jpg") -# Plot histogram -hist(pts, probability=TRUE, breaks = 100) - -cat("Sample mean is: ") -sample_mean <- mean(pts) -cat(sample_mean) -cat("\n") -cat("Sample variance is: ") -sample_variance <- mean((pts - sample_mean)^2) -cat(sample_variance) -cat("\n") -invisible(capture.output(dev.off())) - -# Negative log-probability hessian oracle -hess_f <- function(x) (2) -cat("---Sampling with hessian\n") -pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f,"negative_logprob_hessian" = hess_f, "L_" = L, "m" = m)) -jpeg("histogram_with_hessian.jpg") -# Plot histogram -hist(pts, probability=TRUE, breaks = 100) - -cat("Sample mean is: ") -sample_mean <- mean(pts) -cat(sample_mean) -cat("\n") -cat("Sample variance is: ") -sample_variance <- mean((pts - sample_mean)^2) -cat(sample_variance) -cat("\n") -invisible(capture.output(dev.off())) - -walk="CRHMC" -library(Matrix) -bineq=matrix(c(10,10,10,10,10), nrow=5, ncol=1, byrow=TRUE) -Aineq = matrix(c(1,0,-0.25,-1,2.5,1,0.4,-1,-0.9,0.5), nrow=5, ncol=2, byrow = TRUE) -Aineq = as( Aineq, 'dgCMatrix' ) -beq=matrix(,nrow=0, ncol=1, byrow=TRUE) -Aeq = matrix(, nrow=0, ncol=2, byrow = TRUE) -Aeq=as( Aeq, 'dgCMatrix' ) -lb=-100000*c(1,1); -ub=100000*c(1,1); -cat("---Sampling the normal distribution in a pentagon\n") -P <- volesti::sparse_constraint_problem$new(Aineq, bineq,Aeq, beq, lb, ub) -points <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "step_size" = 0.3, "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "variance" = 8)) -jpeg("pentagon.jpg") -plot(ggplot(data.frame( x=points[1,], y=points[2,] )) + -geom_point( aes(x=x, y=y, color=walk)) + coord_fixed(xlim = c(-15,15), -ylim = c(-15,15)) + ggtitle(sprintf("Sampling a random pentagon with walk %s", walk))) -invisible(capture.output(dev.off())) -write.table(points, file="pentagon.txt", row.names=FALSE, col.names=FALSE) diff --git a/R-proj/inst/AUTHORS b/R-proj/inst/AUTHORS deleted file mode 100644 index 956eb3255..000000000 --- a/R-proj/inst/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -1. Bojan Nikolic . We have modified the implementations of Khachiyan's Algorithm by B. Nikolic from bnmin1-1.11 package for the Computation of Minimum Volume Enclosing Ellipsoids in /src/external/minimum_ellipsoid. - -2. Kjell Konis , Stefan I. Larimore and Timothy A. Davis , Kjell Eikland, Michel Berkelaar, Richard Stallman, Authors of lpsolve package , in /src/external/lpsolve. - diff --git a/R-proj/inst/COPYRIGHTS b/R-proj/inst/COPYRIGHTS deleted file mode 100644 index 39cabd5a7..000000000 --- a/R-proj/inst/COPYRIGHTS +++ /dev/null @@ -1,6 +0,0 @@ -All files in src/external are taken from -(i) lpsolve (https://cran.r-project.org/src/contrib/Archive/lpSolveAPI) version 5.5.2.0, -(ii) bnmin1 (https://www.mrao.cam.ac.uk/~bn204/oof/bnmin1.html) version 1.11 - -Copyrights and modification details are explicitly described at the beginning of each of those files. - diff --git a/R-proj/inst/checks/README.md b/R-proj/inst/checks/README.md deleted file mode 100644 index a21b374b9..000000000 --- a/R-proj/inst/checks/README.md +++ /dev/null @@ -1,31 +0,0 @@ -| Check | cran-name | ERRORS | WARNINGS | NOTES | URL | -| ----------------------- |-------------|:-------------:| :-------: | :---: | -- | -| `macOS 10.9 Mavericks, R-oldrel (experimental)` | `r-oldrel-osx-x86_64` | 0 | 0 | 0 | [PREPERROR](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-4561558b7b96f9d9ab4662b565f1b871)* | -| `macOS 10.11 El Capitan, R-release (experimental)` | `r-release-osx-x86_64` | 0 | 0 | 0 | [OK](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-b02c328852acddb3fcd3048f9f327055) | -| `Windows Server 2008 R2 SP1, R-oldrel, 32/64 bit` | `r-oldrel-windows-ix86+x86_64` | 0 | 0 | 0 | [OK](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-f43945e177bd0a39f2a4effa8f6e9c88) | -| `Windows Server 2008 R2 SP1, R-release, 32/64 bit` | `r-release-windows-ix86+x86_64` | 0 | 0 | 0 | [OK](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-707ffbeaa5fb7f3b00a1cff357e63c7f) | -| `Windows Server 2008 R2 SP1, R-patched, 32/64 bit` | `N/A` | 0 | 0 | 0 | [OK](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-3376f9b5f6a17ba0a2c30b0cbf0bf917) | -| `Windows Server 2008 R2 SP1, R-devel, 32/64 bit` | `r-devel-windows-ix86+x86_64` | 0 | 0 | 0 | [OK](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-901e108dfc1802c6f8726f162c95e597) | -| `Windows Server 2012, R-devel, Rtools4.0, 32/64 bit (experimental)` | `N/A` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-c48dc0fa6839ef8b509c73c48f0ca887) | -| `Oracle Solaris 10, x86, 32 bit, R-patched (experimental)` | `r-patched-solaris-x86` | 0 | 0 | 0 | [OK](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-39bda3d243591a660eb3a4d2cdb4ac3f) | -| `Debian Linux, R-devel, GCC` | `r-devel-linux-x86_64-debian-gcc` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-907c4d873965c64d435bc672335063eb) | -| `Debian Linux, R-devel, GCC, no long double` | `N/A` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-cb5a82d9e3112bb706e6c767e778e3a5) | -| `Debian Linux, R-release, GCC` | `r-release-linux-x86_64` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-4c142b0323d2f174d53a761564e0b498) | -| `Debian Linux, R-patched, GCC` | `r-patched-linux-x86_64` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-031047558bf41664b387180f558adfd1) | -| `Debian Linux, R-devel, clang, ISO-8859-15 locale` | `r-devel-linux-x86_64-debian-clang` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-eecaf29af2fd88fdf148667c5463e141) | -| `Fedora Linux, R-devel, GCC` | `r-devel-linux-x86_64-fedora-gcc` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-f919c24153e9afd09ef0654d4799fb12) | -| `Fedora Linux, R-devel, clang, gfortran` | `r-devel-linux-x86_64-fedora-clang` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-0efbc2539568b86e2fa716db1a1231d6) | -| `Ubuntu Linux 16.04 LTS, R-devel, GCC` | `N/A` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-7d47fbd13a90cb4c3712232cfa320fc3) | -| `Ubuntu Linux 16.04 LTS, R-release, GCC` |`N/A` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-6911a48496c075be151e7ba5d6326fbb) | -| `CentOS 6, stock R from EPEL` |`N/A` | 1 | 0 | 0 | [ERROR](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-6f5d27f5b548d46da8fcafab677b86e4)** | -| `CentOS 6 with Redhat Developer Toolset, R from EPEL` | `N/A` | 0 | 0 | 1 | [NOTE](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-efce07b30b0a73c6c4f39db5fed70efa) | -| `Debian Linux, R-devel, GCC ASAN/UBSAN` *** | `N/A` | | | | [SUCCESS](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-1d695055bc3e2facdc252827c5d27f1b) | -| `Ubuntu Linux 16.04 LTS, R-devel with rchk` *** | `N/A` | | | | [SUCCESS](https://builder.r-hub.io/status/volesti_1.0.2.tar.gz-a35e57a5f29f45f2e74e07fd3b72c9e5) | - -All the checks above have performed via [rhub](https://cran.r-project.org/web/packages/rhub/index.html) package. For more details on system characteristics see [rhub's vignettes](https://cran.r-project.org/web/packages/rhub/vignettes/rhub.html). **cran-name** column shows the correspondance to [CRAN package check flavors](https://cran.r-project.org/web/checks/check_flavors.html) - -*The check on `macOS 10.9 Mavericks, R-oldrel (experimental)` fails because the system fails to install `RcppEigen`. You can see our [issue](https://github.com/r-hub/rhub/issues/280) at [rhub's github page](https://github.com/r-hub/rhub). - -** This is expected since our C++ code needs C++11 standard at least while this systems uses gcc4.4.X which does not support C++11 - -*** Checks for compiled code diff --git a/R-proj/inst/extdata/birk4.ine b/R-proj/inst/extdata/birk4.ine deleted file mode 100644 index f7515b94d..000000000 --- a/R-proj/inst/extdata/birk4.ine +++ /dev/null @@ -1,22 +0,0 @@ -birk4.ine -H-representation -begin - 16 10 integer --2 1 1 1 1 1 1 1 1 1 - 1 -1 0 0 -1 0 0 -1 0 0 - 1 0 -1 0 0 -1 0 0 -1 0 - 1 0 0 -1 0 0 -1 0 0 -1 - 1 -1 -1 -1 0 0 0 0 0 0 - 1 0 0 0 -1 -1 -1 0 0 0 - 1 0 0 0 0 0 0 -1 -1 -1 - 0 1 0 0 0 0 0 0 0 0 - 0 0 1 0 0 0 0 0 0 0 - 0 0 0 1 0 0 0 0 0 0 - 0 0 0 0 1 0 0 0 0 0 - 0 0 0 0 0 1 0 0 0 0 - 0 0 0 0 0 0 1 0 0 0 - 0 0 0 0 0 0 0 1 0 0 - 0 0 0 0 0 0 0 0 1 0 - 0 0 0 0 0 0 0 0 0 1 -end -input_incidence diff --git a/R-proj/inst/extdata/birk5.ine b/R-proj/inst/extdata/birk5.ine deleted file mode 100644 index 7a59b3f11..000000000 --- a/R-proj/inst/extdata/birk5.ine +++ /dev/null @@ -1,31 +0,0 @@ -birk5.ine -H-representation -begin - 25 17 integer --3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 -1 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 -1 -1 -1 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 -1 -1 -1 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -end -input_incidence diff --git a/R-proj/inst/extdata/cross_10.ext b/R-proj/inst/extdata/cross_10.ext deleted file mode 100644 index c14ee63c5..000000000 --- a/R-proj/inst/extdata/cross_10.ext +++ /dev/null @@ -1,27 +0,0 @@ -cross_10.ext -V-representation -begin - 20 11 integer - 1 0 0 0 0 0 0 0 0 0 1 - 1 1 0 0 0 0 0 0 0 0 0 - 1 0 1 0 0 0 0 0 0 0 0 - 1 0 0 1 0 0 0 0 0 0 0 - 1 0 0 0 1 0 0 0 0 0 0 - 1 0 0 0 0 1 0 0 0 0 0 - 1 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 1 0 0 0 - 1 0 0 0 0 0 0 0 1 0 0 - 1 0 0 0 0 0 0 0 0 1 0 - 1 0 0 0 0 0 0 0 0 0 -1 - 1 0 0 0 0 0 0 0 0 -1 0 - 1 0 0 0 0 0 0 0 -1 0 0 - 1 0 0 0 0 0 0 -1 0 0 0 - 1 0 0 0 0 0 -1 0 0 0 0 - 1 0 0 0 0 -1 0 0 0 0 0 - 1 0 0 0 -1 0 0 0 0 0 0 - 1 0 0 -1 0 0 0 0 0 0 0 - 1 0 -1 0 0 0 0 0 0 0 0 - 1 -1 0 0 0 0 0 0 0 0 0 -end -hull -incidence diff --git a/R-proj/inst/extdata/cross_10.ine b/R-proj/inst/extdata/cross_10.ine deleted file mode 100644 index 6f1b30487..000000000 --- a/R-proj/inst/extdata/cross_10.ine +++ /dev/null @@ -1,1030 +0,0 @@ -cross_10.ine -H-representation -begin - 1024 11 integer - 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 - 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 - 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 - 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 - 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 - 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 - 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 - 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 - 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 - 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 - 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 - 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 - 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 - 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 - 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 - 1 1 1 1 1 -1 -1 -1 -1 -1 -1 - 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 - 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 - 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 - 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 - 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 - 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 - 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 - 1 1 1 1 -1 1 -1 -1 -1 -1 -1 - 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 - 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 - 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 - 1 1 1 -1 1 1 -1 -1 -1 -1 -1 - 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 - 1 1 -1 1 1 1 -1 -1 -1 -1 -1 - 1 -1 1 1 1 1 -1 -1 -1 -1 -1 - 1 1 1 1 1 1 -1 -1 -1 -1 -1 - 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 - 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 - 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 - 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 - 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 - 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 - 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 - 1 1 1 1 -1 -1 1 -1 -1 -1 -1 - 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 - 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 - 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 - 1 1 1 -1 1 -1 1 -1 -1 -1 -1 - 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 - 1 1 -1 1 1 -1 1 -1 -1 -1 -1 - 1 -1 1 1 1 -1 1 -1 -1 -1 -1 - 1 1 1 1 1 -1 1 -1 -1 -1 -1 - 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 - 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 - 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 - 1 1 1 -1 -1 1 1 -1 -1 -1 -1 - 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 - 1 1 -1 1 -1 1 1 -1 -1 -1 -1 - 1 -1 1 1 -1 1 1 -1 -1 -1 -1 - 1 1 1 1 -1 1 1 -1 -1 -1 -1 - 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 - 1 1 -1 -1 1 1 1 -1 -1 -1 -1 - 1 -1 1 -1 1 1 1 -1 -1 -1 -1 - 1 1 1 -1 1 1 1 -1 -1 -1 -1 - 1 -1 -1 1 1 1 1 -1 -1 -1 -1 - 1 1 -1 1 1 1 1 -1 -1 -1 -1 - 1 -1 1 1 1 1 1 -1 -1 -1 -1 - 1 1 1 1 1 1 1 -1 -1 -1 -1 - 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 - 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 - 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 - 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 - 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 - 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 - 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 - 1 1 1 1 -1 -1 -1 1 -1 -1 -1 - 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 - 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 - 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 - 1 1 1 -1 1 -1 -1 1 -1 -1 -1 - 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 - 1 1 -1 1 1 -1 -1 1 -1 -1 -1 - 1 -1 1 1 1 -1 -1 1 -1 -1 -1 - 1 1 1 1 1 -1 -1 1 -1 -1 -1 - 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 - 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 - 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 - 1 1 1 -1 -1 1 -1 1 -1 -1 -1 - 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 - 1 1 -1 1 -1 1 -1 1 -1 -1 -1 - 1 -1 1 1 -1 1 -1 1 -1 -1 -1 - 1 1 1 1 -1 1 -1 1 -1 -1 -1 - 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 - 1 1 -1 -1 1 1 -1 1 -1 -1 -1 - 1 -1 1 -1 1 1 -1 1 -1 -1 -1 - 1 1 1 -1 1 1 -1 1 -1 -1 -1 - 1 -1 -1 1 1 1 -1 1 -1 -1 -1 - 1 1 -1 1 1 1 -1 1 -1 -1 -1 - 1 -1 1 1 1 1 -1 1 -1 -1 -1 - 1 1 1 1 1 1 -1 1 -1 -1 -1 - 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 - 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 - 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 - 1 1 1 -1 -1 -1 1 1 -1 -1 -1 - 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 - 1 1 -1 1 -1 -1 1 1 -1 -1 -1 - 1 -1 1 1 -1 -1 1 1 -1 -1 -1 - 1 1 1 1 -1 -1 1 1 -1 -1 -1 - 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 - 1 1 -1 -1 1 -1 1 1 -1 -1 -1 - 1 -1 1 -1 1 -1 1 1 -1 -1 -1 - 1 1 1 -1 1 -1 1 1 -1 -1 -1 - 1 -1 -1 1 1 -1 1 1 -1 -1 -1 - 1 1 -1 1 1 -1 1 1 -1 -1 -1 - 1 -1 1 1 1 -1 1 1 -1 -1 -1 - 1 1 1 1 1 -1 1 1 -1 -1 -1 - 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 - 1 1 -1 -1 -1 1 1 1 -1 -1 -1 - 1 -1 1 -1 -1 1 1 1 -1 -1 -1 - 1 1 1 -1 -1 1 1 1 -1 -1 -1 - 1 -1 -1 1 -1 1 1 1 -1 -1 -1 - 1 1 -1 1 -1 1 1 1 -1 -1 -1 - 1 -1 1 1 -1 1 1 1 -1 -1 -1 - 1 1 1 1 -1 1 1 1 -1 -1 -1 - 1 -1 -1 -1 1 1 1 1 -1 -1 -1 - 1 1 -1 -1 1 1 1 1 -1 -1 -1 - 1 -1 1 -1 1 1 1 1 -1 -1 -1 - 1 1 1 -1 1 1 1 1 -1 -1 -1 - 1 -1 -1 1 1 1 1 1 -1 -1 -1 - 1 1 -1 1 1 1 1 1 -1 -1 -1 - 1 -1 1 1 1 1 1 1 -1 -1 -1 - 1 1 1 1 1 1 1 1 -1 -1 -1 - 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 - 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 - 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 - 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 - 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 - 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 - 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 - 1 1 1 1 -1 -1 -1 -1 1 -1 -1 - 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 - 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 - 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 - 1 1 1 -1 1 -1 -1 -1 1 -1 -1 - 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 - 1 1 -1 1 1 -1 -1 -1 1 -1 -1 - 1 -1 1 1 1 -1 -1 -1 1 -1 -1 - 1 1 1 1 1 -1 -1 -1 1 -1 -1 - 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 - 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 - 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 - 1 1 1 -1 -1 1 -1 -1 1 -1 -1 - 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 - 1 1 -1 1 -1 1 -1 -1 1 -1 -1 - 1 -1 1 1 -1 1 -1 -1 1 -1 -1 - 1 1 1 1 -1 1 -1 -1 1 -1 -1 - 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 - 1 1 -1 -1 1 1 -1 -1 1 -1 -1 - 1 -1 1 -1 1 1 -1 -1 1 -1 -1 - 1 1 1 -1 1 1 -1 -1 1 -1 -1 - 1 -1 -1 1 1 1 -1 -1 1 -1 -1 - 1 1 -1 1 1 1 -1 -1 1 -1 -1 - 1 -1 1 1 1 1 -1 -1 1 -1 -1 - 1 1 1 1 1 1 -1 -1 1 -1 -1 - 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 - 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 - 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 - 1 1 1 -1 -1 -1 1 -1 1 -1 -1 - 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 - 1 1 -1 1 -1 -1 1 -1 1 -1 -1 - 1 -1 1 1 -1 -1 1 -1 1 -1 -1 - 1 1 1 1 -1 -1 1 -1 1 -1 -1 - 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 - 1 1 -1 -1 1 -1 1 -1 1 -1 -1 - 1 -1 1 -1 1 -1 1 -1 1 -1 -1 - 1 1 1 -1 1 -1 1 -1 1 -1 -1 - 1 -1 -1 1 1 -1 1 -1 1 -1 -1 - 1 1 -1 1 1 -1 1 -1 1 -1 -1 - 1 -1 1 1 1 -1 1 -1 1 -1 -1 - 1 1 1 1 1 -1 1 -1 1 -1 -1 - 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 - 1 1 -1 -1 -1 1 1 -1 1 -1 -1 - 1 -1 1 -1 -1 1 1 -1 1 -1 -1 - 1 1 1 -1 -1 1 1 -1 1 -1 -1 - 1 -1 -1 1 -1 1 1 -1 1 -1 -1 - 1 1 -1 1 -1 1 1 -1 1 -1 -1 - 1 -1 1 1 -1 1 1 -1 1 -1 -1 - 1 1 1 1 -1 1 1 -1 1 -1 -1 - 1 -1 -1 -1 1 1 1 -1 1 -1 -1 - 1 1 -1 -1 1 1 1 -1 1 -1 -1 - 1 -1 1 -1 1 1 1 -1 1 -1 -1 - 1 1 1 -1 1 1 1 -1 1 -1 -1 - 1 -1 -1 1 1 1 1 -1 1 -1 -1 - 1 1 -1 1 1 1 1 -1 1 -1 -1 - 1 -1 1 1 1 1 1 -1 1 -1 -1 - 1 1 1 1 1 1 1 -1 1 -1 -1 - 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 - 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 - 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 - 1 1 1 -1 -1 -1 -1 1 1 -1 -1 - 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 - 1 1 -1 1 -1 -1 -1 1 1 -1 -1 - 1 -1 1 1 -1 -1 -1 1 1 -1 -1 - 1 1 1 1 -1 -1 -1 1 1 -1 -1 - 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 - 1 1 -1 -1 1 -1 -1 1 1 -1 -1 - 1 -1 1 -1 1 -1 -1 1 1 -1 -1 - 1 1 1 -1 1 -1 -1 1 1 -1 -1 - 1 -1 -1 1 1 -1 -1 1 1 -1 -1 - 1 1 -1 1 1 -1 -1 1 1 -1 -1 - 1 -1 1 1 1 -1 -1 1 1 -1 -1 - 1 1 1 1 1 -1 -1 1 1 -1 -1 - 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 - 1 1 -1 -1 -1 1 -1 1 1 -1 -1 - 1 -1 1 -1 -1 1 -1 1 1 -1 -1 - 1 1 1 -1 -1 1 -1 1 1 -1 -1 - 1 -1 -1 1 -1 1 -1 1 1 -1 -1 - 1 1 -1 1 -1 1 -1 1 1 -1 -1 - 1 -1 1 1 -1 1 -1 1 1 -1 -1 - 1 1 1 1 -1 1 -1 1 1 -1 -1 - 1 -1 -1 -1 1 1 -1 1 1 -1 -1 - 1 1 -1 -1 1 1 -1 1 1 -1 -1 - 1 -1 1 -1 1 1 -1 1 1 -1 -1 - 1 1 1 -1 1 1 -1 1 1 -1 -1 - 1 -1 -1 1 1 1 -1 1 1 -1 -1 - 1 1 -1 1 1 1 -1 1 1 -1 -1 - 1 -1 1 1 1 1 -1 1 1 -1 -1 - 1 1 1 1 1 1 -1 1 1 -1 -1 - 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 - 1 1 -1 -1 -1 -1 1 1 1 -1 -1 - 1 -1 1 -1 -1 -1 1 1 1 -1 -1 - 1 1 1 -1 -1 -1 1 1 1 -1 -1 - 1 -1 -1 1 -1 -1 1 1 1 -1 -1 - 1 1 -1 1 -1 -1 1 1 1 -1 -1 - 1 -1 1 1 -1 -1 1 1 1 -1 -1 - 1 1 1 1 -1 -1 1 1 1 -1 -1 - 1 -1 -1 -1 1 -1 1 1 1 -1 -1 - 1 1 -1 -1 1 -1 1 1 1 -1 -1 - 1 -1 1 -1 1 -1 1 1 1 -1 -1 - 1 1 1 -1 1 -1 1 1 1 -1 -1 - 1 -1 -1 1 1 -1 1 1 1 -1 -1 - 1 1 -1 1 1 -1 1 1 1 -1 -1 - 1 -1 1 1 1 -1 1 1 1 -1 -1 - 1 1 1 1 1 -1 1 1 1 -1 -1 - 1 -1 -1 -1 -1 1 1 1 1 -1 -1 - 1 1 -1 -1 -1 1 1 1 1 -1 -1 - 1 -1 1 -1 -1 1 1 1 1 -1 -1 - 1 1 1 -1 -1 1 1 1 1 -1 -1 - 1 -1 -1 1 -1 1 1 1 1 -1 -1 - 1 1 -1 1 -1 1 1 1 1 -1 -1 - 1 -1 1 1 -1 1 1 1 1 -1 -1 - 1 1 1 1 -1 1 1 1 1 -1 -1 - 1 -1 -1 -1 1 1 1 1 1 -1 -1 - 1 1 -1 -1 1 1 1 1 1 -1 -1 - 1 -1 1 -1 1 1 1 1 1 -1 -1 - 1 1 1 -1 1 1 1 1 1 -1 -1 - 1 -1 -1 1 1 1 1 1 1 -1 -1 - 1 1 -1 1 1 1 1 1 1 -1 -1 - 1 -1 1 1 1 1 1 1 1 -1 -1 - 1 1 1 1 1 1 1 1 1 -1 -1 - 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 - 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 - 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 - 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 - 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 - 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 - 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 - 1 1 1 1 -1 -1 -1 -1 -1 1 -1 - 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 - 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 - 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 - 1 1 1 -1 1 -1 -1 -1 -1 1 -1 - 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 - 1 1 -1 1 1 -1 -1 -1 -1 1 -1 - 1 -1 1 1 1 -1 -1 -1 -1 1 -1 - 1 1 1 1 1 -1 -1 -1 -1 1 -1 - 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 - 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 - 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 - 1 1 1 -1 -1 1 -1 -1 -1 1 -1 - 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 - 1 1 -1 1 -1 1 -1 -1 -1 1 -1 - 1 -1 1 1 -1 1 -1 -1 -1 1 -1 - 1 1 1 1 -1 1 -1 -1 -1 1 -1 - 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 - 1 1 -1 -1 1 1 -1 -1 -1 1 -1 - 1 -1 1 -1 1 1 -1 -1 -1 1 -1 - 1 1 1 -1 1 1 -1 -1 -1 1 -1 - 1 -1 -1 1 1 1 -1 -1 -1 1 -1 - 1 1 -1 1 1 1 -1 -1 -1 1 -1 - 1 -1 1 1 1 1 -1 -1 -1 1 -1 - 1 1 1 1 1 1 -1 -1 -1 1 -1 - 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 - 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 - 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 - 1 1 1 -1 -1 -1 1 -1 -1 1 -1 - 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 - 1 1 -1 1 -1 -1 1 -1 -1 1 -1 - 1 -1 1 1 -1 -1 1 -1 -1 1 -1 - 1 1 1 1 -1 -1 1 -1 -1 1 -1 - 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 - 1 1 -1 -1 1 -1 1 -1 -1 1 -1 - 1 -1 1 -1 1 -1 1 -1 -1 1 -1 - 1 1 1 -1 1 -1 1 -1 -1 1 -1 - 1 -1 -1 1 1 -1 1 -1 -1 1 -1 - 1 1 -1 1 1 -1 1 -1 -1 1 -1 - 1 -1 1 1 1 -1 1 -1 -1 1 -1 - 1 1 1 1 1 -1 1 -1 -1 1 -1 - 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 - 1 1 -1 -1 -1 1 1 -1 -1 1 -1 - 1 -1 1 -1 -1 1 1 -1 -1 1 -1 - 1 1 1 -1 -1 1 1 -1 -1 1 -1 - 1 -1 -1 1 -1 1 1 -1 -1 1 -1 - 1 1 -1 1 -1 1 1 -1 -1 1 -1 - 1 -1 1 1 -1 1 1 -1 -1 1 -1 - 1 1 1 1 -1 1 1 -1 -1 1 -1 - 1 -1 -1 -1 1 1 1 -1 -1 1 -1 - 1 1 -1 -1 1 1 1 -1 -1 1 -1 - 1 -1 1 -1 1 1 1 -1 -1 1 -1 - 1 1 1 -1 1 1 1 -1 -1 1 -1 - 1 -1 -1 1 1 1 1 -1 -1 1 -1 - 1 1 -1 1 1 1 1 -1 -1 1 -1 - 1 -1 1 1 1 1 1 -1 -1 1 -1 - 1 1 1 1 1 1 1 -1 -1 1 -1 - 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 - 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 - 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 - 1 1 1 -1 -1 -1 -1 1 -1 1 -1 - 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 - 1 1 -1 1 -1 -1 -1 1 -1 1 -1 - 1 -1 1 1 -1 -1 -1 1 -1 1 -1 - 1 1 1 1 -1 -1 -1 1 -1 1 -1 - 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 - 1 1 -1 -1 1 -1 -1 1 -1 1 -1 - 1 -1 1 -1 1 -1 -1 1 -1 1 -1 - 1 1 1 -1 1 -1 -1 1 -1 1 -1 - 1 -1 -1 1 1 -1 -1 1 -1 1 -1 - 1 1 -1 1 1 -1 -1 1 -1 1 -1 - 1 -1 1 1 1 -1 -1 1 -1 1 -1 - 1 1 1 1 1 -1 -1 1 -1 1 -1 - 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 - 1 1 -1 -1 -1 1 -1 1 -1 1 -1 - 1 -1 1 -1 -1 1 -1 1 -1 1 -1 - 1 1 1 -1 -1 1 -1 1 -1 1 -1 - 1 -1 -1 1 -1 1 -1 1 -1 1 -1 - 1 1 -1 1 -1 1 -1 1 -1 1 -1 - 1 -1 1 1 -1 1 -1 1 -1 1 -1 - 1 1 1 1 -1 1 -1 1 -1 1 -1 - 1 -1 -1 -1 1 1 -1 1 -1 1 -1 - 1 1 -1 -1 1 1 -1 1 -1 1 -1 - 1 -1 1 -1 1 1 -1 1 -1 1 -1 - 1 1 1 -1 1 1 -1 1 -1 1 -1 - 1 -1 -1 1 1 1 -1 1 -1 1 -1 - 1 1 -1 1 1 1 -1 1 -1 1 -1 - 1 -1 1 1 1 1 -1 1 -1 1 -1 - 1 1 1 1 1 1 -1 1 -1 1 -1 - 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 - 1 1 -1 -1 -1 -1 1 1 -1 1 -1 - 1 -1 1 -1 -1 -1 1 1 -1 1 -1 - 1 1 1 -1 -1 -1 1 1 -1 1 -1 - 1 -1 -1 1 -1 -1 1 1 -1 1 -1 - 1 1 -1 1 -1 -1 1 1 -1 1 -1 - 1 -1 1 1 -1 -1 1 1 -1 1 -1 - 1 1 1 1 -1 -1 1 1 -1 1 -1 - 1 -1 -1 -1 1 -1 1 1 -1 1 -1 - 1 1 -1 -1 1 -1 1 1 -1 1 -1 - 1 -1 1 -1 1 -1 1 1 -1 1 -1 - 1 1 1 -1 1 -1 1 1 -1 1 -1 - 1 -1 -1 1 1 -1 1 1 -1 1 -1 - 1 1 -1 1 1 -1 1 1 -1 1 -1 - 1 -1 1 1 1 -1 1 1 -1 1 -1 - 1 1 1 1 1 -1 1 1 -1 1 -1 - 1 -1 -1 -1 -1 1 1 1 -1 1 -1 - 1 1 -1 -1 -1 1 1 1 -1 1 -1 - 1 -1 1 -1 -1 1 1 1 -1 1 -1 - 1 1 1 -1 -1 1 1 1 -1 1 -1 - 1 -1 -1 1 -1 1 1 1 -1 1 -1 - 1 1 -1 1 -1 1 1 1 -1 1 -1 - 1 -1 1 1 -1 1 1 1 -1 1 -1 - 1 1 1 1 -1 1 1 1 -1 1 -1 - 1 -1 -1 -1 1 1 1 1 -1 1 -1 - 1 1 -1 -1 1 1 1 1 -1 1 -1 - 1 -1 1 -1 1 1 1 1 -1 1 -1 - 1 1 1 -1 1 1 1 1 -1 1 -1 - 1 -1 -1 1 1 1 1 1 -1 1 -1 - 1 1 -1 1 1 1 1 1 -1 1 -1 - 1 -1 1 1 1 1 1 1 -1 1 -1 - 1 1 1 1 1 1 1 1 -1 1 -1 - 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 - 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 - 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 - 1 1 1 -1 -1 -1 -1 -1 1 1 -1 - 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 - 1 1 -1 1 -1 -1 -1 -1 1 1 -1 - 1 -1 1 1 -1 -1 -1 -1 1 1 -1 - 1 1 1 1 -1 -1 -1 -1 1 1 -1 - 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 - 1 1 -1 -1 1 -1 -1 -1 1 1 -1 - 1 -1 1 -1 1 -1 -1 -1 1 1 -1 - 1 1 1 -1 1 -1 -1 -1 1 1 -1 - 1 -1 -1 1 1 -1 -1 -1 1 1 -1 - 1 1 -1 1 1 -1 -1 -1 1 1 -1 - 1 -1 1 1 1 -1 -1 -1 1 1 -1 - 1 1 1 1 1 -1 -1 -1 1 1 -1 - 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 - 1 1 -1 -1 -1 1 -1 -1 1 1 -1 - 1 -1 1 -1 -1 1 -1 -1 1 1 -1 - 1 1 1 -1 -1 1 -1 -1 1 1 -1 - 1 -1 -1 1 -1 1 -1 -1 1 1 -1 - 1 1 -1 1 -1 1 -1 -1 1 1 -1 - 1 -1 1 1 -1 1 -1 -1 1 1 -1 - 1 1 1 1 -1 1 -1 -1 1 1 -1 - 1 -1 -1 -1 1 1 -1 -1 1 1 -1 - 1 1 -1 -1 1 1 -1 -1 1 1 -1 - 1 -1 1 -1 1 1 -1 -1 1 1 -1 - 1 1 1 -1 1 1 -1 -1 1 1 -1 - 1 -1 -1 1 1 1 -1 -1 1 1 -1 - 1 1 -1 1 1 1 -1 -1 1 1 -1 - 1 -1 1 1 1 1 -1 -1 1 1 -1 - 1 1 1 1 1 1 -1 -1 1 1 -1 - 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 - 1 1 -1 -1 -1 -1 1 -1 1 1 -1 - 1 -1 1 -1 -1 -1 1 -1 1 1 -1 - 1 1 1 -1 -1 -1 1 -1 1 1 -1 - 1 -1 -1 1 -1 -1 1 -1 1 1 -1 - 1 1 -1 1 -1 -1 1 -1 1 1 -1 - 1 -1 1 1 -1 -1 1 -1 1 1 -1 - 1 1 1 1 -1 -1 1 -1 1 1 -1 - 1 -1 -1 -1 1 -1 1 -1 1 1 -1 - 1 1 -1 -1 1 -1 1 -1 1 1 -1 - 1 -1 1 -1 1 -1 1 -1 1 1 -1 - 1 1 1 -1 1 -1 1 -1 1 1 -1 - 1 -1 -1 1 1 -1 1 -1 1 1 -1 - 1 1 -1 1 1 -1 1 -1 1 1 -1 - 1 -1 1 1 1 -1 1 -1 1 1 -1 - 1 1 1 1 1 -1 1 -1 1 1 -1 - 1 -1 -1 -1 -1 1 1 -1 1 1 -1 - 1 1 -1 -1 -1 1 1 -1 1 1 -1 - 1 -1 1 -1 -1 1 1 -1 1 1 -1 - 1 1 1 -1 -1 1 1 -1 1 1 -1 - 1 -1 -1 1 -1 1 1 -1 1 1 -1 - 1 1 -1 1 -1 1 1 -1 1 1 -1 - 1 -1 1 1 -1 1 1 -1 1 1 -1 - 1 1 1 1 -1 1 1 -1 1 1 -1 - 1 -1 -1 -1 1 1 1 -1 1 1 -1 - 1 1 -1 -1 1 1 1 -1 1 1 -1 - 1 -1 1 -1 1 1 1 -1 1 1 -1 - 1 1 1 -1 1 1 1 -1 1 1 -1 - 1 -1 -1 1 1 1 1 -1 1 1 -1 - 1 1 -1 1 1 1 1 -1 1 1 -1 - 1 -1 1 1 1 1 1 -1 1 1 -1 - 1 1 1 1 1 1 1 -1 1 1 -1 - 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 - 1 1 -1 -1 -1 -1 -1 1 1 1 -1 - 1 -1 1 -1 -1 -1 -1 1 1 1 -1 - 1 1 1 -1 -1 -1 -1 1 1 1 -1 - 1 -1 -1 1 -1 -1 -1 1 1 1 -1 - 1 1 -1 1 -1 -1 -1 1 1 1 -1 - 1 -1 1 1 -1 -1 -1 1 1 1 -1 - 1 1 1 1 -1 -1 -1 1 1 1 -1 - 1 -1 -1 -1 1 -1 -1 1 1 1 -1 - 1 1 -1 -1 1 -1 -1 1 1 1 -1 - 1 -1 1 -1 1 -1 -1 1 1 1 -1 - 1 1 1 -1 1 -1 -1 1 1 1 -1 - 1 -1 -1 1 1 -1 -1 1 1 1 -1 - 1 1 -1 1 1 -1 -1 1 1 1 -1 - 1 -1 1 1 1 -1 -1 1 1 1 -1 - 1 1 1 1 1 -1 -1 1 1 1 -1 - 1 -1 -1 -1 -1 1 -1 1 1 1 -1 - 1 1 -1 -1 -1 1 -1 1 1 1 -1 - 1 -1 1 -1 -1 1 -1 1 1 1 -1 - 1 1 1 -1 -1 1 -1 1 1 1 -1 - 1 -1 -1 1 -1 1 -1 1 1 1 -1 - 1 1 -1 1 -1 1 -1 1 1 1 -1 - 1 -1 1 1 -1 1 -1 1 1 1 -1 - 1 1 1 1 -1 1 -1 1 1 1 -1 - 1 -1 -1 -1 1 1 -1 1 1 1 -1 - 1 1 -1 -1 1 1 -1 1 1 1 -1 - 1 -1 1 -1 1 1 -1 1 1 1 -1 - 1 1 1 -1 1 1 -1 1 1 1 -1 - 1 -1 -1 1 1 1 -1 1 1 1 -1 - 1 1 -1 1 1 1 -1 1 1 1 -1 - 1 -1 1 1 1 1 -1 1 1 1 -1 - 1 1 1 1 1 1 -1 1 1 1 -1 - 1 -1 -1 -1 -1 -1 1 1 1 1 -1 - 1 1 -1 -1 -1 -1 1 1 1 1 -1 - 1 -1 1 -1 -1 -1 1 1 1 1 -1 - 1 1 1 -1 -1 -1 1 1 1 1 -1 - 1 -1 -1 1 -1 -1 1 1 1 1 -1 - 1 1 -1 1 -1 -1 1 1 1 1 -1 - 1 -1 1 1 -1 -1 1 1 1 1 -1 - 1 1 1 1 -1 -1 1 1 1 1 -1 - 1 -1 -1 -1 1 -1 1 1 1 1 -1 - 1 1 -1 -1 1 -1 1 1 1 1 -1 - 1 -1 1 -1 1 -1 1 1 1 1 -1 - 1 1 1 -1 1 -1 1 1 1 1 -1 - 1 -1 -1 1 1 -1 1 1 1 1 -1 - 1 1 -1 1 1 -1 1 1 1 1 -1 - 1 -1 1 1 1 -1 1 1 1 1 -1 - 1 1 1 1 1 -1 1 1 1 1 -1 - 1 -1 -1 -1 -1 1 1 1 1 1 -1 - 1 1 -1 -1 -1 1 1 1 1 1 -1 - 1 -1 1 -1 -1 1 1 1 1 1 -1 - 1 1 1 -1 -1 1 1 1 1 1 -1 - 1 -1 -1 1 -1 1 1 1 1 1 -1 - 1 1 -1 1 -1 1 1 1 1 1 -1 - 1 -1 1 1 -1 1 1 1 1 1 -1 - 1 1 1 1 -1 1 1 1 1 1 -1 - 1 -1 -1 -1 1 1 1 1 1 1 -1 - 1 1 -1 -1 1 1 1 1 1 1 -1 - 1 -1 1 -1 1 1 1 1 1 1 -1 - 1 1 1 -1 1 1 1 1 1 1 -1 - 1 -1 -1 1 1 1 1 1 1 1 -1 - 1 1 -1 1 1 1 1 1 1 1 -1 - 1 -1 1 1 1 1 1 1 1 1 -1 - 1 1 1 1 1 1 1 1 1 1 -1 - 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 - 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 - 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 - 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 - 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 - 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 - 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 - 1 1 1 1 -1 -1 -1 -1 -1 -1 1 - 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 - 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 - 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 - 1 1 1 -1 1 -1 -1 -1 -1 -1 1 - 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 - 1 1 -1 1 1 -1 -1 -1 -1 -1 1 - 1 -1 1 1 1 -1 -1 -1 -1 -1 1 - 1 1 1 1 1 -1 -1 -1 -1 -1 1 - 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 - 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 - 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 - 1 1 1 -1 -1 1 -1 -1 -1 -1 1 - 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 - 1 1 -1 1 -1 1 -1 -1 -1 -1 1 - 1 -1 1 1 -1 1 -1 -1 -1 -1 1 - 1 1 1 1 -1 1 -1 -1 -1 -1 1 - 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 - 1 1 -1 -1 1 1 -1 -1 -1 -1 1 - 1 -1 1 -1 1 1 -1 -1 -1 -1 1 - 1 1 1 -1 1 1 -1 -1 -1 -1 1 - 1 -1 -1 1 1 1 -1 -1 -1 -1 1 - 1 1 -1 1 1 1 -1 -1 -1 -1 1 - 1 -1 1 1 1 1 -1 -1 -1 -1 1 - 1 1 1 1 1 1 -1 -1 -1 -1 1 - 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 - 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 - 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 - 1 1 1 -1 -1 -1 1 -1 -1 -1 1 - 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 - 1 1 -1 1 -1 -1 1 -1 -1 -1 1 - 1 -1 1 1 -1 -1 1 -1 -1 -1 1 - 1 1 1 1 -1 -1 1 -1 -1 -1 1 - 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 - 1 1 -1 -1 1 -1 1 -1 -1 -1 1 - 1 -1 1 -1 1 -1 1 -1 -1 -1 1 - 1 1 1 -1 1 -1 1 -1 -1 -1 1 - 1 -1 -1 1 1 -1 1 -1 -1 -1 1 - 1 1 -1 1 1 -1 1 -1 -1 -1 1 - 1 -1 1 1 1 -1 1 -1 -1 -1 1 - 1 1 1 1 1 -1 1 -1 -1 -1 1 - 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 - 1 1 -1 -1 -1 1 1 -1 -1 -1 1 - 1 -1 1 -1 -1 1 1 -1 -1 -1 1 - 1 1 1 -1 -1 1 1 -1 -1 -1 1 - 1 -1 -1 1 -1 1 1 -1 -1 -1 1 - 1 1 -1 1 -1 1 1 -1 -1 -1 1 - 1 -1 1 1 -1 1 1 -1 -1 -1 1 - 1 1 1 1 -1 1 1 -1 -1 -1 1 - 1 -1 -1 -1 1 1 1 -1 -1 -1 1 - 1 1 -1 -1 1 1 1 -1 -1 -1 1 - 1 -1 1 -1 1 1 1 -1 -1 -1 1 - 1 1 1 -1 1 1 1 -1 -1 -1 1 - 1 -1 -1 1 1 1 1 -1 -1 -1 1 - 1 1 -1 1 1 1 1 -1 -1 -1 1 - 1 -1 1 1 1 1 1 -1 -1 -1 1 - 1 1 1 1 1 1 1 -1 -1 -1 1 - 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 - 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 - 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 - 1 1 1 -1 -1 -1 -1 1 -1 -1 1 - 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 - 1 1 -1 1 -1 -1 -1 1 -1 -1 1 - 1 -1 1 1 -1 -1 -1 1 -1 -1 1 - 1 1 1 1 -1 -1 -1 1 -1 -1 1 - 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 - 1 1 -1 -1 1 -1 -1 1 -1 -1 1 - 1 -1 1 -1 1 -1 -1 1 -1 -1 1 - 1 1 1 -1 1 -1 -1 1 -1 -1 1 - 1 -1 -1 1 1 -1 -1 1 -1 -1 1 - 1 1 -1 1 1 -1 -1 1 -1 -1 1 - 1 -1 1 1 1 -1 -1 1 -1 -1 1 - 1 1 1 1 1 -1 -1 1 -1 -1 1 - 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 - 1 1 -1 -1 -1 1 -1 1 -1 -1 1 - 1 -1 1 -1 -1 1 -1 1 -1 -1 1 - 1 1 1 -1 -1 1 -1 1 -1 -1 1 - 1 -1 -1 1 -1 1 -1 1 -1 -1 1 - 1 1 -1 1 -1 1 -1 1 -1 -1 1 - 1 -1 1 1 -1 1 -1 1 -1 -1 1 - 1 1 1 1 -1 1 -1 1 -1 -1 1 - 1 -1 -1 -1 1 1 -1 1 -1 -1 1 - 1 1 -1 -1 1 1 -1 1 -1 -1 1 - 1 -1 1 -1 1 1 -1 1 -1 -1 1 - 1 1 1 -1 1 1 -1 1 -1 -1 1 - 1 -1 -1 1 1 1 -1 1 -1 -1 1 - 1 1 -1 1 1 1 -1 1 -1 -1 1 - 1 -1 1 1 1 1 -1 1 -1 -1 1 - 1 1 1 1 1 1 -1 1 -1 -1 1 - 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 - 1 1 -1 -1 -1 -1 1 1 -1 -1 1 - 1 -1 1 -1 -1 -1 1 1 -1 -1 1 - 1 1 1 -1 -1 -1 1 1 -1 -1 1 - 1 -1 -1 1 -1 -1 1 1 -1 -1 1 - 1 1 -1 1 -1 -1 1 1 -1 -1 1 - 1 -1 1 1 -1 -1 1 1 -1 -1 1 - 1 1 1 1 -1 -1 1 1 -1 -1 1 - 1 -1 -1 -1 1 -1 1 1 -1 -1 1 - 1 1 -1 -1 1 -1 1 1 -1 -1 1 - 1 -1 1 -1 1 -1 1 1 -1 -1 1 - 1 1 1 -1 1 -1 1 1 -1 -1 1 - 1 -1 -1 1 1 -1 1 1 -1 -1 1 - 1 1 -1 1 1 -1 1 1 -1 -1 1 - 1 -1 1 1 1 -1 1 1 -1 -1 1 - 1 1 1 1 1 -1 1 1 -1 -1 1 - 1 -1 -1 -1 -1 1 1 1 -1 -1 1 - 1 1 -1 -1 -1 1 1 1 -1 -1 1 - 1 -1 1 -1 -1 1 1 1 -1 -1 1 - 1 1 1 -1 -1 1 1 1 -1 -1 1 - 1 -1 -1 1 -1 1 1 1 -1 -1 1 - 1 1 -1 1 -1 1 1 1 -1 -1 1 - 1 -1 1 1 -1 1 1 1 -1 -1 1 - 1 1 1 1 -1 1 1 1 -1 -1 1 - 1 -1 -1 -1 1 1 1 1 -1 -1 1 - 1 1 -1 -1 1 1 1 1 -1 -1 1 - 1 -1 1 -1 1 1 1 1 -1 -1 1 - 1 1 1 -1 1 1 1 1 -1 -1 1 - 1 -1 -1 1 1 1 1 1 -1 -1 1 - 1 1 -1 1 1 1 1 1 -1 -1 1 - 1 -1 1 1 1 1 1 1 -1 -1 1 - 1 1 1 1 1 1 1 1 -1 -1 1 - 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 - 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 - 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 - 1 1 1 -1 -1 -1 -1 -1 1 -1 1 - 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 - 1 1 -1 1 -1 -1 -1 -1 1 -1 1 - 1 -1 1 1 -1 -1 -1 -1 1 -1 1 - 1 1 1 1 -1 -1 -1 -1 1 -1 1 - 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 - 1 1 -1 -1 1 -1 -1 -1 1 -1 1 - 1 -1 1 -1 1 -1 -1 -1 1 -1 1 - 1 1 1 -1 1 -1 -1 -1 1 -1 1 - 1 -1 -1 1 1 -1 -1 -1 1 -1 1 - 1 1 -1 1 1 -1 -1 -1 1 -1 1 - 1 -1 1 1 1 -1 -1 -1 1 -1 1 - 1 1 1 1 1 -1 -1 -1 1 -1 1 - 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 - 1 1 -1 -1 -1 1 -1 -1 1 -1 1 - 1 -1 1 -1 -1 1 -1 -1 1 -1 1 - 1 1 1 -1 -1 1 -1 -1 1 -1 1 - 1 -1 -1 1 -1 1 -1 -1 1 -1 1 - 1 1 -1 1 -1 1 -1 -1 1 -1 1 - 1 -1 1 1 -1 1 -1 -1 1 -1 1 - 1 1 1 1 -1 1 -1 -1 1 -1 1 - 1 -1 -1 -1 1 1 -1 -1 1 -1 1 - 1 1 -1 -1 1 1 -1 -1 1 -1 1 - 1 -1 1 -1 1 1 -1 -1 1 -1 1 - 1 1 1 -1 1 1 -1 -1 1 -1 1 - 1 -1 -1 1 1 1 -1 -1 1 -1 1 - 1 1 -1 1 1 1 -1 -1 1 -1 1 - 1 -1 1 1 1 1 -1 -1 1 -1 1 - 1 1 1 1 1 1 -1 -1 1 -1 1 - 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 - 1 1 -1 -1 -1 -1 1 -1 1 -1 1 - 1 -1 1 -1 -1 -1 1 -1 1 -1 1 - 1 1 1 -1 -1 -1 1 -1 1 -1 1 - 1 -1 -1 1 -1 -1 1 -1 1 -1 1 - 1 1 -1 1 -1 -1 1 -1 1 -1 1 - 1 -1 1 1 -1 -1 1 -1 1 -1 1 - 1 1 1 1 -1 -1 1 -1 1 -1 1 - 1 -1 -1 -1 1 -1 1 -1 1 -1 1 - 1 1 -1 -1 1 -1 1 -1 1 -1 1 - 1 -1 1 -1 1 -1 1 -1 1 -1 1 - 1 1 1 -1 1 -1 1 -1 1 -1 1 - 1 -1 -1 1 1 -1 1 -1 1 -1 1 - 1 1 -1 1 1 -1 1 -1 1 -1 1 - 1 -1 1 1 1 -1 1 -1 1 -1 1 - 1 1 1 1 1 -1 1 -1 1 -1 1 - 1 -1 -1 -1 -1 1 1 -1 1 -1 1 - 1 1 -1 -1 -1 1 1 -1 1 -1 1 - 1 -1 1 -1 -1 1 1 -1 1 -1 1 - 1 1 1 -1 -1 1 1 -1 1 -1 1 - 1 -1 -1 1 -1 1 1 -1 1 -1 1 - 1 1 -1 1 -1 1 1 -1 1 -1 1 - 1 -1 1 1 -1 1 1 -1 1 -1 1 - 1 1 1 1 -1 1 1 -1 1 -1 1 - 1 -1 -1 -1 1 1 1 -1 1 -1 1 - 1 1 -1 -1 1 1 1 -1 1 -1 1 - 1 -1 1 -1 1 1 1 -1 1 -1 1 - 1 1 1 -1 1 1 1 -1 1 -1 1 - 1 -1 -1 1 1 1 1 -1 1 -1 1 - 1 1 -1 1 1 1 1 -1 1 -1 1 - 1 -1 1 1 1 1 1 -1 1 -1 1 - 1 1 1 1 1 1 1 -1 1 -1 1 - 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 - 1 1 -1 -1 -1 -1 -1 1 1 -1 1 - 1 -1 1 -1 -1 -1 -1 1 1 -1 1 - 1 1 1 -1 -1 -1 -1 1 1 -1 1 - 1 -1 -1 1 -1 -1 -1 1 1 -1 1 - 1 1 -1 1 -1 -1 -1 1 1 -1 1 - 1 -1 1 1 -1 -1 -1 1 1 -1 1 - 1 1 1 1 -1 -1 -1 1 1 -1 1 - 1 -1 -1 -1 1 -1 -1 1 1 -1 1 - 1 1 -1 -1 1 -1 -1 1 1 -1 1 - 1 -1 1 -1 1 -1 -1 1 1 -1 1 - 1 1 1 -1 1 -1 -1 1 1 -1 1 - 1 -1 -1 1 1 -1 -1 1 1 -1 1 - 1 1 -1 1 1 -1 -1 1 1 -1 1 - 1 -1 1 1 1 -1 -1 1 1 -1 1 - 1 1 1 1 1 -1 -1 1 1 -1 1 - 1 -1 -1 -1 -1 1 -1 1 1 -1 1 - 1 1 -1 -1 -1 1 -1 1 1 -1 1 - 1 -1 1 -1 -1 1 -1 1 1 -1 1 - 1 1 1 -1 -1 1 -1 1 1 -1 1 - 1 -1 -1 1 -1 1 -1 1 1 -1 1 - 1 1 -1 1 -1 1 -1 1 1 -1 1 - 1 -1 1 1 -1 1 -1 1 1 -1 1 - 1 1 1 1 -1 1 -1 1 1 -1 1 - 1 -1 -1 -1 1 1 -1 1 1 -1 1 - 1 1 -1 -1 1 1 -1 1 1 -1 1 - 1 -1 1 -1 1 1 -1 1 1 -1 1 - 1 1 1 -1 1 1 -1 1 1 -1 1 - 1 -1 -1 1 1 1 -1 1 1 -1 1 - 1 1 -1 1 1 1 -1 1 1 -1 1 - 1 -1 1 1 1 1 -1 1 1 -1 1 - 1 1 1 1 1 1 -1 1 1 -1 1 - 1 -1 -1 -1 -1 -1 1 1 1 -1 1 - 1 1 -1 -1 -1 -1 1 1 1 -1 1 - 1 -1 1 -1 -1 -1 1 1 1 -1 1 - 1 1 1 -1 -1 -1 1 1 1 -1 1 - 1 -1 -1 1 -1 -1 1 1 1 -1 1 - 1 1 -1 1 -1 -1 1 1 1 -1 1 - 1 -1 1 1 -1 -1 1 1 1 -1 1 - 1 1 1 1 -1 -1 1 1 1 -1 1 - 1 -1 -1 -1 1 -1 1 1 1 -1 1 - 1 1 -1 -1 1 -1 1 1 1 -1 1 - 1 -1 1 -1 1 -1 1 1 1 -1 1 - 1 1 1 -1 1 -1 1 1 1 -1 1 - 1 -1 -1 1 1 -1 1 1 1 -1 1 - 1 1 -1 1 1 -1 1 1 1 -1 1 - 1 -1 1 1 1 -1 1 1 1 -1 1 - 1 1 1 1 1 -1 1 1 1 -1 1 - 1 -1 -1 -1 -1 1 1 1 1 -1 1 - 1 1 -1 -1 -1 1 1 1 1 -1 1 - 1 -1 1 -1 -1 1 1 1 1 -1 1 - 1 1 1 -1 -1 1 1 1 1 -1 1 - 1 -1 -1 1 -1 1 1 1 1 -1 1 - 1 1 -1 1 -1 1 1 1 1 -1 1 - 1 -1 1 1 -1 1 1 1 1 -1 1 - 1 1 1 1 -1 1 1 1 1 -1 1 - 1 -1 -1 -1 1 1 1 1 1 -1 1 - 1 1 -1 -1 1 1 1 1 1 -1 1 - 1 -1 1 -1 1 1 1 1 1 -1 1 - 1 1 1 -1 1 1 1 1 1 -1 1 - 1 -1 -1 1 1 1 1 1 1 -1 1 - 1 1 -1 1 1 1 1 1 1 -1 1 - 1 -1 1 1 1 1 1 1 1 -1 1 - 1 1 1 1 1 1 1 1 1 -1 1 - 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 - 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 - 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 - 1 1 1 -1 -1 -1 -1 -1 -1 1 1 - 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 - 1 1 -1 1 -1 -1 -1 -1 -1 1 1 - 1 -1 1 1 -1 -1 -1 -1 -1 1 1 - 1 1 1 1 -1 -1 -1 -1 -1 1 1 - 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 - 1 1 -1 -1 1 -1 -1 -1 -1 1 1 - 1 -1 1 -1 1 -1 -1 -1 -1 1 1 - 1 1 1 -1 1 -1 -1 -1 -1 1 1 - 1 -1 -1 1 1 -1 -1 -1 -1 1 1 - 1 1 -1 1 1 -1 -1 -1 -1 1 1 - 1 -1 1 1 1 -1 -1 -1 -1 1 1 - 1 1 1 1 1 -1 -1 -1 -1 1 1 - 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 - 1 1 -1 -1 -1 1 -1 -1 -1 1 1 - 1 -1 1 -1 -1 1 -1 -1 -1 1 1 - 1 1 1 -1 -1 1 -1 -1 -1 1 1 - 1 -1 -1 1 -1 1 -1 -1 -1 1 1 - 1 1 -1 1 -1 1 -1 -1 -1 1 1 - 1 -1 1 1 -1 1 -1 -1 -1 1 1 - 1 1 1 1 -1 1 -1 -1 -1 1 1 - 1 -1 -1 -1 1 1 -1 -1 -1 1 1 - 1 1 -1 -1 1 1 -1 -1 -1 1 1 - 1 -1 1 -1 1 1 -1 -1 -1 1 1 - 1 1 1 -1 1 1 -1 -1 -1 1 1 - 1 -1 -1 1 1 1 -1 -1 -1 1 1 - 1 1 -1 1 1 1 -1 -1 -1 1 1 - 1 -1 1 1 1 1 -1 -1 -1 1 1 - 1 1 1 1 1 1 -1 -1 -1 1 1 - 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 - 1 1 -1 -1 -1 -1 1 -1 -1 1 1 - 1 -1 1 -1 -1 -1 1 -1 -1 1 1 - 1 1 1 -1 -1 -1 1 -1 -1 1 1 - 1 -1 -1 1 -1 -1 1 -1 -1 1 1 - 1 1 -1 1 -1 -1 1 -1 -1 1 1 - 1 -1 1 1 -1 -1 1 -1 -1 1 1 - 1 1 1 1 -1 -1 1 -1 -1 1 1 - 1 -1 -1 -1 1 -1 1 -1 -1 1 1 - 1 1 -1 -1 1 -1 1 -1 -1 1 1 - 1 -1 1 -1 1 -1 1 -1 -1 1 1 - 1 1 1 -1 1 -1 1 -1 -1 1 1 - 1 -1 -1 1 1 -1 1 -1 -1 1 1 - 1 1 -1 1 1 -1 1 -1 -1 1 1 - 1 -1 1 1 1 -1 1 -1 -1 1 1 - 1 1 1 1 1 -1 1 -1 -1 1 1 - 1 -1 -1 -1 -1 1 1 -1 -1 1 1 - 1 1 -1 -1 -1 1 1 -1 -1 1 1 - 1 -1 1 -1 -1 1 1 -1 -1 1 1 - 1 1 1 -1 -1 1 1 -1 -1 1 1 - 1 -1 -1 1 -1 1 1 -1 -1 1 1 - 1 1 -1 1 -1 1 1 -1 -1 1 1 - 1 -1 1 1 -1 1 1 -1 -1 1 1 - 1 1 1 1 -1 1 1 -1 -1 1 1 - 1 -1 -1 -1 1 1 1 -1 -1 1 1 - 1 1 -1 -1 1 1 1 -1 -1 1 1 - 1 -1 1 -1 1 1 1 -1 -1 1 1 - 1 1 1 -1 1 1 1 -1 -1 1 1 - 1 -1 -1 1 1 1 1 -1 -1 1 1 - 1 1 -1 1 1 1 1 -1 -1 1 1 - 1 -1 1 1 1 1 1 -1 -1 1 1 - 1 1 1 1 1 1 1 -1 -1 1 1 - 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 - 1 1 -1 -1 -1 -1 -1 1 -1 1 1 - 1 -1 1 -1 -1 -1 -1 1 -1 1 1 - 1 1 1 -1 -1 -1 -1 1 -1 1 1 - 1 -1 -1 1 -1 -1 -1 1 -1 1 1 - 1 1 -1 1 -1 -1 -1 1 -1 1 1 - 1 -1 1 1 -1 -1 -1 1 -1 1 1 - 1 1 1 1 -1 -1 -1 1 -1 1 1 - 1 -1 -1 -1 1 -1 -1 1 -1 1 1 - 1 1 -1 -1 1 -1 -1 1 -1 1 1 - 1 -1 1 -1 1 -1 -1 1 -1 1 1 - 1 1 1 -1 1 -1 -1 1 -1 1 1 - 1 -1 -1 1 1 -1 -1 1 -1 1 1 - 1 1 -1 1 1 -1 -1 1 -1 1 1 - 1 -1 1 1 1 -1 -1 1 -1 1 1 - 1 1 1 1 1 -1 -1 1 -1 1 1 - 1 -1 -1 -1 -1 1 -1 1 -1 1 1 - 1 1 -1 -1 -1 1 -1 1 -1 1 1 - 1 -1 1 -1 -1 1 -1 1 -1 1 1 - 1 1 1 -1 -1 1 -1 1 -1 1 1 - 1 -1 -1 1 -1 1 -1 1 -1 1 1 - 1 1 -1 1 -1 1 -1 1 -1 1 1 - 1 -1 1 1 -1 1 -1 1 -1 1 1 - 1 1 1 1 -1 1 -1 1 -1 1 1 - 1 -1 -1 -1 1 1 -1 1 -1 1 1 - 1 1 -1 -1 1 1 -1 1 -1 1 1 - 1 -1 1 -1 1 1 -1 1 -1 1 1 - 1 1 1 -1 1 1 -1 1 -1 1 1 - 1 -1 -1 1 1 1 -1 1 -1 1 1 - 1 1 -1 1 1 1 -1 1 -1 1 1 - 1 -1 1 1 1 1 -1 1 -1 1 1 - 1 1 1 1 1 1 -1 1 -1 1 1 - 1 -1 -1 -1 -1 -1 1 1 -1 1 1 - 1 1 -1 -1 -1 -1 1 1 -1 1 1 - 1 -1 1 -1 -1 -1 1 1 -1 1 1 - 1 1 1 -1 -1 -1 1 1 -1 1 1 - 1 -1 -1 1 -1 -1 1 1 -1 1 1 - 1 1 -1 1 -1 -1 1 1 -1 1 1 - 1 -1 1 1 -1 -1 1 1 -1 1 1 - 1 1 1 1 -1 -1 1 1 -1 1 1 - 1 -1 -1 -1 1 -1 1 1 -1 1 1 - 1 1 -1 -1 1 -1 1 1 -1 1 1 - 1 -1 1 -1 1 -1 1 1 -1 1 1 - 1 1 1 -1 1 -1 1 1 -1 1 1 - 1 -1 -1 1 1 -1 1 1 -1 1 1 - 1 1 -1 1 1 -1 1 1 -1 1 1 - 1 -1 1 1 1 -1 1 1 -1 1 1 - 1 1 1 1 1 -1 1 1 -1 1 1 - 1 -1 -1 -1 -1 1 1 1 -1 1 1 - 1 1 -1 -1 -1 1 1 1 -1 1 1 - 1 -1 1 -1 -1 1 1 1 -1 1 1 - 1 1 1 -1 -1 1 1 1 -1 1 1 - 1 -1 -1 1 -1 1 1 1 -1 1 1 - 1 1 -1 1 -1 1 1 1 -1 1 1 - 1 -1 1 1 -1 1 1 1 -1 1 1 - 1 1 1 1 -1 1 1 1 -1 1 1 - 1 -1 -1 -1 1 1 1 1 -1 1 1 - 1 1 -1 -1 1 1 1 1 -1 1 1 - 1 -1 1 -1 1 1 1 1 -1 1 1 - 1 1 1 -1 1 1 1 1 -1 1 1 - 1 -1 -1 1 1 1 1 1 -1 1 1 - 1 1 -1 1 1 1 1 1 -1 1 1 - 1 -1 1 1 1 1 1 1 -1 1 1 - 1 1 1 1 1 1 1 1 -1 1 1 - 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 - 1 1 -1 -1 -1 -1 -1 -1 1 1 1 - 1 -1 1 -1 -1 -1 -1 -1 1 1 1 - 1 1 1 -1 -1 -1 -1 -1 1 1 1 - 1 -1 -1 1 -1 -1 -1 -1 1 1 1 - 1 1 -1 1 -1 -1 -1 -1 1 1 1 - 1 -1 1 1 -1 -1 -1 -1 1 1 1 - 1 1 1 1 -1 -1 -1 -1 1 1 1 - 1 -1 -1 -1 1 -1 -1 -1 1 1 1 - 1 1 -1 -1 1 -1 -1 -1 1 1 1 - 1 -1 1 -1 1 -1 -1 -1 1 1 1 - 1 1 1 -1 1 -1 -1 -1 1 1 1 - 1 -1 -1 1 1 -1 -1 -1 1 1 1 - 1 1 -1 1 1 -1 -1 -1 1 1 1 - 1 -1 1 1 1 -1 -1 -1 1 1 1 - 1 1 1 1 1 -1 -1 -1 1 1 1 - 1 -1 -1 -1 -1 1 -1 -1 1 1 1 - 1 1 -1 -1 -1 1 -1 -1 1 1 1 - 1 -1 1 -1 -1 1 -1 -1 1 1 1 - 1 1 1 -1 -1 1 -1 -1 1 1 1 - 1 -1 -1 1 -1 1 -1 -1 1 1 1 - 1 1 -1 1 -1 1 -1 -1 1 1 1 - 1 -1 1 1 -1 1 -1 -1 1 1 1 - 1 1 1 1 -1 1 -1 -1 1 1 1 - 1 -1 -1 -1 1 1 -1 -1 1 1 1 - 1 1 -1 -1 1 1 -1 -1 1 1 1 - 1 -1 1 -1 1 1 -1 -1 1 1 1 - 1 1 1 -1 1 1 -1 -1 1 1 1 - 1 -1 -1 1 1 1 -1 -1 1 1 1 - 1 1 -1 1 1 1 -1 -1 1 1 1 - 1 -1 1 1 1 1 -1 -1 1 1 1 - 1 1 1 1 1 1 -1 -1 1 1 1 - 1 -1 -1 -1 -1 -1 1 -1 1 1 1 - 1 1 -1 -1 -1 -1 1 -1 1 1 1 - 1 -1 1 -1 -1 -1 1 -1 1 1 1 - 1 1 1 -1 -1 -1 1 -1 1 1 1 - 1 -1 -1 1 -1 -1 1 -1 1 1 1 - 1 1 -1 1 -1 -1 1 -1 1 1 1 - 1 -1 1 1 -1 -1 1 -1 1 1 1 - 1 1 1 1 -1 -1 1 -1 1 1 1 - 1 -1 -1 -1 1 -1 1 -1 1 1 1 - 1 1 -1 -1 1 -1 1 -1 1 1 1 - 1 -1 1 -1 1 -1 1 -1 1 1 1 - 1 1 1 -1 1 -1 1 -1 1 1 1 - 1 -1 -1 1 1 -1 1 -1 1 1 1 - 1 1 -1 1 1 -1 1 -1 1 1 1 - 1 -1 1 1 1 -1 1 -1 1 1 1 - 1 1 1 1 1 -1 1 -1 1 1 1 - 1 -1 -1 -1 -1 1 1 -1 1 1 1 - 1 1 -1 -1 -1 1 1 -1 1 1 1 - 1 -1 1 -1 -1 1 1 -1 1 1 1 - 1 1 1 -1 -1 1 1 -1 1 1 1 - 1 -1 -1 1 -1 1 1 -1 1 1 1 - 1 1 -1 1 -1 1 1 -1 1 1 1 - 1 -1 1 1 -1 1 1 -1 1 1 1 - 1 1 1 1 -1 1 1 -1 1 1 1 - 1 -1 -1 -1 1 1 1 -1 1 1 1 - 1 1 -1 -1 1 1 1 -1 1 1 1 - 1 -1 1 -1 1 1 1 -1 1 1 1 - 1 1 1 -1 1 1 1 -1 1 1 1 - 1 -1 -1 1 1 1 1 -1 1 1 1 - 1 1 -1 1 1 1 1 -1 1 1 1 - 1 -1 1 1 1 1 1 -1 1 1 1 - 1 1 1 1 1 1 1 -1 1 1 1 - 1 -1 -1 -1 -1 -1 -1 1 1 1 1 - 1 1 -1 -1 -1 -1 -1 1 1 1 1 - 1 -1 1 -1 -1 -1 -1 1 1 1 1 - 1 1 1 -1 -1 -1 -1 1 1 1 1 - 1 -1 -1 1 -1 -1 -1 1 1 1 1 - 1 1 -1 1 -1 -1 -1 1 1 1 1 - 1 -1 1 1 -1 -1 -1 1 1 1 1 - 1 1 1 1 -1 -1 -1 1 1 1 1 - 1 -1 -1 -1 1 -1 -1 1 1 1 1 - 1 1 -1 -1 1 -1 -1 1 1 1 1 - 1 -1 1 -1 1 -1 -1 1 1 1 1 - 1 1 1 -1 1 -1 -1 1 1 1 1 - 1 -1 -1 1 1 -1 -1 1 1 1 1 - 1 1 -1 1 1 -1 -1 1 1 1 1 - 1 -1 1 1 1 -1 -1 1 1 1 1 - 1 1 1 1 1 -1 -1 1 1 1 1 - 1 -1 -1 -1 -1 1 -1 1 1 1 1 - 1 1 -1 -1 -1 1 -1 1 1 1 1 - 1 -1 1 -1 -1 1 -1 1 1 1 1 - 1 1 1 -1 -1 1 -1 1 1 1 1 - 1 -1 -1 1 -1 1 -1 1 1 1 1 - 1 1 -1 1 -1 1 -1 1 1 1 1 - 1 -1 1 1 -1 1 -1 1 1 1 1 - 1 1 1 1 -1 1 -1 1 1 1 1 - 1 -1 -1 -1 1 1 -1 1 1 1 1 - 1 1 -1 -1 1 1 -1 1 1 1 1 - 1 -1 1 -1 1 1 -1 1 1 1 1 - 1 1 1 -1 1 1 -1 1 1 1 1 - 1 -1 -1 1 1 1 -1 1 1 1 1 - 1 1 -1 1 1 1 -1 1 1 1 1 - 1 -1 1 1 1 1 -1 1 1 1 1 - 1 1 1 1 1 1 -1 1 1 1 1 - 1 -1 -1 -1 -1 -1 1 1 1 1 1 - 1 1 -1 -1 -1 -1 1 1 1 1 1 - 1 -1 1 -1 -1 -1 1 1 1 1 1 - 1 1 1 -1 -1 -1 1 1 1 1 1 - 1 -1 -1 1 -1 -1 1 1 1 1 1 - 1 1 -1 1 -1 -1 1 1 1 1 1 - 1 -1 1 1 -1 -1 1 1 1 1 1 - 1 1 1 1 -1 -1 1 1 1 1 1 - 1 -1 -1 -1 1 -1 1 1 1 1 1 - 1 1 -1 -1 1 -1 1 1 1 1 1 - 1 -1 1 -1 1 -1 1 1 1 1 1 - 1 1 1 -1 1 -1 1 1 1 1 1 - 1 -1 -1 1 1 -1 1 1 1 1 1 - 1 1 -1 1 1 -1 1 1 1 1 1 - 1 -1 1 1 1 -1 1 1 1 1 1 - 1 1 1 1 1 -1 1 1 1 1 1 - 1 -1 -1 -1 -1 1 1 1 1 1 1 - 1 1 -1 -1 -1 1 1 1 1 1 1 - 1 -1 1 -1 -1 1 1 1 1 1 1 - 1 1 1 -1 -1 1 1 1 1 1 1 - 1 -1 -1 1 -1 1 1 1 1 1 1 - 1 1 -1 1 -1 1 1 1 1 1 1 - 1 -1 1 1 -1 1 1 1 1 1 1 - 1 1 1 1 -1 1 1 1 1 1 1 - 1 -1 -1 -1 1 1 1 1 1 1 1 - 1 1 -1 -1 1 1 1 1 1 1 1 - 1 -1 1 -1 1 1 1 1 1 1 1 - 1 1 1 -1 1 1 1 1 1 1 1 - 1 -1 -1 1 1 1 1 1 1 1 1 - 1 1 -1 1 1 1 1 1 1 1 1 - 1 -1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 -end -input_incidence diff --git a/R-proj/inst/extdata/cube10.ine b/R-proj/inst/extdata/cube10.ine deleted file mode 100644 index 1f035f33c..000000000 --- a/R-proj/inst/extdata/cube10.ine +++ /dev/null @@ -1,26 +0,0 @@ -cube10.ine -H-representation -begin - 20 11 real - 1 1 0 0 0 0 0 0 0 0 0 - 1 0 1 0 0 0 0 0 0 0 0 - 1 0 0 1 0 0 0 0 0 0 0 - 1 0 0 0 1 0 0 0 0 0 0 - 1 0 0 0 0 1 0 0 0 0 0 - 1 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 1 0 0 0 - 1 0 0 0 0 0 0 0 1 0 0 - 1 0 0 0 0 0 0 0 0 1 0 - 1 0 0 0 0 0 0 0 0 0 1 - 1 -1 0 0 0 0 0 0 0 0 0 - 1 0 -1 0 0 0 0 0 0 0 0 - 1 0 0 -1 0 0 0 0 0 0 0 - 1 0 0 0 -1 0 0 0 0 0 0 - 1 0 0 0 0 -1 0 0 0 0 0 - 1 0 0 0 0 0 -1 0 0 0 0 - 1 0 0 0 0 0 0 -1 0 0 0 - 1 0 0 0 0 0 0 0 -1 0 0 - 1 0 0 0 0 0 0 0 0 -1 0 - 1 0 0 0 0 0 0 0 0 0 -1 -end -input_incidence diff --git a/R-proj/inst/extdata/cube_10.ext b/R-proj/inst/extdata/cube_10.ext deleted file mode 100644 index ed4dd559e..000000000 --- a/R-proj/inst/extdata/cube_10.ext +++ /dev/null @@ -1,1031 +0,0 @@ -cube_10.ext -V-representation -begin -1024 11 integer -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 1 1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1 1 1 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 -1 -1 -1 1 1 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1 1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1 -1 1 1 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1 1 1 1 1 -1 -1 1 -1 1 1 1 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1 1 1 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1 1 1 1 -1 -1 1 1 -1 1 1 -1 1 1 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1 1 1 -1 1 1 -1 1 1 1 1 1 -1 1 -1 1 1 -1 1 1 1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 1 1 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 1 -1 1 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1 1 1 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1 1 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1 1 1 1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1 1 1 -1 -1 1 1 1 -1 1 1 1 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1 1 -1 1 1 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1 1 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1 1 1 -1 1 1 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1 1 -1 1 1 1 1 1 -1 1 1 1 -1 -1 1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1 1 -1 1 1 1 1 1 1 1 -1 1 -1 -1 1 1 1 1 1 1 1 -1 1 1 -1 1 1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 -1 -1 -1 1 1 1 1 1 1 1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -end -hull -incidence diff --git a/R-proj/inst/extdata/linear_extensions/simple.txt b/R-proj/inst/extdata/linear_extensions/simple.txt deleted file mode 100644 index b50a96df4..000000000 --- a/R-proj/inst/extdata/linear_extensions/simple.txt +++ /dev/null @@ -1,2 +0,0 @@ -50 20 -[[1,2],[1,3],[1,5],[1,7],[2,3],[2,5],[2,8],[3,4],[3,9],[4,5],[4,7],[4,10],[5,6],[5,8],[6,7],[6,8],[6,9],[7,8],[7,9],[9,10]] diff --git a/R-proj/inst/extdata/linear_extensions/simple_poset.txt b/R-proj/inst/extdata/linear_extensions/simple_poset.txt deleted file mode 100644 index 8998e738c..000000000 --- a/R-proj/inst/extdata/linear_extensions/simple_poset.txt +++ /dev/null @@ -1,2 +0,0 @@ -4 3 -[[1,2],[1,3],[3,4]] diff --git a/R-proj/inst/extdata/prod_simplex_10_10.ine b/R-proj/inst/extdata/prod_simplex_10_10.ine deleted file mode 100644 index 0eca1b7d1..000000000 --- a/R-proj/inst/extdata/prod_simplex_10_10.ine +++ /dev/null @@ -1,28 +0,0 @@ -prod_simplex_10.ine -H-representation -begin - 21 21 integer -0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 -end -input_incidence diff --git a/R-proj/inst/extdata/sdpa_n2m3.txt b/R-proj/inst/extdata/sdpa_n2m3.txt deleted file mode 100644 index 0459374cf..000000000 --- a/R-proj/inst/extdata/sdpa_n2m3.txt +++ /dev/null @@ -1,13 +0,0 @@ -2 -1 -3 -1 1 --1 0 0 - 0 -2 1 - 0 1 -2 - 1 -0 -0 --0 -0 -1 --0 -1 -0 --0 -0 1 --0 -0 -0 - 1 -0 -0 diff --git a/R-proj/inst/extdata/simplex10.ext b/R-proj/inst/extdata/simplex10.ext deleted file mode 100644 index c40976554..000000000 --- a/R-proj/inst/extdata/simplex10.ext +++ /dev/null @@ -1,18 +0,0 @@ -simplex_10.ext -V-representation -begin - 11 11 integer -1 1 0 0 0 0 0 0 0 0 0 -1 0 1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 0 1 0 -1 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 -end -hull -incidence diff --git a/R-proj/inst/extdata/simplex10.ine b/R-proj/inst/extdata/simplex10.ine deleted file mode 100644 index 0e3cb59ac..000000000 --- a/R-proj/inst/extdata/simplex10.ine +++ /dev/null @@ -1,17 +0,0 @@ -simplex_10.ine -H-representation -begin - 11 11 integer -0 1 0 0 0 0 0 0 0 0 0 -0 0 1 0 0 0 0 0 0 0 0 -0 0 0 1 0 0 0 0 0 0 0 -0 0 0 0 1 0 0 0 0 0 0 -0 0 0 0 0 1 0 0 0 0 0 -0 0 0 0 0 0 1 0 0 0 0 -0 0 0 0 0 0 0 1 0 0 0 -0 0 0 0 0 0 0 0 1 0 0 -0 0 0 0 0 0 0 0 0 1 0 -0 0 0 0 0 0 0 0 0 0 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -end -input_incidence diff --git a/R-proj/inst/extdata/skinny_cube10.ine b/R-proj/inst/extdata/skinny_cube10.ine deleted file mode 100644 index aba4f0524..000000000 --- a/R-proj/inst/extdata/skinny_cube10.ine +++ /dev/null @@ -1,26 +0,0 @@ -cube_10.ine -H-representation -begin - 20 11 integer - 100 1 0 0 0 0 0 0 0 0 0 - 1 0 1 0 0 0 0 0 0 0 0 - 1 0 0 1 0 0 0 0 0 0 0 - 1 0 0 0 1 0 0 0 0 0 0 - 1 0 0 0 0 1 0 0 0 0 0 - 1 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 1 0 0 0 - 1 0 0 0 0 0 0 0 1 0 0 - 1 0 0 0 0 0 0 0 0 1 0 - 1 0 0 0 0 0 0 0 0 0 1 - 100 -1 0 0 0 0 0 0 0 0 0 - 1 0 -1 0 0 0 0 0 0 0 0 - 1 0 0 -1 0 0 0 0 0 0 0 - 1 0 0 0 -1 0 0 0 0 0 0 - 1 0 0 0 0 -1 0 0 0 0 0 - 1 0 0 0 0 0 -1 0 0 0 0 - 1 0 0 0 0 0 0 -1 0 0 0 - 1 0 0 0 0 0 0 0 -1 0 0 - 1 0 0 0 0 0 0 0 0 -1 0 - 1 0 0 0 0 0 0 0 0 0 -1 -end -input_incidence diff --git a/R-proj/man/Hpolytope.Rd b/R-proj/man/Hpolytope.Rd deleted file mode 100644 index c0b826747..000000000 --- a/R-proj/man/Hpolytope.Rd +++ /dev/null @@ -1,19 +0,0 @@ -\name{Hpolytope} -\alias{Hpolytope} -\title{An \code{R} class to represent H-polytopes.} - -\description{ -A H-polytope is a convex polytope defined by a set of linear inequalities or equivalently a \eqn{d}-dimensional H-polytope with \eqn{m} facets is defined by a \eqn{m\times d} matrix A and a \eqn{m}-dimensional vector b, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }. -} -\section{Fields}{ -\itemize{ -\item{\code{A} }{ A \eqn{m\times d} numerical matrix A} - -\item{\code{b} }{ \eqn{m}-dimensional vector b} - -\item{\code{type} }{ An integer that declares the representation of the polytope. For H-representation the default value is 1.} - -\item{\code{dimension} }{ The dimension of the polytope.} - -\item{\code{volume} }{ The volume of the polytope, if it is known.} -}} diff --git a/R-proj/man/Rcpp_Hpolytope.Rd b/R-proj/man/Rcpp_Hpolytope.Rd deleted file mode 100644 index 88fa5b766..000000000 --- a/R-proj/man/Rcpp_Hpolytope.Rd +++ /dev/null @@ -1,28 +0,0 @@ -\docType{class} -\name{Rcpp_Hpolytope} -\alias{Rcpp_Hpolytope-class} -\alias{[,Rcpp_Hpolytope-method} -\alias{[,Rcpp_Hpolytope,ANY,ANY,ANY-method} -\alias{$<-,Rcpp_Hpolytope-method} -\alias{$,Rcpp_Hpolytope-method} -\alias{filepaths<-,Rcpp_Hpolytope-method} -\title{ -An \code{Rcpp} class to represent H-polytopes, exposed to \code{R} via modules. -} -\description{ -A H-polytope is a convex polytope defined by a set of linear inequalities or equivalently a \eqn{d}-dimensional H-polytope with \eqn{m} facets is defined by a \eqn{m\times d} matrix A and a \eqn{m}-dimensional vector b, s.t.: \eqn{P=\{ Ax\leq b \} }. -} -\details{ -\describe{ -\item{\code{A} }{ A \eqn{m\times d} numerical matrix A} - -\item{\code{b} }{ \eqn{m}-dimensional vector b} - -\item{\code{type} }{ An integer that declares the representation of the polytope. For H-representation the default value is 1.} - -\item{\code{dimension} }{ The dimension of the polytope.} - -\item{\code{volume} }{ The volume of the polytope, if it is known.} - } -} -\keyword{internal} diff --git a/R-proj/man/Rcpp_Spectrahedron.Rd b/R-proj/man/Rcpp_Spectrahedron.Rd deleted file mode 100644 index 3ac432e59..000000000 --- a/R-proj/man/Rcpp_Spectrahedron.Rd +++ /dev/null @@ -1,21 +0,0 @@ -\docType{class} -\name{Rcpp_Spectrahedron} -\alias{Rcpp_Spectrahedron-class} -\alias{[,Rcpp_Spectrahedron-method} -\alias{[,Rcpp_Spectrahedron,ANY,ANY,ANY-method} -\alias{$<-,Rcpp_Spectrahedron-method} -\alias{$,Rcpp_Spectrahedron-method} -\alias{filepaths<-,Rcpp_Spectrahedron-method} -\title{ -An \code{Rcpp} class to represent spectrahedra, exposed to \code{R} via modules. -} -\description{ -A spectrahedron is a convex body defined by a linear matrix inequality of the form \eqn{A_0 + x_1 A_1 + ... + x_n A_n \preceq 0}. -The matrices \eqn{A_i} are symmetric \eqn{m \times m} real matrices and \eqn{\preceq 0} denoted negative semidefiniteness. -} -\details{ -\describe{ -\item{\code{matrices} }{A list with the matrices \eqn{A_0, A_1, ..., A_n}} - } -} - diff --git a/R-proj/man/Rcpp_Vpolytope.Rd b/R-proj/man/Rcpp_Vpolytope.Rd deleted file mode 100644 index 95c46c099..000000000 --- a/R-proj/man/Rcpp_Vpolytope.Rd +++ /dev/null @@ -1,26 +0,0 @@ -\docType{class} -\name{Rcpp_Vpolytope} -\alias{Rcpp_Vpolytope-class} -\alias{[,Rcpp_Vpolytope-method} -\alias{[,Rcpp_Vpolytope,ANY,ANY,ANY-method} -\alias{$<-,Rcpp_Vpolytope-method} -\alias{$,Rcpp_Vpolytope-method} -\alias{filepaths<-,Rcpp_Vpolytope-method} -\title{ -An \code{Rcpp} class to represent V-polytopes, exposed to \code{R} via modules. -} -\description{ -A V-polytope is defined as the convex hull of \eqn{m} \eqn{d}-dimensional points which corresponds to its vertices. -} -\details{ -\describe{ - \item{\code{V} }{ A \eqn{m\times d} numerical matrix that contains the vertices row-wise} - - \item{\code{type} }{ An integer that declares the representation of the polytope. For V-representation the default value is 2.} - - \item{\code{dimension} }{ The dimension of the polytope.} - - \item{\code{volume} }{ The volume of the polytope, if it is known.} - } -} -\keyword{internal} diff --git a/R-proj/man/Rcpp_VpolytopeIntersection.Rd b/R-proj/man/Rcpp_VpolytopeIntersection.Rd deleted file mode 100644 index ec308c3be..000000000 --- a/R-proj/man/Rcpp_VpolytopeIntersection.Rd +++ /dev/null @@ -1,28 +0,0 @@ -\docType{class} -\name{Rcpp_VpolytopeIntersection} -\alias{Rcpp_VpolytopeIntersection-class} -\alias{[,Rcpp_VpolytopeIntersection-method} -\alias{[,Rcpp_VpolytopeIntersection,ANY,ANY,ANY-method} -\alias{$<-,Rcpp_VpolytopeIntersection-method} -\alias{$,Rcpp_VpolytopeIntersection-method} -\alias{filepaths<-,Rcpp_VpolytopeIntersection-method} -\title{ -An \code{Rcpp} class to represent the intersection of two V-polytope, exposed to \code{R} via modules. -} -\description{ -An intersection of two V-polytopes, \eqn{P_1}, \eqn{P_2}, is defined by the intersection of the two coresponding convex hulls. -} -\details{ -\describe{ -\item{\code{V1} }{ The numerical matrix that contains the vertices of \eqn{P_1} row-wise.} - -\item{\code{V2} }{ The numerical matrix that contains the vertices of \eqn{P_2} row-wise.} - -\item{\code{type} }{ An integer that declares the representation of the polytope. For these kinf of polytopes the default value is 4.} - -\item{\code{dimension} }{ The dimension of the polytope.} - -\item{\code{volume} }{ The volume of the polytope, if it is known.} - } -} -\keyword{internal} diff --git a/R-proj/man/Rcpp_Zonotope.Rd b/R-proj/man/Rcpp_Zonotope.Rd deleted file mode 100644 index 8c010851e..000000000 --- a/R-proj/man/Rcpp_Zonotope.Rd +++ /dev/null @@ -1,26 +0,0 @@ -\docType{class} -\name{Rcpp_Zonotope} -\alias{Rcpp_Zonotope-class} -\alias{[,Rcpp_Zonotope-method} -\alias{[,Rcpp_Zonotope,ANY,ANY,ANY-method} -\alias{$<-,Rcpp_Zonotope-method} -\alias{$,Rcpp_Zonotope-method} -\alias{filepaths<-,Rcpp_Zonotope-method} -\title{ -An \code{Rcpp} class to represent zonotopes, exposed to \code{R} via modules. -} -\description{ -A zonotope is a convex polytope defined by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -} -\details{ -\describe{ - \item{\code{G} }{ A \eqn{m\times d} numerical matrix that contains the segments (or generators) row-wise} - -\item{\code{type} }{ An integer that declares the representation of the polytope. For zonotopes the default value is 3.} - -\item{\code{dimension} }{ The dimension of the polytope.} - -\item{\code{volume} }{ The volume of the polytope, if it is known.} - } -} -\keyword{internal} diff --git a/R-proj/man/Rcpp_sparse_constraint_problem.Rd b/R-proj/man/Rcpp_sparse_constraint_problem.Rd deleted file mode 100644 index 82f81f6c9..000000000 --- a/R-proj/man/Rcpp_sparse_constraint_problem.Rd +++ /dev/null @@ -1,34 +0,0 @@ -\docType{class} -\name{Rcpp_sparse_constraint_problem} -\alias{Rcpp_sparse_constraint_problem-class} -\alias{[,Rcpp_sparse_constraint_problem-method} -\alias{[,Rcpp_sparse_constraint_problem,ANY,ANY,ANY-method} -\alias{$<-,Rcpp_sparse_constraint_problem-method} -\alias{$,Rcpp_sparse_constraint_problem-method} -\alias{filepaths<-,Rcpp_sparse_constraint_problem-method} -\title{ -An \code{Rcpp} class to represent sparse_constraint_problems, exposed to \code{R} via modules. -} -\description{ -A constraint problem is defined by a set of linear inequalities and equalities or equivalently a \eqn{d}-dimensional constraint problem is defined by a \eqn{mineq\times d} matrix Aineq and a \eqn{mineq}-dimensional vector bineq, s.t.: \eqn{Aineqx\leq bineq}, a \eqn{meq\times d} matrix Aeq and a \eqn{meq}-dimensional vector beq, s.t.: \eqn{Aeqx= beq} and two \eqn{d} vectors lb, ub such that \eqn{lb\leq x \leq ub}.} -\details{ -\describe{ -\item{\code{Aineq} }{\eqn{mineq\times d} sparse matrix Aineq} - -\item{\code{bineq} }{\eqn{mineq}-dimensional vector bineq} - -\item{\code{Aeq} }{\eqn{meq\times d} sparse matrix Aeq} - -\item{\code{beq} }{\eqn{meq}-dimensional vector beq} - -\item{\code{lb} }{\eqn{d}-dimensional vector bineq} - -\item{\code{ub} }{\eqn{d}-dimensional vector bineq} - -\item{\code{type} }{An integer that declares the representation of the polytope. For sparse_constraint_problem the default value is 5.} - -\item{\code{dimension} }{The dimension of the polytope.} - - } -} -\keyword{internal} diff --git a/R-proj/man/Spectrahedron.Rd b/R-proj/man/Spectrahedron.Rd deleted file mode 100644 index 6c6df1d8a..000000000 --- a/R-proj/man/Spectrahedron.Rd +++ /dev/null @@ -1,12 +0,0 @@ -\name{Spectrahedron} -\alias{Spectrahedron} -\title{An \code{R} class to represent spectrahedra.} - -\description{ -A spectrahedron is a convex body defined by a linear matrix inequality of the form \eqn{A_0 + x_1 A_1 + ... + x_n A_n \preceq 0}. -The matrices \eqn{A_i} are symmetric \eqn{m \times m} real matrices and \eqn{\preceq 0} denoted negative semidefiniteness. -} -\section{Fields}{ -\itemize{ -\item{\code{matrices} }{A list with the matrices \eqn{A_0, A_1, ..., A_n}} -}} diff --git a/R-proj/man/Vpolytope.Rd b/R-proj/man/Vpolytope.Rd deleted file mode 100644 index e330af8b3..000000000 --- a/R-proj/man/Vpolytope.Rd +++ /dev/null @@ -1,17 +0,0 @@ -\name{Vpolytope} -\alias{Vpolytope} -\title{An \code{R} class to represent V-polytopes.} - -\description{ - A V-polytope is defined as the convex hull of \eqn{m} \eqn{d}-dimensional points which corresponds to its vertices. -} -\section{Fields}{ -\itemize{ - \item{\code{V} }{ A \eqn{m\times d} numerical matrix that contains the vertices row-wise} - - \item{\code{type} }{ An integer that declares the representation of the polytope. For V-representation the default value is 2.} - - \item{\code{dimension} }{ The dimension of the polytope.} - - \item{\code{volume} }{ The volume of the polytope, if it is known.} -}} diff --git a/R-proj/man/VpolytopeIntersection.Rd b/R-proj/man/VpolytopeIntersection.Rd deleted file mode 100644 index f7a75c662..000000000 --- a/R-proj/man/VpolytopeIntersection.Rd +++ /dev/null @@ -1,19 +0,0 @@ -\name{VpolytopeIntersection} -\alias{VpolytopeIntersection} -\title{An \code{R} class to represent the intersection of two V-polytopes.} - -\description{ - An intersection of two V-polytopes, \eqn{P_1}, \eqn{P_2}, is defined by the intersection of the two corresponding convex hulls. -} -\section{Fields}{ -\itemize{ -\item{\code{V1} }{ The numerical matrix that contains the vertices of \eqn{P_1} row-wise.} - -\item{\code{V2} }{ The numerical matrix that contains the vertices of \eqn{P_2} row-wise.} - -\item{\code{type} }{ An integer that declares the representation of the polytope. For this polytope the default value is 4.} - -\item{\code{dimension} }{ The dimension of the polytope.} - -\item{\code{volume} }{ The volume of the polytope, if it is known.} -}} diff --git a/R-proj/man/Zonotope.Rd b/R-proj/man/Zonotope.Rd deleted file mode 100644 index 959fbed5d..000000000 --- a/R-proj/man/Zonotope.Rd +++ /dev/null @@ -1,17 +0,0 @@ -\name{Zonotope} -\alias{Zonotope} -\title{An \code{R} class to represent zonotopes.} - -\description{ -A zonotope is a convex polytope defined by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -} -\section{Fields}{ -\itemize{ -\item{\code{G} }{ A \eqn{m\times d} numerical matrix that contains the segments (or generators) row-wise} - -\item{\code{type} }{ An integer that declares the representation of the polytope. For zonotopes the default value is 3.} - -\item{\code{dimension} }{ The dimension of the polytope.} - -\item{\code{volume} }{ The volume of the polytope, if it is known.} -}} diff --git a/R-proj/man/compute_indicators.Rd b/R-proj/man/compute_indicators.Rd deleted file mode 100644 index c0eaadd9e..000000000 --- a/R-proj/man/compute_indicators.Rd +++ /dev/null @@ -1,49 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/compute_indicators.R -\name{compute_indicators} -\alias{compute_indicators} -\title{Compute an indicator for each time period that describes the state of a market.} -\usage{ -compute_indicators( - returns, - win_length = NULL, - m = NULL, - n = NULL, - nwarning = NULL, - ncrisis = NULL, - seed = NULL -) -} -\arguments{ -\item{returns}{A \eqn{d}-dimensional vector that describes the direction of the first family of parallel hyperplanes.} - -\item{win_length}{Optional. The length of the sliding window. The default value is 60.} - -\item{m}{Optional. The number of slices for the copula. The default value is 100.} - -\item{n}{Optional. The number of points to sample. The default value is \eqn{5\cdot 10^5}.} - -\item{nwarning}{Optional. The number of consecutive indicators larger than 1 required to declare a warning period. The default value is 60.} - -\item{ncrisis}{Optional. The number of consecutive indicators larger than 1 required to declare a crisis period. The default value is 100.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A list that contains the indicators and the corresponding vector that label each time period with respect to the market state: a) normal, b) crisis, c) warning. -} -\description{ -Given a matrix that contains row-wise the assets' returns and a sliding window \code{win_length}, this function computes an approximation of the joint distribution (copula, e.g. see \url{https://en.wikipedia.org/wiki/Copula_(probability_theory)}) between portfolios' return and volatility in each time period defined by \code{win_len}. -For each copula it computes an indicator: If the indicator is large it corresponds to a crisis period and if it is small it corresponds to a normal period. -In particular, the periods over which the indicator is greater than 1 for more than 60 consecutive sliding windows are warnings and for more than 100 are crisis. The sliding window is shifted by one day. -} -\examples{ -# simple example on random asset returns -asset_returns = replicate(10, rnorm(14)) -market_states_and_indicators = compute_indicators(asset_returns, 10, 10, 10000, 2, 3) - -} -\references{ -\cite{L. Cales, A. Chalkis, I.Z. Emiris, V. Fisikopoulos, -\dQuote{Practical volume computation of structured convex bodies, and an application to modeling portfolio dependencies and financial crises,} \emph{Proc. of Symposium on Computational Geometry, Budapest, Hungary,} 2018.} -} diff --git a/R-proj/man/copula.Rd b/R-proj/man/copula.Rd deleted file mode 100644 index be99e4892..000000000 --- a/R-proj/man/copula.Rd +++ /dev/null @@ -1,48 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{copula} -\alias{copula} -\title{Construct a copula using uniform sampling from the unit simplex} -\usage{ -copula(r1, r2 = NULL, sigma = NULL, m = NULL, n = NULL, seed = NULL) -} -\arguments{ -\item{r1}{The \eqn{d}-dimensional normal vector of the first family of parallel hyperplanes.} - -\item{r2}{Optional. The \eqn{d}-dimensional normal vector of the second family of parallel hyperplanes.} - -\item{sigma}{Optional. The \eqn{d\times d} symmetric positive semidefine matrix that describes the family of concentric ellipsoids centered at the origin.} - -\item{m}{The number of the slices for the copula. The default value is 100.} - -\item{n}{The number of points to sample. The default value is \eqn{5\cdot 10^5}.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A \eqn{m\times m} numerical matrix that corresponds to a copula. -} -\description{ -Given two families of parallel hyperplanes or a family of parallel hyperplanes and a family of concentric ellispoids centered at the origin intersecting the canonical simplex, this function uniformly samples from the canonical simplex and construct an approximation of the bivariate probability distribution, called copula (see \url{https://en.wikipedia.org/wiki/Copula_(probability_theory)}). -At least two families of hyperplanes or one family of hyperplanes and one family of ellipsoids have to be given as input. -} -\examples{ -# compute a copula for two random families of parallel hyperplanes -h1 = runif(n = 10, min = 1, max = 1000) -h1 = h1 / 1000 -h2=runif(n = 10, min = 1, max = 1000) -h2 = h2 / 1000 -cop = copula(r1 = h1, r2 = h2, m = 10, n = 100000) - -# compute a copula for a family of parallel hyperplanes and a family of conentric ellipsoids -h = runif(n = 10, min = 1, max = 1000) -h = h / 1000 -E = replicate(10, rnorm(20)) -E = cov(E) -cop = copula(r1 = h, sigma = E, m = 10, n = 100000) - -} -\references{ -\cite{L. Cales, A. Chalkis, I.Z. Emiris, V. Fisikopoulos, -\dQuote{Practical volume computation of structured convex bodies, and an application to modeling portfolio dependencies and financial crises,} \emph{Proc. of Symposium on Computational Geometry, Budapest, Hungary,} 2018.} -} diff --git a/R-proj/man/dinvweibull_with_loc.Rd b/R-proj/man/dinvweibull_with_loc.Rd deleted file mode 100644 index b6600f816..000000000 --- a/R-proj/man/dinvweibull_with_loc.Rd +++ /dev/null @@ -1,23 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/estimate_lipschitz_constant.R -\name{dinvweibull_with_loc} -\alias{dinvweibull_with_loc} -\title{Inverse weibull distribution PDF with location parameter} -\usage{ -dinvweibull_with_loc(x, k, lambda, theta) -} -\arguments{ -\item{x}{The argument of the PDF} - -\item{k}{The shape parameter} - -\item{lambda}{The scale parameter} - -\item{theta}{The location parameter} -} -\value{ -The value of the PDF of an Inverse Weibull distribution with parameters k, lambda, theta evaluated at x -} -\description{ -Inverse weibull distribution PDF with location parameter -} diff --git a/R-proj/man/direct_sampling.Rd b/R-proj/man/direct_sampling.Rd deleted file mode 100644 index 4609ec03d..000000000 --- a/R-proj/man/direct_sampling.Rd +++ /dev/null @@ -1,37 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{direct_sampling} -\alias{direct_sampling} -\title{Sample perfect uniformly distributed points from well known convex bodies: (a) the unit simplex, (b) the canonical simplex, (c) the boundary of a hypersphere or (d) the interior of a hypersphere.} -\usage{ -direct_sampling(body, n, seed = NULL) -} -\arguments{ -\item{body}{A list to request exact uniform sampling from special well known convex bodies through the following input parameters: -\itemize{ -\item{\code{type} }{ A string that declares the type of the body for the exact sampling: a) \code{'unit_simplex'} for the unit simplex, b) \code{'canonical_simplex'} for the canonical simplex, c) \code{'hypersphere'} for the boundary of a hypersphere centered at the origin, d) \code{'ball'} for the interior of a hypersphere centered at the origin.} -\item{\code{dimension} }{ An integer that declares the dimension when exact sampling is enabled for a simplex or a hypersphere.} -\item{\code{radius} }{ The radius of the \eqn{d}-dimensional hypersphere. The default value is \eqn{1}.} -}} - -\item{n}{The number of points that the function is going to sample.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A \eqn{d\times n} matrix that contains, column-wise, the sampled points from the convex polytope P. -} -\description{ -The \eqn{d}-dimensional unit simplex is the set of points \eqn{\vec{x}\in \R^d}, s.t.: \eqn{\sum_i x_i\leq 1}, \eqn{x_i\geq 0}. The \eqn{d}-dimensional canonical simplex is the set of points \eqn{\vec{x}\in \R^d}, s.t.: \eqn{\sum_i x_i = 1}, \eqn{x_i\geq 0}. -} -\examples{ -# 100 uniform points from the 2-d unit ball -points = direct_sampling(n = 100, body = list("type" = "ball", "dimension" = 2)) -} -\references{ -\cite{R.Y. Rubinstein and B. Melamed, -\dQuote{Modern simulation and modeling} \emph{ Wiley Series in Probability and Statistics,} 1998.} - -\cite{A Smith, Noah and W Tromble, Roy, -\dQuote{Sampling Uniformly from the Unit Simplex,} \emph{ Center for Language and Speech Processing Johns Hopkins University,} 2004.} -} diff --git a/R-proj/man/ess.Rd b/R-proj/man/ess.Rd deleted file mode 100644 index f9fbcbcb8..000000000 --- a/R-proj/man/ess.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{ess} -\alias{ess} -\title{Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal} -\usage{ -ess(samples) -} -\arguments{ -\item{samples}{A matrix that contans column-wise the sampled points from a geometric random walk.} -} -\value{ -A vector that contains the values of PSRF for each coordinate -} -\description{ -Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal -} -\references{ -\cite{Gelman, A. and Rubin, D. B., -\dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} - -\cite{Brooks, S. and Gelman, A., -\dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -} diff --git a/R-proj/man/estimtate_lipschitz_constant.Rd b/R-proj/man/estimtate_lipschitz_constant.Rd deleted file mode 100644 index 5418857d2..000000000 --- a/R-proj/man/estimtate_lipschitz_constant.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/estimate_lipschitz_constant.R -\name{estimtate_lipschitz_constant} -\alias{estimtate_lipschitz_constant} -\title{Estimate the Lipschitz Constant of a function f} -\usage{ -estimtate_lipschitz_constant(f, P, n) -} -\arguments{ -\item{f}{Function whose Lipschitz constant is to be estimated} - -\item{P}{Domain of f (a convex polytope)} - -\item{n}{Number of samples to take - -The procedure draws n uniform samples from P and evaluates the Lipschitz -constant at subsequent samples (where the sampler moves to a new point), -It then returns the maximum observation} -} -\value{ -An estimate of the Lipschitz constant -} -\description{ -Estimate the Lipschitz Constant of a function f -} diff --git a/R-proj/man/exact_vol.Rd b/R-proj/man/exact_vol.Rd deleted file mode 100644 index 593247409..000000000 --- a/R-proj/man/exact_vol.Rd +++ /dev/null @@ -1,38 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{exact_vol} -\alias{exact_vol} -\title{Compute the exact volume of (a) a zonotope (b) an arbitrary simplex in V-representation or (c) if the volume is known and declared by the input object.} -\usage{ -exact_vol(P) -} -\arguments{ -\item{P}{A polytope} -} -\value{ -The exact volume of the input polytope, for zonotopes, simplices in V-representation and polytopes with known exact volume -} -\description{ -Given a zonotope (as an object of class Zonotope), this function computes the sum of the absolute values of the determinants of all the \eqn{d \times d} submatrices of the \eqn{m\times d} matrix \eqn{G} that contains row-wise the \eqn{m} \eqn{d}-dimensional segments that define the zonotope. -For an arbitrary simplex that is given in V-representation this function computes the absolute value of the determinant formed by the simplex's points assuming it is shifted to the origin. -} -\examples{ - -# compute the exact volume of a 5-dimensional zonotope defined by the Minkowski sum of 10 segments -Z = gen_rand_zonotope(2, 5) -vol = exact_vol(Z) - -\donttest{# compute the exact volume of a 2-d arbitrary simplex -V = matrix(c(2,3,-1,7,0,0),ncol = 2, nrow = 3, byrow = TRUE) -P = Vpolytope$new(V) -vol = exact_vol(P) -} - -# compute the exact volume the 10-dimensional cross polytope -P = gen_cross(10,'V') -vol = exact_vol(P) -} -\references{ -\cite{E. Gover and N. Krikorian, -\dQuote{Determinants and the Volumes of Parallelotopes and Zonotopes,} \emph{Linear Algebra and its Applications, 433(1), 28 - 40,} 2010.} -} diff --git a/R-proj/man/file_to_polytope.Rd b/R-proj/man/file_to_polytope.Rd deleted file mode 100644 index 8ec843d53..000000000 --- a/R-proj/man/file_to_polytope.Rd +++ /dev/null @@ -1,20 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/file_to_polytope.R -\name{file_to_polytope} -\alias{file_to_polytope} -\title{function to get an ine or an ext file and returns the corresponding polytope} -\usage{ -file_to_polytope(path, zonotope = FALSE) -} -\arguments{ -\item{path}{A string that containes the path to an ine or a ext file. The ine file desrcibes a H-polytope and ext file describes a V-polytope or a zonotope.} - -\item{zonotope}{A boolean parameter. It has to be TRUE when the path leads to an .ext file that describes a zonotope.} -} -\value{ -A polytope class. If the path corresponds to an ine file then the return value represents a H-polytope. If it corresponds to an ext file the return value represents a V-polytope (default choice) or a zonotope if the second argument is TRUE. -} -\description{ -For an ".ine" file it generates the corresponding H-polytope. For an ".ext" file it generates the corresponding V-polytope or zonotope. -For more details on those file formats see \url{https://github.com/GeomScale/volume_approximation/blob/develop/doc/cpp_interface.md#polytope-input}. -} diff --git a/R-proj/man/frustum_of_simplex.Rd b/R-proj/man/frustum_of_simplex.Rd deleted file mode 100644 index bcb075eb4..000000000 --- a/R-proj/man/frustum_of_simplex.Rd +++ /dev/null @@ -1,32 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{frustum_of_simplex} -\alias{frustum_of_simplex} -\title{Compute the percentage of the volume of the simplex that is contained in the intersection of a half-space and the simplex.} -\usage{ -frustum_of_simplex(a, z0) -} -\arguments{ -\item{a}{A \eqn{d}-dimensional vector that defines the direction of the hyperplane.} - -\item{z0}{The scalar that defines the half-space.} -} -\value{ -The percentage of the volume of the simplex that is contained in the intersection of a given half-space and the simplex. -} -\description{ -A half-space \eqn{H} is given as a pair of a vector \eqn{a\in R^d} and a scalar \eqn{z0\in R} s.t.: \eqn{a^Tx\leq z0}. This function calls the Ali's version of the Varsi formula to compute a frustum of the simplex. -} -\examples{ -# compute the frustum of H: -x1+x2<=0 -a=c(-1,1) -z0=0 -frustum = frustum_of_simplex(a, z0) -} -\references{ -\cite{Varsi, Giulio, -\dQuote{The multidimensional content of the frustum of the simplex,} \emph{Pacific J. Math. 46, no. 1, 303--314,} 1973.} - -\cite{Ali, Mir M., -\dQuote{Content of the frustum of a simplex,} \emph{ Pacific J. Math. 48, no. 2, 313--322,} 1973.} -} diff --git a/R-proj/man/gen_birkhoff.Rd b/R-proj/man/gen_birkhoff.Rd deleted file mode 100644 index b5659c021..000000000 --- a/R-proj/man/gen_birkhoff.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_birkhoff.R -\name{gen_birkhoff} -\alias{gen_birkhoff} -\title{Generator function for Birkhoff polytope} -\usage{ -gen_birkhoff(n) -} -\arguments{ -\item{n}{The order of the Birkhoff polytope} -} -\value{ -A polytope class representing the full dimensional \eqn{n}-Birkhoff polytope in H-representation. -} -\description{ -This function can be used to generate the full dimensional \eqn{n}-Birkhoff polytope in H-representation. -The dimension of the generated polytope is \eqn{(n-1)^2}. -} -\examples{ -# generate the Birkhoff polytope of order 5 -P = gen_birkhoff(5) -} diff --git a/R-proj/man/gen_cross.Rd b/R-proj/man/gen_cross.Rd deleted file mode 100644 index 53e84c78d..000000000 --- a/R-proj/man/gen_cross.Rd +++ /dev/null @@ -1,26 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_cross.R -\name{gen_cross} -\alias{gen_cross} -\title{Generator function for cross polytopes} -\usage{ -gen_cross(dimension, representation) -} -\arguments{ -\item{dimension}{The dimension of the cross polytope.} - -\item{representation}{A string to declare the representation. It has to be \code{'H'} for H-representation or \code{'V'} for V-representation.} -} -\value{ -A polytope class representing a cross polytope in H- or V-representation. -} -\description{ -This function generates the \eqn{d}-dimensional cross polytope in H- or V-representation. -} -\examples{ -# generate a 10-dimensional cross polytope in H-representation -P = gen_cross(5, 'H') - -# generate a 15-dimension cross polytope in V-representation -P = gen_cross(15, 'V') -} diff --git a/R-proj/man/gen_cube.Rd b/R-proj/man/gen_cube.Rd deleted file mode 100644 index efb486d61..000000000 --- a/R-proj/man/gen_cube.Rd +++ /dev/null @@ -1,26 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_cube.R -\name{gen_cube} -\alias{gen_cube} -\title{Generator function for hypercubes} -\usage{ -gen_cube(dimension, representation) -} -\arguments{ -\item{dimension}{The dimension of the hypercube} - -\item{representation}{A string to declare the representation. It has to be \code{'H'} for H-representation or \code{'V'} for V-representation.} -} -\value{ -A polytope class representing the unit \eqn{d}-dimensional hypercube in H- or V-representation. -} -\description{ -This function generates the \eqn{d}-dimensional unit hypercube \eqn{[-1,1]^d} in H- or V-representation. -} -\examples{ -# generate a 10-dimensional hypercube in H-representation -P = gen_cube(10, 'H') - -# generate a 15-dimension hypercube in V-representation -P = gen_cube(5, 'V') -} diff --git a/R-proj/man/gen_prod_simplex.Rd b/R-proj/man/gen_prod_simplex.Rd deleted file mode 100644 index 108a2dc1b..000000000 --- a/R-proj/man/gen_prod_simplex.Rd +++ /dev/null @@ -1,21 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_prod_simplex.R -\name{gen_prod_simplex} -\alias{gen_prod_simplex} -\title{Generator function for product of simplices} -\usage{ -gen_prod_simplex(dimension) -} -\arguments{ -\item{dimension}{The dimension of the simplices.} -} -\value{ -A polytope class representing the product of the two \eqn{d}-dimensional unit simplices in H-representation. -} -\description{ -This function generates a \eqn{2d}-dimensional polytope that is defined as the product of two \eqn{d}-dimensional unit simplices in H-representation. -} -\examples{ -# generate a product of two 5-dimensional simplices. -P = gen_prod_simplex(5) -} diff --git a/R-proj/man/gen_rand_hpoly.Rd b/R-proj/man/gen_rand_hpoly.Rd deleted file mode 100644 index e4db1c9e5..000000000 --- a/R-proj/man/gen_rand_hpoly.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_rand_hpoly.R -\name{gen_rand_hpoly} -\alias{gen_rand_hpoly} -\title{Generator function for random H-polytopes} -\usage{ -gen_rand_hpoly(dimension, nfacets, seed = NULL) -} -\arguments{ -\item{dimension}{The dimension of the convex polytope.} - -\item{nfacets}{The number of the facets.} - -\item{seed}{Optional. A fixed seed for the generator.} -} -\value{ -A polytope class representing a H-polytope. -} -\description{ -This function generates a \eqn{d}-dimensional polytope in H-representation with \eqn{m} facets. We pick \eqn{m} random hyperplanes tangent on the \eqn{d}-dimensional unit hypersphere as facets. -} -\examples{ -# generate a 10-dimensional polytope with 50 facets -P = gen_rand_hpoly(10, 50) -} diff --git a/R-proj/man/gen_rand_vpoly.Rd b/R-proj/man/gen_rand_vpoly.Rd deleted file mode 100644 index e2c3c0978..000000000 --- a/R-proj/man/gen_rand_vpoly.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_rand_vpoly.R -\name{gen_rand_vpoly} -\alias{gen_rand_vpoly} -\title{Generator function for random V-polytopes} -\usage{ -gen_rand_vpoly(dimension, nvertices, generator = NULL, seed = NULL) -} -\arguments{ -\item{dimension}{The dimension of the convex polytope.} - -\item{nvertices}{The number of the vertices.} - -\item{generator}{The body that the generator samples uniformly the vertices from: (a) 'cube' or (b) 'sphere'.} - -\item{seed}{Optional. A fixed seed for the generator.} -} -\value{ -A polytope class representing a V-polytope. -} -\description{ -This function generates a \eqn{d}-dimensional polytope in V-representation with \eqn{m} vertices. We pick \eqn{m} random points from the boundary of the \eqn{d}-dimensional unit hypersphere as vertices. -} -\examples{ -# generate a 10-dimensional polytope defined as the convex hull of 25 random vertices -P = gen_rand_vpoly(10, 25) -} diff --git a/R-proj/man/gen_rand_zonotope.Rd b/R-proj/man/gen_rand_zonotope.Rd deleted file mode 100644 index ab971d35e..000000000 --- a/R-proj/man/gen_rand_zonotope.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_rand_zonotope.R -\name{gen_rand_zonotope} -\alias{gen_rand_zonotope} -\title{Generator function for zonotopes} -\usage{ -gen_rand_zonotope(dimension, nsegments, generator = NULL, seed = NULL) -} -\arguments{ -\item{dimension}{The dimension of the zonotope.} - -\item{nsegments}{The number of segments that generate the zonotope.} - -\item{generator}{The distribution to pick the length of each segment from \eqn{[0,100]}: (a) 'uniform', (b) 'gaussian' or (c) 'exponential'.} - -\item{seed}{Optional. A fixed seed for the generator.} -} -\value{ -A polytope class representing a zonotope. -} -\description{ -This function generates a random \eqn{d}-dimensional zonotope defined by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -The function considers \eqn{m} random directions in \eqn{R^d}. There are three strategies to pick the length of each segment: a) it is uniformly sampled from \eqn{[0,100]}, b) it is random from \eqn{\mathcal{N}(50,(50/3)^2)} truncated to \eqn{[0,100]}, c) it is random from \eqn{Exp(1/30)} truncated to \eqn{[0,100]}. -} -\examples{ -# generate a 10-dimensional zonotope defined by the Minkowski sum of 20 segments -P = gen_rand_zonotope(10, 20) -} diff --git a/R-proj/man/gen_simplex.Rd b/R-proj/man/gen_simplex.Rd deleted file mode 100644 index bed04a3a6..000000000 --- a/R-proj/man/gen_simplex.Rd +++ /dev/null @@ -1,26 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_simplex.R -\name{gen_simplex} -\alias{gen_simplex} -\title{Generator function for simplices} -\usage{ -gen_simplex(dimension, representation) -} -\arguments{ -\item{dimension}{The dimension of the unit simplex.} - -\item{representation}{A string to declare the representation. It has to be \code{'H'} for H-representation or \code{'V'} for V-representation.} -} -\value{ -A polytope class representing the \eqn{d}-dimensional unit simplex in H- or V-representation. -} -\description{ -This function generates the \eqn{d}-dimensional unit simplex in H- or V-representation. -} -\examples{ -# generate a 10-dimensional simplex in H-representation -PolyList = gen_simplex(10, 'H') - -# generate a 20-dimensional simplex in V-representation -P = gen_simplex(20, 'V') -} diff --git a/R-proj/man/gen_skinny_cube.Rd b/R-proj/man/gen_skinny_cube.Rd deleted file mode 100644 index 916f5e20a..000000000 --- a/R-proj/man/gen_skinny_cube.Rd +++ /dev/null @@ -1,21 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_skinny_cube.R -\name{gen_skinny_cube} -\alias{gen_skinny_cube} -\title{Generator function for skinny hypercubes} -\usage{ -gen_skinny_cube(dimension) -} -\arguments{ -\item{dimension}{The dimension of the skinny hypercube.} -} -\value{ -A polytope class representing the \eqn{d}-dimensional skinny hypercube in H-representation. -} -\description{ -This function generates a \eqn{d}-dimensional skinny hypercube \eqn{[-1,1]^{d-1}\times [-100,100]}. -} -\examples{ -# generate a 10-dimensional skinny hypercube. -P = gen_skinny_cube(10) -} diff --git a/R-proj/man/geweke.Rd b/R-proj/man/geweke.Rd deleted file mode 100644 index bcaa199d8..000000000 --- a/R-proj/man/geweke.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{geweke} -\alias{geweke} -\title{Geweke's MCMC diagnostic} -\usage{ -geweke(samples, frac_first = NULL, frac_last = NULL) -} -\arguments{ -\item{samples}{A matrix that contans column-wise the sampled points from a geometric random walk.} - -\item{frac_first}{Optional. The portion of the first in order points in matrix samples.} - -\item{frac_last}{Optional. The portion of the last in order points in matrix samples.} -} -\value{ -A boolean to denote if the result of Geweke diagnostic: (i) false if the null hypothesis is rejected, (ii) true if the null hypothesis is not rejected. -} -\description{ -Geweke's MCMC diagnostic -} -\references{ -\cite{Geweke, J., -\dQuote{Evaluating the accuracy of sampling-based approaches to the calculation of posterior moments,} \emph{ In Bayesian Statistics 4. Proceedings of the Fourth Valencia International Meeting,} 1992.} -} diff --git a/R-proj/man/inner_ball.Rd b/R-proj/man/inner_ball.Rd deleted file mode 100644 index f267faad1..000000000 --- a/R-proj/man/inner_ball.Rd +++ /dev/null @@ -1,29 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{inner_ball} -\alias{inner_ball} -\title{Compute an inscribed ball of a convex polytope} -\usage{ -inner_ball(P, lpsolve = NULL) -} -\arguments{ -\item{P}{A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection.} - -\item{lpsolve}{Optional. A boolean variable to compute the Chebychev ball of an H-polytope using the lpsolve library.} -} -\value{ -A \eqn{(d+1)}-dimensional vector that describes the inscribed ball. The first \eqn{d} coordinates corresponds to the center of the ball and the last one to the radius. -} -\description{ -For a H-polytope described by a \eqn{m\times d} matrix \eqn{A} and a \eqn{m}-dimensional vector \eqn{b}, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }, this function computes the largest inscribed ball (Chebychev ball) by solving the corresponding linear program. -For both zonotopes and V-polytopes the function computes the minimum \eqn{r} s.t.: \eqn{ r e_i \in P} for all \eqn{i=1, \dots ,d}. Then the ball centered at the origin with radius \eqn{r/ \sqrt{d}} is an inscribed ball. -} -\examples{ -# compute the Chebychev ball of the 2d unit simplex -P = gen_cube(10,'H') -ball_vec = inner_ball(P) - -# compute an inscribed ball of the 3-dimensional unit cube in V-representation -P = gen_cube(3, 'V') -ball_vec = inner_ball(P, lpsolve = TRUE) -} diff --git a/R-proj/man/loadSdpaFormatFile.Rd b/R-proj/man/loadSdpaFormatFile.Rd deleted file mode 100644 index bb6aa7558..000000000 --- a/R-proj/man/loadSdpaFormatFile.Rd +++ /dev/null @@ -1,21 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{loadSdpaFormatFile} -\alias{loadSdpaFormatFile} -\title{Read a SDPA format file} -\usage{ -loadSdpaFormatFile(inputFile = NULL) -} -\arguments{ -\item{inputFile}{Name of the input file} -} -\value{ -A list with two named items: an item "matrices" which is a list of the matrices and an vector "objFunction" -} -\description{ -Read a SDPA format file -} -\examples{ -path = system.file('extdata', package = 'volesti') -l = loadSdpaFormatFile(paste0(path,'/sdpa_n2m3.txt')) -} diff --git a/R-proj/man/ode_solve.Rd b/R-proj/man/ode_solve.Rd deleted file mode 100644 index b4e8e4b90..000000000 --- a/R-proj/man/ode_solve.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{ode_solve} -\alias{ode_solve} -\title{Solve an ODE of the form dx^n / dt^n = F(x, t)} -\usage{ -ode_solve( - n, - step_size, - order, - dimension, - initial_time, - F, - method, - domains = NULL, - initial_conditions = NULL -) -} -\arguments{ -\item{n}{The number of steps.} - -\item{step_size}{The step size.} - -\item{order}{The ODE order (default is n = 1)} - -\item{dimension}{The dimension of each derivative} - -\item{initial_time}{The initial time} - -\item{F}{The function oracle F(x, t) in the ODE.} - -\item{method}{The method to be used} - -\item{domains}{A list of n H-polytopes with keys "P_1", "P_2", ..., "P_n" that correspond to each derivative's domain} - -\item{initial_conditions}{The initial conditions provided to the solver. Must be provided in a list with keys "x_1", ..., "x_n" and column vectors as values. The state "x_n" represents the (n-1)-th order derivative with respect to time} -} -\value{ -A list which contains elements "x_1", ..., "x_n" representing each derivative results. Each "x_i" corresponds to a d x n matrix where each column represents a certain timestep of the solver. -} -\description{ -Solve an ODE of the form dx^n / dt^n = F(x, t) -} -\examples{ -# Please visit the examples directory on examples demonstrating usage of the ODE solvers. - -} diff --git a/R-proj/man/pinvweibull_with_loc.Rd b/R-proj/man/pinvweibull_with_loc.Rd deleted file mode 100644 index 08eecf30c..000000000 --- a/R-proj/man/pinvweibull_with_loc.Rd +++ /dev/null @@ -1,23 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/estimate_lipschitz_constant.R -\name{pinvweibull_with_loc} -\alias{pinvweibull_with_loc} -\title{Inverse weibull distribution CDF with location parameter} -\usage{ -pinvweibull_with_loc(q, k, lambda, theta) -} -\arguments{ -\item{q}{The argument of the CDF} - -\item{k}{The shape parameter} - -\item{lambda}{The scale parameter} - -\item{theta}{The location parameter} -} -\value{ -The value of the CDF of an Inverse Weibull distribution with parameters k, lambda, theta evaluated at q -} -\description{ -Inverse weibull distribution CDF with location parameter -} diff --git a/R-proj/man/poly_gen.Rd b/R-proj/man/poly_gen.Rd deleted file mode 100644 index be2ed4dd0..000000000 --- a/R-proj/man/poly_gen.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{poly_gen} -\alias{poly_gen} -\title{An internal Rccp function as a polytope generator} -\usage{ -poly_gen(kind_gen, Vpoly_gen, Zono_gen, dim_gen, m_gen, seed = NULL) -} -\arguments{ -\item{kind_gen}{An integer to declare the type of the polytope.} - -\item{Vpoly_gen}{A boolean parameter to declare if the requested polytope has to be in V-representation.} - -\item{Zono_gen}{A boolean parameter to declare if the requested polytope has to be a zonotope.} - -\item{dim_gen}{An integer to declare the dimension of the requested polytope.} - -\item{m_gen}{An integer to declare the number of generators for the requested random zonotope or the number of vertices for a V-polytope.} - -\item{seed}{Optional. A fixed seed for the random polytope generator.} -} -\value{ -A numerical matrix describing the requested polytope -} -\description{ -An internal Rccp function as a polytope generator -} -\keyword{internal} diff --git a/R-proj/man/psrf_multivariate.Rd b/R-proj/man/psrf_multivariate.Rd deleted file mode 100644 index b941783fa..000000000 --- a/R-proj/man/psrf_multivariate.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{psrf_multivariate} -\alias{psrf_multivariate} -\title{Gelman-Rubin Potential Scale Reduction Factor (PSRF)} -\usage{ -psrf_multivariate(samples) -} -\arguments{ -\item{samples}{A matrix that contans column-wise the sampled points from a geometric random walk.} -} -\value{ -The value of multivariate PSRF by S. Brooks and A. Gelman. -} -\description{ -Gelman-Rubin Potential Scale Reduction Factor (PSRF) -} -\references{ -\cite{Gelman, A. and Rubin, D. B., -\dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} - -\cite{Brooks, S. and Gelman, A., -\dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -} diff --git a/R-proj/man/psrf_univariate.Rd b/R-proj/man/psrf_univariate.Rd deleted file mode 100644 index 45aff7ee0..000000000 --- a/R-proj/man/psrf_univariate.Rd +++ /dev/null @@ -1,26 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{psrf_univariate} -\alias{psrf_univariate} -\title{Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal} -\usage{ -psrf_univariate(samples, method = NULL) -} -\arguments{ -\item{samples}{A matrix that contans column-wise the sampled points from a geometric random walk.} - -\item{method}{A string to reauest diagnostic: (i) \code{'normal'} for psrf of Gelman-Rubin and (ii) \code{'interval'} for psrf of Brooks-Gelman.} -} -\value{ -A vector that contains the values of PSRF for each coordinate -} -\description{ -Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal -} -\references{ -\cite{Gelman, A. and Rubin, D. B., -\dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} - -\cite{Brooks, S. and Gelman, A., -\dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -} diff --git a/R-proj/man/raftery.Rd b/R-proj/man/raftery.Rd deleted file mode 100644 index 0415442e7..000000000 --- a/R-proj/man/raftery.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{raftery} -\alias{raftery} -\title{Raftery and Lewis MCMC diagnostic} -\usage{ -raftery(samples, q = NULL, r = NULL, s = NULL) -} -\arguments{ -\item{samples}{A matrix that contans column-wise the sampled points from a geometric random walk.} - -\item{q}{Optional. The quantile of the quantity of interest. The default value is 0.025.} - -\item{r}{Optional. The level of precision desired. The default value is 0.01.} - -\item{s}{Optional. The probability associated with r. The default value is 0.95.} -} -\value{ -(i) The number of draws required for burn-in, (ii) the skip parameter for 1st-order Markov chain, (iii) the skip parameter sufficient to get independence chain, (iv) the number of draws required to achieve r precision, (v) the number of draws if the chain is white noise, (vi) the I-statistic from Raftery and Lewis (1992). -} -\description{ -Raftery and Lewis MCMC diagnostic -} -\references{ -\cite{Raftery, A. E. and Lewis, S. M., -\dQuote{How many iterations in the Gibbs sampler?,} \emph{Bayesian Statistics 4. Proceedings of the Fourth Valencia International Meeting,} 1992.} -} diff --git a/R-proj/man/readSdpaFormatFile.Rd b/R-proj/man/readSdpaFormatFile.Rd deleted file mode 100644 index 878a11965..000000000 --- a/R-proj/man/readSdpaFormatFile.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/read_sdpa_file.R -\name{readSdpaFormatFile} -\alias{readSdpaFormatFile} -\title{Read a SDPA format file} -\usage{ -readSdpaFormatFile(path) -} -\arguments{ -\item{path}{Name of the input file} -} -\value{ -A list with two named items: an item "matrices" which is an object of class Spectrahedron and an vector "objFunction" -} -\description{ -Read a SDPA format file and return a spectrahedron (an object of class Spectrahedron) which is defined by -the linear matrix inequality in the input file, and the objective function. -} -\examples{ -path = system.file('extdata', package = 'volesti') -l = readSdpaFormatFile(paste0(path,'/sdpa_n2m3.txt')) -Spectrahedron = l$spectrahedron -objFunction = l$objFunction -} diff --git a/R-proj/man/rotate_polytope.Rd b/R-proj/man/rotate_polytope.Rd deleted file mode 100644 index 70c9c3adf..000000000 --- a/R-proj/man/rotate_polytope.Rd +++ /dev/null @@ -1,43 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rotate_polytope.R -\name{rotate_polytope} -\alias{rotate_polytope} -\title{Apply a random rotation to a convex polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes)} -\usage{ -rotate_polytope(P, T = NULL, seed = NULL) -} -\arguments{ -\item{P}{A convex polytope. It is an object from class (a) Hpolytope, (b) Vpolytope, (c) Zonotope, (d) intersection of two V-polytopes.} - -\item{T}{Optional. A \eqn{d\times d} rotation matrix.} - -\item{seed}{Optional. A fixed seed for the random linear map generator.} -} -\value{ -A list that contains the rotated polytope and the matrix \eqn{T} of the linear transformation. -} -\description{ -Given a convex H- or V- polytope or a zonotope or an intersection of two V-polytopes as input, this function applies (a) a random rotation or (b) a given rotation by an input matrix \eqn{T}. -} -\details{ -Let \eqn{P} be the given polytope and \eqn{Q} the rotated one and \eqn{T} be the matrix of the linear transformation. -\itemize{ -\item{If \eqn{P} is in H-representation and \eqn{A} is the matrix that contains the normal vectors of the facets of \eqn{Q} then \eqn{AT} contains the normal vactors of the facets of \eqn{P}.} -\item{If \eqn{P} is in V-representation and \eqn{V} is the matrix that contains column-wise the vertices of \eqn{Q} then \eqn{T^TV} contains the vertices of \eqn{P}.} -\item{If \eqn{P} is a zonotope and \eqn{G} is the matrix that contains column-wise the generators of \eqn{Q} then \eqn{T^TG} contains the generators of \eqn{P}.} -\item{If \eqn{M} is a matrix that contains column-wise points in \eqn{Q} then \eqn{T^TM} contains points in \eqn{P}.} -} -} -\examples{ -# rotate a H-polytope (2d unit simplex) -P = gen_simplex(2,'H') -poly_matrix_list = rotate_polytope(P) - -# rotate a V-polytope (3d cube) -P = gen_cube(3, 'V') -poly_matrix_list = rotate_polytope(P) - -# rotate a 5-dimensional zonotope defined by the Minkowski sum of 15 segments -Z = gen_rand_zonotope(3,6) -poly_matrix_list = rotate_polytope(Z) -} diff --git a/R-proj/man/rotating.Rd b/R-proj/man/rotating.Rd deleted file mode 100644 index 4b091f815..000000000 --- a/R-proj/man/rotating.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{rotating} -\alias{rotating} -\title{An internal Rccp function for the random rotation of a convex polytope} -\usage{ -rotating(P, T = NULL, seed = NULL) -} -\arguments{ -\item{P}{A convex polytope (H-, V-polytope or a zonotope).} - -\item{T}{Optional. A rotation matrix.} - -\item{seed}{Optional. A fixed seed for the random linear map generator.} -} -\value{ -A matrix that describes the rotated polytope -} -\description{ -An internal Rccp function for the random rotation of a convex polytope -} -\keyword{internal} diff --git a/R-proj/man/round_polytope.Rd b/R-proj/man/round_polytope.Rd deleted file mode 100644 index 787e40fb0..000000000 --- a/R-proj/man/round_polytope.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/round_polytope.R -\name{round_polytope} -\alias{round_polytope} -\title{Apply rounding to a convex polytope (H-polytope, V-polytope or a zonotope)} -\usage{ -round_polytope(P, method = NULL, seed = NULL) -} -\arguments{ -\item{P}{A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope.} - -\item{method}{Optional. The method to use for rounding, a) \code{'min_ellipsoid'} for the method based on mimimmum volume enclosing ellipsoid of a dataset, b) \code{'max_ellipsoid'} for the method based on maximum volume enclosed ellipsoid, (c) \code{'isotropy'} for the method based on svd decomposition. The default method is \code{'mee'} for all the representations.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A list with 4 elements: (a) a polytope of the same class as the input polytope class and (b) the element "T" which is the matrix of the inverse linear transformation that is applied on the input polytope, (c) the element "shift" which is the opposite vector of that which has shifted the input polytope, (d) the element "round_value" which is the determinant of the square matrix of the linear transformation that is applied on the input polytope. -} -\description{ -Given a convex H or V polytope or a zonotope as input this function brings the polytope in rounded position based on minimum volume enclosing ellipsoid of a pointset. -} -\examples{ -# round a 5d skinny cube -P = gen_skinny_cube(5) -listHpoly = round_polytope(P) - -# round a V-polytope (3d unit cube) -P = gen_cube(3, 'V') -ListVpoly = round_polytope(P) - -# round a 2-dimensional zonotope defined by 6 generators -Z = gen_rand_zonotope(2,6) -ListZono = round_polytope(Z) -} -\references{ -\cite{I.Z.Emiris and V. Fisikopoulos, -\dQuote{Practical polytope volume approximation,} \emph{ACM Trans. Math. Soft.,} 2018.}, - -\cite{Michael J. Todd and E. Alper Yildirim, -\dQuote{On Khachiyan’s Algorithm for the Computation of Minimum Volume Enclosing Ellipsoids,} \emph{Discrete Applied Mathematics,} 2007.} - -\cite{B. Cousins and S. Vempala, -\dQuote{A practical volume algorithm,} \emph{Math. Prog. Comp.,} 2016.}, - -\cite{Yin Zhang and Liyan Gao, -\dQuote{On Numerical Solution of the Maximum Volume Ellipsoid Problem,} \emph{SIAM Journal on Optimization,} 2003.}, -} diff --git a/R-proj/man/rounding.Rd b/R-proj/man/rounding.Rd deleted file mode 100644 index 75be33968..000000000 --- a/R-proj/man/rounding.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{rounding} -\alias{rounding} -\title{Internal rcpp function for the rounding of a convex polytope} -\usage{ -rounding(P, method = NULL, seed = NULL) -} -\arguments{ -\item{P}{A convex polytope (H- or V-representation or zonotope).} - -\item{method}{Optional. The method to use for rounding, a) \code{'min_ellipsoid'} for the method based on mimimmum volume enclosing ellipsoid of a uniform sample from P, b) \code{'max_ellipsoid'} for the method based on maximum volume enclosed ellipsoid in P, (c) \code{'isotropy'} for the method based on isotropy. The default method is \code{'min_ellipsoid'} for all the representations.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A numerical matrix that describes the rounded polytope, a numerical matrix of the inverse linear transofmation that is applied on the input polytope, the numerical vector the the input polytope is shifted and the determinant of the matrix of the linear transformation that is applied on the input polytope. -} -\description{ -Internal rcpp function for the rounding of a convex polytope -} -\keyword{internal} diff --git a/R-proj/man/sample_points.Rd b/R-proj/man/sample_points.Rd deleted file mode 100644 index e969e557d..000000000 --- a/R-proj/man/sample_points.Rd +++ /dev/null @@ -1,82 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{sample_points} -\alias{sample_points} -\title{Sample uniformly, normally distributed, or logconcave distributed points from a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes).} -\usage{ -sample_points(P, n, random_walk = NULL, distribution = NULL, seed = NULL) -} -\arguments{ -\item{P}{A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection or (e) sparse_constraint_problem.} - -\item{n}{The number of points that the function is going to sample from the convex polytope.} - -\item{random_walk}{Optional. A list that declares the random walk and some related parameters as follows: -\itemize{ -\item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR, x) \code{'NUTS'} for NUTS Hamiltonian Monte Carlo sampler (logconcave densities), xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities), xii) CRHMC for Riemannian HMC with H-polytope constraints (uniform and general logconcave densities), xiii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities), xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes and \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities and \code{'CRHMC'} for logconcave densities with H-polytope and sparse constrainted problems.} -\item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} -\item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} -\item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} -\item{\code{BaW_rad} }{ The radius for the ball walk.} -\item{\code{L} }{ The maximum length of the billiard trajectory or the radius for the step of dikin, vaidya or john walk.} -\item{\code{solver}} {Specify ODE solver for logconcave sampling. Options are i) leapfrog, ii) euler iii) runge-kutta iv) richardson} -\item{\code{step_size} {Optionally chosen step size for logconcave sampling. Defaults to a theoretical value if not provided.}} -}} - -\item{distribution}{Optional. A list that declares the target density and some related parameters as follows: -\itemize{ -\item{\code{density} }{ A string: (a) \code{'uniform'} for the uniform distribution or b) \code{'gaussian'} for the multidimensional spherical distribution c) \code{logconcave} with form proportional to exp(-f(x)) where f(x) is L-smooth and m-strongly-convex d) \code{'exponential'} for the exponential distribution. The default target distribution is the uniform distribution.} -\item{\code{variance} }{ The variance of the multidimensional spherical gaussian or the exponential distribution. The default value is 1.} -\item{\code{mode} }{ A \eqn{d}-dimensional numerical vector that declares the mode of the Gaussian distribution. The default choice is the center of the as that one computed by the function \code{inner_ball()}.} -\item{\code{bias} }{ The bias vector for the exponential distribution. The default vector is \eqn{c_1 = 1} and \eqn{c_i = 0} for \eqn{i \neq 1}.} -\item{\code{L_} }{ Smoothness constant (for logconcave). } -\item{\code{m} }{ Strong-convexity constant (for logconcave). } -\item{\code{negative_logprob} }{ Negative log-probability (for logconcave). } -\item{\code{negative_logprob_gradient} }{ Negative log-probability gradient (for logconcave). } -}} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A \eqn{d\times n} matrix that contains, column-wise, the sampled points from the convex polytope P. -} -\description{ -Sample uniformly, normally distributed, or logconcave distributed points from a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes). -} -\examples{ -# uniform distribution from the 3d unit cube in H-representation using ball walk -P = gen_cube(3, 'H') -points = sample_points(P, n = 100, random_walk = list("walk" = "BaW", "walk_length" = 5)) - -# gaussian distribution from the 2d unit simplex in H-representation with variance = 2 -A = matrix(c(-1,0,0,-1,1,1), ncol=2, nrow=3, byrow=TRUE) -b = c(0,0,1) -P = Hpolytope$new(A,b) -points = sample_points(P, n = 100, distribution = list("density" = "gaussian", "variance" = 2)) - -# uniform points from the boundary of a 2-dimensional random H-polytope -P = gen_rand_hpoly(2,20) -points = sample_points(P, n = 100, random_walk = list("walk" = "BRDHR")) - -# For sampling from logconcave densities see the examples directory - -} -\references{ -\cite{Robert L. Smith, -\dQuote{Efficient Monte Carlo Procedures for Generating Points Uniformly Distributed Over Bounded Regions,} \emph{Operations Research,} 1984.}, - -\cite{B.T. Polyak, E.N. Gryazina, -\dQuote{Billiard walk - a new sampling algorithm for control and optimization,} \emph{IFAC Proceedings Volumes,} 2014.}, - -\cite{Y. Chen, R. Dwivedi, M. J. Wainwright and B. Yu, -\dQuote{Fast MCMC Sampling Algorithms on Polytopes,} \emph{Journal of Machine Learning Research,} 2018.} - -\cite{Lee, Yin Tat, Ruoqi Shen, and Kevin Tian, -\dQuote{"Logsmooth Gradient Concentration and Tighter Runtimes for Metropolized Hamiltonian Monte Carlo,"} \emph{arXiv preprint arXiv:2002.04121}, 2020.} - -\cite{Shen, Ruoqi, and Yin Tat Lee, -\dQuote{"The randomized midpoint method for log-concave sampling.",} \emph{Advances in Neural Information Processing Systems}, 2019.} - -\cite{Augustin Chevallier, Sylvain Pion, Frederic Cazals, -\dQuote{"Hamiltonian Monte Carlo with boundary reflections, and application to polytope volume calculations,"} \emph{Research Report preprint hal-01919855}, 2018.} -} diff --git a/R-proj/man/sparse_constraint_problem.Rd b/R-proj/man/sparse_constraint_problem.Rd deleted file mode 100644 index 535dc8426..000000000 --- a/R-proj/man/sparse_constraint_problem.Rd +++ /dev/null @@ -1,26 +0,0 @@ -\name{sparse_constraint_problem} -\alias{sparse_constraint_problem} -\title{An \code{R} class to represent sparse constraint problems.} - -\description{ -A constraint problem is defined by a set of linear inequalities and equalities or equivalently a \eqn{d}-dimensional constraint problem is defined by a \eqn{mineq\times d} matrix Aineq and a \eqn{mineq}-dimensional vector bineq, s.t.: \eqn{Aineqx\leq bineq}, a \eqn{meq\times d} matrix Aeq and a \eqn{meq}-dimensional vector beq, s.t.: \eqn{Aeqx\eq beq} and two \eqn{d} vectors lb, ub such that \eqn{lb\leq x \leq ub}. -} -\section{Fields}{ -\itemize{ -\item{\code{Aineq} }{\eqn{mineq\times d} sparse matrix Aineq} - -\item{\code{bineq} }{\eqn{mineq}-dimensional vector bineq} - -\item{\code{Aeq} }{\eqn{meq\times d} sparse matrix Aeq} - -\item{\code{beq} }{\eqn{meq}-dimensional vector beq} - -\item{\code{lb} }{\eqn{d}-dimensional vector bineq} - -\item{\code{ub} }{\eqn{d}-dimensional vector bineq} - -\item{\code{type} }{An integer that declares the representation of the polytope. For sparse_constraint_problem the default value is 5.} - -\item{\code{dimension} }{The dimension of the polytope.} - -}} diff --git a/R-proj/man/volume.Rd b/R-proj/man/volume.Rd deleted file mode 100644 index cd325c87f..000000000 --- a/R-proj/man/volume.Rd +++ /dev/null @@ -1,55 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{volume} -\alias{volume} -\title{The main function for volume approximation of a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes). It returns a list with two elements: (a) the logarithm of the estimated volume and (b) the estimated volume} -\usage{ -volume(P, settings = NULL, rounding = NULL, seed = NULL) -} -\arguments{ -\item{P}{A convex polytope. It is an object from class a) Hpolytope or b) Vpolytope or c) Zonotope or d) VpolytopeIntersection.} - -\item{settings}{Optional. A list that declares which algorithm, random walk and values of parameters to use, as follows: -\itemize{ -\item{\code{algorithm} }{ A string to set the algorithm to use: a) \code{'CB'} for CB algorithm, b) \code{'SoB'} for SOB algorithm or b) \code{'CG'} for CG algorithm. The defalut algorithm is \code{'CB'}.} -\item{\code{error} }{ A numeric value to set the upper bound for the approximation error. The default value is \eqn{1} for SOB algorithm and \eqn{0.1} otherwise.} -\item{\code{random_walk} }{ A string that declares the random walk method: a) \code{'CDHR'} for Coordinate Directions Hit-and-Run, b) \code{'RDHR'} for Random Directions Hit-and-Run, c) \code{'BaW'} for Ball Walk, or \code{'BiW'} for Billiard walk. For CB algorithm the default walk is \code{'BiW'}. For CG and SOB algorithms the default walk is \code{'CDHR'} for H-polytopes and \code{'RDHR'} for the other representations.} -\item{\code{walk_length} }{ An integer to set the number of the steps for the random walk. The default value is \eqn{\lfloor 10 + d/10\rfloor} for \code{'SOB'} and \eqn{1} otherwise.} -\item{\code{win_len} }{ The length of the sliding window for CB or CG algorithm. The default value is \eqn{250} for CB with BiW and \eqn{400+3d^2} for CB and any other random walk and \eqn{500+4d^2} for CG.} -\item{\code{hpoly} }{ A boolean parameter to use H-polytopes in MMC of CB algorithm when the input polytope is a zonotope. The default value is \code{TRUE} when the order of the zonotope is \eqn{<5}, otherwise it is \code{FALSE}.} -}} - -\item{rounding}{Optional. A string parameter to request a rounding method to be applied in the input polytope before volume computation: a) \code{'min_ellipsoid'}, b) \code{'svd'}, c) \code{'max_ellipsoid'} and d) \code{'none'} for no rounding.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -The approximation of the volume of a convex polytope. -} -\description{ -For the volume approximation can be used three algorithms. Either CoolingBodies (CB) or SequenceOfBalls (SOB) or CoolingGaussian (CG). An H-polytope with \eqn{m} facets is described by a \eqn{m\times d} matrix \eqn{A} and a \eqn{m}-dimensional vector \eqn{b}, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }. A V-polytope is defined as the convex hull of \eqn{m} \eqn{d}-dimensional points which correspond to the vertices of P. A zonotope is desrcibed by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -} -\examples{ - -# calling SOB algorithm for a H-polytope (5d unit simplex) -HP = gen_cube(5,'H') -pair_vol = volume(HP) - -# calling CG algorithm for a V-polytope (3d simplex) -VP = gen_simplex(3,'V') -pair_vol = volume(VP, settings = list("algorithm" = "CG")) - -# calling CG algorithm for a 2-dimensional zonotope defined as the Minkowski sum of 4 segments -Z = gen_rand_zonotope(2, 4) -pair_vol = volume(Z, settings = list("random_walk" = "RDHR", "walk_length" = 2)) - -} -\references{ -\cite{I.Z.Emiris and V. Fisikopoulos, -\dQuote{Practical polytope volume approximation,} \emph{ACM Trans. Math. Soft.,} 2018.}, - -\cite{A. Chalkis and I.Z.Emiris and V. Fisikopoulos, -\dQuote{Practical Volume Estimation by a New Annealing Schedule for Cooling Convex Bodies,} \emph{CoRR, abs/1905.05494,} 2019.}, - -\cite{B. Cousins and S. Vempala, \dQuote{A practical volume algorithm,} \emph{Springer-Verlag Berlin Heidelberg and The Mathematical Programming Society,} 2015.} -} diff --git a/R-proj/man/writeSdpaFormatFile.Rd b/R-proj/man/writeSdpaFormatFile.Rd deleted file mode 100644 index 7c791dce0..000000000 --- a/R-proj/man/writeSdpaFormatFile.Rd +++ /dev/null @@ -1,34 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{writeSdpaFormatFile} -\alias{writeSdpaFormatFile} -\title{Write a SDPA format file} -\usage{ -writeSdpaFormatFile( - spectrahedron = NULL, - objectiveFunction = NULL, - outputFile = NULL -) -} -\arguments{ -\item{spectrahedron}{A spectrahedron in n dimensions; must be an object of class Spectrahedron} - -\item{objectiveFunction}{A numerical vector of length n} - -\item{outputFile}{Name of the output file} -} -\description{ -Outputs a spectrahedron (the matrices defining a linear matrix inequality) and a vector (the objective function) -to a SDPA format file. -} -\examples{ -\dontrun{ -A0 = matrix(c(-1,0,0,0,-2,1,0,1,-2), nrow=3, ncol=3, byrow = TRUE) -A1 = matrix(c(-1,0,0,0,0,1,0,1,0), nrow=3, ncol=3, byrow = TRUE) -A2 = matrix(c(0,0,-1,0,0,0,-1,0,0), nrow=3, ncol=3, byrow = TRUE) -lmi = list(A0, A1, A2) -S = Spectrahedron$new(lmi); -objFunction = c(1,1) -writeSdpaFormatFile(S, objFunction, "output.txt") -} -} diff --git a/R-proj/man/zono_approx.Rd b/R-proj/man/zono_approx.Rd deleted file mode 100644 index 9c27c369c..000000000 --- a/R-proj/man/zono_approx.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/RcppExports.R -\name{zono_approx} -\alias{zono_approx} -\title{An internal Rccp function for the over-approximation of a zonotope} -\usage{ -zono_approx(Z, fit_ratio = NULL, settings = NULL, seed = NULL) -} -\arguments{ -\item{Z}{A zonotope.} - -\item{fit_ratio}{Optional. A boolean parameter to request the computation of the ratio of fitness.} - -\item{settings}{Optional. A list that declares the values of the parameters of CB algorithm.} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A List that contains a numerical matrix that describes the PCA approximation as a H-polytope and the ratio of fitness. -} -\description{ -An internal Rccp function for the over-approximation of a zonotope -} -\keyword{internal} diff --git a/R-proj/man/zonotope_approximation.Rd b/R-proj/man/zonotope_approximation.Rd deleted file mode 100644 index 152a0b0a7..000000000 --- a/R-proj/man/zonotope_approximation.Rd +++ /dev/null @@ -1,39 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/zonotope_approximation.R -\name{zonotope_approximation} -\alias{zonotope_approximation} -\title{A function to over-approximate a zonotope with PCA method and to evaluate the approximation by computing a ratio of fitness.} -\usage{ -zonotope_approximation(Z, fit_ratio = NULL, settings = NULL, seed = NULL) -} -\arguments{ -\item{Z}{A zonotope.} - -\item{fit_ratio}{Optional. A boolean parameter to request the computation of the ratio of fitness.} - -\item{settings}{Optional. A list that declares the values of the parameters of CB algorithm as follows: -\itemize{ -\item{\code{error} }{ A numeric value to set the upper bound for the approximation error. The default value is \eqn{0.1}.} -\item{\code{walk_length} }{ An integer to set the number of the steps for the random walk. The default value is \eqn{1}.} -\item{\code{win_len} }{ The length of the sliding window for CB algorithm. The default value is \eqn{200}.} -\item{\code{hpoly} }{ A boolean parameter to use H-polytopes in MMC of CB algorithm. The default value is \code{TRUE} when the order of the zonotope is \eqn{<5}, otherwise it is \code{FALSE}.} -}} - -\item{seed}{Optional. A fixed seed for the number generator.} -} -\value{ -A list that contains the approximation body in H-representation and the ratio of fitness -} -\description{ -For the evaluation of the PCA method the exact volume of the approximation body is computed and the volume of the input zonotope is computed by CoolingBodies algorithm. The ratio of fitness is \eqn{R=vol(P) / vol(P_{red})}, where \eqn{P_{red}} is the approximate polytope. -} -\examples{ -# over-approximate a 2-dimensional zonotope with 10 generators and compute the ratio of fitness -Z = gen_rand_zonotope(2,12) -retList = zonotope_approximation(Z = Z) - -} -\references{ -\cite{A.K. Kopetzki and B. Schurmann and M. Althoff, -\dQuote{Methods for Order Reduction of Zonotopes,} \emph{IEEE Conference on Decision and Control,} 2017.} -} diff --git a/R-proj/src/Makevars b/R-proj/src/Makevars deleted file mode 100644 index 12623b8b9..000000000 --- a/R-proj/src/Makevars +++ /dev/null @@ -1,17 +0,0 @@ -PKG_CPPFLAGS= -I../../external/boost -I../../external/autodiff -I../../external/LPsolve_src/run_headers -I../../external/minimum_ellipsoid -I../../include - -PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES - -PKG_LIBS=-LRproj_externals/lp_solve -llp_solve -L../../external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) - -$(SHLIB): Rproj_externals/lp_solve/liblp_solve.a ../../external/PackedCSparse/qd/libqd.a - -Rproj_externals/lp_solve/liblp_solve.a: - @(cd Rproj_externals/lp_solve && $(MAKE) liblp_solve.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ - CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") - -../../external/PackedCSparse/qd/libqd.a: - @(cd ../../PackedCSparse/qd && $(MAKE) libqd.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ - CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/R-proj/src/Makevars.win b/R-proj/src/Makevars.win deleted file mode 100644 index 83ed4e0c6..000000000 --- a/R-proj/src/Makevars.win +++ /dev/null @@ -1,17 +0,0 @@ -PKG_CPPFLAGS=-I../../external/boost -I../../external/LPsolve_src/run_headers -I../../external/minimum_ellipsoid -I../../include -I../../include/convex_bodies/spectrahedra -PKG_CXXFLAGS= -Wno-deprecated-declarations -lm -ldl -Wno-ignored-attributes -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES - -PKG_LIBS=-LRproj_externals/lp_solve -llp_solve -L../../external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) - -$(SHLIB): Rproj_externals/lp_solve/liblp_solve.a ../../external/PackedCSparse/qd/libqd.a - -Rproj_externals/lp_solve/liblp_solve.a: - @(cd Rproj_externals/lp_solve && $(MAKE) liblp_solve.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS) -DUSRDLL -DINLINE=static" \ - CFLAGS="$(CFLAGS)" CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" \ - RANLIB="$(RANLIB)") - -../../external/PackedCSparse/qd/libqd.a: - @(cd ../../PackedCSparse/qd && $(MAKE) libqd.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ - CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/R-proj/src/copula.cpp b/R-proj/src/copula.cpp deleted file mode 100644 index 0e8069ea2..000000000 --- a/R-proj/src/copula.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 program. - - -#include -#include -#include -#include "convex_bodies/ellipsoid.h" -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include "sampling/simplex.hpp" -#include "volume/copulas.h" - -//' Construct a copula using uniform sampling from the unit simplex -//' -//' Given two families of parallel hyperplanes or a family of parallel hyperplanes and a family of concentric ellispoids centered at the origin intersecting the canonical simplex, this function uniformly samples from the canonical simplex and construct an approximation of the bivariate probability distribution, called copula (see \url{https://en.wikipedia.org/wiki/Copula_(probability_theory)}). -//' At least two families of hyperplanes or one family of hyperplanes and one family of ellipsoids have to be given as input. -//' -//' @param r1 The \eqn{d}-dimensional normal vector of the first family of parallel hyperplanes. -//' @param r2 Optional. The \eqn{d}-dimensional normal vector of the second family of parallel hyperplanes. -//' @param sigma Optional. The \eqn{d\times d} symmetric positive semidefine matrix that describes the family of concentric ellipsoids centered at the origin. -//' @param m The number of the slices for the copula. The default value is 100. -//' @param n The number of points to sample. The default value is \eqn{5\cdot 10^5}. -//' @param seed Optional. A fixed seed for the number generator. -//' -//' @references \cite{L. Cales, A. Chalkis, I.Z. Emiris, V. Fisikopoulos, -//' \dQuote{Practical volume computation of structured convex bodies, and an application to modeling portfolio dependencies and financial crises,} \emph{Proc. of Symposium on Computational Geometry, Budapest, Hungary,} 2018.} -//' -//' @return A \eqn{m\times m} numerical matrix that corresponds to a copula. -//' @examples -//' # compute a copula for two random families of parallel hyperplanes -//' h1 = runif(n = 10, min = 1, max = 1000) -//' h1 = h1 / 1000 -//' h2=runif(n = 10, min = 1, max = 1000) -//' h2 = h2 / 1000 -//' cop = copula(r1 = h1, r2 = h2, m = 10, n = 100000) -//' -//' # compute a copula for a family of parallel hyperplanes and a family of conentric ellipsoids -//' h = runif(n = 10, min = 1, max = 1000) -//' h = h / 1000 -//' E = replicate(10, rnorm(20)) -//' E = cov(E) -//' cop = copula(r1 = h, sigma = E, m = 10, n = 100000) -//' -//' @export -// [[Rcpp::export]] -Rcpp::NumericMatrix copula (Rcpp::Nullable r1, - Rcpp::Nullable r2 = R_NilValue, - Rcpp::Nullable sigma = R_NilValue, - Rcpp::Nullable m = R_NilValue, - Rcpp::Nullable n = R_NilValue, - Rcpp::Nullable seed = R_NilValue){ - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef boost::mt19937 RNGType; - typedef Eigen::Matrix MT; - typedef Eigen::Matrix VT; - typedef Ellipsoid CopEll; - unsigned int num_slices = 100, numpoints = 500000; - - if (m.isNotNull()) { - num_slices = Rcpp::as(m); - } - - if (n.isNotNull()) { - numpoints = Rcpp::as(n); - } - - double seed3 = (!seed.isNotNull()) ? std::numeric_limits::signaling_NaN() : Rcpp::as(seed); - - Rcpp::NumericMatrix copula(num_slices, num_slices); - std::vector > StdCopula; - unsigned int dim = Rcpp::as >(r1).size(), i, j; - - std::vector hyp1 = Rcpp::as >(r1); - if (r2.isNotNull()) { - - std::vector hyp2 = Rcpp::as < std::vector < NT > > (r2); - StdCopula = twoParHypFam(dim, numpoints, num_slices, hyp1, hyp2, seed3); - - } else if (sigma.isNotNull()) { - - std::vector > Gin(dim, std::vector(dim)); - MT EE = Rcpp::as(sigma); - for (int i=0; i(dim, numpoints, num_slices, hyp1, Ell, seed3); - } else { - - throw Rcpp::exception("You have to give as input either two families of hyperplanes or one family of hyperplanes and one family of ellipsoids!"); - - } - - for(int i=0; i -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "volume/volume_sequence_of_balls.hpp" -#include "sampling/simplex.hpp" - -//' Sample perfect uniformly distributed points from well known convex bodies: (a) the unit simplex, (b) the canonical simplex, (c) the boundary of a hypersphere or (d) the interior of a hypersphere. -//' -//' The \eqn{d}-dimensional unit simplex is the set of points \eqn{\vec{x}\in \R^d}, s.t.: \eqn{\sum_i x_i\leq 1}, \eqn{x_i\geq 0}. The \eqn{d}-dimensional canonical simplex is the set of points \eqn{\vec{x}\in \R^d}, s.t.: \eqn{\sum_i x_i = 1}, \eqn{x_i\geq 0}. -//' -//' @param body A list to request exact uniform sampling from special well known convex bodies through the following input parameters: -//' \itemize{ -//' \item{\code{type} }{ A string that declares the type of the body for the exact sampling: a) \code{'unit_simplex'} for the unit simplex, b) \code{'canonical_simplex'} for the canonical simplex, c) \code{'hypersphere'} for the boundary of a hypersphere centered at the origin, d) \code{'ball'} for the interior of a hypersphere centered at the origin.} -//' \item{\code{dimension} }{ An integer that declares the dimension when exact sampling is enabled for a simplex or a hypersphere.} -//' \item{\code{radius} }{ The radius of the \eqn{d}-dimensional hypersphere. The default value is \eqn{1}.} -//' } -//' @param n The number of points that the function is going to sample. -//' @param seed Optional. A fixed seed for the number generator. -//' -//' @references \cite{R.Y. Rubinstein and B. Melamed, -//' \dQuote{Modern simulation and modeling} \emph{ Wiley Series in Probability and Statistics,} 1998.} -//' @references \cite{A Smith, Noah and W Tromble, Roy, -//' \dQuote{Sampling Uniformly from the Unit Simplex,} \emph{ Center for Language and Speech Processing Johns Hopkins University,} 2004.} -//' -//' @return A \eqn{d\times n} matrix that contains, column-wise, the sampled points from the convex polytope P. -//' @examples -//' # 100 uniform points from the 2-d unit ball -//' points = direct_sampling(n = 100, body = list("type" = "ball", "dimension" = 2)) -//' @export -// [[Rcpp::export]] -Rcpp::NumericMatrix direct_sampling(Rcpp::Nullable body, - Rcpp::Nullable n, - Rcpp::Nullable seed = R_NilValue) { - - typedef double NT; - typedef Cartesian Kernel; - typedef boost::mt19937 RNGType2; - typedef typename Kernel::Point Point; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - typedef BoostRandomNumberGenerator RNGType; - - int dim, numpoints; - NT radius = 1.0; - std::list randPoints; - - if (!Rcpp::as(body).containsElementNamed("dimension")) { - throw Rcpp::exception("Dimension has to be given as input!"); - } - dim = Rcpp::as(Rcpp::as(body)["dimension"]); - if (dim <=1) throw Rcpp::exception("Dimension has to be larger than 1!"); - RNGType rng(dim); - - if (seed.isNotNull()) { - unsigned seed2 = Rcpp::as(seed); - rng.set_seed(seed2); - } - double seed3 = (!seed.isNotNull()) ? std::numeric_limits::signaling_NaN() : Rcpp::as(seed); - //RNGType rng2(5); - - numpoints = (!n.isNotNull()) ? 100 : Rcpp::as(n); - - numpoints = Rcpp::as(n); - if (numpoints <= 0) throw Rcpp::exception("The number of samples has to be a positice integer!"); - - - if (Rcpp::as(body).containsElementNamed("radius")) { - - radius = Rcpp::as(Rcpp::as(body)["radius"]); - if (radius <= NT(0)) throw Rcpp::exception("Radius has to be a positive number!"); - - } - if (!Rcpp::as(body).containsElementNamed("type")) { - - throw Rcpp::exception("The kind of body has to be given as input!"); - - } - if (Rcpp::as(Rcpp::as(body)["type"]).compare(std::string("hypersphere"))==0) { - - for (unsigned int k = 0; k < numpoints; ++k) { - randPoints.push_back(GetPointOnDsphere::apply(dim, radius, rng)); - } - - } else if (Rcpp::as(Rcpp::as(body)["type"]).compare(std::string("ball"))==0) { - - for (unsigned int k = 0; k < numpoints; ++k) { - randPoints.push_back(GetPointInDsphere::apply(dim, radius, rng)); - } - - } else if (Rcpp::as(Rcpp::as(body)["type"]).compare(std::string("unit_simplex"))==0) { - - Sam_Unit(dim, numpoints, randPoints, seed3); - - } else if (Rcpp::as(Rcpp::as(body)["type"]).compare(std::string("canonical_simplex"))==0) { - - Sam_Canon_Unit(dim, numpoints, randPoints, seed3); - - } else { - - throw Rcpp::exception("Wrong input!"); - - } - - MT RetMat(dim, numpoints); - unsigned int jj = 0; - - for (typename std::list::iterator rpit = randPoints.begin(); rpit!=randPoints.end(); rpit++, jj++) { - RetMat.col(jj) = rpit->getCoefficients(); - } - return Rcpp::wrap(RetMat); -} diff --git a/R-proj/src/ess.cpp b/R-proj/src/ess.cpp deleted file mode 100644 index 15730557c..000000000 --- a/R-proj/src/ess.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 20014-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis - -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - -#include -#include -#include -#include -#include -#include -#include -#include "diagnostics/effective_sample_size.hpp" - -//' Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal -//' -//' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -//' -//' @references \cite{Gelman, A. and Rubin, D. B., -//' \dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} -//' -//' @references \cite{Brooks, S. and Gelman, A., -//' \dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -//' -//' @return A vector that contains the values of PSRF for each coordinate -//' -//' @export -// [[Rcpp::export]] -Rcpp::NumericVector ess(Rcpp::NumericMatrix samples) -{ - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - MT samples_ = Rcpp::as(samples); - unsigned int min_ess = 0; - VT Neff = effective_sample_size(samples_, min_ess); - - return Rcpp::wrap(Neff); -} diff --git a/R-proj/src/exact_vol.cpp b/R-proj/src/exact_vol.cpp deleted file mode 100644 index d60d8fa4b..000000000 --- a/R-proj/src/exact_vol.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2019 Vissarion Fisikopoulos -// Copyright (c) 2018-2019 Apostolos Chalkis - - -#include -#include -#include -#include -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include "convex_bodies/hpolytope.h" -#include "convex_bodies/vpolytope.h" -#include "convex_bodies/zpolytope.h" -#include "volume/exact_vols.h" - -template -FT factorial(FT n) -{ - return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n; -} - -//' Compute the exact volume of (a) a zonotope (b) an arbitrary simplex in V-representation or (c) if the volume is known and declared by the input object. -//' -//' Given a zonotope (as an object of class Zonotope), this function computes the sum of the absolute values of the determinants of all the \eqn{d \times d} submatrices of the \eqn{m\times d} matrix \eqn{G} that contains row-wise the \eqn{m} \eqn{d}-dimensional segments that define the zonotope. -//' For an arbitrary simplex that is given in V-representation this function computes the absolute value of the determinant formed by the simplex's points assuming it is shifted to the origin. -//' -//' @param P A polytope -//' -//' @references \cite{E. Gover and N. Krikorian, -//' \dQuote{Determinants and the Volumes of Parallelotopes and Zonotopes,} \emph{Linear Algebra and its Applications, 433(1), 28 - 40,} 2010.} -//' -//' @return The exact volume of the input polytope, for zonotopes, simplices in V-representation and polytopes with known exact volume -//' @examples -//' -//' # compute the exact volume of a 5-dimensional zonotope defined by the Minkowski sum of 10 segments -//' Z = gen_rand_zonotope(2, 5) -//' vol = exact_vol(Z) -//' -//' \donttest{# compute the exact volume of a 2-d arbitrary simplex -//' V = matrix(c(2,3,-1,7,0,0),ncol = 2, nrow = 3, byrow = TRUE) -//' P = Vpolytope$new(V) -//' vol = exact_vol(P) -//' } -//' -//' # compute the exact volume the 10-dimensional cross polytope -//' P = gen_cross(10,'V') -//' vol = exact_vol(P) -//' @export -// [[Rcpp::export]] -double exact_vol(Rcpp::Nullable P) { - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - if (NT(Rcpp::as(P).field("volume")) > 0.0) { - return NT(Rcpp::as(P).field("volume")); - } - - int type = Rcpp::as(P).field("type"), dim; - NT vol; - - if (type == 2) { - - dim = Rcpp::as(P).field("dimension"); - - if (Rcpp::as(Rcpp::as(P).field("V")).rows() == - Rcpp::as(Rcpp::as(P).field("V")).cols() + 1) { - - MT V = Rcpp::as(Rcpp::as(P).field("V")).transpose(), V2(dim,dim); - VT v0 = V.col(dim); - - for (int i = 0; i < dim; ++i) { - V2.col(i) = V.col(i) - v0; - } - vol = std::abs(V2.determinant()) / factorial(NT(dim)); - - } else { - throw Rcpp::exception("Volume unknown!"); - } - - } else if (type == 3) { - - typedef Zonotope zonotope; - dim = Rcpp::as(P).field("dimension"); - - zonotope ZP(dim, Rcpp::as(Rcpp::as(P).field("G")), - VT::Ones(Rcpp::as(Rcpp::as(P).field("G")).rows())); - vol = exact_zonotope_vol(ZP); - - } else { - throw Rcpp::exception("Volume unknown!"); - } - - return vol; -} diff --git a/R-proj/src/extractMatPoly.h b/R-proj/src/extractMatPoly.h deleted file mode 100644 index 5adb9d56b..000000000 --- a/R-proj/src/extractMatPoly.h +++ /dev/null @@ -1,37 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2018 Vissarion Fisikopoulos, Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 program. - -// VolEsti is free software: you can redistribute it and/or modify it -// under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or (at -// your option) any later version. -// -// VolEsti is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// See the file COPYING.LESSER for the text of the GNU Lesser General -// Public License. If you did not receive this file along with HeaDDaCHe, -// see . - - -#ifndef EXTRACTMATPOLY_H -#define EXTRACTMATPOLY_H - -// Take a H or a V-polytope and return a numerical matrix in ine or ext format respectively -template -Rcpp::NumericMatrix extractMatPoly(Polytope P) { - - typedef typename Polytope::MT MT; - - MT Mat(P.get_mat().rows(), P.dimension()+1); - Mat << P.get_vec(), P.get_mat(); - - return Rcpp::wrap(Mat); -} - -#endif diff --git a/R-proj/src/frustum_of_simplex.cpp b/R-proj/src/frustum_of_simplex.cpp deleted file mode 100644 index 6b191079e..000000000 --- a/R-proj/src/frustum_of_simplex.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -#include -#include -#include "volume/exact_vols.h" - -//' Compute the percentage of the volume of the simplex that is contained in the intersection of a half-space and the simplex. -//' -//' A half-space \eqn{H} is given as a pair of a vector \eqn{a\in R^d} and a scalar \eqn{z0\in R} s.t.: \eqn{a^Tx\leq z0}. This function calls the Ali's version of the Varsi formula to compute a frustum of the simplex. -//' -//' @param a A \eqn{d}-dimensional vector that defines the direction of the hyperplane. -//' @param z0 The scalar that defines the half-space. -//' -//' @references \cite{Varsi, Giulio, -//' \dQuote{The multidimensional content of the frustum of the simplex,} \emph{Pacific J. Math. 46, no. 1, 303--314,} 1973.} -//' -//' @references \cite{Ali, Mir M., -//' \dQuote{Content of the frustum of a simplex,} \emph{ Pacific J. Math. 48, no. 2, 313--322,} 1973.} -//' -//' @return The percentage of the volume of the simplex that is contained in the intersection of a given half-space and the simplex. -//' -//' @examples -//' # compute the frustum of H: -x1+x2<=0 -//' a=c(-1,1) -//' z0=0 -//' frustum = frustum_of_simplex(a, z0) -//' @export -// [[Rcpp::export]] -double frustum_of_simplex(Rcpp::NumericVector a, double z0){ - - unsigned int dim = a.size(); - if (dim < 2) { - throw Rcpp::exception("Dimension has to be greater than 2"); - } - std::vector hyp = Rcpp::as >(a); - - return vol_Ali(hyp, -z0, dim); -} diff --git a/R-proj/src/geweke.cpp b/R-proj/src/geweke.cpp deleted file mode 100644 index 4c41b227e..000000000 --- a/R-proj/src/geweke.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 20014-2020 Vissarion Fisikopoulos -// Copyright (c) 2020 Apostolos Chalkis - -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - - -#include -#include -#include -#include -#include -#include -#include -#include "diagnostics/geweke.hpp" - -//' Geweke's MCMC diagnostic -//' -//' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -//' @param frac_first Optional. The portion of the first in order points in matrix samples. -//' @param frac_last Optional. The portion of the last in order points in matrix samples. -//' -//' @references \cite{Geweke, J., -//' \dQuote{Evaluating the accuracy of sampling-based approaches to the calculation of posterior moments,} \emph{ In Bayesian Statistics 4. Proceedings of the Fourth Valencia International Meeting,} 1992.} -//' -//' @return A boolean to denote if the result of Geweke diagnostic: (i) false if the null hypothesis is rejected, (ii) true if the null hypothesis is not rejected. -//' -//' @export -// [[Rcpp::export]] -bool geweke(Rcpp::NumericMatrix samples, - Rcpp::Nullable frac_first = R_NilValue, - Rcpp::Nullable frac_last = R_NilValue) -{ - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - NT frac_1, frac_2; - - frac_1 = (!frac_first.isNotNull()) ? NT(0.1) : Rcpp::as(frac_first); - frac_2 = (!frac_last.isNotNull()) ? NT(0.5) : Rcpp::as(frac_last); - - return perform_geweke(Rcpp::as(samples), frac_1, frac_2); -} diff --git a/R-proj/src/inner_ball.cpp b/R-proj/src/inner_ball.cpp deleted file mode 100644 index 8472ad3b8..000000000 --- a/R-proj/src/inner_ball.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "volume/volume_sequence_of_balls.hpp" -#include "preprocess/max_inscribed_ball.hpp" - -//' Compute an inscribed ball of a convex polytope -//' -//' For a H-polytope described by a \eqn{m\times d} matrix \eqn{A} and a \eqn{m}-dimensional vector \eqn{b}, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }, this function computes the largest inscribed ball (Chebychev ball) by solving the corresponding linear program. -//' For both zonotopes and V-polytopes the function computes the minimum \eqn{r} s.t.: \eqn{ r e_i \in P} for all \eqn{i=1, \dots ,d}. Then the ball centered at the origin with radius \eqn{r/ \sqrt{d}} is an inscribed ball. -//' -//' @param P A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection. -//' @param lpsolve Optional. A boolean variable to compute the Chebychev ball of an H-polytope using the lpsolve library. -//' -//' @return A \eqn{(d+1)}-dimensional vector that describes the inscribed ball. The first \eqn{d} coordinates corresponds to the center of the ball and the last one to the radius. -//' -//' @examples -//' # compute the Chebychev ball of the 2d unit simplex -//' P = gen_cube(10,'H') -//' ball_vec = inner_ball(P) -//' -//' # compute an inscribed ball of the 3-dimensional unit cube in V-representation -//' P = gen_cube(3, 'V') -//' ball_vec = inner_ball(P, lpsolve = TRUE) -//' @export -// [[Rcpp::export]] -Rcpp::NumericVector inner_ball(Rcpp::Reference P, - Rcpp::Nullable lpsolve = R_NilValue) { - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef BoostRandomNumberGenerator RNGType; - typedef HPolytope Hpolytope; - typedef VPolytope Vpolytope; - typedef Zonotope zonotope; - typedef IntersectionOfVpoly InterVP; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - unsigned int n = P.field("dimension"), type = P.field("type"); - - std::pair InnerBall; - bool lp_solve = (lpsolve.isNotNull()) ? Rcpp::as(lpsolve) : false; - - switch (type) { - case 1: { - // Hpolytope - Hpolytope HP(n, Rcpp::as(P.field("A")), Rcpp::as(P.field("b"))); - if (lp_solve) { - InnerBall = ComputeChebychevBall(HP.get_mat(), HP.get_vec()); - } else { - InnerBall = HP.ComputeInnerBall(); - } - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - break; - } - case 2: { - // Vpolytope - Vpolytope VP(n, Rcpp::as(P.field("V")), VT::Ones(Rcpp::as(P.field("V")).rows())); - InnerBall = VP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - break; - } - case 3: { - // Zonotope - zonotope ZP(n, Rcpp::as(P.field("G")), VT::Ones(Rcpp::as(P.field("G")).rows())); - InnerBall = ZP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - break; - } - case 4: { - // Intersection of two V-polytopes - Vpolytope VP1(n, Rcpp::as(P.field("V1")), VT::Ones(Rcpp::as(P.field("V1")).rows())); - Vpolytope VP2(n, Rcpp::as(P.field("V2")), VT::Ones(Rcpp::as(P.field("V2")).rows())); - InterVP VPcVP(VP1, VP2); - if (!VPcVP.is_feasible()) throw Rcpp::exception("Empty set!"); - InnerBall = VPcVP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - break; - } - } - - Rcpp::NumericVector vec(n + 1); - for (unsigned int k = 0; k < n; ++k){ - vec[k] = InnerBall.first[k]; - } - - vec[n] = InnerBall.second; - return vec; -} diff --git a/R-proj/src/ode_solve.cpp b/R-proj/src/ode_solve.cpp deleted file mode 100644 index 07766d33a..000000000 --- a/R-proj/src/ode_solve.cpp +++ /dev/null @@ -1,205 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis -// Copyright (c) 2020-2020 Marios Papachristou - -//Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2018 and 2019 program. - - -#include -#include -#include -#include -#include -#include -#include -#include "random_walks/random_walks.hpp" -#include "volume/volume_sequence_of_balls.hpp" -#include "volume/volume_cooling_gaussians.hpp" -#include "sampling/sampling.hpp" -#include "ode_solvers/ode_solvers.hpp" -#include "oracle_functors_rcpp.h" - -template < - typename Solver, - typename MT -> -void run_ode_solver( - Solver &solver, - unsigned int &order, - unsigned int &num_steps, - unsigned int &dimension, - Rcpp::List &results) { - - std::vector results_temp; - - for (unsigned int i = 0; i < order; i++) { - MT temp_result; - temp_result.resize(dimension, num_steps); - results_temp.push_back(temp_result); - } - - for (unsigned int i = 0; i < num_steps; i++) { - for (unsigned int j = 0; j < order; j++) { - results_temp[j].col(i) = solver.xs[j].getCoefficients(); - } - solver.step(i, true); - } - - for (unsigned int i = 0; i < order; i++) { - std::ostringstream stringStream; - stringStream << "x_" << i + 1; - std::string state_name = stringStream.str(); - - results.push_back(Rcpp::wrap(results_temp[i]), state_name.c_str()); - - } - -} - -//' Solve an ODE of the form dx^n / dt^n = F(x, t) -//' -//' @param n The number of steps. -//' @param step_size The step size. -//' @param order The ODE order (default is n = 1) -//' @param dimension The dimension of each derivative -//' @param initial_time The initial time -//' @param F The function oracle F(x, t) in the ODE. -//' @param method The method to be used -//' @param initial_conditions The initial conditions provided to the solver. Must be provided in a list with keys "x_1", ..., "x_n" and column vectors as values. The state "x_n" represents the (n-1)-th order derivative with respect to time -//' @param domains A list of n H-polytopes with keys "P_1", "P_2", ..., "P_n" that correspond to each derivative's domain -//' -//' @return A list which contains elements "x_1", ..., "x_n" representing each derivative results. Each "x_i" corresponds to a d x n matrix where each column represents a certain timestep of the solver. -//' -//' @examples -//' # Please visit the examples directory on examples demonstrating usage of the ODE solvers. -//' -//' @export -// [[Rcpp::export]] -Rcpp::List ode_solve(Rcpp::Nullable n, - Rcpp::Nullable step_size, - Rcpp::Nullable order, - Rcpp::Nullable dimension, - Rcpp::Nullable initial_time, - Rcpp::Function F, - Rcpp::Nullable method, - Rcpp::Nullable domains = R_NilValue, - Rcpp::Nullable initial_conditions = R_NilValue) -{ - - typedef double NT; - typedef Cartesian Kernel; - typedef BoostRandomNumberGenerator RNGType; - typedef typename Kernel::Point Point; - typedef HPolytope Hpolytope; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - typedef std::vector pts; - typedef std::vector hp_bounds; - typedef RcppFunctor::GradientFunctor func; - - unsigned int n_ = Rcpp::as(n); - NT step_size_ = Rcpp::as(step_size); - unsigned int order_ = Rcpp::as(order); - std::string method_ = Rcpp::as(method); - unsigned int dim = Rcpp::as(dimension); - NT initial_time_ = Rcpp::as(initial_time); - - // Create functors - RcppFunctor::parameters rcpp_functor_params(1, 1, order_); - - // Create C++ functor - func F_(rcpp_functor_params, F, false); - - // Initialize initial conditions - pts initial_conditions_; - VT temp_initial_condition; - - for (unsigned int i = 1; i <= order_; i++) { - std::ostringstream stringStream; - stringStream << "x_" << i; - std::string state_name = stringStream.str(); - - if (Rcpp::as(initial_conditions).containsElementNamed(state_name.c_str())) { - temp_initial_condition = Rcpp::as(Rcpp::as(initial_conditions)[state_name.c_str()]); - Point p(temp_initial_condition); - initial_conditions_.push_back(p); - } else { - Point p(dim); - initial_conditions_.push_back(p); - } - - } - - unsigned int i = 0; - unsigned int t = 0; - F_(i, initial_conditions_, t); - - hp_bounds domains_; - - // Initialize domains - // TODO Test and add other polytope types - for (unsigned int i = 0; i < order_; i++) { - std::ostringstream stringStream; - stringStream << "P_" << i + 1; - std::string domain_name = stringStream.str(); - - if (Rcpp::as(domains).containsElementNamed(domain_name.c_str())) { - - Hpolytope HP(dim, Rcpp::as( - Rcpp::as(Rcpp::as(domains) - [domain_name.c_str()]).field("A")), - Rcpp::as( - Rcpp::as(Rcpp::as(domains) - [domain_name.c_str()]).field("b")) - ); - - HP.normalize(); - - Hpolytope *HP_ref = &HP; - - if (!HP_ref->is_in(initial_conditions_[i])) { - std::ostringstream errStream; - errStream << "Initial condition out of bounds for state " << i + 1 << ".\n"; - throw Rcpp::exception(errStream.str().c_str()); - } - domains_.push_back(HP_ref); - } else { - domains_.push_back(NULL); - } - } - - Rcpp::List results; - - if (method_ == "euler") { - EulerODESolver euler_solver = - EulerODESolver - (initial_time_, step_size_, initial_conditions_, F_, domains_); - run_ode_solver, MT>(euler_solver, order_, n_, dim, results); - } else if (method_ == "leapfrog") { - if (order_ % 2 == 1) { - throw Rcpp::exception("Leapfrog is an even order solver."); - } - LeapfrogODESolver leapfrog_solver = - LeapfrogODESolver - (initial_time_, step_size_, initial_conditions_, F_, domains_); - run_ode_solver, MT>(leapfrog_solver, order_, n_, dim, results); - } else if (method_ == "runge_kutta") { - RKODESolver rk_solver = - RKODESolver - (initial_time_, step_size_, initial_conditions_, F_, domains_); - run_ode_solver, MT>(rk_solver, order_, n_, dim, results); - } else if (method_ == "richardson") { - RichardsonExtrapolationODESolver r_solver = - RichardsonExtrapolationODESolver - (initial_time_, step_size_, initial_conditions_, F_, domains_); - run_ode_solver, MT>(r_solver, order_, n_, dim, results); - } else { - throw Rcpp::exception("Unrecognized solver. Aborting."); - } - - return results; -} diff --git a/R-proj/src/oracle_functors_rcpp.h b/R-proj/src/oracle_functors_rcpp.h deleted file mode 100644 index 6929540ca..000000000 --- a/R-proj/src/oracle_functors_rcpp.h +++ /dev/null @@ -1,160 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis -// Copyright (c) 2020-2020 Marios Papachristou - -// Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -// Licensed under GNU LGPL.3, see LICENCE file - -#ifndef ODE_SOLVERS_ORACLE_FUNCTORS_RCPP_HPP -#define ODE_SOLVERS_ORACLE_FUNCTORS_RCPP_HPP - -enum ode_solvers { - no_solver, - leapfrog, - euler, - runge_kutta, - richardson, - collocation, - implicit_midpoint -}; - -// Holds Oracle Functor that wraps an R function via RCpp -// The R function is provided as an Rcpp::Function object -// The functor uses Rcpp::as and Rcpp::wrap to do the conversion, -// call the oracle, and convert the results back to C++ -struct RcppFunctor { - - template < - typename NT - > - struct parameters { - NT L; // Lipschitz constant of gradient - NT m; // Strong-convexity parameter - NT eta; // Step-size (if defined by user) - NT kappa; // Condition number - unsigned int order; // Order of ODE functor - - parameters( - NT L_, - NT m_, - NT eta_, - unsigned int order_=2 - ) : - L(L_), - m(m_), - eta(eta_), - kappa(L_ / m_), - order(order_) - {} - }; - - // Log-probability gradient functor - template - < - typename Point - > - struct GradientFunctor { - typedef typename Point::FT NT; - typedef typename Point::Coeff VT; - typedef std::vector pts; - - parameters params; - Rcpp::Function neg_grad_f; // Negative gradient as an Rcpp::Function - bool negate; - - GradientFunctor( - parameters params_, - Rcpp::Function neg_grad_f_, - bool negate_=true): - params(params_), - neg_grad_f(neg_grad_f_), - negate(negate_) - {}; - - // The index i represents the state vector index - Point operator() (unsigned int const& i, pts const& xs, NT const& t) const { - if (i == params.order - 1) { - // Convert point to Rcpp::NumericMatrix - - VT y = Rcpp::as(neg_grad_f(Rcpp::wrap(xs[0].getCoefficients()))); - - Point z(y); - - if (negate) z = (-1.0) * z; - - // Return result as Point - return z; - } else { - return xs[i + 1]; // returns derivative - } - } - - Point operator() (Point const& x) const { - VT y = Rcpp::as(neg_grad_f(Rcpp::wrap(x.getCoefficients()))); - - Point z(y); - - if (negate) z = (-1.0) * z; - - // Return result as Point - return z; - } - - }; - - // Negative log-probability functor - template - < - typename Point - > - struct FunctionFunctor { - typedef typename Point::FT NT; - typedef typename Point::Coeff VT; - - parameters params; - Rcpp::Function negative_logprob; - - FunctionFunctor( - parameters params_, - Rcpp::Function negative_logprob_) : - params(params_), - negative_logprob(negative_logprob_) - {}; - - NT operator() (Point const& x) const { - return Rcpp::as(negative_logprob(Rcpp::wrap(x.getCoefficients()))); - } - - }; - - // Log-probability hessian functor - template - < - typename Point - > - struct HessianFunctor { - typedef typename Point::FT NT; - typedef typename Point::Coeff VT; - - parameters params; - Rcpp::Function hessian; // Negative hessian as an Rcpp::Function - - HessianFunctor( - parameters params_, - Rcpp::Function hessian_) : - params(params_), - hessian(hessian_) - {}; - - Point operator() (Point const& x) const { - VT y= Rcpp::as(hessian(Rcpp::wrap(x.getCoefficients()))); - return Point(y); - } - - }; -}; - -#endif diff --git a/R-proj/src/poly_gen.cpp b/R-proj/src/poly_gen.cpp deleted file mode 100644 index 1ffa75d7f..000000000 --- a/R-proj/src/poly_gen.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 program. - - -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "convex_bodies/hpolytope.h" -#include "convex_bodies/vpolytope.h" -#include "convex_bodies/zpolytope.h" -#include "generators/known_polytope_generators.h" -#include "generators/h_polytopes_generator.h" -#include "generators/v_polytopes_generators.h" -#include "generators/z_polytopes_generators.h" -#include "extractMatPoly.h" - -//' An internal Rccp function as a polytope generator -//' -//' @param kind_gen An integer to declare the type of the polytope. -//' @param Vpoly_gen A boolean parameter to declare if the requested polytope has to be in V-representation. -//' @param Zono_gen A boolean parameter to declare if the requested polytope has to be a zonotope. -//' @param dim_gen An integer to declare the dimension of the requested polytope. -//' @param m_gen An integer to declare the number of generators for the requested random zonotope or the number of vertices for a V-polytope. -//' @param seed Optional. A fixed seed for the random polytope generator. -//' -//' @keywords internal -//' -//' @return A numerical matrix describing the requested polytope -// [[Rcpp::export]] -Rcpp::NumericMatrix poly_gen (int kind_gen, bool Vpoly_gen, bool Zono_gen, int dim_gen, int m_gen, - Rcpp::Nullable seed = R_NilValue) { - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef boost::mt19937 RNGType; - typedef HPolytope Hpolytope; - typedef VPolytope Vpolytope; - typedef Zonotope zonotope; - - double seed_rcpp = (!seed.isNotNull()) ? std::numeric_limits::signaling_NaN() : Rcpp::as(seed); - - if (Zono_gen) { - switch (kind_gen) { - - case 1: - return extractMatPoly(gen_zonotope_uniform(dim_gen, m_gen, seed_rcpp)); - case 2: - return extractMatPoly(gen_zonotope_gaussian(dim_gen, m_gen, seed_rcpp)); - case 3: - return extractMatPoly(gen_zonotope_exponential(dim_gen, m_gen, seed_rcpp)); - - } - - } else if (Vpoly_gen) { - switch (kind_gen) { - - case 1: - return extractMatPoly(generate_cube(dim_gen, true)); - - case 2: - return extractMatPoly(generate_cross(dim_gen, true)); - - case 3: - return extractMatPoly(generate_simplex(dim_gen, true)); - - case 4: - return extractMatPoly(random_vpoly(dim_gen, m_gen, seed_rcpp)); - - case 5: - return extractMatPoly(random_vpoly_incube(dim_gen, m_gen, seed_rcpp)); - - } - } else { - switch (kind_gen) { - - case 1: - return extractMatPoly(generate_cube(dim_gen, false)); - - case 2: - return extractMatPoly(generate_cross(dim_gen, false)); - - case 3: - return extractMatPoly(generate_simplex(dim_gen, false)); - - case 4: - return extractMatPoly(generate_prod_simplex(dim_gen)); - - case 5: - return extractMatPoly(generate_skinny_cube(dim_gen)); - - case 6: - return extractMatPoly(random_hpoly(dim_gen, m_gen, seed_rcpp)); - - case 7: - return extractMatPoly(generate_birkhoff(dim_gen)); - - } - } - - throw Rcpp::exception("Wrong inputs!"); - -} diff --git a/R-proj/src/polytopes_modules.cpp b/R-proj/src/polytopes_modules.cpp deleted file mode 100644 index 443251fbb..000000000 --- a/R-proj/src/polytopes_modules.cpp +++ /dev/null @@ -1,240 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2019 Vissarion Fisikopoulos -// Copyright (c) 2018-2019 Apostolos Chalkis - - -#include - -class Hpolytope { -public: - Hpolytope() {} - Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b) : A(_A), b(_b), Aeq(Rcpp::NumericMatrix(0,0)), - beq(Rcpp::NumericVector(0)), vol(std::numeric_limits::signaling_NaN()), dimension(_A.ncol()), type(1) {} - Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, Rcpp::NumericMatrix _Aeq, Rcpp::NumericVector _beq) : - A(_A), b(_b), Aeq(_Aeq), beq(_beq), vol(std::numeric_limits::signaling_NaN()), dimension(_A.ncol()), type(1) {} - Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, double volume) : A(_A), b(_b), - Aeq(Rcpp::NumericMatrix(0,0)), beq(Rcpp::NumericVector(0)), vol(volume), dimension(_A.ncol()), type(1) {} - Hpolytope(Rcpp::NumericMatrix _A, Rcpp::NumericVector _b, Rcpp::NumericMatrix _Aeq, Rcpp::NumericVector _beq, - double volume) : A(_A), b(_b), Aeq(_Aeq), beq(_beq), vol(volume), dimension(_A.ncol()), type(1) {} - Rcpp::NumericMatrix A; - Rcpp::NumericVector b; - Rcpp::NumericMatrix Aeq; - Rcpp::NumericVector beq; - double vol; - unsigned int dimension; - int type; -}; - -class Vpolytope { -public: - Vpolytope() {} - Vpolytope(Rcpp::NumericMatrix _V) : V(_V), vol(std::numeric_limits::signaling_NaN()), dimension(_V.ncol()), type(2) {} - Vpolytope(Rcpp::NumericMatrix _V, double volume) : V(_V), vol(volume), dimension(_V.ncol()), type(2) {} - Rcpp::NumericMatrix V; - double vol; - unsigned int dimension; - int type; -}; - -class Zonotope { -public: - Zonotope() {} - Zonotope(Rcpp::NumericMatrix _G) : G(_G), vol(std::numeric_limits::signaling_NaN()), dimension(_G.ncol()), type(3) {} - Zonotope(Rcpp::NumericMatrix _G, double volume) : G(_G), vol(volume), dimension(_G.ncol()), type(3) {} - Rcpp::NumericMatrix G; - double vol; - unsigned int dimension; - int type; -}; - -class VPinterVP { -public: - VPinterVP() {} - VPinterVP(Rcpp::NumericMatrix _V1, Rcpp::NumericMatrix _V2) : V1(_V1), V2(_V2), vol(std::numeric_limits::signaling_NaN()), dimension(_V1.ncol()), type(4) {} - VPinterVP(Rcpp::NumericMatrix _V1, Rcpp::NumericMatrix _V2, double volume) : V1(_V1), V2(_V2), vol(volume), dimension(_V1.ncol()), type(4) {} - Rcpp::NumericMatrix V1; - Rcpp::NumericMatrix V2; - double vol; - unsigned int dimension; - int type; -}; -#include -using SpMat=Eigen::SparseMatrix ; -class sparse_constraint_problem { -public: - sparse_constraint_problem() {} - sparse_constraint_problem(SpMat _Aineq, Rcpp::NumericVector _bineq, SpMat _Aeq, Rcpp::NumericVector _beq) : Aineq(_Aineq), bineq(_bineq), Aeq(_Aeq), beq(_beq), - lb(Rcpp::NumericVector(_Aineq.cols(),-1e9)), ub(Rcpp::NumericMatrix(_Aineq.cols(),1e9)), dimension(_Aineq.cols()), type(5) {} - sparse_constraint_problem(SpMat _Aineq, Rcpp::NumericVector _bineq, SpMat _Aeq, Rcpp::NumericVector _beq, - Rcpp::NumericVector _lb, Rcpp::NumericVector _ub) : Aineq(_Aineq), bineq(_bineq), Aeq(_Aeq), beq(_beq), - lb(_lb), ub(_ub), dimension(_Aineq.cols()), type(5) {} - sparse_constraint_problem(SpMat _Aeq, Rcpp::NumericVector _beq) : Aineq(SpMat(0, _Aeq.cols())), bineq(Rcpp::NumericVector(0)), Aeq(_Aeq), beq(_beq), - lb(Rcpp::NumericVector(_Aeq.cols(),-1e9)), ub(Rcpp::NumericMatrix(_Aeq.cols(),1e9)), dimension(_Aeq.cols()), type(5) {} - SpMat Aineq; - Rcpp::NumericVector bineq; - SpMat Aeq; - Rcpp::NumericVector beq; - Rcpp::NumericVector lb; - Rcpp::NumericVector ub; - unsigned int dimension; - int type; -}; -RCPP_MODULE(polytopes){ - using namespace Rcpp ; - - //' An exposed class to represent a H-polytope - //' - //' @description A H-polytope is a convex polytope defined by a set of linear inequalities or equivalently a \eqn{d}-dimensional H-polytope with \eqn{m} facets is defined by a \eqn{m\times d} matrix A and a \eqn{m}-dimensional vector b, s.t.: \eqn{Ax\leq b}. - //' - //' @field A \eqn{m\times d} numerical matrix A - //' @field b \eqn{m}-dimensional vector b - //' @field Aeq \eqn{q\times d} numerical matrix Aeq - //' @field beq \eqn{q}-dimensional vector beq - //' @field volume The volume of the polytope. - //' @field dimension An integer that declares the dimension of the polytope. It has not be given to the constructor. - //' @field type An integer that declares the representation of the polytope. For H-representation the default value is 1. It has not be given to the constructor. - //' - //' @example - //' # create a 2-d unit simplex - //' A = matrix(c(-1,0,0,-1,1,1), ncol=2, nrow=3, byrow=TRUE) - //' b = c(0,0,1) - //' P = Hpolytope$new(A,b) - //' @export - class_("Hpolytope") - // expose the default constructor - .constructor() - .constructor() - .constructor() - .constructor() - .constructor() - - .field( "A", &Hpolytope::A ) - .field( "b", &Hpolytope::b ) - .field( "Aeq", &Hpolytope::Aeq ) - .field( "beq", &Hpolytope::beq ) - .field( "volume", &Hpolytope::vol ) - .field( "dimension", &Hpolytope::dimension ) - .field( "type", &Hpolytope::type ); - - //' An exposed C++ class to represent a V-polytope - //' - //' @description A V-polytope is a convex polytope defined by the set of its vertices. - //' - //' @field V \eqn{m\times d} numerical matrix that contains the vertices row-wise - //' @field volume The volume of the polytope. - //' @field dimension An integer that declares the dimension of the polytope. It has not be given to the constructor. - //' @field type An integer that declares the representation of the polytope. For H-representation the default value is 2. It has not be given to the constructor. - //' - //' @example - //' # Create a 2-d cube in V-representation - //' V = matrix(c(-1,1,1,1,1,-1,-1,-1), ncol=3, byrow=TRUE) - //' P = Vpolytope$new(V) - //' @export - class_("Vpolytope") - // expose the default constructor - .constructor() - .constructor() - .constructor() - - .field( "V", &Vpolytope::V ) - .field( "volume", &Vpolytope::vol ) - .field( "dimension", &Vpolytope::dimension ) - .field( "type", &Vpolytope::type ); - - //' An exposed C++ class to represent a zonotope - //' - //' @description A zonotope is a convex polytope defined by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. - //' - //' @field G \eqn{m\times d} numerical matrix that contains the segments (or generators) row-wise - //' @field volume The volume of the polytope. - //' @field dimension An integer that declares the dimension of the polytope. It has not be given to the constructor. - //' @field type An integer that declares the representation of the polytope. For H-representation the default value is 3. It has not be given to the constructor. - //' - //' @example - //' # Create a 2-d zonotope with 4 generators - //' G = matrix(c(1,0,0,1,-0.73,0.67,-0.25,0.96), ncol = 2, nrow = 4, byrow = TRUE) - //' P = Zonotope$new(G) - //' @export - class_("Zonotope") - // expose the default constructor - .constructor() - .constructor() - .constructor() - - .field( "G", &Zonotope::G ) - .field( "volume", &Zonotope::vol ) - .field( "dimension", &Zonotope::dimension ) - .field( "type", &Zonotope::type ); - - //' An exposed C++ class to represent an intersection of two V-polytopes - //' - //' @description An intersection of two V-polytopes is defined by the intersection of the two coresponding convex hulls. - //' - //' @field V1 \eqn{m\times d} numerical matrix that contains the vertices of the first V-polytope (row-wise) - //' @field V2 \eqn{q\times d} numerical matrix that contains the vertices of the second V-polytope (row-wise) - //' @field volume The volume of the polytope. - //' @field dimension An integer that declares the dimension of the polytope. It has not be given to the constructor. - //' @field type An integer that declares the representation of the polytope. For H-representation the default value is 4. It has not be given to the constructor. - //' - //' @example - //' # define the intwrsection of a 2-d simplex with a 2-d cross polytope - //' P1 = gen_simplex(2,'V') - //' P2 = gen_cross(2,'V') - //' P = VpolytopeIntersection$new(P1$V, P2$V) - //' @export - class_("VpolytopeIntersection") - // expose the default constructor - .constructor() - .constructor() - .constructor() - - .field( "V1", &VPinterVP::V1 ) - .field( "V2", &VPinterVP::V2 ) - .field( "volume", &VPinterVP::vol ) - .field( "dimension", &VPinterVP::dimension ) - .field( "type", &VPinterVP::type ); - - //' An exposed class to represent a sparse constraint problem - //' - //' @description A constraint problem is defined by a set of linear inequalities and equalities or equivalently a \eqn{d}-dimensional constraint problem is defined by a \eqn{mineq\times d} matrix Aineq and a \eqn{mineq}-dimensional vector bineq, s.t.: \eqn{Aineqx\leq bineq}, a \eqn{meq\times d} matrix Aeq and a \eqn{meq}-dimensional vector beq, s.t.: \eqn{Aeqx\eq beq} and two \eqn{d} vectors lb, ub such that \eqn{lb\leq x \leq ub}. - //' - //' @field Aineq \eqn{mineq\times d} sparse matrix Aineq - //' @field bineq \eqn{mineq}-dimensional vector bineq - //' @field Aeq \eqn{meq\times d} sparse matrix Aeq - //' @field beq \eqn{meq}-dimensional vector beq - //' @field lb \eqn{d}-dimensional vector lb - //' @field ub \eqn{d}-dimensional vector ub - //' @field dimension An integer that declares the dimension of the polytope. It has not be given to the constructor. - //' @field type An integer that declares the representation of the polytope. For sparse_constraint_problem the default value is 5. It has not be given to the constructor. - //' - //' @example - //' # create a 2-d unit simplex - //' Aineq = matrix(, nrow=0, ncol=2, byrow = TRUE) - //' Aineq = as( Aineq, 'dgCMatrix' ) - //' bineq= matrix(,nrow=0, ncol=1, byrow=TRUE) - //' Aeq = matrix(c(1,1), ncol=2, nrow=1, byrow=TRUE) - //' Aeq = as( Aeq, 'dgCMatrix' ) - //' beq = c(1) - //' lb = c(0,0) - //' ub = c(1,1) - //' P = sparse_constraint_problem$new(Aineq, bineq, Aeq, beq, lb, ub) - //' @export - class_("sparse_constraint_problem") - // expose the default constructor - .constructor() - .constructor() - .constructor() - .constructor() - - .field( "Aineq", &sparse_constraint_problem::Aineq ) - .field( "bineq", &sparse_constraint_problem::bineq ) - .field( "Aeq", &sparse_constraint_problem::Aeq ) - .field( "beq", &sparse_constraint_problem::beq ) - .field( "lb", &sparse_constraint_problem::lb ) - .field( "ub", &sparse_constraint_problem::ub ) - .field( "dimension", &sparse_constraint_problem::dimension ) - .field( "type", &sparse_constraint_problem::type ); -} - -extern SEXP _rcpp_module_boot_polytopes(void); diff --git a/R-proj/src/psrf_multivariate.cpp b/R-proj/src/psrf_multivariate.cpp deleted file mode 100644 index d9392f3f8..000000000 --- a/R-proj/src/psrf_multivariate.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 20014-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis - -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - - -#include -#include -#include -#include -#include -#include -#include -#include "diagnostics/multivariate_psrf.hpp" - -//' Gelman-Rubin Potential Scale Reduction Factor (PSRF) -//' -//' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -//' -//' @references \cite{Gelman, A. and Rubin, D. B., -//' \dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} -//' -//' @references \cite{Brooks, S. and Gelman, A., -//' \dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -//' -//' @return The value of multivariate PSRF by S. Brooks and A. Gelman. -//' -//' @export -// [[Rcpp::export]] -double psrf_multivariate(Rcpp::NumericMatrix samples) -{ - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - return multivariate_psrf(Rcpp::as(samples)); -} diff --git a/R-proj/src/psrf_univariate.cpp b/R-proj/src/psrf_univariate.cpp deleted file mode 100644 index f01edadaf..000000000 --- a/R-proj/src/psrf_univariate.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 20014-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis - -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - - -#include -#include -#include -#include -#include -#include -#include -#include "diagnostics/univariate_psrf.hpp" -#include "diagnostics/interval_psrf.hpp" - -//' Gelman-Rubin and Brooks-Gelman Potential Scale Reduction Factor (PSRF) for each marginal -//' -//' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -//' @param method A string to reauest diagnostic: (i) \code{'normal'} for psrf of Gelman-Rubin and (ii) \code{'interval'} for psrf of Brooks-Gelman. -//' -//' @references \cite{Gelman, A. and Rubin, D. B., -//' \dQuote{Inference from iterative simulation using multiple sequences,} \emph{Statistical Science,} 1992.} -//' -//' @references \cite{Brooks, S. and Gelman, A., -//' \dQuote{General Methods for Monitoring Convergence of Iterative Simulations,} \emph{Journal of Computational and Graphical Statistics,} 1998.} -//' -//' @return A vector that contains the values of PSRF for each coordinate -//' -//' @export -// [[Rcpp::export]] -Rcpp::NumericVector psrf_univariate(Rcpp::NumericMatrix samples, - Rcpp::Nullable method = R_NilValue) -{ - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - VT scores(samples.nrow()); - - std::string method_rcpp = std::string("normal"); - if(method.isNotNull()) { - method_rcpp = Rcpp::as(method); - } - - if (method_rcpp.compare(std::string("normal")) == 0) { - scores = univariate_psrf(Rcpp::as(samples)); - } else if(method_rcpp.compare(std::string("interval")) == 0) { - scores = interval_psrf(Rcpp::as(samples)); - } else { - throw Rcpp::exception("Unknown method!"); - } - - return Rcpp::wrap(scores); -} diff --git a/R-proj/src/raftery.cpp b/R-proj/src/raftery.cpp deleted file mode 100644 index e8e4f9ec8..000000000 --- a/R-proj/src/raftery.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2020 Apostolos Chalkis - -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - - -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "diagnostics/raftery.hpp" - -//' Raftery and Lewis MCMC diagnostic -//' -//' @param samples A matrix that contans column-wise the sampled points from a geometric random walk. -//' @param q Optional. The quantile of the quantity of interest. The default value is 0.025. -//' @param r Optional. The level of precision desired. The default value is 0.01. -//' @param s Optional. The probability associated with r. The default value is 0.95. -//' -//' @references \cite{Raftery, A. E. and Lewis, S. M., -//' \dQuote{How many iterations in the Gibbs sampler?,} \emph{Bayesian Statistics 4. Proceedings of the Fourth Valencia International Meeting,} 1992.} -//' -//' @return (i) The number of draws required for burn-in, (ii) the skip parameter for 1st-order Markov chain, (iii) the skip parameter sufficient to get independence chain, (iv) the number of draws required to achieve r precision, (v) the number of draws if the chain is white noise, (vi) the I-statistic from Raftery and Lewis (1992). -//' -//' @export -// [[Rcpp::export]] -Rcpp::NumericMatrix raftery(Rcpp::NumericMatrix samples, - Rcpp::Nullable q = R_NilValue, - Rcpp::Nullable r = R_NilValue, - Rcpp::Nullable s = R_NilValue) -{ - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - NT _q = (!q.isNotNull()) ? 0.025 : Rcpp::as(q); - NT _r = (!r.isNotNull()) ? 0.01 : Rcpp::as(r); - NT _s = (!s.isNotNull()) ? 0.95 : Rcpp::as(s); - - MT results = perform_raftery(Rcpp::as(samples), _q, _r, _s); - - return Rcpp::wrap(results); -} diff --git a/R-proj/src/rotating.cpp b/R-proj/src/rotating.cpp deleted file mode 100644 index 607c00921..000000000 --- a/R-proj/src/rotating.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 program. - - -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "volume/volume_sequence_of_balls.hpp" -#include "volume/rotating.hpp" -#include "extractMatPoly.h" - -//' An internal Rccp function for the random rotation of a convex polytope -//' -//' @param P A convex polytope (H-, V-polytope or a zonotope). -//' @param T Optional. A rotation matrix. -//' @param seed Optional. A fixed seed for the random linear map generator. -//' -//' @keywords internal -//' -//' @return A matrix that describes the rotated polytope -// [[Rcpp::export]] -Rcpp::NumericMatrix rotating (Rcpp::Reference P, Rcpp::Nullable T = R_NilValue, - Rcpp::Nullable seed = R_NilValue){ - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef BoostRandomNumberGenerator RNGType; - typedef HPolytope Hpolytope; - typedef VPolytope Vpolytope; - typedef Zonotope zonotope; - typedef IntersectionOfVpoly InterVP; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - MT TransorfMat; - Rcpp::NumericMatrix Mat; - unsigned int n = P.field("dimension"), type = P.field("type"); - - int seed_rcpp = (!seed.isNotNull()) ? std::chrono::system_clock::now() - .time_since_epoch().count() - : Rcpp::as(seed); - - switch (type) { - case 1: { - // Hpolytope - Hpolytope HP(n, Rcpp::as(P.field("A")), Rcpp::as(P.field("b"))); - if (T.isNotNull()) { - TransorfMat = Rcpp::as(T); - HP.linear_transformIt(TransorfMat.inverse()); - } else { - TransorfMat = rotating < MT > (HP, seed_rcpp); - } - Mat = extractMatPoly(HP); - break; - } - case 2: { - // Vpolytope - Vpolytope VP(n, Rcpp::as(P.field("V")), VT::Ones(Rcpp::as(P.field("V")).rows())); - if (T.isNotNull()) { - TransorfMat = Rcpp::as(T); - VP.linear_transformIt(TransorfMat.inverse()); - } else { - TransorfMat = rotating < MT > (VP, seed_rcpp); - } - Mat = extractMatPoly(VP); - break; - } - case 3: { - // Zonotope - zonotope ZP(n, Rcpp::as(P.field("G")), VT::Ones(Rcpp::as(P.field("G")).rows())); - if (T.isNotNull()) { - TransorfMat = Rcpp::as(T); - ZP.linear_transformIt(TransorfMat.inverse()); - } else { - TransorfMat = rotating < MT > (ZP, seed_rcpp); - } - Mat = extractMatPoly(ZP); - break; - } - case 4: { - throw Rcpp::exception("volesti does not support rotation for this representation currently."); - } - } - - TransorfMat.conservativeResize(n+1, n); - TransorfMat.row(n) = VT::Ones(n); - MT res(TransorfMat.rows(), Rcpp::as(Mat).rows()+n); - res << Rcpp::as(Mat).transpose(), TransorfMat; - return Rcpp::wrap(res); -} diff --git a/R-proj/src/rounding.cpp b/R-proj/src/rounding.cpp deleted file mode 100644 index 0b2cbe0f0..000000000 --- a/R-proj/src/rounding.cpp +++ /dev/null @@ -1,142 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 program. -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - - -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "random_walks/random_walks.hpp" -#include "volume/volume_sequence_of_balls.hpp" -#include "volume/volume_cooling_gaussians.hpp" -#include "preprocess/min_sampling_covering_ellipsoid_rounding.hpp" -#include "preprocess/svd_rounding.hpp" -#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" -#include "extractMatPoly.h" - -template -< - typename MT, - typename VT, - typename WalkType, - typename Polytope, - typename Point, - typename NT, - typename RNGType -> -std::tuple apply_rounding(Polytope &P, - std::string const& method_rcpp, - unsigned int const& walkL, - std::pair &InnerBall, - RNGType &rng) -{ - std::tuple round_res; - if (method_rcpp.compare(std::string("min_ellipsoid")) == 0) { - round_res = min_sampling_covering_ellipsoid_rounding(P, InnerBall, walkL, rng); - } else if (method_rcpp.compare(std::string("isotropy")) == 0) { - round_res = svd_rounding(P, InnerBall, walkL, rng); - } else { - throw Rcpp::exception("Unknown method!"); - } - return round_res; -} - -//' Internal rcpp function for the rounding of a convex polytope -//' -//' @param P A convex polytope (H- or V-representation or zonotope). -//' @param method Optional. The method to use for rounding, a) \code{'min_ellipsoid'} for the method based on mimimmum volume enclosing ellipsoid of a uniform sample from P, b) \code{'max_ellipsoid'} for the method based on maximum volume enclosed ellipsoid in P, (c) \code{'isotropy'} for the method based on isotropy. The default method is \code{'min_ellipsoid'} for all the representations. -//' @param seed Optional. A fixed seed for the number generator. -//' -//' @keywords internal -//' -//' @return A numerical matrix that describes the rounded polytope, a numerical matrix of the inverse linear transofmation that is applied on the input polytope, the numerical vector the the input polytope is shifted and the determinant of the matrix of the linear transformation that is applied on the input polytope. -// [[Rcpp::export]] -Rcpp::List rounding (Rcpp::Reference P, - Rcpp::Nullable method = R_NilValue, - Rcpp::Nullable seed = R_NilValue){ - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef BoostRandomNumberGenerator RNGType; - typedef HPolytope Hpolytope; - typedef VPolytope Vpolytope; - typedef Zonotope zonotope; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - - unsigned int n = P.field("dimension"), walkL = 2, type = P.field("type"); - std::string method_rcpp = std::string("isotropy"); - if(method.isNotNull()) { - method_rcpp = Rcpp::as(method); - if (method_rcpp.compare(std::string("max_ellipsoid")) == 0 && type != 1) { - Rcpp::exception("This method can not be used for V- or Z-polytopes!"); - } - } - - RNGType rng(n); - if (seed.isNotNull()) { - unsigned seed_rcpp = Rcpp::as(seed); - rng.set_seed(seed_rcpp); - } - - std::pair InnerBall; - Rcpp::NumericMatrix Mat; - - std::tuple round_res; - switch (type) { - case 1: { - // Hpolytope - - if (Rcpp::as(P.field("Aeq")).rows() > 0) { - throw Rcpp::exception("volesti supports rounding for full dimensional polytopes"); - } - Hpolytope HP(n, Rcpp::as(P.field("A")), Rcpp::as(P.field("b"))); - InnerBall = HP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - if (method_rcpp.compare(std::string("max_ellipsoid")) == 0) { - round_res = max_inscribed_ellipsoid_rounding(HP, InnerBall.first); - } else { - round_res = apply_rounding(HP, method_rcpp, walkL, InnerBall, rng); - } - Mat = extractMatPoly(HP); - break; - } - case 2: { - // Vpolytope - Vpolytope VP(n, Rcpp::as(P.field("V")), VT::Ones(Rcpp::as(P.field("V")).rows())); - InnerBall = VP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - round_res = apply_rounding(VP, method_rcpp, walkL, InnerBall, rng); - Mat = extractMatPoly(VP); - break; - } - case 3: { - // Zonotope - zonotope ZP(n, Rcpp::as(P.field("G")), VT::Ones(Rcpp::as(P.field("G")).rows())); - InnerBall = ZP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - round_res = apply_rounding(ZP, method_rcpp, walkL, InnerBall, rng); - Mat = extractMatPoly(ZP); - break; - } - case 4: { - throw Rcpp::exception("volesti does not support rounding for this representation currently."); - } - } - - return Rcpp::List::create(Rcpp::Named("Mat") = Mat, Rcpp::Named("T") = Rcpp::wrap(std::get<0>(round_res)), - Rcpp::Named("shift") = Rcpp::wrap(std::get<1>(round_res)), - Rcpp::Named("round_value") = std::get<2>(round_res)); -} diff --git a/R-proj/src/sample_points.cpp b/R-proj/src/sample_points.cpp deleted file mode 100644 index 1014e74ea..000000000 --- a/R-proj/src/sample_points.cpp +++ /dev/null @@ -1,795 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2021 Vissarion Fisikopoulos -// Copyright (c) 2018-2021 Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 and 2019 program. - -// Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - - -#include -#include -#include -#include -#include -#include -#include -#include "random_walks/random_walks.hpp" -#include "volume/volume_sequence_of_balls.hpp" -#include "volume/volume_cooling_gaussians.hpp" -#include "sampling/sampling.hpp" -#include "ode_solvers/ode_solvers.hpp" -#include "oracle_functors_rcpp.h" -#include "preprocess/crhmc/constraint_problem.h" -enum random_walks { - ball_walk, - rdhr, - cdhr, - billiard, - accelarated_billiard, - dikin_walk, - vaidya_walk, - john_walk, - brdhr, - bcdhr, - hmc, - nuts, - gaussian_hmc, - exponential_hmc, - uld, - crhmc -}; - -template < - typename Polytope, - typename RNGType, - typename PointList, - typename NT, - typename Point, - typename NegativeGradientFunctor, - typename NegativeLogprobFunctor, - typename HessianFunctor -> -void sample_from_polytope(Polytope &P, int type, RNGType &rng, PointList &randPoints, - unsigned int const& walkL, unsigned int const& numpoints, - bool const& gaussian, NT const& a, NT const& L, Point const& c, - Point const& StartingPoint, unsigned int const& nburns, - bool const& set_L, NT const& eta, random_walks walk, - NegativeGradientFunctor *F=NULL, NegativeLogprobFunctor *f=NULL, - HessianFunctor *h=NULL, ode_solvers solver_type = no_solver) -{ - switch (walk) - { - case bcdhr: - uniform_sampling_boundary (randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - break; - case brdhr: - uniform_sampling_boundary (randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - break; - case cdhr: - if(gaussian) { - gaussian_sampling(randPoints, P, rng, walkL, numpoints, - a, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case rdhr: - if(gaussian) { - gaussian_sampling(randPoints, P, rng, walkL, numpoints, - a, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case gaussian_hmc: - if(set_L) { - GaussianHamiltonianMonteCarloExactWalk WalkType(L); - gaussian_sampling(randPoints, P, rng, WalkType, walkL, numpoints, a, StartingPoint, nburns); - } else { - gaussian_sampling(randPoints, P, rng, walkL, numpoints, a, - StartingPoint, nburns); - } - break; - case vaidya_walk: - if (set_L) { - VaidyaWalk WalkType(L); - uniform_sampling(randPoints, P, rng, WalkType, walkL, numpoints, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case dikin_walk: - if (set_L) { - DikinWalk WalkType(L); - uniform_sampling(randPoints, P, rng, WalkType, walkL, numpoints, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case john_walk: - if (set_L) { - JohnWalk WalkType(L); - uniform_sampling(randPoints, P, rng, WalkType, walkL, numpoints, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case billiard: - if(set_L) { - BilliardWalk WalkType(L); - uniform_sampling(randPoints, P, rng, WalkType, walkL, numpoints, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case accelarated_billiard: - if(set_L) { - AcceleratedBilliardWalk WalkType(L); - uniform_sampling(randPoints, P, rng, WalkType, walkL, numpoints, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - break; - case exponential_hmc: - if (set_L) { - ExponentialHamiltonianMonteCarloExactWalk WalkType(L); - exponential_sampling(randPoints, P, rng, WalkType, walkL, numpoints, c, a, StartingPoint, nburns); - } else { - exponential_sampling(randPoints, P, rng, walkL, numpoints, c, a, - StartingPoint, nburns); - } - break; - case ball_walk: - if (set_L) { - if (gaussian) { - GaussianBallWalk WalkType(L); - gaussian_sampling(randPoints, P, rng, WalkType, walkL, numpoints, a, - StartingPoint, nburns); - } else { - BallWalk WalkType(L); - uniform_sampling(randPoints, P, rng, WalkType, walkL, numpoints, - StartingPoint, nburns); - } - } else { - if(gaussian) { - gaussian_sampling(randPoints, P, rng, walkL, numpoints, - a, StartingPoint, nburns); - } else { - uniform_sampling(randPoints, P, rng, walkL, numpoints, - StartingPoint, nburns); - } - } - break; - case hmc: - switch (solver_type) { - case leapfrog: - logconcave_sampling < - PointList, - Polytope, - RNGType, - HamiltonianMonteCarloWalk, - NT, - Point, - NegativeGradientFunctor, - NegativeLogprobFunctor, - LeapfrogODESolver < - Point, - NT, - Polytope, - NegativeGradientFunctor - > - >(randPoints, P, rng, walkL, numpoints, StartingPoint, nburns, *F, *f); - break; - case euler: - logconcave_sampling < - PointList, - Polytope, - RNGType, - HamiltonianMonteCarloWalk, - NT, - Point, - NegativeGradientFunctor, - NegativeLogprobFunctor, - EulerODESolver < - Point, - NT, - Polytope, - NegativeGradientFunctor - > - >(randPoints, P, rng, walkL, numpoints, StartingPoint, nburns, *F, *f); - break; - default: - break; - } - - break; - case crhmc:{ - execute_crhmc(P, rng, randPoints, walkL, numpoints, nburns, F, f, h); - break; - } - case nuts: - - logconcave_sampling < - PointList, - Polytope, - RNGType, - NutsHamiltonianMonteCarloWalk, - NT, - Point, - NegativeGradientFunctor, - NegativeLogprobFunctor, - LeapfrogODESolver < - Point, - NT, - Polytope, - NegativeGradientFunctor - > - >(randPoints, P, rng, walkL, numpoints, StartingPoint, nburns, *F, *f); - - break; - case uld: - - logconcave_sampling < - PointList, - Polytope, - RNGType, - UnderdampedLangevinWalk, - NT, - Point, - NegativeGradientFunctor, - NegativeLogprobFunctor, - LeapfrogODESolver < - Point, - NT, - Polytope, - NegativeGradientFunctor - > - >(randPoints, P, rng, walkL, numpoints, StartingPoint, nburns, *F, *f); - - break; - default: - throw Rcpp::exception("Unknown random walk!"); - } -} - -//' Sample uniformly, normally distributed, or logconcave distributed points from a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes). -//' -//' @param P A convex polytope. It is an object from class (a) Hpolytope or (b) Vpolytope or (c) Zonotope or (d) VpolytopeIntersection. -//' @param n The number of points that the function is going to sample from the convex polytope. -//' @param random_walk Optional. A list that declares the random walk and some related parameters as follows: -//' \itemize{ -//' \item{\code{walk} }{ A string to declare the random walk: i) \code{'CDHR'} for Coordinate Directions Hit-and-Run, -//' ii) \code{'RDHR'} for Random Directions Hit-and-Run, iii) \code{'BaW'} for Ball Walk, iv) \code{'BiW'} for Billiard walk, -//' v) \code{'dikin'} for dikin walk, vi) \code{'vaidya'} for vaidya walk, vii) \code{'john'} for john walk, -//' viii) \code{'BCDHR'} boundary sampling by keeping the extreme points of CDHR or ix) \code{'BRDHR'} boundary sampling by keeping the extreme points of RDHR, -//' x) \code{'NUTS'} for NUTS Hamiltonian Monte Carlo sampler (logconcave densities), xi) \code{'HMC'} for Hamiltonian Monte Carlo (logconcave densities), -//' xii) CRHMC for Riemannian HMC with H-polytope constraints (uniform and general logconcave densities), -//' xiii) \code{'ULD'} for Underdamped Langevin Dynamics using the Randomized Midpoint Method (logconcave densities), -//' xiii) \code{'ExactHMC'} for exact Hamiltonian Monte Carlo with reflections (spherical Gaussian or exponential distribution). -//' The default walk is \code{'aBiW'} for the uniform distribution, \code{'CDHR'} for the Gaussian distribution and H-polytopes and -//' \code{'BiW'} or \code{'RDHR'} for the same distributions and V-polytopes and zonotopes. \code{'NUTS'} is the default sampler for logconcave densities and \code{'CRHMC'} -//' for logconcave densities with H-polytope and sparse constrainted problems.} -//' \item{\code{walk_length} }{ The number of the steps per generated point for the random walk. The default value is \eqn{1}.} -//' \item{\code{nburns} }{ The number of points to burn before start sampling. The default value is \eqn{1}.} -//' \item{\code{starting_point} }{ A \eqn{d}-dimensional numerical vector that declares a starting point in the interior of the polytope for the random walk. The default choice is the center of the ball as that one computed by the function \code{inner_ball()}.} -//' \item{\code{BaW_rad} }{ The radius for the ball walk.} -//' \item{\code{L} }{ The maximum length of the billiard trajectory or the radius for the step of dikin, vaidya or john walk.} -//' \item{\code{solver} }{ Specify ODE solver for logconcave sampling. Options are i) leapfrog, ii) euler iii) runge-kutta iv) richardson} -//' \item{\code{step_size }{ Optionally chosen step size for logconcave sampling. Defaults to a theoretical value if not provided.} -//' } -//' @param distribution Optional. A list that declares the target density and some related parameters as follows: -//' \itemize{ -//' \item{\code{density} }{ A string: (a) \code{'uniform'} for the uniform distribution or b) \code{'gaussian'} for the multidimensional spherical distribution c) \code{logconcave} with form proportional to exp(-f(x)) where f(x) is L-smooth and m-strongly-convex d) \code{'exponential'} for the exponential distribution. The default target distribution is the uniform distribution.} -//' \item{\code{variance} }{ The variance of the multidimensional spherical gaussian or the exponential distribution. The default value is 1.} -//' \item{\code{mode} }{ A \eqn{d}-dimensional numerical vector that declares the mode of the Gaussian distribution. The default choice is the center of the as that one computed by the function \code{inner_ball()}.} -//' \item{\code{bias} }{ The bias vector for the exponential distribution. The default vector is \eqn{c_1 = 1} and \eqn{c_i = 0} for \eqn{i \neq 1}.} -//' \item{\code{L_} }{ Smoothness constant (for logconcave). } -//' \item{\code{m} }{ Strong-convexity constant (for logconcave). } -//' \item{\code{negative_logprob} }{ Negative log-probability (for logconcave). } -//' \item{\code{negative_logprob_gradient} }{ Negative log-probability gradient (for logconcave). } -//' } -//' @param seed Optional. A fixed seed for the number generator. -//' -//' @references \cite{Robert L. Smith, -//' \dQuote{Efficient Monte Carlo Procedures for Generating Points Uniformly Distributed Over Bounded Regions,} \emph{Operations Research,} 1984.}, -//' -//' @references \cite{B.T. Polyak, E.N. Gryazina, -//' \dQuote{Billiard walk - a new sampling algorithm for control and optimization,} \emph{IFAC Proceedings Volumes,} 2014.}, -//' -//' @references \cite{Y. Chen, R. Dwivedi, M. J. Wainwright and B. Yu, -//' \dQuote{Fast MCMC Sampling Algorithms on Polytopes,} \emph{Journal of Machine Learning Research,} 2018.} -//' -//' @references \cite{Lee, Yin Tat, Ruoqi Shen, and Kevin Tian, -//' \dQuote{"Logsmooth Gradient Concentration and Tighter Runtimes for Metropolized Hamiltonian Monte Carlo,"} \emph{arXiv preprint arXiv:2002.04121}, 2020.} -//' -//' @references \cite{Shen, Ruoqi, and Yin Tat Lee, -//' \dQuote{"The randomized midpoint method for log-concave sampling.",} \emph{Advances in Neural Information Processing Systems}, 2019.} -//' -//' @references \cite{Augustin Chevallier, Sylvain Pion, Frederic Cazals, -//' \dQuote{"Hamiltonian Monte Carlo with boundary reflections, and application to polytope volume calculations,"} \emph{Research Report preprint hal-01919855}, 2018.} -//' -//' @return A \eqn{d\times n} matrix that contains, column-wise, the sampled points from the convex polytope P. -//' @examples -//' # uniform distribution from the 3d unit cube in H-representation using ball walk -//' P = gen_cube(3, 'H') -//' points = sample_points(P, n = 100, random_walk = list("walk" = "BaW", "walk_length" = 5)) -//' -//' # gaussian distribution from the 2d unit simplex in H-representation with variance = 2 -//' A = matrix(c(-1,0,0,-1,1,1), ncol=2, nrow=3, byrow=TRUE) -//' b = c(0,0,1) -//' P = Hpolytope$new(A,b) -//' points = sample_points(P, n = 100, distribution = list("density" = "gaussian", "variance" = 2)) -//' -//' # uniform points from the boundary of a 2-dimensional random H-polytope -//' P = gen_rand_hpoly(2,20) -//' points = sample_points(P, n = 100, random_walk = list("walk" = "BRDHR")) -//' -//' # For sampling from logconcave densities see the examples directory -//' -//' @export -// [[Rcpp::export]] -Rcpp::NumericMatrix sample_points(Rcpp::Nullable P, - Rcpp::Nullable n, - Rcpp::Nullable random_walk = R_NilValue, - Rcpp::Nullable distribution = R_NilValue, - Rcpp::Nullable seed = R_NilValue){ - - typedef double NT; - typedef Cartesian Kernel; - typedef BoostRandomNumberGenerator RNGType; - typedef typename Kernel::Point Point; - typedef HPolytope Hpolytope; - typedef VPolytope Vpolytope; - typedef Zonotope zonotope; - typedef IntersectionOfVpoly InterVP; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - typedef Eigen::SparseMatrix SpMat; - typedef constraint_problem sparse_problem; - - unsigned int type = Rcpp::as(P).field("type"), dim = Rcpp::as(P).field("dimension"), - walkL = 1, numpoints, nburns = 0; - - RcppFunctor::GradientFunctor *F = NULL; - RcppFunctor::FunctionFunctor *f = NULL; - RcppFunctor::HessianFunctor *h = NULL; - - GaussianFunctor::GradientFunctor *G = NULL; - GaussianFunctor::FunctionFunctor *g = NULL; - GaussianFunctor::HessianFunctor *hess_g = NULL; - bool functor_defined = true; - - - RNGType rng(dim); - if (seed.isNotNull()) { - unsigned seed_rcpp = Rcpp::as(seed); - rng.set_seed(seed_rcpp); - } - - Point c(dim); - - NT radius = 1.0, L; - bool set_mode = false, gaussian = false, logconcave = false, exponential = false, - set_starting_point = false, set_L = false; - - random_walks walk; - ode_solvers solver; // Used only for logconcave sampling - - NT eta = 1; - std::list randPoints; - std::pair InnerBall; - Point mode(dim); - - numpoints = Rcpp::as(n); - if (numpoints <= 0) throw Rcpp::exception("The number of samples has to be a positive integer!"); - - if (!distribution.isNotNull() || !Rcpp::as(distribution).containsElementNamed("density")) { - walk = billiard; - } else if ( - Rcpp::as(Rcpp::as(distribution)["density"]).compare(std::string("uniform")) == 0) { - walk = billiard; - } else if ( - Rcpp::as(Rcpp::as(distribution)["density"]).compare(std::string("gaussian")) == 0) { - gaussian = true; - } else if ( - Rcpp::as(Rcpp::as(distribution)["density"]).compare(std::string("exponential")) == 0) { - walk = exponential_hmc; - exponential = true; - } else if ( - Rcpp::as(Rcpp::as(distribution)["density"]).compare(std::string("logconcave")) == 0) { - logconcave = true; - } else { - throw Rcpp::exception("Wrong distribution!"); - } - - if (Rcpp::as(distribution).containsElementNamed("mode")) { - if (!(gaussian || logconcave)) throw Rcpp::exception("Mode is given only for Gaussian/logconcave sampling!"); - if (Rcpp::as(Rcpp::as(distribution)["mode"]).size() != dim) { - throw Rcpp::exception("Mode has to be a point in the same dimension as the polytope P"); - } else { - set_mode = true; - VT temp = Rcpp::as(Rcpp::as(distribution)["mode"]); - mode = Point(dim, std::vector(&temp[0], temp.data() + temp.cols() * temp.rows())); - } - } - - NT a = 0.5; - if (Rcpp::as(distribution).containsElementNamed("variance")) { - a = 1.0 / (2.0 * Rcpp::as(Rcpp::as(distribution)["variance"])); - if (exponential) a = Rcpp::as(Rcpp::as(distribution)["variance"]); - if (!(gaussian || logconcave || exponential)) { - Rcpp::warning("The variance can be set only for Gaussian and exponential sampling!"); - } else if (a <= 0.0) { - throw Rcpp::exception("The variance has to be positive!"); - } - } - - if (Rcpp::as(distribution).containsElementNamed("bias")) { - c = Point(Rcpp::as(Rcpp::as(distribution)["bias"])); - } - - if (Rcpp::as(distribution).containsElementNamed("negative_logprob") && - Rcpp::as(distribution).containsElementNamed("negative_logprob_gradient")) { - - if (!logconcave) { - throw Rcpp::exception("The negative logprob and its gradient can be set only for logconcave sampling!"); - } - - // Parse arguments - Rcpp::Function negative_logprob = Rcpp::as(distribution)["negative_logprob"]; - Rcpp::Function negative_logprob_gradient = Rcpp::as(distribution)["negative_logprob_gradient"]; - - NT L_ = 1, m = 1; - - if (Rcpp::as(distribution).containsElementNamed("L_")) { - L_ = Rcpp::as(Rcpp::as(distribution)["L_"]); - if (L_ <= NT(0)) { - throw Rcpp::exception("The smoothness constant must be positive"); - } - } else { - L_ = -1; - } - - if (Rcpp::as(distribution).containsElementNamed("m")) { - m = Rcpp::as(Rcpp::as(distribution)["m"]); - if (m <= NT(0)) { - throw Rcpp::exception("The strong-convexity constant must be positive"); - } - } else { - m = -1; - } - - if (Rcpp::as(random_walk).containsElementNamed("step_size")) { - eta = NT(Rcpp::as(Rcpp::as(random_walk)["step_size"])); - if (eta <= NT(0)) { - throw Rcpp::exception("Step size must be positive"); - } - } else { - eta = NT(-1); - } - - if (Rcpp::as(random_walk).containsElementNamed("solver")) { - std::string solver_str = Rcpp::as(Rcpp::as(random_walk)["solver"]); - if (solver_str == "leapfrog") { - solver = leapfrog; - } else if (solver_str == "euler") { - solver = euler; - } else if (solver_str == "implicit_midpoint"){ - solver = implicit_midpoint; - } else { - throw Rcpp::exception("Invalid ODE solver specified. Aborting."); - } - } else { - solver = leapfrog; - } - // Create functors - RcppFunctor::parameters rcpp_functor_params(L_, m, eta, 2); - F = new RcppFunctor::GradientFunctor(rcpp_functor_params, negative_logprob_gradient); - f = new RcppFunctor::FunctionFunctor(rcpp_functor_params, negative_logprob); - if(Rcpp::as(distribution).containsElementNamed("negative_logprob_hessian")){ - Rcpp::Function negative_logprob_hessian = Rcpp::as(distribution)["negative_logprob_hessian"]; - h = new RcppFunctor::HessianFunctor(rcpp_functor_params, negative_logprob_hessian); - } - } - - else if (logconcave && !Rcpp::as(distribution).containsElementNamed("negative_logprob") && - !Rcpp::as(distribution).containsElementNamed("negative_logprob_gradient")) { - - functor_defined = false; - - if (Rcpp::as(random_walk).containsElementNamed("step_size")) { - eta = NT(Rcpp::as(Rcpp::as(random_walk)["step_size"])); - if (eta <= NT(0)) { - throw Rcpp::exception("Step size must be positive"); - } - } else { - eta = NT(-1); - } - - if (Rcpp::as(random_walk).containsElementNamed("solver")) { - std::string solver_str = Rcpp::as(Rcpp::as(random_walk)["solver"]); - if (solver_str == "leapfrog") { - solver = leapfrog; - } else if (solver_str == "euler") { - solver = euler; - } else if (solver_str == "implicit_midpoint"){ - solver = implicit_midpoint; - } else { - throw Rcpp::exception("Invalid ODE solver specified. Aborting."); - } - } else { - Rcpp::warning("Solver set to leapfrog."); - solver = leapfrog; - } - // Create functors - GaussianFunctor::parameters* gaussian_functor_params=new GaussianFunctor::parameters(mode, a, eta); - G = new GaussianFunctor::GradientFunctor(*gaussian_functor_params); - g = new GaussianFunctor::FunctionFunctor(*gaussian_functor_params); - hess_g = new GaussianFunctor::HessianFunctor(*gaussian_functor_params); - } - - if (!random_walk.isNotNull() || !Rcpp::as(random_walk).containsElementNamed("walk")) { - if (exponential) { - if (type !=1) { - throw Rcpp::exception("Exponential sampling is supported only for H-polytopes"); - } - walk = exponential_hmc; - } else if (logconcave) { - walk = (type == 5) ? crhmc : nuts; - } else if (gaussian) { - walk = (type == 1) ? cdhr : rdhr; - } else { - walk = (type == 1) ? accelarated_billiard : billiard; - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("CDHR")) == 0) { - walk = cdhr; - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("dikin")) == 0) { - walk = dikin_walk; - if (Rcpp::as(random_walk).containsElementNamed("L")) { - L = Rcpp::as(Rcpp::as(random_walk)["L"]); - set_L = true; - if (L <= 0.0) throw Rcpp::exception("L must be a postitive number!"); - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("vaidya")) == 0) { - walk = vaidya_walk; - if (Rcpp::as(random_walk).containsElementNamed("L")) { - L = Rcpp::as(Rcpp::as(random_walk)["L"]); - set_L = true; - if (L <= 0.0) throw Rcpp::exception("L must be a postitive number!"); - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("john")) == 0) { - walk = john_walk; - if (Rcpp::as(random_walk).containsElementNamed("L")) { - L = Rcpp::as(Rcpp::as(random_walk)["L"]); - set_L = true; - if (L <= 0.0) throw Rcpp::exception("L must be a postitive number!"); - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("RDHR")) == 0) { - walk = rdhr; - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("BaW")) == 0) { - walk = ball_walk; - if (Rcpp::as(random_walk).containsElementNamed("BaW_rad")) { - L = Rcpp::as(Rcpp::as(random_walk)["BaW_rad"]); - set_L = true; - if (L <= 0.0) throw Rcpp::exception("BaW diameter must be a postitive number!"); - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("BiW")) == 0) { - if (gaussian) throw Rcpp::exception("Billiard walk can be used only for uniform sampling!"); - walk = billiard; - if (Rcpp::as(random_walk).containsElementNamed("L")) { - L = Rcpp::as(Rcpp::as(random_walk)["L"]); - set_L = true; - if (L <= 0.0) throw Rcpp::exception("L must be a postitive number!"); - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("aBiW")) == 0) { - if (gaussian) throw Rcpp::exception("Billiard walk can be used only for uniform sampling!"); - walk = accelarated_billiard; - if (Rcpp::as(random_walk).containsElementNamed("L")) { - L = Rcpp::as(Rcpp::as(random_walk)["L"]); - set_L = true; - if (L <= 0.0) throw Rcpp::exception("L must be a postitive number!"); - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("BRDHR")) == 0) { - if (gaussian || exponential) throw Rcpp::exception("Gaussian sampling from the boundary is not supported!"); - walk = brdhr; - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("BCDHR")) == 0) { - if (gaussian) throw Rcpp::exception("Gaussian sampling from the boundary is not supported!"); - walk = bcdhr; - } else if(Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("ExactHMC")) == 0) { - if (!exponential && !gaussian) throw Rcpp::exception("Exact HMC is supported only for exponential or spherical Gaussian sampling."); - if(exponential){ - walk = exponential_hmc; - } else { - walk = gaussian_hmc; - } - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("HMC")) == 0) { - if (!logconcave) throw Rcpp::exception("HMC is not supported for non first-order sampling"); - if (F->params.L < 0) throw Rcpp::exception("The smoothness constant is absent"); - if (F->params.m < 0) throw Rcpp::exception("The strong-convexity constant is absent"); - walk = hmc; - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("NUTS")) == 0) { - if (!logconcave) throw Rcpp::exception("NUTS is not supported for non first-order sampling"); - walk = nuts; - } else if (Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("ULD")) == 0) { - if (!logconcave) throw Rcpp::exception("ULD is not supported for non first-order sampling"); - walk = uld; - } else if(Rcpp::as(Rcpp::as(random_walk)["walk"]).compare(std::string("CRHMC")) == 0){ - if (!logconcave) throw Rcpp::exception("CRHMC is used for logconcave sampling"); - if (type !=1 && type !=5 ) { - throw Rcpp::exception("CRHMC sampling is supported only for H-polytopes and Sparse Problems."); - } - walk =crhmc; - if(solver!=implicit_midpoint){ - Rcpp::warning("Solver set to implicit midpoint."); - } - solver = implicit_midpoint; - } else { - throw Rcpp::exception("Unknown walk type!"); - } - - Point StartingPoint; - if (Rcpp::as(random_walk).containsElementNamed("starting_point")) { - if (Rcpp::as(Rcpp::as(random_walk)["starting_point"]).size() != dim) { - throw Rcpp::exception("Starting Point has to lie in the same dimension as the polytope P"); - } else { - set_starting_point = true; - VT temp = Rcpp::as(Rcpp::as(random_walk)["starting_point"]); - StartingPoint = Point(dim, std::vector(&temp[0], temp.data() + temp.cols() * temp.rows())); - } - } - - if (Rcpp::as(random_walk).containsElementNamed("walk_length")) { - walkL = Rcpp::as(Rcpp::as(random_walk)["walk_length"]); - if (walkL <= 0) { - throw Rcpp::exception("The walk length has to be a positive integer!"); - } - } - - if (Rcpp::as(random_walk).containsElementNamed("nburns")) { - nburns = Rcpp::as(Rcpp::as(random_walk)["nburns"]); - if (nburns < 0) { - throw Rcpp::exception("The number of points to burn before sampling has to be a positive integer!"); - } - } - - switch(type) { - case 1: { - // Hpolytope - Hpolytope HP(dim, Rcpp::as(Rcpp::as(P).field("A")), - Rcpp::as(Rcpp::as(P).field("b"))); - - InnerBall = HP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - if (!set_starting_point || (!set_mode && gaussian)) { - if (!set_starting_point) StartingPoint = InnerBall.first; - if (!set_mode && gaussian) mode = InnerBall.first; - } - if (HP.is_in(StartingPoint) == 0) { - throw Rcpp::exception("The given point is not in the interior of the polytope!"); - } - if (gaussian) { - StartingPoint = StartingPoint - mode; - HP.shift(mode.getCoefficients()); - } - if (functor_defined) { - sample_from_polytope(HP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); - } - else { - sample_from_polytope(HP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, G, g, hess_g, solver); - } - break; - } - case 2: { - // Vpolytope - Vpolytope VP(dim, Rcpp::as(Rcpp::as(P).field("V")), - VT::Ones(Rcpp::as(Rcpp::as(P).field("V")).rows())); - - InnerBall = VP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - if (!set_starting_point || (!set_mode && gaussian)) { - if (!set_starting_point) StartingPoint = InnerBall.first; - if (!set_mode && gaussian) mode = InnerBall.first; - } - if (VP.is_in(StartingPoint) == 0) - throw Rcpp::exception("The given point is not in the interior of the polytope!"); - if (gaussian) { - StartingPoint = StartingPoint - mode; - VP.shift(mode.getCoefficients()); - } - sample_from_polytope(VP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); - break; - } - case 3: { - // Zonotope - zonotope ZP(dim, Rcpp::as(Rcpp::as(P).field("G")), - VT::Ones(Rcpp::as(Rcpp::as(P).field("G")).rows())); - - InnerBall = ZP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - if (!set_starting_point || (!set_mode && gaussian)) { - if (!set_starting_point) StartingPoint = InnerBall.first; - if (!set_mode && gaussian) mode = InnerBall.first; - } - if (ZP.is_in(StartingPoint) == 0) - throw Rcpp::exception("The given point is not in the interior of the polytope!"); - if (gaussian) { - StartingPoint = StartingPoint - mode; - ZP.shift(mode.getCoefficients()); - } - sample_from_polytope(ZP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); - break; - } - case 4: { - // Intersection of two V-polytopes - Vpolytope VP1(dim, Rcpp::as(Rcpp::as(P).field("V1")), - VT::Ones(Rcpp::as(Rcpp::as(P).field("V1")).rows())); - Vpolytope VP2(dim, Rcpp::as(Rcpp::as(P).field("V2")), - VT::Ones(Rcpp::as(Rcpp::as(P).field("V2")).rows())); - InterVP VPcVP(VP1, VP2); - - if (!VPcVP.is_feasible()) throw Rcpp::exception("Empty set!"); - InnerBall = VPcVP.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - if (!set_starting_point) StartingPoint = InnerBall.first; - if (!set_mode && gaussian) mode = InnerBall.first; - if (VPcVP.is_in(StartingPoint) == 0) - throw Rcpp::exception("The given point is not in the interior of the polytope!"); - if (gaussian) { - StartingPoint = StartingPoint - mode; - VPcVP.shift(mode.getCoefficients()); - } - sample_from_polytope(VPcVP, type, rng, randPoints, walkL, numpoints, gaussian, a, L, c, - StartingPoint, nburns, set_L, eta, walk, F, f, h, solver); - break; - } - case 5: { - // Sparse constraint_problem - SpMat Aeq = Rcpp::as(Rcpp::as(P).field("Aeq")); - VT beq= Rcpp::as(Rcpp::as(P).field("beq")); - SpMat Aineq = Rcpp::as(Rcpp::as(P).field("Aineq")); - VT bineq= Rcpp::as(Rcpp::as(P).field("bineq")); - VT lb= Rcpp::as(Rcpp::as(P).field("lb")); - VT ub= Rcpp::as(Rcpp::as(P).field("ub")); - sparse_problem problem(dim, Aeq, beq, Aineq, bineq, lb, ub); - if(walk!=crhmc){throw Rcpp::exception("Sparse problems are supported only by the CRHMC walk.");} - if (functor_defined) { - execute_crhmc, RcppFunctor::GradientFunctor,RcppFunctor::FunctionFunctor, RcppFunctor::HessianFunctor, CRHMCWalk, 8>(problem, rng, randPoints, walkL, numpoints, nburns, F, f, h); - } - else { - execute_crhmc, GaussianFunctor::GradientFunctor,GaussianFunctor::FunctionFunctor, GaussianFunctor::HessianFunctor, CRHMCWalk, 8>(problem, rng, randPoints, walkL, numpoints, nburns, G, g, hess_g); - } - break; - } - } - - if (numpoints % 2 == 1 && (walk == brdhr || walk == bcdhr)) numpoints--; - MT RetMat(dim, numpoints); - unsigned int jj = 0; - - for (typename std::list::iterator rpit = randPoints.begin(); rpit!=randPoints.end(); rpit++, jj++) { - if (gaussian) { - RetMat.col(jj) = (*rpit).getCoefficients() + mode.getCoefficients(); - } else { - RetMat.col(jj) = (*rpit).getCoefficients(); - } - } - - return Rcpp::wrap(RetMat); -} diff --git a/R-proj/src/spectrahedron.cpp b/R-proj/src/spectrahedron.cpp deleted file mode 100644 index e7926597c..000000000 --- a/R-proj/src/spectrahedron.cpp +++ /dev/null @@ -1,117 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2020 Apostolos Chalkis - -//Contributed and/or modified by Repouskos Panagiotis, as part of Google Summer of Code 2019 program. - -// Licensed under GNU LGPL.3, see LICENCE file - - -#include -#include -#include -#include "cartesian_geom/cartesian_kernel.h" -#include -#include -#include -#include -#include "convex_bodies/spectrahedra/LMI.h" -#include "convex_bodies/spectrahedra/spectrahedron.h" -#include "SDPAFormatManager.h" - -//' Write a SDPA format file -//' -//' Outputs a spectrahedron (the matrices defining a linear matrix inequality) and a vector (the objective function) -//' to a SDPA format file. -//' -//' @param spectrahedron A spectrahedron in n dimensions; must be an object of class Spectrahedron -//' @param objectiveFunction A numerical vector of length n -//' @param outputFile Name of the output file -//' -//' @examples -//' \dontrun{ -//' A0 = matrix(c(-1,0,0,0,-2,1,0,1,-2), nrow=3, ncol=3, byrow = TRUE) -//' A1 = matrix(c(-1,0,0,0,0,1,0,1,0), nrow=3, ncol=3, byrow = TRUE) -//' A2 = matrix(c(0,0,-1,0,0,0,-1,0,0), nrow=3, ncol=3, byrow = TRUE) -//' lmi = list(A0, A1, A2) -//' S = Spectrahedron$new(lmi); -//' objFunction = c(1,1) -//' writeSdpaFormatFile(S, objFunction, "output.txt") -//' } -//' @export -// [[Rcpp::export]] -void writeSdpaFormatFile(Rcpp::Nullable spectrahedron = R_NilValue, - Rcpp::Nullable objectiveFunction = R_NilValue, - Rcpp::Nullable outputFile = R_NilValue) { - - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef boost::mt19937 RNGType; - typedef LMI LMI; - typedef Spectrahedron Spectrahedron; - - std::vector matrices = Rcpp::as > (Rcpp::as (spectrahedron).field("matrices")); - LMI lmi(matrices); - Spectrahedron _spectrahedron(lmi); - Point c(Rcpp::as (objectiveFunction)); - - std::filebuf fb; - fb.open(Rcpp::as (outputFile), std::ios::out); - std::ostream os(&fb); - - SdpaFormatManager sdpaFormatManager; - sdpaFormatManager.writeSDPAFormatFile(os, _spectrahedron, c); - - return; -} - - - -//' Read a SDPA format file -//' -//' @param inputFile Name of the input file -//' -//' @return A list with two named items: an item "matrices" which is a list of the matrices and an vector "objFunction" -//' -//' @examples -//' path = system.file('extdata', package = 'volesti') -//' l = loadSdpaFormatFile(paste0(path,'/sdpa_n2m3.txt')) -//' @export -// [[Rcpp::export]] -Rcpp::List loadSdpaFormatFile(Rcpp::Nullable inputFile = R_NilValue) { - - typedef double NT; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef boost::mt19937 RNGType; - typedef LMI LMI; - typedef Spectrahedron Spectrahedron; - - Spectrahedron _spectrahedron; - Point c; - - // open stream - std::ifstream os; - os.open(Rcpp::as (inputFile),std::ifstream::in); - - // read file - SdpaFormatManager sdpaFormatManager; - sdpaFormatManager.loadSDPAFormatFile(os, _spectrahedron, c); - - std::vector matrices = _spectrahedron.getLMI().getMatrices(); - - // return spectrahedron and objective function - Rcpp::List _matrices; - - for (auto matrix : matrices) - _matrices.push_back(Rcpp::wrap(matrix)); - - Rcpp::List retList = Rcpp::List::create(Rcpp::Named("matrices") = _matrices , Rcpp::_["objFunction"] = Rcpp::wrap(c.getCoefficients())); - return Rcpp::wrap(retList); -} diff --git a/R-proj/src/spectrahedron_module.cpp b/R-proj/src/spectrahedron_module.cpp deleted file mode 100644 index 8dedd2dc1..000000000 --- a/R-proj/src/spectrahedron_module.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2020 Apostolos Chalkis - -//Contributed and/or modified by Repouskos Panagiotis, as part of Google Summer of Code 2019 program. - -// Licensed under GNU LGPL.3, see LICENCE file - - -#include - -class Spectrahedron { -public: - /// A list with the matrices A0, ..., An - Rcpp::List matrices; - - Spectrahedron() {} - - Spectrahedron(Rcpp::List _matrices) : matrices(_matrices) {} -}; - -RCPP_MODULE(spectrahedron){ - using namespace Rcpp ; - - //' An exposed class to represent a spectrahedron - //' - //' @description A spectrahedron is a convex body defined by a linear matrix inequality of the form \eqn{A_0 + x_1 A_1 + ... + x_n A_n \preceq 0}. - //' The matrices \eqn{A_i} are symmetric \eqn{m \times m} real matrices and \eqn{\preceq 0} denoted negative semidefiniteness. - //' - //' @field matrices The matrices \eqn{A_0, A_1, ..., A_n} - //' - //' @example - //' A0 = matrix(c(-1,0,0,0,-2,1,0,1,-2), nrow=3, ncol=3, byrow = TRUE) - //' A1 = matrix(c(-1,0,0,0,0,1,0,1,0), nrow=3, ncol=3, byrow = TRUE) - //' A2 = matrix(c(0,0,-1,0,0,0,-1,0,0), nrow=3, ncol=3, byrow = TRUE) - //' lmi = list(M0, M1,M2) - //' S = Spectrahedron$new(lmi); - //' - //' @export - class_("Spectrahedron") - // expose the default constructor - .constructor() - .constructor() - .field( "matrices", &Spectrahedron::matrices); -} - -extern SEXP _rcpp_module_boot_spectrahedron(void); diff --git a/R-proj/src/volume.cpp b/R-proj/src/volume.cpp deleted file mode 100644 index 0a47210aa..000000000 --- a/R-proj/src/volume.cpp +++ /dev/null @@ -1,407 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis - -//Contributed and/or modified by Apostolos Chalkis, as part of Google Summer of Code 2018 and 2019 program. - - -#include -#include -#include -#include -#include -#include -#include "random_walks/random_walks.hpp" -#include "volume/volume_cooling_gaussians.hpp" -#include "volume/volume_sequence_of_balls.hpp" -#include "volume/volume_cooling_gaussians.hpp" -#include "volume/volume_cooling_balls.hpp" -#include "volume/volume_cooling_hpoly.hpp" -#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" -#include "preprocess/svd_rounding.hpp" - -enum random_walks {ball_walk, rdhr, cdhr, billiard, accelarated_billiard}; -enum volume_algorithms {CB, CG, SOB}; -enum rounding_type {none, min_ellipsoid, max_ellipsoid, isotropy}; - -template -std::pair generic_volume(Polytope& P, RNGType &rng, unsigned int walk_length, NT e, - volume_algorithms const& algo, unsigned int win_len, - rounding_type const& rounding, random_walks const& walk) -{ - typedef typename Polytope::MT MT; - typedef typename Polytope::VT VT; - typedef typename Polytope::PointType Point; - - typedef HPolytope Hpolytope; - - NT round_val = 1.0; - unsigned int n = P.dimension(); - std::pair InnerBall; - - if (rounding != none){ - InnerBall = P.ComputeInnerBall(); - if (InnerBall.second < 0.0) throw Rcpp::exception("Unable to compute a feasible point."); - } - - switch (rounding) - { - case min_ellipsoid: - switch (walk) - { - case cdhr: - round_val = std::get<2>(min_sampling_covering_ellipsoid_rounding(P, InnerBall, 10 + 10 * n, rng)); - break; - case accelarated_billiard: - round_val = std::get<2>(min_sampling_covering_ellipsoid_rounding(P, InnerBall, 2, rng)); - break; - default: - round_val = std::get<2>(min_sampling_covering_ellipsoid_rounding(P, InnerBall, 2, rng)); - break; - } - break; - case isotropy: - switch (walk) - { - case cdhr: - round_val = std::get<2>(svd_rounding(P, InnerBall, 10 + 10 * n, rng)); - break; - case accelarated_billiard: - round_val = std::get<2>(svd_rounding(P, InnerBall, 2, rng)); - break; - default: - round_val = std::get<2>(svd_rounding(P, InnerBall, 2, rng)); - break; - } - break; - case max_ellipsoid: - round_val = std::get<2>(max_inscribed_ellipsoid_rounding(P, InnerBall.first)); - break; - default: - break; - } - - NT vol; - std::pair pair_vol; - switch (algo) - { - case CG: - switch (walk) - { - case cdhr: - vol = volume_cooling_gaussians(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - case rdhr: - vol = volume_cooling_gaussians(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - case ball_walk: - vol = volume_cooling_gaussians(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - default: - throw Rcpp::exception("This random walk can not be used by CG algorithm!"); - break; - } - break; - case CB: - switch (walk) - { - case cdhr: - pair_vol = volume_cooling_balls(P, rng, e, walk_length, win_len); - break; - case rdhr: - pair_vol = volume_cooling_balls(P, rng, e, walk_length, win_len); - break; - case ball_walk: - pair_vol = volume_cooling_balls(P, rng, e, walk_length, win_len); - break; - case billiard: - pair_vol = volume_cooling_balls(P, rng, e, walk_length, win_len); - break; - case accelarated_billiard: - pair_vol = volume_cooling_balls(P, rng, e, walk_length, win_len); - break; - default: - throw Rcpp::exception("This random walk can not be used by CB algorithm!"); - break; - } - break; - case SOB: - switch (walk) - { - case cdhr: - vol = volume_sequence_of_balls(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - case rdhr: - vol = volume_sequence_of_balls(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - case ball_walk: - vol = volume_sequence_of_balls(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - case billiard: - vol = volume_sequence_of_balls(P, rng, e, walk_length); - break; - case accelarated_billiard: - vol = volume_sequence_of_balls(P, rng, e, walk_length); - pair_vol = std::pair (std::log(vol), vol); - break; - default: - throw Rcpp::exception("This random walk can not be used by CB algorithm!"); - break; - } - break; - default: - throw Rcpp::exception("Unknown algorithm!"); - break; - } - if (pair_vol.second < 0.0) throw Rcpp::exception("volesti failed to terminate."); - pair_vol.first += std::log(round_val); - pair_vol.second *= round_val; - return pair_vol; -} - -//' The main function for volume approximation of a convex Polytope (H-polytope, V-polytope, zonotope or intersection of two V-polytopes). It returns a list with two elements: (a) the logarithm of the estimated volume and (b) the estimated volume -//' -//' For the volume approximation can be used three algorithms. Either CoolingBodies (CB) or SequenceOfBalls (SOB) or CoolingGaussian (CG). An H-polytope with \eqn{m} facets is described by a \eqn{m\times d} matrix \eqn{A} and a \eqn{m}-dimensional vector \eqn{b}, s.t.: \eqn{P=\{x\ |\ Ax\leq b\} }. A V-polytope is defined as the convex hull of \eqn{m} \eqn{d}-dimensional points which correspond to the vertices of P. A zonotope is desrcibed by the Minkowski sum of \eqn{m} \eqn{d}-dimensional segments. -//' -//' @param P A convex polytope. It is an object from class a) Hpolytope or b) Vpolytope or c) Zonotope or d) VpolytopeIntersection. -//' @param settings Optional. A list that declares which algorithm, random walk and values of parameters to use, as follows: -//' \itemize{ -//' \item{\code{algorithm} }{ A string to set the algorithm to use: a) \code{'CB'} for CB algorithm, b) \code{'SoB'} for SOB algorithm or b) \code{'CG'} for CG algorithm. The defalut algorithm is \code{'CB'}.} -//' \item{\code{error} }{ A numeric value to set the upper bound for the approximation error. The default value is \eqn{1} for SOB algorithm and \eqn{0.1} otherwise.} -//' \item{\code{random_walk} }{ A string that declares the random walk method: a) \code{'CDHR'} for Coordinate Directions Hit-and-Run, b) \code{'RDHR'} for Random Directions Hit-and-Run, c) \code{'BaW'} for Ball Walk, or \code{'BiW'} for Billiard walk. For CB algorithm the default walk is \code{'BiW'}. For CG and SOB algorithms the default walk is \code{'CDHR'} for H-polytopes and \code{'RDHR'} for the other representations.} -//' \item{\code{walk_length} }{ An integer to set the number of the steps for the random walk. The default value is \eqn{\lfloor 10 + d/10\rfloor} for \code{'SOB'} and \eqn{1} otherwise.} -//' \item{\code{win_len} }{ The length of the sliding window for CB or CG algorithm. The default value is \eqn{250} for CB with BiW and \eqn{400+3d^2} for CB and any other random walk and \eqn{500+4d^2} for CG.} -//' \item{\code{hpoly} }{ A boolean parameter to use H-polytopes in MMC of CB algorithm when the input polytope is a zonotope. The default value is \code{TRUE} when the order of the zonotope is \eqn{<5}, otherwise it is \code{FALSE}.} -//' } -//' @param rounding Optional. A string parameter to request a rounding method to be applied in the input polytope before volume computation: a) \code{'min_ellipsoid'}, b) \code{'svd'}, c) \code{'max_ellipsoid'} and d) \code{'none'} for no rounding. -//' @param seed Optional. A fixed seed for the number generator. -//' -//' @references \cite{I.Z.Emiris and V. Fisikopoulos, -//' \dQuote{Practical polytope volume approximation,} \emph{ACM Trans. Math. Soft.,} 2018.}, -//' @references \cite{A. Chalkis and I.Z.Emiris and V. Fisikopoulos, -//' \dQuote{Practical Volume Estimation by a New Annealing Schedule for Cooling Convex Bodies,} \emph{CoRR, abs/1905.05494,} 2019.}, -//' @references \cite{B. Cousins and S. Vempala, \dQuote{A practical volume algorithm,} \emph{Springer-Verlag Berlin Heidelberg and The Mathematical Programming Society,} 2015.} -//' -//' -//' @return The approximation of the volume of a convex polytope. -//' @examples -//' -//' # calling SOB algorithm for a H-polytope (5d unit simplex) -//' HP = gen_cube(5,'H') -//' pair_vol = volume(HP) -//' -//' # calling CG algorithm for a V-polytope (3d simplex) -//' VP = gen_simplex(3,'V') -//' pair_vol = volume(VP, settings = list("algorithm" = "CG")) -//' -//' # calling CG algorithm for a 2-dimensional zonotope defined as the Minkowski sum of 4 segments -//' Z = gen_rand_zonotope(2, 4) -//' pair_vol = volume(Z, settings = list("random_walk" = "RDHR", "walk_length" = 2)) -//' -//' @export -// [[Rcpp::export]] -Rcpp::List volume (Rcpp::Reference P, - Rcpp::Nullable settings = R_NilValue, - Rcpp::Nullable rounding = R_NilValue, - Rcpp::Nullable seed = R_NilValue) { - - typedef double NT; - typedef Cartesian Kernel; - typedef typename Kernel::Point Point; - typedef BoostRandomNumberGenerator RNGType; - typedef HPolytope Hpolytope; - typedef VPolytope Vpolytope; - typedef Zonotope zonotope; - typedef IntersectionOfVpoly InterVP; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - unsigned int n = P.field("dimension"), walkL, type = P.field("type"); - - RNGType rng(n); - if (seed.isNotNull()) { - unsigned seed_rcpp = Rcpp::as(seed); - rng.set_seed(seed_rcpp); - } - - bool round = false, hpoly = false; - unsigned int win_len = 300; - - random_walks walk; - volume_algorithms algo; - rounding_type rounding_method; - - if (!rounding.isNotNull()) { - rounding_method = (type == 2) ? min_ellipsoid : none; - } else if (Rcpp::as(rounding).compare(std::string("min_ellipsoid")) == 0) { - rounding_method = min_ellipsoid; - } else if (Rcpp::as(rounding).compare(std::string("max_ellipsoid")) == 0) { - if (type != 1) throw Rcpp::exception("This rounding method can be used only for H-polytopes!"); - rounding_method = max_ellipsoid; - } else if (Rcpp::as(rounding).compare(std::string("isotropy")) == 0) { - rounding_method = isotropy; - } else if (Rcpp::as(rounding).compare(std::string("none")) == 0) { - rounding_method = none; - } - - NT e; - - if (!Rcpp::as(settings).containsElementNamed("algorithm")) { - algo = CB; - walkL = (!Rcpp::as(settings).containsElementNamed("walk_length")) ? 1 : Rcpp::as( - Rcpp::as(settings)["walk_length"]); - e = (!Rcpp::as(settings).containsElementNamed("error")) ? 0.1 : Rcpp::as( - Rcpp::as(settings)["error"]); - } else if (Rcpp::as(Rcpp::as(settings)["algorithm"]).compare(std::string("SOB")) == 0) { - algo = SOB; - walkL = (!Rcpp::as(settings).containsElementNamed("walk_length")) ? 10 + n / 10 : Rcpp::as( - Rcpp::as(settings)["walk_length"]); - e = (!Rcpp::as(settings).containsElementNamed("error")) ? 1.0 : Rcpp::as( - Rcpp::as(settings)["error"]); - } else if (Rcpp::as(Rcpp::as(settings)["algorithm"]).compare(std::string("CG")) == 0) { - algo = CG; - walkL = (!Rcpp::as(settings).containsElementNamed("walk_length")) ? 1 : Rcpp::as( - Rcpp::as(settings)["walk_length"]); - e = (!Rcpp::as(settings).containsElementNamed("error")) ? 0.1 : Rcpp::as( - Rcpp::as(settings)["error"]); - } else if (Rcpp::as(Rcpp::as(settings)["algorithm"]).compare(std::string("CB")) == 0) { - algo = CB; - walkL = (!Rcpp::as(settings).containsElementNamed("walk_length")) ? 1 : Rcpp::as( - Rcpp::as(settings)["walk_length"]); - e = (!Rcpp::as(settings).containsElementNamed("error")) ? 0.1 : Rcpp::as( - Rcpp::as(settings)["error"]); - } else { - throw Rcpp::exception("Unknown method!"); - } - - if (!Rcpp::as(settings).containsElementNamed("random_walk")) { - if (algo == CB) { - walk = (type == 1) ? accelarated_billiard : billiard; - } else { - win_len = 4 * n * n + 500; - if (type == 1) { - walk = cdhr; - } else { - walk = rdhr; - } - } - }else if (Rcpp::as(Rcpp::as(settings)["random_walk"]).compare(std::string("CDHR")) == 0) { - walk = cdhr; - if (algo == CB) win_len = 3*n*n+400; - } else if (Rcpp::as(Rcpp::as(settings)["random_walk"]).compare(std::string("RDHR")) == 0) { - walk = rdhr; - if (algo == CB) win_len = 3*n*n+400; - } else if (Rcpp::as(Rcpp::as(settings)["random_walk"]).compare(std::string("BaW")) == 0) { - walk = ball_walk; - if (algo == CB) win_len = 3*n*n+400; - } else if (Rcpp::as(Rcpp::as(settings)["random_walk"]).compare(std::string("BiW")) == 0) { - if (algo == CG) { - if (type !=1){ - Rcpp::Rcout << "Billiard walk is not supported for CG algorithm. RDHR is used."<(settings).containsElementNamed("win_len")) { - win_len = Rcpp::as(Rcpp::as(settings)["win_len"]); - if (algo == SOB) Rf_warning("input 'win_len' can be used only for CG or CB algorithms."); - } - - std::pair pair_vol; - NT vol; - - switch(type) { - case 1: { - // Hpolytope - Hpolytope HP(n, Rcpp::as(P.field("A")), Rcpp::as(P.field("b"))); - pair_vol = generic_volume(HP, rng, walkL, e, algo, win_len, rounding_method, walk); - break; - } - case 2: { - // Vpolytope - Vpolytope VP(n, Rcpp::as(P.field("V")), VT::Ones(Rcpp::as(P.field("V")).rows())); - pair_vol = generic_volume(VP, rng, walkL, e, algo, win_len, rounding_method, walk); - break; - } - case 3: { - // Zonotope - zonotope ZP(n, Rcpp::as(P.field("G")), VT::Ones(Rcpp::as(P.field("G")).rows())); - if (Rcpp::as(settings).containsElementNamed("hpoly")) { - hpoly = Rcpp::as(Rcpp::as(settings)["hpoly"]); - if (hpoly && (algo == CG || algo == SOB)) - Rf_warning("flag 'hpoly' can be used to only in MMC of CB algorithm for zonotopes."); - } else if (ZP.num_of_generators() / ZP.dimension() < 5) { - hpoly = true; - } else { - hpoly = false; - } - if (hpoly && algo == CB) { - switch (walk) - { - case cdhr: - vol = volume_cooling_hpoly(ZP, rng, e, walkL, win_len); - pair_vol = std::pair (std::log(vol), vol); - break; - case rdhr: - vol = volume_cooling_hpoly(ZP, rng, e, walkL, win_len); - pair_vol = std::pair (std::log(vol), vol); - break; - case ball_walk: - vol = volume_cooling_hpoly(ZP, rng, e, walkL, win_len); - pair_vol = std::pair (std::log(vol), vol); - break; - case billiard: - vol = volume_cooling_hpoly(ZP, rng, e, walkL, win_len); - pair_vol = std::pair (std::log(vol), vol); - break; - case accelarated_billiard: - vol = volume_cooling_hpoly(ZP, rng, e, walkL, win_len); - pair_vol = std::pair (std::log(vol), vol); - break; - default: - throw Rcpp::exception("This random walk can not be used by CB algorithm!"); - break; - } - } - pair_vol = generic_volume(ZP, rng, walkL, e, algo, win_len, rounding_method, walk); - break; - } - case 4: { - // Intersection of two V-polytopes - Vpolytope VP1(n, Rcpp::as(P.field("V1")), VT::Ones(Rcpp::as(P.field("V1")).rows())); - Vpolytope VP2(n, Rcpp::as(P.field("V2")), VT::Ones(Rcpp::as(P.field("V2")).rows())); - InterVP VPcVP; - if (!seed.isNotNull()) { - InterVP VPcVP(VP1, VP2); - } else { - unsigned seed3 = Rcpp::as(seed); - InterVP VPcVP(VP1, VP2, seed3); - } - if (!VPcVP.is_feasible()) throw Rcpp::exception("Empty set!"); - pair_vol = generic_volume(VPcVP, rng, walkL, e, algo, win_len, rounding_method, walk); - break; - } - } - - return Rcpp::List::create(Rcpp::Named("log_volume") = pair_vol.first, Rcpp::Named("volume") = pair_vol.second); -} diff --git a/R-proj/src/zonotope_approximation.cpp b/R-proj/src/zonotope_approximation.cpp deleted file mode 100644 index 237ec96e1..000000000 --- a/R-proj/src/zonotope_approximation.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// [[Rcpp::depends(BH)]] - -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - - -#include -#include -#include -#include -#include -#include -#include "random_walks/random_walks.hpp" -#include "volume/volume_sequence_of_balls.hpp" -#include "volume/volume_cooling_gaussians.hpp" -#include "volume/volume_cooling_balls.hpp" -#include "volume/volume_cooling_hpoly.hpp" - -//' An internal Rccp function for the over-approximation of a zonotope -//' -//' @param Z A zonotope. -//' @param fit_ratio Optional. A boolean parameter to request the computation of the ratio of fitness. -//' @param settings Optional. A list that declares the values of the parameters of CB algorithm. -//' @param seed Optional. A fixed seed for the number generator. -//' -//' @keywords internal -//' -//' @return A List that contains a numerical matrix that describes the PCA approximation as a H-polytope and the ratio of fitness. -// [[Rcpp::export]] -Rcpp::List zono_approx (Rcpp::Reference Z, - Rcpp::Nullable fit_ratio = R_NilValue, - Rcpp::Nullable settings = R_NilValue, - Rcpp::Nullable seed = R_NilValue) { - - typedef double NT; - typedef Cartesian Kernel; - typedef BoostRandomNumberGenerator RNGType; - typedef typename Kernel::Point Point; - typedef HPolytope Hpolytope; - typedef Zonotope zonotope; - typedef Eigen::Matrix VT; - typedef Eigen::Matrix MT; - int n = Rcpp::as(Z.field("dimension")), k = Rcpp::as(Z.field("G")).rows(), win_len = 200, walkL = 1; - - RNGType rng(n); - if (seed.isNotNull()) { - unsigned seed_rcpp = Rcpp::as(seed); - rng.set_seed(seed_rcpp); - } - - NT e = 0.1, ratio = std::numeric_limits::signaling_NaN(); - bool hpoly = false; - - MT X(n, 2 * k); - X << Rcpp::as(Z.field("G")).transpose(), -Rcpp::as(Z.field("G")).transpose(); - Eigen::JacobiSVD svd(X * X.transpose(), Eigen::ComputeFullU | Eigen::ComputeFullV); - MT G(k, 2 * n); - G << Rcpp::as(Z.field("G")) * svd.matrixU(), Rcpp::as(Z.field("G")) * svd.matrixU(); - VT Gred_ii = G.transpose().cwiseAbs().rowwise().sum(); - MT A(n, 2 * n); - A << -MT::Identity(n, n), MT::Identity(n, n); - MT Mat(2 * n, n + 1); - Mat << Gred_ii, A.transpose() * svd.matrixU().transpose(); - - //Hpolytope HP(n, A.transpose() * svd.matrixU().transpose(), Gred_ii); - - if (fit_ratio.isNotNull() && Rcpp::as(fit_ratio)) { - NT vol_red = std::abs(svd.matrixU().determinant()); - for (int i = 0; i < n; ++i) { - vol_red *= 2.0 * Gred_ii(i); - } - - walkL = (!Rcpp::as(settings).containsElementNamed("walk_length")) ? 1 : Rcpp::as( - Rcpp::as(settings)["walk_length"]); - e = (!Rcpp::as(settings).containsElementNamed("error")) ? 0.1 : Rcpp::as( - Rcpp::as(settings)["error"]); - win_len = (!Rcpp::as(settings).containsElementNamed("win_len")) ? 200 : Rcpp::as( - Rcpp::as(settings)["win_len"]); - - zonotope ZP(n, Rcpp::as(Z.field("G")), VT::Ones(Rcpp::as(Z.field("G")).rows())); - - if (Rcpp::as(settings).containsElementNamed("hpoly")) { - hpoly = Rcpp::as(Rcpp::as(settings)["hpoly"]); - } else if (ZP.num_of_generators() / ZP.dimension() < 5 ) { - hpoly = true; - } else { - hpoly = false; - } - - NT vol; - if (!hpoly) { - vol = volume_cooling_balls(ZP, rng, e, walkL, win_len).second; - } else { - vol = volume_cooling_hpoly(ZP, rng, e, walkL, win_len); - } - ratio = std::pow(vol_red / vol, 1.0 / NT(n)); - } - - return Rcpp::List::create(Rcpp::Named("Mat") = Rcpp::wrap(Mat), Rcpp::Named("fit_ratio") = ratio); -} diff --git a/R-proj/tests/testthat.R b/R-proj/tests/testthat.R deleted file mode 100644 index 051a041f8..000000000 --- a/R-proj/tests/testthat.R +++ /dev/null @@ -1,3 +0,0 @@ -library(testthat) - -test_check("volesti") diff --git a/R-proj/tests/testthat/test_Hvol.R b/R-proj/tests/testthat/test_Hvol.R deleted file mode 100644 index 061a33acf..000000000 --- a/R-proj/tests/testthat/test_Hvol.R +++ /dev/null @@ -1,66 +0,0 @@ -context("H-polytopes' volume test") - -library(volesti) - - -Hruntest <- function(P, name_string, exactvol, tol, num_of_exps, alg, seed){ - - vol = 0 - for (j in 1:num_of_exps) { - if (alg == "CB") { - vol = vol + volume(P, seed = seed)$volume - } else if (alg == "SOB") { - vol = vol + volume(P, settings = list("algorithm" = "SOB"), seed = seed)$volume - } else { - vol = vol + volume(P, settings = list("algorithm" = "CG"), seed = seed)$volume - } - } - vol = vol / num_of_exps - error = abs(vol - exactvol) / exactvol - if (error >= tol){ - res = 0 - } else { - res = 1 - } - return(res) -} - -cran_only = TRUE - -for (i in 1:2) { - - if (i==1) { - algo = 'CG' - num_of_exps = 10 - } else { - algo = 'CB' - num_of_exps = 10 - } - - - test_that("Volume H-cube10", { - P = gen_cube(10, 'H') - res = Hruntest(P, 'H-cube10', 1024, 0.2, num_of_exps, algo, 5) - expect_equal(res, 1) - }) - - test_that("Volume H-cross5", { - P = gen_cross(5, 'H') - res = Hruntest(P, 'H-cross10', 0.2666667, 0.2, num_of_exps, algo, 5) - expect_equal(res, 1) - }) - - - test_that("Volume H-prod_simplex_5_5", { - P = gen_prod_simplex(5) - res = Hruntest(P, 'H-prod_simplex_5_5', (1/prod(1:5))^2, 0.2, num_of_exps, algo, 5) - expect_equal(res, 1) - }) - - test_that("Volume H-cube10", { - P = gen_cube(10, 'H') - res = Hruntest(P, 'H-cube10', 1024, 0.2, 5, "SOB", 5) - expect_equal(res, 1) - }) - -} diff --git a/R-proj/tests/testthat/test_InnerBall.R b/R-proj/tests/testthat/test_InnerBall.R deleted file mode 100644 index cb19e1c00..000000000 --- a/R-proj/tests/testthat/test_InnerBall.R +++ /dev/null @@ -1,135 +0,0 @@ -context("Chebychev ball test") - -library(volesti) - -runCheTest <- function(P, name_string, radius, tol) { - - vec_ball = inner_ball(P, lpsolve = TRUE) - rad = vec_ball[length(vec_ball)] - - error = abs(radius - rad) / radius - if (error >= tol){ - res = 0 - } else { - res = 1 - } - return(res) -} - -tol = 0.00001 - -test_that("Chebychev test", { - P = gen_cube(10, 'H') - res = runCheTest(P, 'H-cube10', 1.0, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_cube(20, 'H') - res = runCheTest(P, 'H-cube20', 1.0, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_cube(30, 'H') - res = runCheTest(P, 'H-cube30', 1.0, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_cross(10, 'H') - res = runCheTest(P, 'H-cross10', 0.316228, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_birkhoff(3) - res = runCheTest(P, 'H-birk3', 0.207107, tol) - expect_equal(res, 1) -}) - - -test_that("Chebychev test", { - P = gen_birkhoff(4) - res = runCheTest(P, 'H-birk4', 0.122008, tol) - expect_equal(res, 1) -}) - - -test_that("Chebychev test", { - P = gen_birkhoff(5) - res = runCheTest(P, 'H-birk5', 0.0833333, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_birkhoff(6) - res = runCheTest(P, 'H-birk6', 0.0618034, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_prod_simplex(5) - res = runCheTest(P, 'H-prod_simplex_5_5', 0.138197, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_prod_simplex(10) - res = runCheTest(P, 'H-prod_simplex_10_10', 0.0759747, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_prod_simplex(15) - res = runCheTest(P, 'H-prod_simplex_15_15', 0.0529858, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_prod_simplex(20) - res = runCheTest(P, 'H-prod_simplex_20_20', 0.0408628, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_simplex(10, 'H') - res = runCheTest(P, 'H-simplex10', 0.0759747, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_simplex(20, 'H') - res = runCheTest(P, 'H-simplex20', 0.0408628, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_simplex(30, 'H') - res = runCheTest(P, 'H-simplex30', 0.0281871, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_simplex(40, 'H') - res = runCheTest(P, 'H-simplex40', 0.0215868, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_simplex(50, 'H') - res = runCheTest(P, 'H-simplex50', 0.017522, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_skinny_cube(10) - res = runCheTest(P, 'H-skinny_cube10', 1.0, tol) - expect_equal(res, 1) -}) - -test_that("Chebychev test", { - P = gen_skinny_cube(20) - res = runCheTest(P, 'H-skinny_cube20', 1.0, tol) - expect_equal(res, 1) -}) diff --git a/R-proj/tests/testthat/test_Vvol.R b/R-proj/tests/testthat/test_Vvol.R deleted file mode 100644 index 9e18e52b2..000000000 --- a/R-proj/tests/testthat/test_Vvol.R +++ /dev/null @@ -1,44 +0,0 @@ -context("V-polytopes' volume test") - -library(volesti) - -Vruntest <- function(P, name_string, exactvol, tol, num_of_exps, algorithm,seed){ - - vol = 0 - for (j in 1:num_of_exps) { - if (algorithm == "CB") { - vol = vol + volume(P, rounding = "none", seed = seed)$volume - } else { - vol = vol + volume(P, settings = list("algorithm" = "CG", "error" = 0.1), rounding = "none", seed = seed)$volume - } - } - vol = vol / num_of_exps - error = abs(vol - exactvol) / exactvol - if (error >= tol){ - res = 0 - } else { - res = 1 - } - return(res) -} - -cran_only = TRUE -num_of_exps = 2 - -for (i in 1:2) { - seed = 5 - if (i==1) { - algo = 'CG' - tol = 0.2 - } else { - algo = 'CB' - tol = 0.2 - } - - test_that("Volume V-simplex3", { - P = gen_simplex(3, 'V') - res = Vruntest(P, 'V-simplex3', 1/prod(1:3), tol, num_of_exps, algo, seed) - expect_equal(res, 1) - }) - -} diff --git a/R-proj/tests/testthat/test_Zvol.R b/R-proj/tests/testthat/test_Zvol.R deleted file mode 100644 index f382b003c..000000000 --- a/R-proj/tests/testthat/test_Zvol.R +++ /dev/null @@ -1,45 +0,0 @@ -context("Zonotopes' volume test") - -library(volesti) - -Zruntest <- function(P, name_string, tol, num_of_exps, algo, seed){ - - exactvol = exact_vol(P) - vol = 0 - for (j in 1:num_of_exps) { - if (algo == "CB") { - vol = vol + volume(P, settings = list("hpoly" = FALSE), rounding = "none", seed = seed)$volume - } else { - vol = vol + volume(P, settings = list("algorithm" = "CG", "error" = 0.1), rounding = "none", seed = seed)$volume - } - } - vol = vol / num_of_exps - error = abs(vol - exactvol) / exactvol - if (error >= tol){ - res = 0 - } else { - res = 1 - } - return(res) -} - -cran_only = TRUE -num_of_exps = 2 - -for (i in 1:2) { - if (i==1) { - algo = 'CG' - tol = 0.2 - } else { - algo = 'CB' - tol = 0.2 - } - - test_that("Volume Zonotope_2_4", { - #skip_if(Sys.info()[["machine"]] %in% c("x86_32")) - Z = gen_rand_zonotope(2, 4, seed = 127) - res = Zruntest(Z, 'Zonotope_2_4', tol, num_of_exps, algo, 5) - expect_equal(res, 1) - }) - -} diff --git a/R-proj/tests/testthat/test_copulas.R b/R-proj/tests/testthat/test_copulas.R deleted file mode 100644 index e0ee51375..000000000 --- a/R-proj/tests/testthat/test_copulas.R +++ /dev/null @@ -1,23 +0,0 @@ -context("Copulas' test") - -library(volesti) - -test_that("10-dimensional 2-hyp_fam copula", { - h1 = h1 = runif(n = 10, min = 1, max = 1000) - h1 = h1 / 1000 - h2 = h2 = runif(n = 10, min = 1, max = 1000) - h2 = h1 / 1000 - cop = copula(r1 = h1 , r2 = h2 , m = 10, n = 100000) - res = sum(cop) - expect_equal(res, 1) -}) - -test_that("20-dimensional 1_hyp_1_ell fam copula", { - h = h = runif(n = 20, min = 1, max = 1000) - h = h / 1000 - E = replicate(20, rnorm(30)) - E = cov(E) - cop = copula(r1 = h , sigma = E , m = 100, n = 100000) - res = sum(cop) - expect_equal(res, 1) -}) \ No newline at end of file diff --git a/R-proj/tests/testthat/test_rounding.R b/R-proj/tests/testthat/test_rounding.R deleted file mode 100644 index 5d308e367..000000000 --- a/R-proj/tests/testthat/test_rounding.R +++ /dev/null @@ -1,49 +0,0 @@ -context("Rounding test") - -library(volesti) - -testRound <- function(P, exactvol, tol, name_string, num_of_exps, algo, rotation,seed){ - - if (rotation) { - P = rand_rotate(P) - listHpoly = round_polytope(P, seed = seed) - } else { - listHpoly = round_polytope(P, seed = seed) - } - vol = 0 - for (j in 1:num_of_exps) { - if (algo == "CB") { - vol = vol + listHpoly$round_value * volume(listHpoly$P, seed = seed)$volume - } else { - vol = vol + listHpoly$round_value * volume(listHpoly$P, settings=list("algorithm"="CG", "error"=0.1), seed = seed)$volume - } - } - vol = vol / num_of_exps - error = abs(vol - exactvol) / exactvol - if (error >= tol){ - res = 0 - } else { - res = 1 - } - return(res) - - -} - -cran_only = TRUE - -for (i in 1:2) { - - num_of_exps = 10 - - - - test_that("Rounding H-skinny_cube10", { - seed=5 - P = gen_skinny_cube(10) - res = testRound(P, 102400, 0.3, 'H-skinny_cube10', num_of_exps, 'CB', FALSE,seed) - expect_equal(res, 1) - }) - - -} diff --git a/R-proj/tests/testthat/test_sampling.R b/R-proj/tests/testthat/test_sampling.R deleted file mode 100644 index d051dc70e..000000000 --- a/R-proj/tests/testthat/test_sampling.R +++ /dev/null @@ -1,91 +0,0 @@ -context("Sampling test") - -library(volesti) - -runsample <- function(P, name_string, dist){ - if (dist == "uniform") { - p = sample_points(P, n = 100) - } else { - p = sample_points(P, n = 100, distribution = list("density" = "gaussian")) - } - if (length(p[is.nan(p)])>0 | length(p[is.infinite(p)])>0) { - res = 0 - } else { - res = 1 - } - return(res) - -} - -logconcave_sample<- function(P,distribution, n_samples ,n_burns){ - if (distribution == "uniform"){ - f <- function(x) (0) - grad_f <- function(x) (0) - L=1 - m=1 - pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "negative_logprob" = f, "negative_logprob_gradient" = grad_f, "L_" = L, "m" = m)) - return(max(psrf_univariate(pts, "interval"))) - } - else if(distribution == "gaussian"){ - pts <- sample_points(P, n = n_samples, random_walk = list("walk" = "CRHMC", "nburns" = n_burns, "walk_length" = 1, "solver" = "implicit_midpoint"), distribution = list("density" = "logconcave", "variance"=8)) - return(max(psrf_univariate(pts, "interval"))) - } -} - -for (i in 1:2) { - - if (i==1) { - distribution = 'gaussian' - } else { - distribution = 'uniform' - } - - test_that("Sampling test", { - P= gen_cube(10, 'H') - res = runsample(P, 'H-cube10', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - P = gen_cross(10, 'H') - res = runsample(P, 'H-cross10', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - P = gen_prod_simplex(5) - res = runsample(P, 'H-prod_simplex_5_5', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - P = gen_prod_simplex(10) - res = runsample(P, 'H-prod_simplex_10_10', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - P = gen_simplex(10, 'H') - res = runsample(P, 'H-prod_simplex10', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - P = gen_skinny_cube(10) - res = runsample(P, 'H-skinny_cube10', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - P = gen_skinny_cube(20) - res = runsample(P, 'H-skinny_cube20', distribution) - expect_equal(res, 1) - }) - - test_that("Sampling test", { - Z = gen_rand_zonotope(4, 8) - res = runsample(Z, 'zonotope_4_8', distribution) - expect_equal(res, 1) - }) - -} diff --git a/R-proj/vignettes/Arxiv.Rnw b/R-proj/vignettes/Arxiv.Rnw deleted file mode 100644 index f6c506299..000000000 --- a/R-proj/vignettes/Arxiv.Rnw +++ /dev/null @@ -1,7 +0,0 @@ -\documentclass{article} -\usepackage{pdfpages} -%\VignetteIndexEntry{Arxiv paper} - -\begin{document} -\includepdf[pages=-, fitpaper=true]{volesti_arxiv.pdf} -\end{document} diff --git a/R-proj/vignettes/volesti_arxiv.pdf b/R-proj/vignettes/volesti_arxiv.pdf deleted file mode 100644 index 1b94382184a1c578118d85cea5b5a1716738f29c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1880824 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νVTUBQTnH)W{f1hKHYhLn&EZ~HIL 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

FYAyw4G$~#cA_p&JMT{x6*{gv^bdC31k5&r*S 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ΠPNOYiKUbP_kp?(&5LSQW^1lQM;ihl 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Ƞ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%0A*PNx-d1H8=f=ZPl4ToR)K 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

bpMvb-D5Z45rIaPTo}tex%pkoiOl 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

+izKUXP>ZxQLDx|D=xB9E$ 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

3nA!5%Bh$ZI2Z;~2-@v( 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�$}7D6 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

Vr_+QMfEU`RFng+l()>OY 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%0AF@5=M5zB7-hOHPb*M++oRN!Z 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�g61#9WB#Fk3vfjG-K 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 z zJ?_mjP-*Xw@JgBEW}1TeVO#hCV7Fqw^r0DjwNk{ewi$$oN)KBHvE(pe@7#dUn8L42 z^<8~ahqtgLH##n=r0(WKk%GIX#^+2~<*t~?G|0;+iF?#Zm3{9?MVlU;)p;)eyDdjNVh;WfYZ|NFfu$#h2j#p1|h0T*W#BVR{xP z1NMFQd?&#+%hj0-#x%5mN-gW{8p0o=i49*Mb@$iF!=m3?qF`8u!Op5weopDv;(wINC+;iGT7 z3LFQb2KjKjLd83Teo+qTOK#lY+s6&&ivMK{FLd%Ea@@yupT2ldEgkyt&AsTRNjSpC z`PrJcs$zvf4B8Bv$On9?lD5HE*ADqgp@)K_RcQ$HulbhA{ItA)|Sq+ zgzA>g&PGm__I8Bgmd=*e_73*0Ki8>X7({+7`z}BEqCbQHA*CocGb1x2BL@=)BO@C- zBct|zFYzB(StC_|CZW5fiv^*@53Ath1TZ6XFfy?=G6(z=lL2_T+dG*$6H>a_+ql{S z2#p*Zoa{X;ZT|~AEupiKt%HrFojEO`gT0NXi@gKjM=VP_7l66be=A{TX=h|-VrgVU zXyWuEq%)x@zy)CPAK_>Tf7{#H|EJFX6V=4t)z0MymGB1|VB|yy@NfaxIsa7o0avCa z6rrK{5lznC^#8qiimGCo^y02IHpWJFc0b$*rK-ixt$z*&Q?sA;{-_S%^dCS%7J4RD zCN?f+b~ZX@dUiS{dR9hyCJsVf%KvCZ*3u0?$o#{a=u#0{I~ciGI0K9b-Tqrmc6w%d z<{vo}o$O6rP5yI_|BC(JF{lU`R9ua%e%eY%`BO~Q(#7VdFMiYraCWieCRG2g`V{(~ z^+{-CXG*B@-&9Iy_R~Eg_I7Rn4?@NNuG}Bp5-R@(&FQBj0H!}QkCBZt;6H56&oHt# zwt`_|W@7xG2G9R*qKJd_fAB;stepRaC*u5HX`*Ir+obgtHPxt(atI8-1{MuFuBkGW^0xTQ!_v*=SPb9SmnftEY0WO&4j;V5O#XLkW8N- z0){Gt0_`z~Szk}cMDZjRXgip>?ul%m2!fM`sc;nq$OGw#^Nb2e{7*kj2`PY*LVUAG z_ZCNM&49AOS_oFvGY(>dszvPQ_i?2u>_AUIhlA#t4yUNT6f@Vtg7q=Vhcc#*f*o%~ zf(wSEp=TWYgM$Q9whmH&>jy^n*vm*Hh9tl$JhH$>qM`Xn0>S9yV61Ex9sie<>`Sj$ z64I&x3*HPilbi4s;UKw@@OJu>uiqAT~KzVE>$vvWLkI{1~tim4P6? z49u6A_zr71y9ezD$pm02td5I6^Ct-HHm~QK3flrgjL2w@*WClR$oAK*?P|MOuQb8; z#YUF_+E*RHMj0^QTTl0AYUWtfs%kAmMq&b0E^`UK+^tNhla*D!hjAphN(i5Q#Y_TG zJF9B?YOL&9M(I&R1MEk@db!Tbs^(Uni5Pret=lF*-!&J;wK0!zOWE>T*o(xQTg=}%47o~Kk4HB=NFZKTZqp-R%jJ6y90 ztg;r*HhY{hp0jGX;rRG{EqFeT6b8kTue?>h#$~mhIy9^E7>! z#9KOQ-EB4C-M#Gp+O%xB=?K7G_C0bA4XV7H*|xuGUVSJZQalZwy*ZRu$wm0RuD*$i z)Y`3?sSvzFE9T!mwOyGba#3&oRbaxf0fFtF3VQ>Pr)|t?*|_Rl5#^gntgN=XU5D1L z?GWHWt@H7JYA+E;#8V@q7eJEZ!>|nh9Qd2~6v#kE?!Kn)UQvmw3aJce~eT*;3RY zqe_zrt5mtOMAqW*B7)g3?sVw#e2;WgTiaV?C_ukvW3FLs&a}7+tldO)SdE$Ob8y?D z+^?R!`e+f18wGydFGDI59PZ9E=aupn0BLqwxAM~upd4}5&NBj<+60zFnrohF`%1Ky zNLuHc{LKM%Zbo2CG3E<$AVPIPA8moW#x5}Us?)J=3=yE`NL#!db zd|&s(;_Cbff5K^ap{JJ?*ktj2c5v7{YQs0jq-M&h$yLkw1>2GrxlMx!4e&)U-$1-a zlV!T+I!g~maQXr~POOxqd>lr934N!{dBVd!l!7yq*gLudAU}Iu7mrm2vfTUxr9Zgc z2L4!=UXrFzbp1w@nM{zRCUjD+2DUc0$~C`upQ!C6soLsL3VjtD|Wzq ze0)9=wMt<_M%;`}X2S4i_Lb7Z0H=rBDfQc5>s-7!*4BjywN&nhj^mw7GGQA)a$S6G zps|i!CxK`t#$&{#N+p%&l|%C_0OY|ZqjmgHns4kKC2y6b+7Xp{#pIx0Cu(G*y}&2g z^T5k&h!&eSlHXHo79mw)MA`X~5A#GDy+_Y_f5qgT&Wb`zjOM+b)c)YMwOezClZ5gh zbd5Y?o1GS$AO40fBlRAbE67p+b=49`hL_*n57{Qp#@;oS<}Nf(c|Y;qq@=H?BSDLO zT#Xwa;ve7@?TGf&#ESxHF8AOv}b@gv85Mc{LP{~Gc|t)-pqwY zhCGCbW6p#WZZASw9;@jS1DW>`ZdE zopT70==}Qox|QFd09)ye3hQh%s|S|%b!R)VoAOhhbIb}=J_n%DI_})cCYzc~c_-Uq z@RHp!eF4n4S zzfJ5eo^Sb5m!now8Cc7su+qoLIVb6d_l9#Ck{iBo zjI-&K^~G8mK?AJJ(>qR^zi0S7(6(^rW(I5)#gbtU;ZbL0L7J_$0@09SHeakn=LXM< z6esi!4m1|R4$C8W->Mk$AZV3UZndwAHM8t=!GB={?f#lH0&jb)W^M_SxKw1E=JTfp zDbRGzk;o;_b!^yOOY8466bPP+Y%e_{IL@i|!>)$4tnYidLNhcWiZq`xRk{3no8J6W zJByF*mNj6sZ5QX@Ae?n7E5@02KiB7a`8(*1eNFUtz1Q(H`^HS$mC^AB)Mn;uv!n=U znFmwQNvW~RH&^Pe6}Se40J6-tve%J6lHt%<6w<%)UUX|re$u6x;1iMNpu)Sf*u)Xy z6~BuLxN8uRmLNEybup7DBcwy{9Y#`zl##ESD;k@EBuPShCXjDBAu;0ZbQ8Kxa)O>e zD(Qo-MSEP~^^+M6!r7u88u(+TD7)mS9p6SBfdFY0U|$6&iUg&=L&8UFmo|6EX7CnA zpt`1he0J&h@_M#tl!#@0WX57DMh@wCGA+f3@AP_3-3fj38kXMpd_|iguveo6@U0l> z$bLUrBvzbQjScF#zBB^5xwebNB6S>0yYt~WG>3>pC`>zsX!6+oEh?~-9V!OgSc!-s zwnTEct|@JEfAkgLa+Po3m^ZXG<|s+<9_51su)1o_AuPKJP0qQ-2YUvV(44+*( z!5T1~Tw|66Qm6LIccg9DS;^-0y9p#?LBr}Y;1F53Lm|sR;EOi|wWToWwFY0zEf=hS z7X+yXjNX291Z9-i%li_6%#=THalN}aZr#eFQwm4MLg7@)J`Z@nG4%YO$XI1(GXG}H zaUSSUeLs$RF+lsTTgcgV1i-@wfu6!P$RXX+fE7$TlXic;Aw{&?%?5xGz~^*#}yN&{fm?r zmX+NGiD&B>0(c<865tb$Aop?&y1HZ{DyEK2nO+O zu1>&rdt?vWA9~o1MAuqEOgM zJd9Xc21wI^0}B(M+UXEcf@o8#sV(MX0HcVlrAjMGlUbvCcWu>V!m9nBB2xN290|+i<>1~(J zqby5+g)Oj!W&u=GupuIfii$J^R8T2`3MwLkh!wkl4GW5h1%D|1zh~~;Wai!pd$S4n zfA8}iCYzg_IWu$W_necw>d!SZuIp7#dvWuUH5X`4H`zV6tX7=ce#q6WnjGl1v2v@+ zH{E)F`|C$00#zx%;Zhi7)J=kDI#{oUv5^cwCw z(dX*y3SU1zvq6KEZO+?zb;}JIi>A)`Y4jz5{S}Aa`d9L&Ro?3N~#?*@A8sG6wg}~SMv|szj*Zo?J{NlVjFKnCCY|aB6$`&2=1in1@@68V{Ew_4h z`C-+}-W4-o0CQT|zo&S55=hyXXCVck&!5eoq z{B>&jrazDEbQc}z{`+e!zuejUs*45{ADH&X)1KcPmn~g)N*&Cv@4IjL)XjAsz4VrwA6m8YvPI6DCOvy7{pn-h zf8)5Ta#Ew?d3SyN?8Gu{+a5i-{@GXGs?l~^-g%9B{d3*Hmx8rVv^p6)c_U z_vt^K*J$vl_Xn;xI{AfHkJos;ZG&SoTTlOI)ajRMKK$-=z!X3H%kvZezPamr_g(eC zsN;wJ{OM^|i$JrAudg_?s6n%eALcJU`0cUbzc>AS^JhnY8U9k6Df_?caB%cD?WCSNqrK8f@^*M*mzZQ0Qk=h*xN6@TI=T~9Tz@OZNl-JzW)5ykH2~P@xkwnuJlmZXUp6Z==G&@ z-g^f}pI80stD8Pv?t@1wO~@Wt`MF0Ymg#-oV-R4WCV%Sn-Z6h=)!6eAk+$ zKdjo{_W2z@G`nQw`{xbm=Pfo4dV#adpxO71t}~?i;yJ!&8@FH4X#I0nHeT_5Wq#1# zzp?u03b@ug#yP7k`shhIq*G^K_2|KZ;U{K3*gmsXwK<=Uu6Fy0IZfNo@-{vF#zpr` zEVy}L!S==t%3RZW+UVOpc`s$w{C6*%T))@sj6;up)2G@GFI_hJf(A#b{{CBqK-E>P z{@k#=^5RoFS6}70>c`_dYqlG?<=|JJoNBav)`wrsY_WdNx3i|V`uxy_uWo<+^uIIT z{A##;_xeeY;Zf`l}|IT;2v@7pCadq3uD;iAN{&uD3dNv>W!Dqz>m%Uy%apblN)y`l3(Uv`H zn%!KKI=tedhRcuMKcd$Qv-|G8w9=9-4^FJOa_X4fZ4XRr_|vXo9cm8W_v!Uh*WI!G zskF;xPx-RT?8e!*fAUq+(Jgk=nbKj$Roc{f^@e>=^z_9$dL8evcIMHpYrb4QB>&YG zTAz7SdfeW9%+5MBhwj_x-Fnfsoq?viT4=*(|Jq{hKd0~d{Ybl4rhT{ni9yajw@(?< ztKL_e>!0`9H7~cHJ>tvUL8tz&`@Xy0ZM5~SY3~hq@Pm<`ezpDY7mpOx*}rpovt3_m z&E^%mo6VbY_3h=q%o_dK#96K(j zWT%^IyH4HIaCY&C-A%k>E7jOIaB0owQbYdp|ClpuZHEC*=S{e8>;20D`-VK#H1lXq zlb<@=pLJR5dDA90{&e5u9X}j@xzsmUf2ABDl=wmsWD;brn2kT*BCnHmLJNtJh7lo?(R?8 zepc?lkiD;7HSw-G)3#Ktc0$Y9_*ka_AN*Z^^wt`G&VF%m{$49gUi_tGcR8+glclz2)fF z9evdgXYM`H=lh0#cj!3owqF|DF|y2+06nzmet+sK!MzKQN5iD*5A|f?Vhh(-SoSr@6@RB;^p5Z zr&8kg%rG3iBWB>ZM+n-glmL$JY;h&}xny0p}`dIfGsdME7C@3*EhMS`~zCr z(0l6KJZt%RE8OpSy7q9ryX5Y-ZZ8^l`4w4@x_-ScyWW-yoXwZiZB_6>UG0IJ>kYZ| z;(mMUYnOez#)%qzKVH+mMd`7yQpgbKYMz390z zzA^pFephYotIs}OVey=aEpH#yKjVUyUGG2t$UXgAPAK2t$u4`#zFzhG*RSrsy-u^n z?_~XN+K&@@yI0kCEpYMtz?54L3_bkyEnEA}nmTpD`Kzxw|J3)l{xkZy&y(EKzFWL> zwl{O%ZXbU5v!z?tT=&ANx^J~zzI@P@m3`_JjoW$A$Q2)4y88Nesy@23*)5wx zeg0{(aKxa#-YW`zt-Y_-d)XCR-{-AfSnVPv?wpk!WqP~j6kmUQ>d2AbKD6=w$`(9& z!GN--uMge4saK!9)dnn?bEUgqsM4A@ufF%9$6e(I9=J1@KX=>6etRpne8K%>`r3_s zdOtqkxdZn-GU$nY^Vk0SWcs!`uiv+Jz%yU|^GL=MugjszL#1(d*`XVKUN-W(|%^} zmERng@zk)DWq*8OTDPV<2aapE=k~5kjyHc~^INayH#+acv_8d;@4MLjQ`z(8)L3@S zoI4->>)F+<=B6)wCZ*!79e%3Zylt0{TjcjFo^X4Q^oDho-#Vc3&c`qB@^_2M6I)E| z+y9#RpJaT!^oO_aFTZL)*Vi6OUHMV+H#d3k=ZpImPk8g)ln?s1eSJlXk==q#<@eU!a)Xq4bfPU)IIAYaJ8iJ4n+sWg{g_jra39hMw`FXIV1G`E(Vhuoy@ z)bPZe=&hx~;bCr4A7nn01NwjW%Pa`xk)MP%;p~rkM$yY&L=u4Xni7G{MPgeR=|La= zYrA&IDZA#GMvqgvP@bO{fhoQ!;{@^P844zh;+D+N3|@I7Gpe^ znoQ)t8|*~+UbuNi(He6E;Us3Ff(;!XBCK!`m*65=c+syQG&Pz1F_~vtb$TLvq1TKr z(N-Gfk(59sCKZn<tA5e~VO2SKAPG*(I{!OSAf?{RqDUMq_{g2(_A z@G)+12JoYyp9D?!ts_fjZ?H9+X^yN_Ja*=_YL0L&niA9FL;1O(qJr$K3 zV+4f70fr&yHLNbaY9G1e8f;QGP+R`@qzIu~ZTVULW5v&Lof9<8UdNMC&k~Oigz2$Jm8%b4ke$ zgf1S9OW-n#K=uYZ1SPB?%nCPg+xTrWD+KY7rNdN8l8MlJ;@5!*L0Kqx1HjaH6&Ham z)F31^nb8$KDPhIo=DcAi#W;kFQ66>}!Y9RG6cZiB`O*&xMskpZja(h}2IE>-beNYL z;g>?3Mzn_;h#_Z0rcTYylqIQKDM_IsN?@AP=KzMudc7Ds1g43i)WaFiPmXbrI1kL? z(`^->X6hq65YH<=Gcpe}N9XJU!bKHwsFNeg%FS}q=g|pEF?5Iq5SCwMOo`_f$Ayam z{U~rYm{!h?f^mR!Hh9cZl)b@@f@uNa#e2*$6f2h(4{4f{U&PRDnG7^H9w;o-mXU%y#q0wbm$#pWffA;OO{ z$x{0olE@d%{dWWpL)eZ zXcnGsN0;fDxB^od3^1D3Kz2mF`+nnu@*CjQG>6;ovaXx0&EQySGNT2X&TfF0Gr^=a z*t&H=X{Zo1Uz3F)dxPBoiTv<>dldqZ+s$B_<0e=GqzOVSixqp zE9i3gRhoh=PFT1o^bF%cwQ%Dw=o{`eOF;GpTex)%k=2Wb&Aj7YN4jn{7vvW)Y%FuM zvhxaoiyZ?f=a|f#oG1n))@eEhelF2CH#EQB;RK16%zzA>p$C+-pvD7UM%<6uVMFLDQuV7|sA+wcibU4BFeeYVj1p%j9=i zcQb)=)$K|jX9lwt0^&Idu)l<@g^0_o+Y9`ooKa>W2@%XigSf^BOQK6e53GZ*cM3PF zC_g_3pyj+|9YY<8ayop5ayIUYnNL2i*Wq`n_(bb8wg-F?g(HND=xOSvwjmdMW_ifo zV5j3u3kWlT`GUp|%NNDt&>UT+X66**Y(P*9Yi)=M86=(zS9C)DSQ4BnZ3&|wvNCpd zm_&gDG;WL*bof+)ldanzEftDJX9E+QepzrDJYlE8I8FMg@S6oEdxJ43hQ&qrB_3!q zzg!LhL=Kka7UvXYkIl~2A@cy|)lr=DWgB_&kYYB5BK$qCqA2T;R6wgF4gD#T` zlk>+V4+`J5XckGpY=#C6*MXlEUl0WpP!?8xh-Wx8nUNMTLnRh4*5PmZ@d%hDEPI2o z;7kjMFu^Qwxf1eFC@(9gnCd{HsGxvx5RIE*Uai{|a3G1OSgm*tv072I24&G|QZEK4 z_~OlyHeejc<`L?{OJ(k~xZixKj`UY!P8YEEOfO47V+X$AqQ z$%cEcYubmF%VyU39E0G{AXNYpD;oh2_`T6H1)63Y z-LQn!MNPzc@gi4%l2rwZ%n2hSW5ij+HI4F0=_f7BB1;Mhm8AxYRI7=w!jeZ4C5qoM zOj-0BO}%slMFfVnMtAj37^+dP+U`Jk&@RvM15p1fdDYV$irDuJH_p z-Z2*M>u!A#nIih;U9|prJz$)qu?RFi&l4+feE8q__wnF7 z;NP%JQLwF3&HZkM1E-(I@_UEIW@mQH*8$>AB!Rq$;`@>V9%Mm-1Rv)cq#1rddZ;kJ zxF8D`NMiv;d0)hvr*n?+jFn#(u|~PQvhyY-r=%w97pi$yc2UUDeMTs6d}cu)ASYc? zI-=Yi#oUBlr~d`Ho!ARv23~XnlszdW9d)?eJouE-%W-abn$+kwG|) zfz~;`L*F)ehtCKO}4NU z2gJ-$6ajFS!gvhg#2Tc!-9CpKPN$kwLn6_}o^w*&ZYU~v@?lba=pX>QS52yDeMTqM zd`i29@@6`NaU4;%FM!ZZgr6P{BE`7rY9d98_8b!F0YCs3+hC-}?{>J6`cTs-+9=U! zv>eZ@2_c-#yfLAI@u30}OJh5t9zX57J4~+E<#Gh!p{U6f-NgTdT*4XoVW7GK$PdEA z)`9^CNCx>J8=i(Fq@kgCuLQ3y5cwKHG+ zvqC7GTZq$Om{1R5$xw=FhL%n{b)FH5Pc?Zw2&5xJ?DFcnY#dUQV>tqFj^tezEl&Hp z9ygKfM1pbdAntnr4j?uhMm^CCktLDHjFOnNXSZ=ED}(J6GDo>A`bbytq)V(S-s6G( zL5|7g()s3rigzLxNi>s6m5H>ckIaX%OHOD~s1Wzk7l)wtcmoa}5oQpII4rYCl!TT} z8zqL&pymj|F*OMF!ie(2Xi{^ubQ+0HW?Dhd%%BOR8)fTJrl{C@mrFz70-!rD0@^Mh zcL{8Q*N~qD^MzDIDd z9l#c7eq3!hxCr_>TnJqe%^qOmWM+!~lYMc7Aafzo>4P*+9M{O@azg2#;uP1(i43&c z1-fC>p?4PSQYvK?B5e{Z9kPXM8eI4N$f$Y7lsn-II=?m(C6rv27BIQAW5Je z`&-^C6pD+HE+>pO1arbP!ZvausidZ{bZRJW8iU{;_L{TNjXn25EU8H>odW8enKwSa zcuaO&cBb3qh79tC3H1O*;s^XkO=#&9P(lcWi;hGJHkotO<3&*g0`6);MGcgO01Wfa z(-7CBY%EJDrIFxeSR#ZH(-822?BIVvY)>=LQE6}vAVugeN%$CKAwyHJXCMd-phFrg zV2uMoQqmAL00@bH8!00lbb~J-VG2R2Q-Euw841ob(gzH@LSGF;9Xu8OG2AjuPnhEi zur->2yhwwasIian6viF z%NIV@pjG2>Zw$TQ{3`3p_B(a*f4^mwDffS4r!DWBawb;VHgoT7 zHGiHw;@;oy-2T)9b@S(^w^;PnV;dJfwjem_m!!AKEq%J>lVfJ>Jvpmuw~Wt!-{&ne z_GsIi@AJCXeZ44iNzY4jeUtw_{af=byN1mTOnTzUZUY-VdB+7$R9`s#jjtbkDt}G0 z&yG(#wk9Q1@7A$*S9qi8+{>E`Z8mmc6D_m%%bx339@&=EXHvs|tNwfc$))A@TzT6i zCp+A=IrQP?m1}1ld!)Gg#lPeZ{$tCQua@ttb8LI(A>02f{__U^7n{Dw|NGsw>6aCa zd2C~!xo_4!apH-iZ9cs7;u#rJzo~b@_~}2MKWgi5TjqT9?~haJJ>6mC-%~D4y<_yt z{T-J*c*C71+I`Z%as8>Q=4~qTZ_^$(Iez`_=Jhr1)@~iurLp6*HuL2-FB!ePR+lyD z*FLr%GSeLJ>)`rFP|g4Hj0cixU+pA7i!{a2dQYu0ngD{maQ!*zV% zrwt~DzPj%DPu)4g8y$Krb>Wtctp~f(o*&Vu|Bi;8-ngb#hw05{T#~zBbJ?R`=iYjA z$Jc(UUS{+?6=(H)c+=vv+LboWJ8(h$7cZadUGYM0_dY96e6;c5dV{-e8MUj%^buv# z_D|fuyP(@j$1n4D|MSJ~FI0c?_)C*!tX+3Y;dL{bAN#&`_O@F)T=B{KPknK+-t9m9 zIAZ8E2MbnQJ#KczuRBzIsB+VWpH*tSx$;=gk4>IBwCUnLRjc%U{`Of|}& zFz?U<+w;2xGN1l^=`HvD>h9F7d$XB~=bqo}qRaNYI(x~!bxDh}Uf6j{o$g2Lzw=#- zfi2gim;Z9@v6qH7snoy6k@9bOJDj@h(~589@40?|%fTt1EqM9+&W}`nrNwoVr{7z< zd|LOZ@16Q%&xV>En`?95zPhN{=|^+cW!O{ixl~ zzNZTAyLWu;!9OKe-d+D>hnq6)uYK#c?|(9{!S27D!>TW6bD(K*W6Z*>_UMbnuRqmt zXpJL(yu0+>zL(zE^UELJ%qX+!%UW-C-1PDteOi5dQ}51C{dOX!W6!%+FJIHY_T?=P zJ(_>=Sfl+nzPj=HOQtsO{K`RX$mm-=-7h|N_>He-Ed0IA$>}woZ?*Zv>bqt>?)>fI zihFLXbz9HsD-J*RNA8X)r)sadWwpD>@i9YuC*R!m;=xUKX09vqS%ciNOItj&uEp{C zZ+^3&{*a1g(&m;)_m=ylQj<~p{%o;mPp3)k-}`=HaP=$Sz4Lo=-S2kp`ghnj543A| zVEC*u*EfHEYx^C^r+#VDuErz#-&qz4w7Wj_p9NX>ZrVR+*23Gb9Z_ROtqIe5|9)?1 zcH{P6_n7}&nM27(*3AEM%#L!}jhEd0;f@bCT;l)b(wZwbEnZSLd)1L;v${{8yZh+L zNB4ZN?XsOqM*nX?n^haU*2|a#ljc1mG$5J+SCn?I|to=PvgI5 zU;D^k*Nka2&R=wDMg66LYwz4N{nz)_yKmYsqU}|U3ieH`o_E*Xx6IA?vifVwY8(!& zA3i(px?}!pAGo&Vd)G{GT@+`MZ3( z3Vj>b4xaz;Gl#zDm)E|^kqaBVecOiBpFMkZ(>mD?v~Ife``#DNpL@?Gt?OiMeY?r# z|2_X&{W_zDtn1i+Uct_u)fN?YZ^STH)G0ITs{l zoV+6E{huGp{Oj~j6>I(d*PR`^y;%6u(2CoxoxOWcll|jAy865QcYV?6_4c012d{5^ zX}hcbyt3-xItL3r7(VLYBUO*Qe&EkP_s?41W8s&>zu2vPlvQnHO7<_VMfbMtQLkCU zUo$I>XqmHR&5s`yJTmUWn%9+oaQe~ruDr#WesI>MKV>Xkv~yPOnrk*c{pyFi>lHos z&sEQb>Q4V@&z}48_WtuzVQ^8+K!t6c_j`Bje7e&GHx^a+YyEkf|2(zoM8;opTeW{< z-1A8|Xcu(9zz(KMlzC<{s&kd)JK3S1t0^z3st%hezGAr@%G*nPtsJ zOsLmv)vHx5Z`rQjJ(p%49oIT_o6~ps>!D*`6r6wmoEu(U)~5E}W!LZC^5Wd>%kF%$ z&$wG3Y5v*bVN37q@NrSupHh#NU7ykQ;hGKqdbfJ-AAJLdG%mO4=|=B(YL^YZU#ZLD ze(%1&z&&MER>+{mHerHgEXV+{5qx_QQ$CZ(hG-=ogs-Dvo+< z^14sAEq>*@8-Bd$W6W)C`Tmqkc2~LYqZzp~makm)^7((Qo0(QM<+^r>GXjtq(S?-G6lc)Q2~Xd3^BK3%j^BulA35|A|Lm|EcTgWtq=q zG``{QCJS>O+W2?tL$xp5{$`gpf9~1e{ju^7Kk$41Chtvrr}6%LZ^tE5x^1Xle`dkz zx!*b;`QnMX`EM@k-D`jTqP?xVwg01et;b)TaLJa+n)llQ*! zT=AaYmLL9c*_O9EC%^XmreKW@{i_w;UG2f`cYONmUDcYcxTdfmXHU;E&1+s-rr(ZV zFlx8%&zl-;t?T-&)%1FfMl0@~Jnh-b3zx3!SU0Qf>ibrVsIs=}l$zVu&VDX+$ksq% zw_opHGwi+PcYE*ou5xyj%=@05(LSl%vc7HiuC4U?`8Tz%{lny+FRVVg#)nT8>~Hnq zg{?kZ`A-7y+aEp9vG=bn@1OGW!#lUHtD4>PfzZPh>b&#W zu$3>59IcI;8TzXHt~az#msf1*C{y;>GfB%c)4Eiw8`yK@m&4PlobaB$dfH|0J@om4 zU2Xr~uh`0n?q8I0&!pr3{?zcR84v%O-f-^iHC|0wF>0E> zXjI!3wZ8jy?!IM9x}Mkg+TX_=`|E|fe;aw(iIaCN&p%fGSLcSZwR%;ra&T_S&(9S8 zQ1O>b#-3ky@C*HG94vcyVV@H--))(EVT#+7lV{zf+i*I@7vp0WR(d511<3|s>XZOh!hyVF{!}U#it!;LH zkK0=9-(Rr!;Vad+A2|erDjFVNBXhl-W;OwzzFiwBg z-8CW3B-MZDK?fDhNMnU*?wc{BN4I_k&6=xq$NZeJNmgP(UYJ;fxfR4xR0fWqK&&fS zAeQ-wVo*#fIk87Jb0&9`@5b4#ObKx8?pSt9;E1rX4{d%SL?Y#CnTzo8Y z7Ie&tNUj(^v3G2H^-RkcIz-@Y_o7S`HI+cF@|Ni#4S`%2P&@*;I@CraSB&FZW#<_h zjp%qF`4p*uC}%N)Zsh%pj5Lx0!Dtz2sk+JDzVsb7Y{<~A#=Zm$QC-5mKs;EFkzQjf z>k5TA0xi(K?V$)QPI=iVO=25JqTr`b3)bAfG_9 zR6%C%SlAQYMyxcf6>Ujw)NqLB!lJ>YdNh0F+B(G+YL&v!a*Cn&gi~x$;ZhBpJ!&)h zcI}rDwvl{s-8pVWh0lU?=Qv7HJPM+sv53N;-{D0KiRJ+~3rI$*Ey;q;vN%+oeo?7* z>)v%}|4xR03EEw(>ayxFb3wom%r>$&9GfYw_KbqxSS{Kw`Bl9D^gw#as}%)QT94j6 zGx|sZD!gRrsxu5Vl~IUE}7(BY&3Tskk+ZEAym11 z3Li>|Xsdjpb|Pkzo!1>jtYA?)^O}5-VtZ;J<}+pUx|>ZkO*1WuS%dA)e_-5FHx-fO9FoxFjzhjgqAKeT8Tk-^vuT8stEMj#nqmR z6}P1Wtfw2SZicqUYc5v=^s$TAqlmvt8({n{iJG86IC-p;frlTe0deC&p2{j}SQVZ4 zILc@EmI}{%QB$ZP?WcI&Ea_A~??Ks_vML^RStjb0KkrA@(T7yC;^!@*M@7DdG%!%6 zs^>*q2jiZR@Do-~upsr~MJW)C_pIhl$$IfdM*D3IT|_)6uvIKwG?Ah`?)Cc|8nTJj z$ECVV{f4PbZUJ?}FzUVXr)Cz;bjAY<1G*nj??AE-xnn9*c45Am2U%OxzN7n`3BM*4 zex6e@0R{o*T@f<<0EnQ3M@?qwzytB(8-l>Hp!(4VOp6onUoC*vE07*O0C0kEH>I3% zxGXgiS+KR?al%A2^v?<)VrI|?5$5nmp->bC_V>C=ZZ^jF#Rai)`yilzRPq7{7yyRF z69Ci-5j`Kl9AK)+j1*#3zw-i~2;LcRHLn{*6L22nlPRi%b4esBWL$)$(*W>=#6}e;yFOmPnmmv@B9WN- zDX9GDM4Dqgz0v2B${@1~y>e?dSgfY{s52Jx5K0ZE1QZbV-W%qp#|zQ{1CmJ19^nvICiN#_}2%EK&G^G`llPh{m2s(`kir{P#2_75Cpm5=@DU=ngU_! zPWI4gfL4+T74607EH#@Qi6PWS9P~#Bg|zqKzN-l>oigegLOv!C58T(|^8w5am@n)N zSbyOY>Lx{slPj~cbh;>hDiIUFJ@O>Gy;Qsf1RRPx0&uKIlhVDCsVto;>RgBpZ4Yh7iX{dEIm8DZeVf1G_ z?DUX6hdg(quOs1T4Q1p;Bny!idCyCyixNVoh9;aCk(}(tzqHNd{s!O%6F}W%GUrso ziEZ1(W8yfQ8ai>f;ZGPux?pwq;eD!!w5N&8Vw3q7@et`ky4#J~tT2(VKvCGPrm=K7 z2sFClQ9o`c!l-a|3=%y~CyHV~vU0Oar+(t4(c?s^7D-EfAU&YXN77PBW9c+cpHOCw z7GH4@VY^XRhL8i@5*H3=5Ct*BU{XZV^_H4u*cX=Z6N$QU3TT9hMCB_LXRC>{r+3Vz zX2(zw=EI}Bzetm%Wo)J<72o=C!3|R30r8?-6+i7MpR+|Om1M(!50i>QT=IX_TrHgj zD$K~fEGm)!eqj)WVc^MrqmwA{zdAU zSv(Gwrm3+3;^8J==#0H0s5b;O4jJrp!QFUGK9CF5dQP};(uEJVT8S-uln6TAKJb&u zGYvWe;3t)5D(SSRh0GVJcW6A7(^xu}C|(*3 z0EyENA&*e3Q8-S;o2ZGDH{G6IGFx+PG@YF9@SP34;5vyoCq!v2=yWQ z4)+K3kS52CK^TqfkbU8l5JFvuy?T&m4-<+Ul#33glF-uWqztMijjKTfB41u8PJ>9A zr9{QVY9dRgk>V!O&D!0en2m3_8#WUXiAox6w%Rct&D3#)z?Q}pH1?nX*9#ljC@nND zxvI3#C5`Q{e=rk3Cco!C#Ez(3*tq9JHHON__nfuAiv9ZJWR4v>A=4GlxpX6eK|v%R zw%SdJ4c-vOM?(pKA8!dED5?ddHiHES>5}fH{Y5W{6{I z$XPiZxakz#M3JfwMx7U3KV?pqPWL2&NHkG#!bamnV*3L)eQF}@X&p{YI5 zP{-p#LovyUkIg=EBQEShFis~GV`5;0;-o71Svs#MVWg66q``FKq@o)fP4rNcYEJ{5 zHLki~w!!1XWC8tLx)G42?w&q$D}&!;I;ZwD(ODxFh6ZpcIG+Zwh#Gt8ysC(`*=NU0 zEKg*1GP|5H9#*ufa?+l2O2dLwNvXXk-Pxg3gGO>A65<2UE(p{RYx1{d$l6ipsDO$i^z=lK;gLSdLPg0zo+La)6xA&$D=~{vFBX8H!^Hz{#yTDmtH56L~Uf~`wh4jEG_<8=MxoG z=zr(G!yD|nSkvD0B$wVB7F)=_A7&BzJd3*FdwC098fU4$&%akkjwPXEjQ&1z+VOc@ zHTF3;&HBIm`*b86{;u=ErI#$>dH#L8ucz2Q(}nsW`i_!XW`?IZ@s^p?q0(rX30cLy zBLZV{vCf^wp&&GqfsWI=6-O_;(hs8Xq<)-KU|9(&*s)uuv~&Y3%d4mQj>*ZMQXG%`r1dp|dTxPnXnMMt`1bTPA5aU^pt`)@7}8RsB9R znS+qHir*Kd2wT1auk53d)T##BG>J2Et)p?zOWcDlv;MkN2^#HjA6z`2l6iPj{&jTy z*Hxv+Jf9PbhpD0XdD45*-YXVQurx1nu8PM=WS8`~7rb*KZl-wLd~|{eurpBSNCGGj z!)ViK`gP^WLsN2O4V8-*{Z9SlDNe524gVU(rGk9X8I1lsfqYa@cNgmtC2~)>c?7?~ z8CU$g<>YazP~3VKQWMmX(fYVl9i~&S0@@?;0l}eo+G-hA?ui$BBj z=A);4K5Cr-@x*j=6=%nc{iz=-Ce!PMJ`glOshsVvDtV z&`OfPQPla?1smRQ9?^&$;>`pwaL>2t11*JZi!~L00CzWDp_uhtZ)^TqDHY#WkPVs2rt1tgcu|IF_3E% zy2Xegz*ungfmW3dXX#W|LI_0+23`d2xIrjvD=!^aC845u7M-Jp+{Hj5R#29(SUrMe zOp&?Z9QqM3BoToB0}2O{2_CG>RnZIi4~QioU=VUCOe`Qne#*iti4`r+=){WB-k2vD zhoE-@X@^t~&9rg^U?5N-3Jqs~V+B%8#*0)<7$u%8b$6A5%kZHhT~{L=R1w0$?+amP zx-#6|N&^Kh9=;_-TVhXDy~4=B_n-DTwz>3TTqC)u|T`QWb$&1;^q>= zxQs`}lhF^kS$rfW%fsV0M(Tu$ZmIvjGIhc>tz<%l+sNcxyuO4HuH$Ap=@7z}sjPH% zEo2H+5pgk4YpW3n&mIWP6eu@p4b|$dnGmXF9}71+;zpl#sYs7)X)U20W7@E>@K0wAi2`j^M?jovJ{9TPmN^ z;|PjCfEU1W55$Va6?U@}mccCjc|`~dSrvGJiWn52wvZd*^QwY>LcXFxQT6kp5gTpw zgzKf8wSs!lxTMG3#x!&aep1MlOcq7_#m!Q3BHiYZ^ilisQC2;&WIM_YCxCY=$L+wa zQFSYaawC64&-meEl0uZ#9tN4(c+nXKD{37p=E=mzW6EQgYJT#zfi1O1B|| z+@$6bTHElb{P)VYC0r!fL-BoBi61i*8etYkM!B3>PNHZf+Ndo=m{t^b z`C-neX^q)Ij)eN`mA}%#w1)Z!Ul)MeMj;SlAm%v$VGHkrIx|R49DFE2j+DIh{1b_Z z^i9j2lua?f5DKVUPc3X6-lN##ewZsrE5xj61k@q}X=v!M2Ofy%x4IeNqvR7L7@y;^ z#}^lb9Pw<4mk`&aYfuv41=E4j)$3WPLyD;)86#GNO*tpZQt}?*_(x`T*mWi2QlkuW zBX5bxuS7r!JV}Ro)}3|D5QjxjB?49zRXr6G;V2)jUiE>(HU( z5>+s48OUW_gZ_W0nE5Hx2)BU<{6{ z>4wK%U}A`%xDKTTkqG7FqViF)T7ZkDs4;SED1$LEQH(3Z#Kd^cBQxiP%0P^m+IJD^g z!XnGvb1AW@n>P3h9betvY2RLSl3B3a&~G~H&Gr*_Qt9Y3yNL(Y0I$UBzSbaoJUtR=6}P+GHK^TtJC-m4wJ=7Mb`Ysd+RWL>E2k0H+G9 z;qIO3m$5HYkqTqNY9TO0x3L43pGHv4g^~ionkya^y+qZcH0s-n6QOuiv`ab_gfa<% z(K)jyl-#^?8-!JZXffmmj1FLTXeRanjH+nfeR3$-?{GQ%Es|1t=Z}s001`rDi?c$~ z6XLOBB?ZQ!6Z!L?81$C(^AcJ$Q9qB6rrYNsnOWk`oA*r>gvR(q)HtfFc)$zg!$u{} z?9v-ySnAXOSHZgN7W^oI1;s}-)CN&oP{pI72&BUn%d_YTz!ny$38Rx2no>tC%6uAy zrUWFXq9B=_G1~%s!{f21P@o}d>>n8-n--xDIyP|uNT z$aJBUn~Gk-q;tv8Mf&pCu9^lwi6Qr{eY*7>*tuozjE=pL0TNQO{s8vDl({hK(IQCz zsd$EkbmXO2uYigmF>x_qQ14z{jl_jMGbCV4A&}A*dd(V$47cRR;j)k%#)CvDPvVtr zBKt*^7M+PA&3$_H?l^!ZCsDGc%k-j9ULkCdDCrhG%q7x|P^W@!{TxPEjS*a8zD0+2 zh;)m()E?b^`)73TLG^2q`7G*50#;sY$R8_+=65#2Y-#=hi|NV-M9kPnE~KK{y^)}G zb1(|k#n8o}(c$c0u86&G&FD2QYQM~a5Qar#fQkN=$Sku7pbVzb0D3pTGFCf40td4@ z%E{uvG^*P{uWFRcB42EMJa*hI(_jezw0aQtf$4-U_HbU&TNMasDoggjMDv#4Zq4^Rmv1)X5UvEfH2j z_XLyag0mV?lJ++}F?1qK4@5(lOz<@Tz`c@8t58<4)10YI7?{|AOdki=6lr7FMB_R|v0bBBs8C!;rnouk zQ#4nhl@TKn%vHj|a7COJu~6{^Q7lw^ffOPWEL6a3;*N?@{+g@U?zy-qT-PBg2CCua zk>bM(7}=~yja02@Su!1E@GPQjar(mMFNcikvL9wJhm4XIq%U`K$SA5x_-kFYqGva~ zPI7bTsAMK{c&F_UnaWJ&P*g#Mv)&BGVk{~c>xedDmC{EM*Ls`{L1iNDKMS3=ARjtBy5aB zZd>g`-Hj8FPk<~&Ksh{pE$;DuERne83=1UGq-uy2DFqTklpE(!5s5?G6wjeIrYB%O z4jDkeHsGbmN(qrTYQ+~h)cW04xmu#{H+b04K7D(%?9{t=cL4qbM=FRRQzqZf!)@q@ zKZ28FY@LVW?jk#fM#Zs{)3tNg!Ra6;9qxue4GOpw=u!H7YYP0Nq~&Ce zFHH96gm&zhKOM1z)=(0ysXGG_>%L?^{sUnz;%i!VPKc%jFp64iYz@%wIbniDc z579OJ3VtM`D3m)0O{9RX;MAenogm=#eV|nir>}QFWhP-ZHN645U%4T+7yy2R88A6z z3L@sh;%TC;zIc6c;l;c4#Z&g4>S&-6gtZ&;0^Hzhmv&!VIz)uNa4&WuvT&!ga3hj6 zoDC0wNsdSz5}e`XGeoPg|B1Vu9uNA%+qj*~Ni}{xa{RC|X*74KZ>NFo2|M26?X<)= zkYrUJhBJ~Q?N21=qP(3v5)|cja@>g^Eg1P$_Sia{XX$q8V0it^Cg^sC!BW=S$rx5j z1|SMfBra2pgb2il2*-A*Hy9u^jo?hGf_!?Kf+Z)K0I+bJH-jx1bumL1y!(<}TNz>%iWLgD`9WoP;;h+vjRJZM>ygUVHsoMZD zzi?D7s6y&qUm9*Ef=qxMJ%n^M$P6MhPn)hJ(<+VZaC6MG-0bO?9teeyk(|;se?UHo z+%vSivBF0P)<%8B5IF>z6le!Zz!1Wxu&z*tO!I{xz%}C>0Od|NTbY+)a5_3K6G|R| zh5X=`ixtNKd`)0%M9E!#^zK6bLng3v=&J2y&7W`J{upa$Z+h|bbn92!SL^UBR-m?*}HRTeQENCK!N za!6x_$wZx%lkSp|%+e{N#Pn1lq3J_Lz@QYP1z{o4{2m2E6#ze#a5o>(#88S@Ft!*V zTfX%kq>HGfy_(XP)lj0g9>^qMZK<0CpvuVa8mJXWe3V9;#Ha*Dw55&`MJ8qjfO~`r z)%RJ0QbH1nsHQ>;N!YWzV#$(8P@0U&PWkapRi`Zu0>Vj91>&6t$Z;PusRrDI--M^4 z?u#*69*Lq7)_V~7F@s7k%wy_Hq^8oIMiO|LfYNX@)y3xGl7pYbHyX)DQj;>TKGT3@ z4+9X#zT2I%Lz6=B&6Z+a8K4%8sZG>2DF{nMHMNP_=9Ff;6F{a104gWqU12i8T^e+# zCexk{GK)UXbe!g2G#aRW93{w6EHkc$&M65=wtAUa!Q zqC%S*Y8rIXKp!$WsZzv5sD$lgaeM1X6sd*X8Bj`L96dsXc7aLc_Jq;$08i;ac6@=< z87M9sy^g(=Z=k8x&cgy#>B)K|i2fz9LjUT3A+#>$uk|1+HB)7OXTD^55_JsJUz0zC z=Y0B_JRFA)U>kp*e;-Fb=_VCD&%cjj=RF*&4*{(|#}pgBm-9*&&h%RUUJ=0L;UK7Z z08AbZtP+B^3{qtL{^Wpp7V=*C1@Lk1GbFotLbG}1RpYsi9(Q#RQ5;C%R0ogO?AKF-!Eg^Km~x zHXdxe7d|r;S(E-p4$h0RumEV4j6Mm6XNyd>83=`EWarun=BR7cDB2W+FlE*LF!!nL z5zR)V*43DLU?Nhys^^eM7Wo7N4I&Z5MTcmrzETk>3Itn3a+5EfvU+r+VT0ueMonm1 z6t4Lo*a$@p?@r!nQR3L5FEKlfx?z1tyc>aA1nVgXN-b-F=|U3{lip_tSVNqjLn2)i zZbF>Fppl|YK$@s&6s2cOG!6>Ib7c(aQqB;q0;14Zy0|ygO?)&0 zO3Phg#zzl2vbq6IQ}Z!qZIb{&?t)6eupmfq#6p16r)&ZhZ=p>G3*5;&{a>gW59Bq? zO`#r0e#DMwZVC-%Vkmo<7ZQc6$y)4kJOMFT)SV!R1mgz`B_kb%7%SdEVIFRhtP?3X zQktus05U!Bg~|Rg$V3IE!;ch#n#`E@o89dABXbl;AVZR@3-C_EmIvTMV~7WmF|s8| zy$DOg%lL_;7^fcxE=(n2oHPhSO{M5LMF}iK@7xn5%0PjIaFhYq9lKEm$^_HaVv=GS zWnLp82Z$!_qnq3AtIMD81!Ph|V340rnSa2-vIuQI90;+_X~`)ALeq;(chqXfnBxz; z%YYt*Bfp-<8CV<%ubGoW|MIv3Z#+U~9<2)f<`_Lx0>t7Eth|Fhug4X18vy0U4BLu- znX09KS-c|2%SXD3aRe$ArSFO-j^Ncxu?0|?R{~FyPivG!mlQ|vh5^YGp|Uk_AI|__?)#Ig8rU|j23}ckrCDi#ICaKCSv9w%N4!VQk zNTEOlk3_LTJW>{!BfO2$OhtDbFU(Jw$4Wn*+LFO2Q2oAmOV}QX&1$H#qDHY+Bq*te zw}O7r6xZq3QSo|rPd?&NL#Q69ZN>Akcj(iR7V-2y(a>Uw8e0+!EQmWxSPLu;laitN zO)3;FNQA%kt>Xl!Q1n-VlZJYBgpX;;2kjv<=3(pk%|^TeovzAho`s+j^&>@&C_*NV zdJuxut0Xh7D{V?5#0dXlu}ZKLz8m7c$Qq*j9%yFR05p3=GVc^%c01hUk|!=Q(Tk5w zRW!(C7l(3&Dl-2oyNQlw08B%`orwq5vkgR|sVOy#ka;NzIQthUe!Iy9JQW)*Xb=hX z3QfRLQz?p3`&6R*FO)YeG$xKnA(?k@GyE`+kvU}U2ZhxAgjNLRQ|6^8tj{TxF1Qyi zBsC2(0jWXu5U-VFiaNnQnK_dS^K+(#;^3tRPLaS%BkZ9hQYu?Gmqa4Kfxw`iX!XN_ zbfH(M3%cD8Ekx-}X~&^^?WiAfMsrMleqj-Y4UEl~BXY6jT|H!Vz~(jPi--BCq*OHa zqVx0YP^x(mM*_m$NM_R{bX+WDGTRHcG{V#W+D8JkMlUdlJNb&94w$IYiE3y~ZBm_3 z#=2*N&%od|%Cx)ZA~YB-%NE@QW&;|QyS|ww-w9Rf;39k(7Gt1)nNNg&b)Se}ZS3#N zGQr>V{;2quViM^|)TdMbJO4bZO~>b0Q8;~G&%sK*5v%oy(>G$fFBa^ei32Dx7Hctq z&(I`7-#Oz+olWdKouOhkeMp}!J-ecpTB@m+T0q%LO=ohX)(24uqbN|*ILjmHVsE$> zChV+9);!WD2w5YvgXPX3sb zv7xD3V`f9!cYXN^<}{~^a4 zrj^ocL72sAV(mFTW?~DnCQr^qYi1x1CSU((T0qTh6xjj=p_P2DmraeV+kTe54*(!=0LkD7=zTUnTF76lt-nm(*!}o zztZ7^6Bna|lh8%-6^a%oiYDYJ0E1noAt*?DxG;wrOmyQaxq(NN$&6VO#?M7Id6gAno_ZQ{N8G$62Q$YTrm_~yI9PVSBhU-nUaLB=mnqZ@x8pXi5 zXPAbdlXBuUK8F3{qd)DX-jJ&^UthEP$l6Mfo2UQ07gvnAgB+6Uv)i?#=T`MD7rL4kAOk|4_8V(o1Y@z~YRqX?e+cWM1x&|Py>_R%pnjDh~qbyrk z()>Cv%ab|CUToilkaemj>`QwQ_ni}O-W^bhe z9C{oIpNkqgzx;VhY@(uA_4A^A8jX5}0SA6eLB09*sM503V1bGc6pxE`T(nWF%CTD?0#iZ9DL~+t3dRveZjiXrNHQdFWx|5R>6=o;stds<+ zr7}X=oHNDy*w+wKjB9tiEbAV9ALuNd_1rjKL#lfBIz`zKD?8z}O1@-l-UT(M_aR70NLL!6NoigRKx@!Q8m_6#Pf-X(kpgEC z%te5EeoV!SPf|dQ(jt)%F%?tNpyItcRLUk~OHn$biv$)0rO_+;Re+tw&Kmuz>l8Fi zjff3a+XB#;-H|I?Y$QoyL$^l-drYc$VKSZH?Go)V1|KuThV@DGktUxQ7O7PaF~r#! zAEgR+r4C`7Hy+hbc}dBM{=@pD_UMCIAL;qInR%M4wceDfg!%P2#^xqv2wRc{!yZJs zrr|aUsSB0`63tzvqYQFYOrqLuDz8*9Nt8RvN70}rpoCvB#NHWy6$Bia<=>>*G9;T3`Ll>?42?AXC?@3bSQQ_T=tF5Q z%57B7ntfWDTgNt!KdPau*NI?{;%7xJ*^)8|kk^>?4fTwuH=!gEJ3__?@&Njy5ZxNgvZY zloO;$6D4Paqm(%#vq%v>nE4FdK+z;8&NT!&tR|B=5_{S@K~%bd^`&};FqKH;A@CoC z%9zE3F+V&WzmW3$u|?0rqcs0>~s?PLp?0=!6bTsNM`9_lT&9my(aL z@}<)mdulmh!79p$1`(VftxMCXkg$c{M}bzLl}%tPs_l%}KGE4}#uW6+FV31U2~#7d zI%P0ZjGzLl+l0AH!xepql@qpxLGu9MfJq~BRCGMfIi*yQK*_`~r7&TrB^*Tnt)!Mt z6Ll>PjYq)2o&=4eifE6aVhl2=(H_8eQOFd{$mkq3OV9+6N$GnxRrT78IMPSTYND%L-j(BnrE;Rn328wRh`H5<{fOi5QzysV9qI(h_rPQmf zo#uRuCz?b(6A76>H9bMZNsK!~<&Ol2mnn={R7#ADD_g=DslhO&5r76G(FYElDNT1q z>PUG`+)|1YavaDRhiHbeFlUI4#h!)GQ**M}YC^97an6DcK8`Z+aa0IRW29h&Zu!!` zdT_$W8@mzW2!BuVany-!gWz)k&U8Oja}byq;SnnS!SHgz5>q8I5-u{8 z;u*HZ&G;K3c&IBO!j9Cljxx4rY~t`Ey5pi!Dzm@LZnPn{Z4t<1XaYJRu%7-Y_Z{s;7lcrBm*ENGoql31ZO!3m&Co>T(2DnP1p##(=8(~MB zO&kIQrm69s$W4EIUF_oOgg~w4X$Yx7C(%buJCtOKVk{PJ#@pN7MR8i_^DvP(0~B#m zQ)w@bV~#o`pcMkfA>dAjsdU5scfy8MQz@DPws>jy$o9fFY9E<8d_v106oUS!)RGhe z6V@)qULm3<3v{4#1=}-AgcETjm z7NsZo^-Mor>t2cIRrrk>@;ES7`aX(Yg`c4Uj73>YsWU(`{kVg&KOz}n6bq)lG%yh? zHjtkI42&POb>Nv|>l7-;o1xi@XG95EQV(egr=$7=|A+Dm#DFOlj3f(ima-&fz=!{Y zN{BQBQ^QoUln?T}YAQ=7;(8Ys6wPqPl}SN4rVBAP>ZU<0f+_rm$Tg@&%ni6*NvlCg zM-Geq9Zvw2G|dfHI!q;sNu4B^l~jsi&OVhL^Jk3BpIl_ix>lb{46BEq2U(29gNQJ= zQB4Z3Pls}u7%4h#=aNJ^gc{H^VH(i`Jcui!BvQ1jqo|8BXb41^xBwRM^Mu=qimO1; z5+A8xiA;qd^9fTIG+=_mXP_L_BX3d{x*UY~=MXDD$8u1>fYgLv z2UOu-Jt!rq0}h(99b}@(GNfY!$gQ7)vLZnyKa_ano?5)yGpPdx!ZM_#^+~uolxWA{ zwyFb$+d9*uZgMuEr4^5g(oglPWO#X@eie^eMH20gqO?HYO6&*BB(^U+80lvTO}x($ zQGO1QK4WQt-+~=e1%4PFOA(UuTkvDbuoH^&kmXi{PW%=WnJV%ETs-T`r(l|>^zDnE z_~m$b1OY@O85Puj2#GNSOHgTV3ZVND&W@bob4n$O4cq_)qxX(ZCBjGu`Kzgny%8g` zg1Y8U#k{0=ASHy(fg~p$)FN2 zLu%Tkrcx9Gwl>`GpyJ6gQW6jFWh4{yU1mWXltR!rA|P>PK3b(s2_Z4I*@H3*3bXz8 z0(VhN3*f5*h;9NWhnYxFtSlN%BzvGxqW#3^FakMSCzHAfiz&#AN-MjE+dw3}1kY5~Ld4y%cRMH?EoPITx)(fSg(hP8$lv$KDA(WGYu40l8 z86&<8HisLYu7(tY3+ZDN$ivCSHt8;ShD0R8W6M%nfP)Y^}a?NT=OJ{M8 z$;-{oleifTprclsZW`!<@>YXJYK2C_8`U(H&fbidMi2N%9caQd5*D1ITdEzGVDh$1 zBo5E<+u|aLMJo=Ap!XiQ92l_-h#0bmIFkXwVIlTRUX^qvB{aS*3Wcm;sv{mt4yO^u zW`s@;O|^v#SJNpPn~5|*VzoM;cOq5?nIPf50r*Q4LqoP8?AZy--Iax}Ig$an!|Vj! zbCkxpu-CAT^?!A}?&pOc1cB1uXZA&sA3hSjmh1@*^@+=#;LT|SP0N5o#$uSJ<=%XW z_JmXfV0{ug0r@k(s;Jm6;qvKG<;(#WOm!z>3Rbt9p_)XZmCw_d)}X3#mWYaYar*DW zAR&&6a1jEaQcT18`x3%D%8{1?dg57*aum;O^G3|vsD~8E8knmct>u-t2!6e75hZcfcdv|k9NiokJLns7cDAk83(oiZL}D)D?W z2wT)A37JBuH!tQtQGJVIlSS7`KO`n(iVHy(7(S|JW7g7KyV$FRQfn6%fj*&=F(3}W zb4<9R3TW2jh1wiSx`n~^4Bnh$-Gab5IpCa1>RrSjv}i?RA=74yCLv#)05(z!Hn_h8 zqCk)zh#qS43WzG%<+wKzA6Z;JCO#&BK#jU-LXs1l4JVfxqENib1zOwU| zQCc?br|7E5pG>n#nd*gV!aN5ZVQf-O5@a``n&3HxLo+-;MfpPdHa}mJpQq0J96{{o zC}BTGB}*n2AG;NoiN$cqQpiTa{xTKD6C@?7Fbf{nNUg9ZDfLL5kN~ehJ8D%XiJ>?R z@x*?ar)2c!5n&+j!;61ujFVLb;;@=4T&>A?k@`tR=l)qBlgRQRh8`vp2vE4jYAQt; zWS`1TndrH#*)ylrAuphgNQN+=2Uw^fMg#b?-mn+`y1e5tn^`)7D{dk+q_I4(0m4+G zbj1a@9cwFWp)zKXtY=u`uZ^Y990Uh7#d8D6Ma`I~K_SDP!9$mM8MC34Fe(lFG$%8R zpN66ZzScyhXlU6#mpwvxg`qs3y(pskU{V1rz=VYGL1uurR|i<0lpnN(%*>b_QO3+f zP|2BTP-!qzNu{Vk?DH}M`KHMspS^-fH7~hXr#eImxg%4>0-Z#(c}{ttlu+~pP)RNm zmHLIrL}ZL|8EP`g*@<2I3@8ZA$jdK?4>3=mX{ebnofH8?E=x_P7&o@R=?S3|aC9^d z4%10>y#Sf1$+V|`3>(E5s4zKH06PRt46{O+d6_vgin6l`C1*PJY!-D{a;0Vr!hH^8SyC(C}o=Q4fl%h)q(r#f&-6%qWBOQg*(&?pybd{i4D%7&jV5x`3 zl>iy5__Nr)#jJBh#+o58BhwG%s?`ap;7&2kTd{={!DF; z0}PK6`)!ZkW9tK!(<3wNFk5t z2=fToi_)&)Oe;kSvGu%t0D>V>%)~}yL=qJY@GWnIIn&BhGJd_~a1%8JQDDnVK zx=gYP$4v!82)$aVwt)4OGwh>ITcAGg@~&kr4f{a1_~lkOoovc;)j~o1t5YXSt3;m z*mpPLCsLy(K`_dx6Ck4!C0CSKR8lE{;G;x(!6l+NcO$^Dxq?JwXdL5*nOx(t zr=&o2fZ=zHCv6=bo}RQ>m_YKw>Y<<`KU@<8c#t_ofd{N=*aJ{>Yyza&MPX3km`IfJ zllForYC7qJ2Vw402Q(m4sWm)x)1?YXYVII!e$3ImL~zm#C=Yc%c2NUc$VQT-P5_u- zY$0DH2Xg}w#QL1v!T3xjJ-Mn#CIOlfUrADcvZa`IP7r=H$p0y=SSWvc0MtVmrp1?5- z0Jsvc^)a#lwji|&VXiN-FElk>x~HW@n8!<_(Zj?bG8{Hm5?N|t5>KZHz$Gw!n4*U| z-zdvWmEJU3!ec`51{ku_IA^x@S`y3lwp%Th8M>J8(40;;n(BB#pPEjR3^CEk&ScO0 z$)Tc|ld|JFmo$6GiL5tGzas~Yq%+l4tH$FHT&iI*G zTr{>Id#V&EjxDT7SZ!+9VGwD6nv~3p9b=v#Dhagagb^GWfQUxP&?iJSRftNmh@qBa zKbr;lW3o&oB(bs5O=I%FB7;a8bqg#(6e2~1VC$kYR>n;v^&UmyB0?lM8$=pV%}G)7 zL@{mb293gyX0v+{#fczSLG474dtoCq6t;7K((XHEBH=RHwPTiz2R4Tuf01n&3EZyl ziP@H6x)?SKAMFspeP*@|liQ{^4R5X)mkk3mp1xo3N-SV_BLY&QS7L#|OHZ;vc`%ts zAW#oJs|{m;!AsAxoCpx6sw%sHgn%dWNmaFvXa&OmD(eYh!H5uN5f8do%;jUjDHQn8 zF@`{}QjJ3tdDi|#ONgdIK^cn5;LB609T5i)AedA)OfVqS=gMMBg07!qLMbTkrcj7M zDA-9Zq?%AsD%c`auuTmMiW3V5?MIJv8bOS>~0S_zW5>bB{cxeTbhmU-YpJo zss$)Z2p|=;goR|J$*BagcGIOY(-*Tf$}~V+^f5#YV%TB&fDCZK##ho8vx#T8-u8M- zsjW~l&s2xJ;mj^f4_Tas6A)f1+4T!7~tbT18N z6)zYIa8x`^I%MV*GwJE?y4DZqv?m3a&cypXff!&ipI&pbjHCPmJbW#Mm^iXOF7qsm zwoVG=jiq}NV08k<4Pt>Jo|r1pJY#D%p0uS_6Xaa+w20xhP^nuGR;JP;kSZ%I%VSfF zv8O)B7OJ4IT4R=;=*rX?!c7PXEBby1EX5J3#2xhyLhoMKmwxL{t(iCc^FC;4BqiV+%d#W4gms8bKU2TVuBCn4C!fm2N-jp;Hv#Q7pPrMZ`plF4C65oMVq-oyDDSj~*-Y!kALU%9!4g z50=@u<0X{=9V?a`;Du@dUTPL#@*Tz+FEXU$7c=&F*;#-|0Q{X}wgMcpMTJWAImwvg zc&)gMIgSAnVr>llWh~O7uFsS&WNR^=Jg2IFTXSIU}6%tXOCu=B(Otj*8QMl3b zs@`1~UWe3y!Wg50S7!1RI3^zpKq!_^y+R_-$0-X+0jZ24B}f*;gQBEZL1bC_(bc2i zozSK&lvh-kOzj2PF5AW11Ubx6Kp^Ve6C>L}2{q5QlaW$#c0Oon!>%uaKS|L+^khZ* zJ($06g`vXY`q>th4jRIYLDfW;(Jaq@d8LFdr38DdUPK6_3rFl#+wQ zT*~Au_75$z5PqRAB{Y3eK;Ehpd{6>gM?d6ehf)GGpb<}m zQXm>AIIpHu6sl3wa_EONWF~1?Fn=K_&gj|a|JUBT z{79Z`d0vB%2FY2mWEU-UOI5Toe*S)3?lhB?Sy`1;S&y4pRky0{m0BJVo|#@15gr|n ztjt=>3XO!25U@c=tXLtzh8@hRdv`S;O)pr0gv5po{{kyM-(zO(W_Era@9dF)+g+X> z=D(jkjvYJia}4DmCIZ~m6;1L+4CgOg(Sf}r(QLzn+16CSBrp#+P)rq2DJSDdF|>ac z!}n)Vrpd+SnMJU({3{svPV+SvM<1WV@lCGFQwV0Ug#Jccp1HX8#3iq?eX4-zhA

  • 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 BQWyXL diff --git a/R-proj/volesti.Rproj b/R-proj/volesti.Rproj deleted file mode 100644 index 21a4da087..000000000 --- a/R-proj/volesti.Rproj +++ /dev/null @@ -1,17 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX - -BuildType: Package -PackageUseDevtools: Yes -PackageInstallArgs: --no-multiarch --with-keep.source diff --git a/cran_gen/.Rbuildignore b/cran_gen/.Rbuildignore deleted file mode 100644 index fd2ed1b3d..000000000 --- a/cran_gen/.Rbuildignore +++ /dev/null @@ -1,4 +0,0 @@ -^.*\.Rproj$ -^\.Rproj\.user$ -^volesti\.Rproj$ -^inst/checks$ diff --git a/cran_gen/Makefile b/cran_gen/Makefile deleted file mode 100644 index 3f53931a7..000000000 --- a/cran_gen/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -LP_SOLVE_CPPFLAGS=$(CPPFLAGS) -I../../headers/include \ - -I$(R_INCLUDE_DIR) \ - -DYY_NEVER_INTERACTIVE \ - -DPARSER_LP -DINVERSE_ACTIVE=INVERSE_LUSOL \ - -DRoleIsExternalInvEngine - -LP_SOLVE_SOURCES=colamd.c lp_MDO.c lp_mipbb.c lp_rlp.c mmio.c commonlib.c \ - lp_MPS.c lp_params.c lp_scale.c lp_SOS.c \ - lp_presolve.c lp_simplex.c yacc_read.c ini.c lp_crash.c \ - lp_price.c lp_utils.c lp_Hash.c lp_lib.c lp_pricePSE.c \ - lp_wlp.c lp_LUSOL.c lp_matrix.c lp_report.c lusol.c \ - myblas.c - -LP_SOLVE_OBJECTS=$(LP_SOLVE_SOURCES:.c=.o) - -liblp_solve.a: $(LP_SOLVE_OBJECTS) - $(AR) rc liblp_solve.a $(LP_SOLVE_OBJECTS) && $(RANLIB) liblp_solve.a - -.c.o: - $(CC) $(CFLAGS) $(CPICFLAGS) $(LP_SOLVE_CPPFLAGS) -c $< -o $@ - -clean: - rm -rf $(LP_SOLVE_OBJECTS) liblp_solve.a diff --git a/cran_gen/Makevars b/cran_gen/Makevars deleted file mode 100644 index 8194d4c8a..000000000 --- a/cran_gen/Makevars +++ /dev/null @@ -1,16 +0,0 @@ -PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimum_ellipsoid -Iinclude -Iinclude/convex_bodies/spectrahedra -PKG_CXXFLAGS= -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES - -PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) - -$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a external/PackedCSparse/qd/libqd.a - -external/lpsolve/build/lp_solve/liblp_solve.a: - @(cd external/lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ - CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") - -external/PackedCSparse/qd/libqd.a: - @(cd external/PackedCSparse/qd/ && $(MAKE) libqd.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ - CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/cran_gen/Makevars.win b/cran_gen/Makevars.win deleted file mode 100644 index e4f79d991..000000000 --- a/cran_gen/Makevars.win +++ /dev/null @@ -1,17 +0,0 @@ -PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimum_ellipsoid -Iinclude -Iinclude/convex_bodies/spectrahedra -PKG_CXXFLAGS= -lm -ldl -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES - -PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) - -$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a external/PackedCSparse/qd/libqd.a - -external/lpsolve/build/lp_solve/liblp_solve.a: - @(cd external/lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS) -DUSRDLL -DINLINE=static" \ - CFLAGS="$(CFLAGS)" CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" \ - RANLIB="$(RANLIB)") - -external/PackedCSparse/qd/libqd.a: - @(cd external/PackedCSparse/qd/ && $(MAKE) libqd.a \ - CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ - CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/cran_gen/NEWS.md b/cran_gen/NEWS.md deleted file mode 100644 index 5038f653b..000000000 --- a/cran_gen/NEWS.md +++ /dev/null @@ -1,31 +0,0 @@ -# volesti 1.0.0 - -* This is the first release of volesti R-Package. - -# volesti 1.0.1 - -* Fix some bugs for solaris os. - -# volesti 1.0.2 - -* Remove r-striper to avoid CRAN policy violation. - -# volesti 1.0.3 - -* Fix CRAN warnings. - -# volesti 1.1.0 - -* New volume computation algorithm. -* Billiard walk for uniform sampling. -* Modified exact volume computation function. -* Implementation and evaluation of PCA method for zonotope approximation. -* Boundary sampling. -* Improved functionality for finance applications. -* Improved names for functions and input variables. -* Use exclusively Eigen/BH library for linear algebra. - -# volesti 1.1.1 - -* Fix CRAN warnings about deprecated use of ftime - diff --git a/cran_gen/README.md b/cran_gen/README.md deleted file mode 100644 index 8a9245ec5..000000000 --- a/cran_gen/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Volume computation and sampling - -## About -The `volesti` package provides [R](https://www.r-project.org/) with functions for volume estimation and sampling. In particular, it provides an R interface for the C++ library [**volesti**](https://github.com/GeomScale/volume_approximation). - -`volesti` computes approximations of volume of polytopes given as a set of points or linear inequalities or as a Minkowski sum of segments (zonotopes). There are algorithms for volume approximation as well as algorithms for sampling, rounding and rotating polytopes. Last but not least, `volesti` provides implementations of geometric algorithms to compute the score of a portfolio given asset returns and to detect financial crises in stock markets. - -## Download and install - -* The latest stable version is available from CRAN. -* The latest development version is available on Github `www.github.com/GeomScale/volume_approximation` - -* Install `volesti` by running: -``` -install.packages("volesti") -``` -* The package-dependencies are: `Rcpp`, `RcppEigen`, `BH`. - -## Documentation - -* [Using the R Interface](https://github.com/GeomScale/volume_approximation/blob/v1.1.1/doc/r_interface.md) -* [Wikipage with Tutorials and Demos](https://github.com/GeomScale/volume_approximation/wiki) -* [Tutorial given to PyData meetup](https://vissarion.github.io/tutorials/volesti_tutorial_pydata.html) - - -## Credits - -* [Contributors and Package History](https://github.com/GeomScale/volume_approximation/blob/v1.1.1/doc/credits.md) -* [List of Publications](https://github.com/GeomScale/volume_approximation/blob/v1.1.1/doc/publications.md) - -Copyright (c) 2012-2020 Vissarion Fisikopoulos -Copyright (c) 2018-2020 Apostolos Chalkis - -You may redistribute or modify the software under the GNU Lesser General Public License as published by Free Software Foundation, either version 3 of the License, or (at your option) any later version. It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. - diff --git a/cran_gen/genCRANpkg.R b/cran_gen/genCRANpkg.R deleted file mode 100644 index abf51d88a..000000000 --- a/cran_gen/genCRANpkg.R +++ /dev/null @@ -1,186 +0,0 @@ -# create cran package folder -dir.create("cran_package") -# set /root as main path -path = getwd() -path = substr(path, start=1, stop=nchar(path)-9) - -# download lpSolveAPI and crate src/Rproj_externals/lp_solve -library(downloader) -download("https://cran.r-project.org/src/contrib/Archive/lpSolveAPI/lpSolveAPI_5.5.2.0-17.6.tar.gz", dest="lpSolve.tar.gz", mode="wb") -untar("lpSolve.tar.gz", exdir = path) -unlink("lpSolve.tar.gz") -dir.create(paste0(path,"/R-proj/src/Rproj_externals")) -dir_lp = paste0(path,"/lpSolveAPI/src/lp_solve") -lp_dist = paste0(path,"/R-proj/src/Rproj_externals") -file.copy(dir_lp, lp_dist, recursive=TRUE) - -# fix ftime deprecation, taken from: https://github.com/GeomScale/volesti/pull/89/files -library(xfun) -gsub_file( - paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), - "struct timeb buf;", "", - fixed=TRUE) -gsub_file( - paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), - "ftime(&buf);", "", - fixed=TRUE) -gsub_file( - paste0(path,"/R-proj/src/Rproj_externals/lp_solve/commonlib.c"), - "return((double)buf.time+((double) buf.millitm)/1000.0);", - "return((double)0);", - fixed=TRUE) - -# add lpsolve header files in external -library(downloader) -download("https://cran.r-project.org/src/contrib/Archive/lpSolve/lpSolve_5.6.15.tar.gz", dest="lpSolve.tar.gz", mode="wb") -untar("lpSolve.tar.gz", exdir = path) -unlink("lpSolve.tar.gz") -dir.create(paste0(path,"/external/LPsolve_src")) -dir.create(paste0(path,"/external/LPsolve_src/include")) -dir.create(paste0(path,"/external/LPsolve_src/run_headers")) -dir_lp = paste0(path,"/lpSolveAPI/inst/include") -h_files = dir(dir_lp, "*.h", ignore.case = TRUE, all.files = TRUE) -lp_dist = paste0(path,"/external/LPsolve_src/include") -file.copy(file.path(dir_lp, h_files), lp_dist, recursive=TRUE, overwrite=TRUE) -# replace the lpsolve header file that issues a warning in mac's cran test -file.copy(paste0(path,"/external/cmake-files/lpsolve_modified_header_files/lp_rlp.h"), lp_dist, recursive=TRUE, overwrite=TRUE) -dir_lp = paste0(path,"/lpSolve/src") -h_files = dir(dir_lp, "*.h", ignore.case = TRUE, all.files = TRUE) -lp_dist = paste0(path,"/external/LPsolve_src/run_headers") -file.copy(file.path(dir_lp, h_files), lp_dist, recursive=TRUE) -unlink(paste0(path,"/lpSolveAPI"), recursive=TRUE) -unlink(paste0(path,"/lpSolve"), recursive=TRUE) - -# copy paste the src folder -src_dir = paste0(path,'/R-proj/src') -src_dist = paste0(path,'/cran_gen/cran_package') -file.copy(src_dir, src_dist, recursive=TRUE) - -# copy paste the inst folder -inst_dir = paste0(path,'/R-proj/inst') -inst_dist = paste0(path,'/cran_gen/cran_package') -file.copy(inst_dir, inst_dist, recursive=TRUE) - -# copy paste the man folder -man_dir = paste0(path,'/R-proj/man') -man_dist = paste0(path,'/cran_gen/cran_package') -file.copy(man_dir, man_dist, recursive=TRUE) - -# copy paste the R folder -R_dir = paste0(path,'/R-proj/R') -R_dist = paste0(path,'/cran_gen/cran_package') -file.copy(R_dir, R_dist, recursive=TRUE) - -# copy paste the tests folder -tests_dir = paste0(path,'/R-proj/tests') -tests_dist = paste0(path,'/cran_gen/cran_package') -file.copy(tests_dir, tests_dist, recursive=TRUE) - -# copy paste the DESCRIPTION file -descr_dir = paste0(path,'/R-proj/DESCRIPTION') -descr_dist = paste0(path,'/cran_gen/cran_package') -file.copy(descr_dir, descr_dist, recursive=TRUE) - -# copy paste the NAMESPACE file -namesp_dir = paste0(path,'/R-proj/NAMESPACE') -namesp_dist = paste0(path,'/cran_gen/cran_package') -file.copy(namesp_dir, namesp_dist, recursive=TRUE) - -# copy paste the volesti.Rproj -volpro_dir = paste0(path,'/R-proj/volesti.Rproj') -volpro_dist = paste0(path,'/cran_gen/cran_package') -file.copy(volpro_dir, volpro_dist, recursive=TRUE) - -# copy paste the external folder -external_dir = paste0(path,'/external') -external_dist = paste0(path,'/cran_gen/cran_package/src') -file.copy(external_dir, external_dist, recursive=TRUE) - -# copy paste the include folder -include_dir = paste0(path,'/include') -include_dist = paste0(path,'/cran_gen/cran_package/src') -file.copy(include_dir, include_dist, recursive=TRUE) - -# copy paste the README.md file -readme_dir = paste0(path,'/cran_gen/README.md') -readme_dist = paste0(path,'/cran_gen/cran_package') -file.copy(readme_dir, readme_dist, recursive=TRUE) - -# copy paste the NEWS.md file -news_dir = paste0(path,'/cran_gen/NEWS.md') -news_dist = paste0(path,'/cran_gen/cran_package') -file.copy(news_dir, news_dist, recursive=TRUE) - -# copy paste the cran-comments.md file -#cran_com_dir = paste0(path,'/cran_gen/cran-comments.md') -#cran_com_dist = paste0(path,'/cran_gen/cran_package') -#file.copy(cran_com_dir, cran_com_dist, recursive=TRUE) - -# copy paste the Rbuildignore.md file -Rbuild_dir = paste0(path,'/cran_gen/.Rbuildignore') -Rbuild_dist = paste0(path,'/cran_gen/cran_package') -file.copy(Rbuild_dir, Rbuild_dist, recursive=TRUE) - -# replace the Makevars -makevars_dir = paste0(path,'/cran_gen/Makevars') -makevars_dist = paste0(path, '/cran_gen/cran_package/src') -file.copy(makevars_dir, makevars_dist, recursive=TRUE) - -# replace the Makevars.win -makevarswin_dir = paste0(path,'/cran_gen/Makevars.win') -makevarswin_dist = paste0(path, '/cran_gen/cran_package/src') -file.copy(makevarswin_dir, makevarswin_dist, recursive=TRUE) - -# copy paste the LICENCE -dir_lic = paste0(path,'/LICENSE') -lic_dist = paste0(path,'/cran_package/inst/doc') - -# delete misc.h from include -dir_misc = paste0(path,'/cran_gen/cran_package/src/include/misc.h') -unlink(dir_misc, recursive = TRUE) - -# delete linear_extensions.h from include -dir_lin_ext = paste0(path,'/cran_gen/cran_package/src/include/linear_extensions.h') -unlink(dir_lin_ext, recursive = TRUE) - -# create lpsolve folder -dir.create(paste0(path,"/cran_gen/cran_package/src/external/lpsolve")) -dir.create(paste0(path,"/cran_gen/cran_package/src/external/lpsolve/build")) -dir.create(paste0(path,"/cran_gen/cran_package/src/external/lpsolve/headers")) -dir_lp = paste0(path,"/cran_gen/cran_package/src/Rproj_externals/lp_solve") -lp_dist = (paste0(path,"/cran_gen/cran_package/src/external/lpsolve/build")) -file.copy(dir_lp, lp_dist, recursive=TRUE) -dir_lp = paste0(path,"/cran_gen/cran_package/src/external/LPsolve_src/include") -lp_dist = (paste0(path,"/cran_gen/cran_package/src/external/lpsolve/headers")) -file.copy(dir_lp, lp_dist, recursive=TRUE) -dir_lp = paste0(path,"/cran_gen/cran_package/src/external/LPsolve_src/run_headers") -lp_dist = (paste0(path,"/cran_gen/cran_package/src/external/lpsolve/headers")) -file.copy(dir_lp, lp_dist, recursive=TRUE) -dir_lpsolve_heds = paste0(path,"/cran_gen/cran_package/src/external/LPsolve_src") -unlink(dir_lpsolve_heds, recursive = TRUE) -dir_lpsolve_heds = paste0(path,"/cran_gen/cran_package/src/Rproj_externals") -unlink(dir_lpsolve_heds, recursive = TRUE) - -# replace the Makefile -makefile_dir = paste0(path,'/cran_gen/Makefile') -makefile_dist = paste0(path, '/cran_gen/cran_package/src/external/lpsolve/build/lp_solve') -file.copy(makefile_dir, makefile_dist, recursive=TRUE) - - - -# set new cran package folder as wrking directory -setwd(paste0(path,'/cran_gen/cran_package')) -# enable devtools and Rcpp libraries -library(devtools) -library(Rcpp) - -# build package tar.gz -Rcpp::compileAttributes() -devtools::build() - -# set /root/R-proj as the working directory -setwd(paste0(path,'/R-proj')) - -# delete folder cran_package -#dir_cr_pkg = paste0(path,'/cran_gen/cran_package') -#unlink(dir_cr_pkg, recursive = TRUE) diff --git a/include/ode_solvers/oracle_functors_rcpp.hpp b/include/ode_solvers/oracle_functors_rcpp.hpp deleted file mode 100644 index 853dcb3c0..000000000 --- a/include/ode_solvers/oracle_functors_rcpp.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis -// Copyright (c) 2020-2020 Marios Papachristou - -// Contributed and/or modified by Marios Papachristou, as part of Google Summer of Code 2020 program. - -// Licensed under GNU LGPL.3, see LICENCE file - -#ifndef ODE_SOLVERS_ORACLE_FUNCTORS_RCPP_HPP -#define ODE_SOLVERS_ORACLE_FUNCTORS_RCPP_HPP - -enum ode_solvers { - no_solver, - leapfrog, - euler, - runge_kutta, - richardson, - collocation -}; - -// Holds Oracle Functor that wraps an R function via RCpp -// The R function is provided as an Rcpp::Function object -// The functor uses Rcpp::as and Rcpp::wrap to do the conversion, -// call the oracle, and convert the results back to C++ -struct RcppFunctor { - - template < - typename NT - > - struct parameters { - NT L; // Lipschitz constant of gradient - NT m; // Strong-convexity parameter - NT eta; // Step-size (if defined by user) - NT kappa; // Condition number - unsigned int order; // Order of ODE functor - - parameters( - NT L_, - NT m_, - NT eta_, - unsigned int order_=2 - ) : - L(L_), - m(m_), - eta(eta_), - kappa(L_ / m_), - order(order_) - {} - }; - - // Log-probability gradient functor - template - < - typename Point - > - struct GradientFunctor { - typedef typename Point::FT NT; - typedef typename Point::Coeff VT; - typedef std::vector pts; - - parameters params; - Rcpp::Function neg_grad_f; // Negative gradient as an Rcpp::Function - bool negate; - - GradientFunctor( - parameters params_, - Rcpp::Function neg_grad_f_, - bool negate_=true): - params(params_), - neg_grad_f(neg_grad_f_), - negate(negate_) - {}; - - // The index i represents the state vector index - Point operator() (unsigned int const& i, pts const& xs, NT const& t) const { - if (i == params.order - 1) { - // Convert point to Rcpp::NumericMatrix - - VT y = Rcpp::as(neg_grad_f(Rcpp::wrap(xs[0].getCoefficients()))); - - Point z(y); - - if (negate) z = (-1.0) * z; - - // Return result as Point - return z; - } else { - return xs[i + 1]; // returns derivative - } - } - - Point operator() (Point const& x) const { - VT y = Rcpp::as(neg_grad_f(Rcpp::wrap(x.getCoefficients()))); - - Point z(y); - - if (negate) z = (-1.0) * z; - - // Return result as Point - return z; - } - - }; - - // Negative log-probability functor - template - < - typename Point - > - struct FunctionFunctor { - typedef typename Point::FT NT; - typedef typename Point::Coeff VT; - - parameters params; - Rcpp::Function negative_logprob; - - FunctionFunctor( - parameters params_, - Rcpp::Function negative_logprob_) : - params(params_), - negative_logprob(negative_logprob_) - {}; - - NT operator() (Point const& x) const { - return Rcpp::as(negative_logprob(Rcpp::wrap(x.getCoefficients()))); - } - - }; - - // Log-probability hessian functor - template - < - typename Point - > - struct HessianFunctor { - typedef typename Point::FT NT; - typedef typename Point::Coeff VT; - - parameters params; - Rcpp::Function hessian; // Negative hessian as an Rcpp::Function - - HessianFunctor( - parameters params_, - Rcpp::Function hessian_) : - params(params_), - hessian(hessian_) - {}; - - Point operator() (Point const& x) const { - VT y= Rcpp::as(hessian(Rcpp::wrap(x.getCoefficients()))); - return Point(y); - } - - }; -}; - -#endif From 8724a7301984bcc8ffcc418ea0d618dddee2c6b9 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Wed, 6 Mar 2024 13:19:28 +0200 Subject: [PATCH 18/44] Fix includes of header files --- test/crhmc_sampling_test.cpp | 2 +- test/sampling_correlation_matrices_test.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/crhmc_sampling_test.cpp b/test/crhmc_sampling_test.cpp index a13a6e299..b762ea7b5 100644 --- a/test/crhmc_sampling_test.cpp +++ b/test/crhmc_sampling_test.cpp @@ -13,7 +13,7 @@ #include "doctest.h" #include "generators/known_polytope_generators.h" #include "misc/misc.h" -#include "ode_solvers.hpp" +#include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" #include "preprocess/crhmc/crhmc_problem.h" #include "preprocess/crhmc/crhmc_problem.h" diff --git a/test/sampling_correlation_matrices_test.cpp b/test/sampling_correlation_matrices_test.cpp index f2f90c529..39bb0e605 100644 --- a/test/sampling_correlation_matrices_test.cpp +++ b/test/sampling_correlation_matrices_test.cpp @@ -9,18 +9,18 @@ #include "doctest.h" #include -#include "misc.h" + #include "random.hpp" #include "random/uniform_int.hpp" #include "random/normal_distribution.hpp" #include "random/uniform_real_distribution.hpp" #include "cartesian_geom/cartesian_kernel.h" +#include "diagnostics/univariate_psrf.hpp" +#include "misc/misc.h" #include "random_walks/random_walks.hpp" #include "sampling/sample_correlation_matrices.hpp" -#include "diagnostics/univariate_psrf.hpp" - template MT rebuildMatrix(const VT &xvector, const unsigned int n){ MT mat = MT::Identity(n,n); From 4c6bcc3e570befc7d6851e5f62561a73a601ec71 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Wed, 6 Mar 2024 13:54:02 +0200 Subject: [PATCH 19/44] Fix windows CI tests --- .github/workflows/R-CMD-check-windows.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/R-CMD-check-windows.yml b/.github/workflows/R-CMD-check-windows.yml index e5c1cf7b3..97e725aa0 100644 --- a/.github/workflows/R-CMD-check-windows.yml +++ b/.github/workflows/R-CMD-check-windows.yml @@ -44,8 +44,8 @@ jobs: run: git clone https://github.com/GeomScale/Rvolesti.git; - name: Upgrade with current develop of volesti - run: cp -rf include Rvolesti/src/volesti; - cp -rf external Rvolesti/src; + run: cp -r -fo include Rvolesti/src/volesti; + cp -r -fo external Rvolesti/src; - name: Check env: From 4ee5374c9206f7411f61d2d89ba73522dab3bdb9 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Thu, 7 Mar 2024 23:14:30 +0200 Subject: [PATCH 20/44] Remove unused header files --- test/crhmc_sampling_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/crhmc_sampling_test.cpp b/test/crhmc_sampling_test.cpp index b762ea7b5..79697b4a4 100644 --- a/test/crhmc_sampling_test.cpp +++ b/test/crhmc_sampling_test.cpp @@ -13,7 +13,6 @@ #include "doctest.h" #include "generators/known_polytope_generators.h" #include "misc/misc.h" -#include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" #include "preprocess/crhmc/crhmc_problem.h" #include "preprocess/crhmc/crhmc_problem.h" From 9114f37b4a3cc3838a9bbdc64118d136be080d70 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Fri, 15 Mar 2024 15:00:10 +0200 Subject: [PATCH 21/44] Update and simplify documentation --- docs/getting_started/cpp_example.md | 47 +++++++---------------------- docs/getting_started/install.md | 45 ++------------------------- docs/getting_started/r_example.md | 7 ----- docs/index.rst | 1 - docs/misc/documentation.md | 20 ------------ 5 files changed, 14 insertions(+), 106 deletions(-) delete mode 100644 docs/getting_started/r_example.md delete mode 100644 docs/misc/documentation.md diff --git a/docs/getting_started/cpp_example.md b/docs/getting_started/cpp_example.md index 82ac82902..e3e39dcbf 100644 --- a/docs/getting_started/cpp_example.md +++ b/docs/getting_started/cpp_example.md @@ -5,7 +5,6 @@ Here we give step-by-step instructions for how to estimate the volume of a 3-dim Write the following C++ code and save it in `volume_example.cpp` ```c++ - #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" #include "convex_bodies/hpolytope.h" @@ -30,8 +29,7 @@ int main() { double e = 0.1; // Calculating volume of the passed polytope - double volume = volume_cooling_balls - (HP, e, walk_len).second; + double volume = volume_cooling_balls(HP, e, walk_len).second; std::cout << "Volume of the cube: " << volume << std::endl; @@ -46,18 +44,15 @@ project( VolEsti-cpp-example ) CMAKE_MINIMUM_REQUIRED(VERSION 3.11) -set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) - -if(COMMAND cmake_policy) - cmake_policy(SET CMP0003 NEW) -endif(COMMAND cmake_policy) - add_definitions(-DDISABLE_NLP_ORACLES) -option(BUILTIN_EIGEN "Use eigen from ../../external" OFF) - include("../../external/cmake-files/Eigen.cmake") GetEigen() +if (${CMAKE_VERSION} VERSION_LESS "3.12.0") + add_compile_options(-D "EIGEN_NO_DEBUG") +else () + add_compile_definitions("EIGEN_NO_DEBUG") +endif () include("../../external/cmake-files/Boost.cmake") GetBoost() @@ -65,33 +60,13 @@ GetBoost() include("../../external/cmake-files/LPSolve.cmake") GetLPSolve() -# Find lpsolve library -find_library(LP_SOLVE NAMES liblpsolve55.so PATHS /usr/lib/lp_solve) - -if (NOT LP_SOLVE) - message(FATAL_ERROR "This program requires the lp_solve library, and will not be compiled.") -else () - message(STATUS "Library lp_solve found: ${LP_SOLVE}") - - set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - - include_directories (BEFORE ../../external) - include_directories (BEFORE ../../include) - - # for Eigen - if (${CMAKE_VERSION} VERSION_LESS "3.12.0") - add_compile_options(-D "EIGEN_NO_DEBUG") - else () - add_compile_definitions("EIGEN_NO_DEBUG") - endif () - - - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard +set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") - add_executable (volume_example volume_example.cpp) - TARGET_LINK_LIBRARIES(volume_example ${LP_SOLVE}) +include_directories (BEFORE ../../external) +include_directories (BEFORE ../../include) -endif() +add_executable (volume_example volume_example.cpp) +target_link_libraries(volume_example PUBLIC lp_solve) ``` We will use `cmake` to build the makefile and compile our example. diff --git a/docs/getting_started/install.md b/docs/getting_started/install.md index cfdb773e7..58fcfe163 100644 --- a/docs/getting_started/install.md +++ b/docs/getting_started/install.md @@ -6,16 +6,13 @@ Installation Guide ### Compile C++ sources and run tests --- -To compile the C++ code you need the [lp_solve](http://lpsolve.sourceforge.net/5.5/) library. For example, for Unix/Linux you need `liblpsolve55.so`. This is available from the library's [webpage](http://lpsolve.sourceforge.net/5.5/) as well as a package in several linux distributions e.g. [debian](https://packages.debian.org/stretch/liblpsolve55-dev) `sudo apt-get install lp-solve`. - -You have to specify the path to `liblpsolve55.so/dll/dylib`, by running, in folder test: +To compile the tests of the C++ interface simply ```bash mkdir -p test/build && cd test/build -cmake -DLP_SOLVE=_PATH_TO_LIB_FILE_ .. +cmake .. make ``` -For example: `-DLP_SOLVE=/usr/lib/lpsolve/liblpsolve55.so` In WSL (Windows Subsystem Linux), you can run the following command to install libc6-dev-i386. This will be required for `ieeefp.h` which is used by `qd` library, @@ -59,43 +56,7 @@ docker run -it -v $PWD:/volesti -w /volesti --name=volesti-dev volesti:dev /bin/ ## R Interface -### Install Rcpp package ---- - -1. Install package-dependencies: ``Rcpp``, ``RcppEigen``, ``BH``. - -2. Then use ``devtools`` package to install ``volesti`` Rcpp package. From terminal go to folder ``/root/R-proj`` and run in terminal: - -```bash - Rscript -e 'Rcpp::compileAttributes()' - R CMD INSTALL --no-multiarch --with-keep.source . -``` - -3. You can use Rstudio as well to open ``volesti.Rproj`` and then click `build source Package` and then `Install and Restart` in `Build` at the menu bar. - -### Generate CRAN version ---- - -To generate the CRAN version of the R package follow the instructions below: - -1. From the command line navigate to folder ``/cran_gen``. Then Run: - -```r - source('genCRANpkg.R') -``` - -2. Open ``genCRANpkg.R`` script with `Rstudio` and run it. - -### Run volesti from R ---- - -* The main function is ``volume()``. It can be used to approximate the volume of a convex polytope given as a set of linear inequalities or a set of vertices (d-dimensional points) or as a Minkowski sum of segments (zonotope). There are three algorithms that can be used (``SequenceOfBalls``, ``CoolingGaussian`` and ``CoolingBalls``). -* The function ``sample_points()`` can be used to sample points from a convex polytope with uniform or spherical gaussian target distribution. -* The function ``round_polytope()`` can be used to round a convex polytope. -* The function ``rand_rotate()`` can be used to apply a random rotation to a convex polytope. - -For more details you can read the documentation in folder ``/inst/doc``. - +An ``R`` interface is available from the package [Rvolesti](https://github.com/GeomScale/Rvolesti). ## Python Interface diff --git a/docs/getting_started/r_example.md b/docs/getting_started/r_example.md deleted file mode 100644 index 0850de823..000000000 --- a/docs/getting_started/r_example.md +++ /dev/null @@ -1,7 +0,0 @@ -# How to create your first example using the R interface - -Here we give step-by-step instructions for how to estimate the volume of a 3-dimensional cube using the R interface of the `volesti` library. - -The user first should install the R interface by following instructions in {doc}`installation guide `. - -to be written ... diff --git a/docs/index.rst b/docs/index.rst index a64b5bf4b..ce0b73886 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,7 +12,6 @@ Welcome to VolEsti's documentation! getting_started/install.md getting_started/cpp_example.md - getting_started/r_example.md .. toctree:: :caption: Tutorials diff --git a/docs/misc/documentation.md b/docs/misc/documentation.md deleted file mode 100644 index 35e066604..000000000 --- a/docs/misc/documentation.md +++ /dev/null @@ -1,20 +0,0 @@ -# Generate documentation - -## How to generate documentation - -Technologies used: Doxygen + Spnynx + Breathe - -to be written ... - -## Create pdf documentation from Rd files - -* Install volesti library. -* In `R` mode (or in Rstudio) Run -```r -pack = "volesti" -path = find.package(pack) -system(paste(shQuote(file.path(R.home("bin"), "R")), - "CMD", "Rd2pdf", shQuote(path))) -``` -* The pdf will be created and saved in `R-proj` folder. -* We give such a documentation in `/R-proj/doc` folder. From 742eb01507c85639e748be12673d4fde3b5e47f7 Mon Sep 17 00:00:00 2001 From: vfisikop Date: Thu, 28 Mar 2024 12:50:26 +0200 Subject: [PATCH 22/44] Refactor trigonometric_positive_intersect function for hpolytopes --- include/convex_bodies/hpolytope.h | 41 +++++++++++++++++-------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/include/convex_bodies/hpolytope.h b/include/convex_bodies/hpolytope.h index 49d942827..bee0fd369 100644 --- a/include/convex_bodies/hpolytope.h +++ b/include/convex_bodies/hpolytope.h @@ -750,22 +750,20 @@ class HPolytope { } - //------------oracle for exact hmc spherical gaussian sampling---------------// - + // Boundary oracle for exact hmc spherical gaussian sampling // compute intersection point of ray starting from r and pointing to v - // with polytope discribed by A and b + // with polytope discribed by A and b (the ray describes a curve) std::pair trigonometric_positive_intersect(Point const& r, Point const& v, NT const& omega, int &facet_prev) const { + constexpr NT pi_2 = NT(2.0) * M_PI; + NT t = std::numeric_limits::max(); - NT lamda = 0, C, Phi, t1, t2, tmin; - NT min_plus = std::numeric_limits::max(), t = std::numeric_limits::max(); - NT max_minus = std::numeric_limits::lowest(); - VT sum_nom, sum_denom; - unsigned int j; - int m = num_of_hyperplanes(), facet = -1; - + int m = num_of_hyperplanes(); + int facet = -1; + VT sum_nom; + VT sum_denom; sum_nom.noalias() = A * r.getCoefficients(); sum_denom.noalias() = A * v.getCoefficients(); @@ -773,10 +771,15 @@ class HPolytope { NT* sum_denom_data = sum_denom.data(); const NT* b_data = b.data(); + const NT omega_sqr = omega * omega; + const NT pi_2_omega = pi_2 / omega; + for (int i = 0; i < m; i++) { - C = std::sqrt((*sum_nom_data) * (*sum_nom_data) + ((*sum_denom_data) * (*sum_denom_data)) / (omega * omega)); - Phi = std::atan((-(*sum_denom_data)) / ((*sum_nom_data) * omega)); + NT C = std::sqrt((*sum_nom_data) * (*sum_nom_data) + ((*sum_denom_data) * (*sum_denom_data)) + / omega_sqr); + NT Phi = std::atan((-(*sum_denom_data)) / ((*sum_nom_data) * omega)); + if ((*sum_denom_data) < 0.0 && Phi < 0.0) { Phi += M_PI; } else if ((*sum_denom_data) > 0.0 && Phi > 0.0) { @@ -785,20 +788,20 @@ class HPolytope { if (C > (*b_data)) { NT acos_b = std::acos((*b_data) / C); - t1 = (acos_b - Phi) / omega; + NT t1 = (acos_b - Phi) / omega; if (facet_prev == i && std::abs(t1) < 1e-10){ - t1 = (2.0 * M_PI) / omega; + t1 = pi_2_omega; } - t2 = (-acos_b - Phi) / omega; + NT t2 = (-acos_b - Phi) / omega; if (facet_prev == i && std::abs(t2) < 1e-10){ - t2 = (2.0 * M_PI) / omega; + t2 = pi_2_omega; } - t1 += (t1 < NT(0)) ? (2.0 * M_PI) / omega : NT(0); - t2 += (t2 < NT(0)) ? (2.0 * M_PI) / omega : NT(0); + t1 += (t1 < NT(0)) ? pi_2_omega : NT(0); + t2 += (t2 < NT(0)) ? pi_2_omega : NT(0); - tmin = std::min(t1, t2); + NT tmin = std::min(t1, t2); if (tmin < t && tmin > NT(0)) { facet = i; From 9c32d0b5fd38a8099138fb20169fabfc590f9cc3 Mon Sep 17 00:00:00 2001 From: vgnecula Date: Mon, 10 Jun 2024 22:13:03 -0400 Subject: [PATCH 23/44] update_position complexity improvement --- ...ian_hamiltonian_monte_carlo_exact_walk.hpp | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp b/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp index 8b83b053b..bda33630c 100644 --- a/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp +++ b/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp @@ -226,20 +226,22 @@ private : inline void update_position(Point &p, Point &v, NT const& T, NT const& omega) { - NT C, Phi; - for (size_t i = 0; i < p.dimension(); i++) + NT next_p, next_v; + + NT sinVal = std::sin(omega * T); + NT cosVal = std::cos(omega * T); + + NT factor1 = sinVal / omega; + NT factor2 = -omega * sinVal; + + for (size_t i = 0; i < p.dimension(); i++) { - C = std::sqrt(p[i] * p[i] + (v[i] * v[i]) / (omega * omega)); - Phi = std::atan((-v[i]) / (p[i] * omega)); - if (v[i] < 0.0 && Phi < 0.0) { - Phi += M_PI; - } else if (v[i] > 0.0 && Phi > 0.0) { - Phi -= M_PI; - } - p.set_coord(i, C * std::cos(omega * T + Phi)); - v.set_coord(i, -C * omega * std::sin(omega * T + Phi)); - } + next_p = cosVal * p[i] + v[i] * factor1; + next_v = factor2 * p[i] + cosVal * v[i]; + p.set_coord(i, next_p); + v.set_coord(i, next_v); + } } inline double get_max_distance(std::vector &pointset, Point const& q, double &rad) From e4848659e70f87db00ff60fa1cac4eb37eff13d5 Mon Sep 17 00:00:00 2001 From: atrayees <121290945+atrayees@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:46:41 +0530 Subject: [PATCH 24/44] Feature/spectra correlations (#306) --- examples/correlation_matrices/sampler.cpp | 62 +++++++++++++++---- .../matrix_operations/EigenvaluesProblems.h | 43 +++++++++++-- 2 files changed, 88 insertions(+), 17 deletions(-) diff --git a/examples/correlation_matrices/sampler.cpp b/examples/correlation_matrices/sampler.cpp index 9a2ac08d2..f18f90a1b 100644 --- a/examples/correlation_matrices/sampler.cpp +++ b/examples/correlation_matrices/sampler.cpp @@ -17,6 +17,7 @@ #include "convex_bodies/spectrahedra/spectrahedron.h" #include "random_walks/random_walks.hpp" #include "sampling/sample_correlation_matrices.hpp" +#include "matrix_operations/EigenvaluesProblems.h" typedef double NT; typedef Eigen::Matrix MT; @@ -89,6 +90,28 @@ void write_to_file(std::string filename, std::vector const& randPoint std::cout.rdbuf(coutbuf); } +bool is_correlation_matrix(const MT& matrix, const double tol = 1e-8){ + //check if all the diagonal elements are ones + for(int i=0 ; i tol) + { + return false; + } + } + + //check if the matrix is positive semidefinite + using NT = double; + using MatrixType = Eigen::Matrix; + EigenvaluesProblems> solver; + + if(solver.isPositiveSemidefinite(matrix)) + { + return true; + } + return false; +} + template void correlation_matrix_uniform_sampling(const unsigned int n, const unsigned int num_points, std::string walkname){ @@ -106,7 +129,7 @@ void correlation_matrix_uniform_sampling(const unsigned int n, const unsigned in time = std::chrono::duration_cast(end - start).count(); std::cout << "Elapsed time : " << time << " (ms)" << std::endl; - write_to_file(walkname + "_matrices.txt", randPoints); + write_to_file(walkname + "_matrices" + std::to_string(n) + ".txt", randPoints); } template @@ -126,7 +149,15 @@ void correlation_matrix_uniform_sampling_MT(const unsigned int n, const unsigned time = std::chrono::duration_cast(end - start).count(); std::cout << "Elapsed time : " << time << " (ms)" << std::endl; - write_to_file(walkname + "_matrices_MT.txt", randPoints); + int valid_points = 0; + for(const auto& points : randPoints){ + if(is_correlation_matrix(points.mat)){ + valid_points++; + } + } + std::cout << "Number of valid points = " << valid_points << std::endl; + + write_to_file(walkname + "_matrices_MT" + std::to_string(n) + ".txt", randPoints); } int main(int argc, char const *argv[]){ @@ -146,25 +177,30 @@ int main(int argc, char const *argv[]){ printf("\n"); #endif - unsigned int n = 3, num_points = 5000; + unsigned int num_points = 5000; + + std::vector dimensions = {3, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; - old_uniform_sampling(n, num_points); + for(unsigned int n : dimensions){ - correlation_matrix_uniform_sampling(n, num_points, "BallWalk"); + old_uniform_sampling(n, num_points); - correlation_matrix_uniform_sampling(n, num_points, "RDHRWalk"); + correlation_matrix_uniform_sampling(n, num_points, "BallWalk"); - correlation_matrix_uniform_sampling(n, num_points, "BilliardWalk"); + correlation_matrix_uniform_sampling(n, num_points, "RDHRWalk"); - correlation_matrix_uniform_sampling(n, num_points, "AcceleratedBilliardWalk"); + correlation_matrix_uniform_sampling(n, num_points, "BilliardWalk"); - correlation_matrix_uniform_sampling_MT(n, num_points, "BallWalk"); + correlation_matrix_uniform_sampling(n, num_points, "AcceleratedBilliardWalk"); - correlation_matrix_uniform_sampling_MT(n, num_points, "RDHRWalk"); + correlation_matrix_uniform_sampling_MT(n, num_points, "BallWalk"); - correlation_matrix_uniform_sampling_MT(n, num_points, "BilliardWalk"); + correlation_matrix_uniform_sampling_MT(n, num_points, "RDHRWalk"); - correlation_matrix_uniform_sampling_MT(n, num_points, "AcceleratedBilliardWalk"); + correlation_matrix_uniform_sampling_MT(n, num_points, "BilliardWalk"); + + correlation_matrix_uniform_sampling_MT(n, num_points, "AcceleratedBilliardWalk"); + } return 0; -} \ No newline at end of file +} diff --git a/include/matrix_operations/EigenvaluesProblems.h b/include/matrix_operations/EigenvaluesProblems.h index 4012177f3..178d91666 100644 --- a/include/matrix_operations/EigenvaluesProblems.h +++ b/include/matrix_operations/EigenvaluesProblems.h @@ -167,9 +167,12 @@ class EigenvaluesProblems, E Spectra::DenseSymMatProd op(B); Spectra::DenseCholesky Bop(-A); - // Construct generalized eigen solver object, requesting the largest three generalized eigenvalues + // Construct generalized eigen solver object, computing the minimum positive eigenvalue by computing the largest eigenvalue of the inverse Generalized Eigenvalue Problem + // An empirical value of ncv that gives a better performance + // TODO: tune this implementation by tuning the parameters like ncv + int ncv = std::min(std::max(10, matrixDim/20), matrixDim); Spectra::SymGEigsSolver, Spectra::DenseCholesky, Spectra::GEIGS_CHOLESKY> - geigs(&op, &Bop, 1, 15 < matrixDim ? 15 : matrixDim); + geigs(&op, &Bop, 1, ncv); // Initialize and compute geigs.init(); @@ -324,9 +327,12 @@ class EigenvaluesProblems, E Spectra::DenseSymMatProd op(B); Spectra::DenseCholesky Bop(-A); - // Construct generalized eigen solver object, requesting the largest three generalized eigenvalues + // Construct generalized eigen solver object, requesting the largest generalized eigenvalue + // an empirical value of ncv that gives a better performance + // TODO: tune this implementation by tuning the parameters like ncv + int ncv = std::min(std::max(10, matrixDim/20), matrixDim); Spectra::SymGEigsSolver, Spectra::DenseCholesky, Spectra::GEIGS_CHOLESKY> - geigs(&op, &Bop, 1, 15 < matrixDim ? 15 : matrixDim); + geigs(&op, &Bop, 1, ncv); // Initialize and compute geigs.init(); @@ -439,10 +445,39 @@ class EigenvaluesProblems, E /// \param[in] B: symmetric matrix /// \return The minimum positive eigenvalue and the corresponding eigenvector NT minPosLinearEigenvalue_EigenSymSolver(MT const & A, MT const & B, VT &eigvec) const { + +#if defined(SPECTRA_EIGENVALUES_SOLVER) + int matrixDim = A.rows(); + NT lambdaMinPositive; + + Spectra::DenseSymMatProd op(B); + Spectra::DenseCholesky Bop(A); + + //construct generalized eigen solver object, requesting the smallest eigenvalue + int ncv = std::min(std::max(10, matrixDim/20), matrixDim); + Spectra::SymGEigsSolver, Spectra::DenseCholesky, Spectra::GEIGS_CHOLESKY> + geigs(&op, &Bop, 1, ncv); + + //initialize and compute + geigs.init(); + int nconv = geigs.compute(); + + //retrieve results + VT evalues; + + if(geigs.info() == Spectra::SUCCESSFUL){ + evalues = geigs.eigenvalues(); + eigvec = geigs.eigenvectors().col(0); + } + + lambdaMinPositive = NT(1)/evalues(0); + +#elif NT lambdaMinPositive = NT(0); Eigen::GeneralizedSelfAdjointEigenSolver ges(B,A); lambdaMinPositive = 1/ges.eigenvalues().reverse()[0]; eigvec = ges.eigenvectors().reverse().col(0).reverse(); +#endif return lambdaMinPositive; } }; From ddcf97b96bf0884188eb114447adf4ab989e76f4 Mon Sep 17 00:00:00 2001 From: Apostolos Chalkis Date: Thu, 20 Jun 2024 11:54:16 -0600 Subject: [PATCH 25/44] Improve max volume ellipsoid computation (#309) * improve the implementation of maximum ellipsoid computation * minor fix in rounding unit-test * fix file copyrights * apply termination criterion after transformation in max ellipsoid rounding * resolve PR comments --------- Co-authored-by: Apostolos Chalkis --- .../preprocess/max_inscribed_ellipsoid.hpp | 78 +++++++++++++------ .../max_inscribed_ellipsoid_rounding.hpp | 39 +++++++--- test/new_rounding_test.cpp | 4 +- 3 files changed, 83 insertions(+), 38 deletions(-) diff --git a/include/preprocess/max_inscribed_ellipsoid.hpp b/include/preprocess/max_inscribed_ellipsoid.hpp index ebdb261e0..7a0c19a6f 100644 --- a/include/preprocess/max_inscribed_ellipsoid.hpp +++ b/include/preprocess/max_inscribed_ellipsoid.hpp @@ -1,7 +1,7 @@ // VolEsti (volume computation and sampling library) -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2012-2024 Vissarion Fisikopoulos +// Copyright (c) 2018-2024 Apostolos Chalkis // Copyright (c) 2021 Vaibhav Thakkar //Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. @@ -15,6 +15,9 @@ #include #include +#include "Spectra/include/Spectra/SymEigsSolver.h" +#include "Spectra/include/Spectra/Util/SelectionRule.h" +#include "Spectra/include/Spectra/MatOp/DenseSymMatProd.h" /* @@ -31,14 +34,15 @@ tolerance parameters tol, reg Output: center of the ellipsoid y - matrix V = E_transpose * E + matrix E2^{-1} = E_transpose * E */ // using Custom_MT as to deal with both dense and sparse matrices, MT will be the type of result matrix +// TODO: Change the return data structure to std::tuple template std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT const& x0, - unsigned int const& maxiter, - NT const& tol, NT const& reg) + unsigned int const& maxiter, + NT const& tol, NT const& reg) { typedef Eigen::DiagonalMatrix Diagonal_MT; @@ -49,8 +53,8 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT last_r1 = std::numeric_limits::lowest(), last_r2 = std::numeric_limits::lowest(), prev_obj = std::numeric_limits::lowest(), - gap, rmu, res, objval, r1, r2 ,r3, rel, Rel, - astep, ax, ay, az, tau; + gap, rmu, res, objval, r1, r2 ,r3, astep, ax, + ay, az, tau, logdetE2; NT const reg_lim = std::pow(10.0, -10.0), tau0 = 0.75, minmu = std::pow(10.0, -8.0); @@ -74,9 +78,10 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT Y = y.asDiagonal(); - E2.noalias() = MT(A_trans * Y * A).inverse(); + E2.noalias() = MT(A_trans * Y * A); + Eigen::LLT llt(E2); - Q.noalias() = A * E2 * A_trans; + Q.noalias() = A * llt.solve(A_trans); h = Q.diagonal(); h = h.cwiseSqrt(); @@ -115,19 +120,38 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT res = std::max(r1, r2); res = std::max(res, r3); - objval = std::log(E2.determinant()) / 2.0; - - Eigen::SelfAdjointEigenSolver eigensolver(E2); // E2 is positive definite matrix - // computing eigenvalues of E2 - rel = eigensolver.eigenvalues().minCoeff(); - Rel = eigensolver.eigenvalues().maxCoeff(); + logdetE2 = llt.matrixL().toDenseMatrix().diagonal().array().log().sum(); + objval = logdetE2; //logdet of E2 is already divided by 2 if (i % 10 == 0) { + + NT rel, Rel; + + // computing eigenvalues of E2 + Spectra::DenseSymMatProd op(E2); + // The value of ncv is chosen empirically + Spectra::SymEigsSolver> eigs(&op, 2, std::min(std::max(10, n/5), n)); + eigs.init(); + int nconv = eigs.compute(); + if (eigs.info() == Spectra::COMPUTATION_INFO::SUCCESSFUL) { + Rel = 1.0 / eigs.eigenvalues().coeff(1); + rel = 1.0 / eigs.eigenvalues().coeff(0); + } else { + Eigen::SelfAdjointEigenSolver eigensolver(E2); // E2 is positive definite matrix + if (eigensolver.info() == Eigen::ComputationInfo::Success) { + Rel = 1.0 / eigensolver.eigenvalues().coeff(0); + rel = 1.0 / eigensolver.eigenvalues().template tail<1>().value(); + } else { + std::runtime_error("Computations failed."); + } + } if (std::abs((last_r1 - r1) / std::min(NT(std::abs(last_r1)), NT(std::abs(r1)))) < 0.01 && std::abs((last_r2 - r2) / std::min(NT(abs(last_r2)), NT(std::abs(r2)))) < 0.01 && Rel / rel > 100.0 && reg > reg_lim) { + converged = false; //Stopped making progress break; @@ -138,9 +162,10 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT // stopping criterion if ((res < tol * (1.0 + bnrm) && rmu <= minmu) || - (i > 4 && prev_obj != std::numeric_limits::lowest() && - ((std::abs(objval - prev_obj) <= tol * objval && std::abs(objval - prev_obj) <= tol * prev_obj) || - (prev_obj >= (1.0 - tol) * objval || objval <= (1.0 - tol) * prev_obj) ) ) ) { + (i > 1 && prev_obj != std::numeric_limits::lowest() && + (std::abs(objval - prev_obj) <= tol * std::min(std::abs(objval), std::abs(prev_obj)) || + std::abs(prev_obj - objval) <= tol) ) ) { + //converged x += x0; converged = true; @@ -151,7 +176,7 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT YQ.noalias() = Y * Q; G = YQ.cwiseProduct(YQ.transpose()); y2h = 2.0 * yh; - YA = Y * A; + YA.noalias() = Y * A; vec_iter1 = y2h.data(); vec_iter2 = z.data(); @@ -165,10 +190,9 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT G.diagonal() += y2h_z; h_z = h + z; + Eigen::PartialPivLU luG(G); + T.noalias() = luG.solve(h_z.asDiagonal()*YA); - for (int j = 0; j < n; ++j) { - T.col(j) = G.colPivHouseholderQr().solve( VT(YA.col(j).cwiseProduct(h_z)) ); - } ATP.noalias() = MT(y2h.asDiagonal()*T - YA).transpose(); vec_iter1 = R3.data(); @@ -184,11 +208,11 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT R23 = R2 - R3Dy; ATP_A.noalias() = ATP * A; ATP_A.diagonal() += ones_m * reg; - dx = ATP_A.colPivHouseholderQr().solve(R1 + ATP * R23); // predictor step + dx = ATP_A.lu().solve(R1 + ATP * R23); // predictor step // corrector and combined step & length Adx.noalias() = A * dx; - dyDy = G.colPivHouseholderQr().solve(y2h.cwiseProduct(Adx-R23)); + dyDy = luG.solve(y2h.cwiseProduct(Adx-R23)); dy = y.cwiseProduct(dyDy); dz = R3Dy - z.cwiseProduct(dyDy); @@ -228,9 +252,13 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT i++; } - return std::pair, bool>(std::pair(E2, x), converged); + if (!converged) { + x += x0; + } + return std::pair, bool>(std::pair(E2, x), converged); } #endif + diff --git a/include/preprocess/max_inscribed_ellipsoid_rounding.hpp b/include/preprocess/max_inscribed_ellipsoid_rounding.hpp index c13d53f70..da00a8867 100644 --- a/include/preprocess/max_inscribed_ellipsoid_rounding.hpp +++ b/include/preprocess/max_inscribed_ellipsoid_rounding.hpp @@ -22,14 +22,16 @@ template typename Point > std::tuple max_inscribed_ellipsoid_rounding(Polytope &P, - Point const& InnerPoint) + Point const& InnerPoint, + unsigned int const max_iterations = 5, + NT const max_eig_ratio = NT(6)) { std::pair, bool> iter_res; iter_res.second = false; VT x0 = InnerPoint.getCoefficients(); MT E, L; - unsigned int maxiter = 150, iter = 1, d = P.dimension(); + unsigned int maxiter = 500, iter = 1, d = P.dimension(); NT R = 100.0, r = 1.0, tol = std::pow(10, -6.0), reg = std::pow(10, -4.0), round_val = 1.0; @@ -44,18 +46,28 @@ std::tuple max_inscribed_ellipsoid_rounding(Polytope &P, E = (E + E.transpose()) / 2.0; E = E + MT::Identity(d, d)*std::pow(10, -8.0); //normalize E - Eigen::LLT lltOfA(E); // compute the Cholesky decomposition of E + Eigen::LLT lltOfA(E.llt().solve(MT::Identity(E.cols(), E.cols()))); // compute the Cholesky decomposition of E^{-1} L = lltOfA.matrixL(); - Eigen::SelfAdjointEigenSolver eigensolver(L); - r = eigensolver.eigenvalues().minCoeff(); - R = eigensolver.eigenvalues().maxCoeff(); - - // check the roundness of the polytope - if(((std::abs(R / r) <= 2.3 && iter_res.second) || iter >= 20) && iter>2){ - break; + // computing eigenvalues of E + Spectra::DenseSymMatProd op(E); + // The value of ncv is chosen empirically + Spectra::SymEigsSolver> eigs(&op, 2, std::min(std::max(10, int(d)/5), int(d))); + eigs.init(); + int nconv = eigs.compute(); + if (eigs.info() == Spectra::COMPUTATION_INFO::SUCCESSFUL) { + R = 1.0 / eigs.eigenvalues().coeff(1); + r = 1.0 / eigs.eigenvalues().coeff(0); + } else { + Eigen::SelfAdjointEigenSolver eigensolver(E); + if (eigensolver.info() == Eigen::ComputationInfo::Success) { + R = 1.0 / eigensolver.eigenvalues().coeff(0); + r = 1.0 / eigensolver.eigenvalues().template tail<1>().value(); + } else { + std::runtime_error("Computations failed."); + } } - // shift polytope and apply the linear transformation on P P.shift(iter_res.first.second); shift += T * iter_res.first.second; @@ -67,6 +79,11 @@ std::tuple max_inscribed_ellipsoid_rounding(Polytope &P, P.normalize(); x0 = VT::Zero(d); + // check the roundness of the polytope + if(((std::abs(R / r) <= max_eig_ratio && iter_res.second) || iter >= max_iterations)){ + break; + } + iter++; } diff --git a/test/new_rounding_test.cpp b/test/new_rounding_test.cpp index 87c63a32a..ab17ed939 100644 --- a/test/new_rounding_test.cpp +++ b/test/new_rounding_test.cpp @@ -26,6 +26,7 @@ #include "preprocess/svd_rounding.hpp" #include "generators/known_polytope_generators.h" +#include "generators/h_polytopes_generator.h" template NT factorial(NT n) @@ -108,7 +109,6 @@ void rounding_max_ellipsoid_test(Polytope &HP, typedef BoostRandomNumberGenerator RNGType; RNGType rng(d); - std::pair InnerBall = HP.ComputeInnerBall(); std::tuple res = max_inscribed_ellipsoid_rounding(HP, InnerBall.first); @@ -184,7 +184,7 @@ void call_test_max_ellipsoid() { std::cout << "\n--- Testing rounding of H-skinny_cube5" << std::endl; P = generate_skinny_cube(5); - rounding_max_ellipsoid_test(P, 0, 3070.64, 3188.25, 3140.6, 3200.0); + rounding_max_ellipsoid_test(P, 0, 3070.64, 3188.25, 3262.61, 3200.0); } From 723869e86f0e5953ad2afab4329e2538ef26c252 Mon Sep 17 00:00:00 2001 From: Apostolos Chalkis Date: Fri, 21 Jun 2024 11:47:00 -0600 Subject: [PATCH 26/44] Improve max ball computation and develop analytic center computation (#310) * improve the implementation of maximum ellipsoid computation * minor fix in rounding unit-test * fix file copyrights * fix max_ball bug and create new unit test * fix max_ball bug and create new unit test * apply termination criterion after transformation in max ellipsoid rounding * imrpove skinny poly generator's interface * improve stopping criterion and seed setting * complete unit tests implementations * implement Newton method to compute the analytic center * minor changes * resolve PR comments * complete analytic center computation * resolve conflicts * minor changes * minor changes * minor changes * improve new unit tests * resolve PR comments --------- Co-authored-by: Apostolos Chalkis --- include/convex_bodies/hpolytope.h | 8 +- include/generators/h_polytopes_generator.h | 82 ++++++++++- .../preprocess/analytic_center_linear_ineq.h | 134 ++++++++++++++++++ include/preprocess/max_inscribed_ball.hpp | 31 ++-- test/CMakeLists.txt | 11 ++ test/test_internal_points.cpp | 107 ++++++++++++++ 6 files changed, 352 insertions(+), 21 deletions(-) create mode 100644 include/preprocess/analytic_center_linear_ineq.h create mode 100644 test/test_internal_points.cpp diff --git a/include/convex_bodies/hpolytope.h b/include/convex_bodies/hpolytope.h index bee0fd369..9f4083bd7 100644 --- a/include/convex_bodies/hpolytope.h +++ b/include/convex_bodies/hpolytope.h @@ -116,13 +116,13 @@ class HPolytope { if (_inner_ball.second <= NT(0)) { - NT const tol = 0.00000001; - std::tuple inner_ball = max_inscribed_ball(A, b, 150, tol); + NT const tol = 1e-08; + std::tuple inner_ball = max_inscribed_ball(A, b, 5000, tol); // check if the solution is feasible - if (is_in(Point(std::get<0>(inner_ball))) == 0 || std::get<1>(inner_ball) < NT(0) || + if (is_in(Point(std::get<0>(inner_ball))) == 0 || std::get<1>(inner_ball) < tol/2.0 || std::isnan(std::get<1>(inner_ball)) || std::isinf(std::get<1>(inner_ball)) || - !std::get<2>(inner_ball) || is_inner_point_nan_inf(std::get<0>(inner_ball))) + is_inner_point_nan_inf(std::get<0>(inner_ball))) { _inner_ball.second = -1.0; } else diff --git a/include/generators/h_polytopes_generator.h b/include/generators/h_polytopes_generator.h index dae44bdca..e9638b62f 100644 --- a/include/generators/h_polytopes_generator.h +++ b/include/generators/h_polytopes_generator.h @@ -9,7 +9,11 @@ #define H_POLYTOPES_GEN_H #include +#include +#include +#include +#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" #ifndef isnan using std::isnan; @@ -19,17 +23,17 @@ /// @tparam Polytope Type of returned polytope /// @tparam RNGType RNGType Type template -Polytope random_hpoly(unsigned int dim, unsigned int m, double seed = std::numeric_limits::signaling_NaN()) { +Polytope random_hpoly(unsigned int dim, unsigned int m, int seed = std::numeric_limits::signaling_NaN()) { typedef typename Polytope::MT MT; typedef typename Polytope::VT VT; typedef typename Polytope::NT NT; typedef typename Polytope::PointType Point; - unsigned rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); + int rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); RNGType rng(rng_seed); if (!isnan(seed)) { - unsigned rng_seed = seed; + int rng_seed = seed; rng.seed(rng_seed); } @@ -58,4 +62,76 @@ Polytope random_hpoly(unsigned int dim, unsigned int m, double seed = std::numer return Polytope(dim, A, b); } +/// This function generates a transformation that maps the unit ball to a skinny ellipsoid +/// with given ratio between the lengths of its maximum and minimum axis +template +MT get_skinny_transformation(const int d, NT const eig_ratio, int const seed) +{ + boost::normal_distribution<> gdist(0, 1); + RNGType rng(seed); + + MT W(d, d); + for (int i = 0; i < d; i++) { + for (int j = 0; j < d; j++) { + W(i, j) = gdist(rng); + } + } + + Eigen::HouseholderQR qr(W); + MT Q = qr.householderQ(); + + VT diag(d); + const NT eig_min = NT(1), eig_max = eig_ratio; + diag(0) = eig_min; + diag(d-1) = eig_max; + boost::random::uniform_real_distribution udist(NT(0), NT(1)); + NT rand; + for (int i = 1; i < d-1; i++) { + rand = udist(rng); + diag(i) = rand * eig_max + (NT(1)-rand) * eig_min; + } + std::sort(diag.begin(), diag.end()); + MT cov = Q * diag.asDiagonal() * Q.transpose(); + + return cov; +} + +/// This function generates a skinny random H-polytope of given dimension and number of hyperplanes $m$ +/// @tparam Polytope Type of returned polytope +/// @tparam NT Number type +/// @tparam RNGType RNGType Type +template +Polytope skinny_random_hpoly(unsigned int dim, unsigned int m, const bool pre_rounding = false, + const NT eig_ratio = NT(1000.0), int seed = std::numeric_limits::signaling_NaN()) { + + typedef typename Polytope::MT MT; + typedef typename Polytope::VT VT; + typedef typename Polytope::PointType Point; + + int rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); + RNGType rng(rng_seed); + if (!isnan(seed)) { + int rng_seed = seed; + rng.seed(rng_seed); + } + + Polytope P = random_hpoly(dim, m, seed); + + // rounding the polytope before applying the skinny transformation + if (pre_rounding) { + Point x0(dim); + // run only one iteration + max_inscribed_ellipsoid_rounding(P, x0, 1); + } + + MT cov = get_skinny_transformation(dim, eig_ratio, seed); + Eigen::LLT lltOfA(cov); + MT L = lltOfA.matrixL(); + P.linear_transformIt(L.inverse()); + + return P; +} + + + #endif diff --git a/include/preprocess/analytic_center_linear_ineq.h b/include/preprocess/analytic_center_linear_ineq.h new file mode 100644 index 000000000..c7918635a --- /dev/null +++ b/include/preprocess/analytic_center_linear_ineq.h @@ -0,0 +1,134 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2024 Vissarion Fisikopoulos +// Copyright (c) 2024 Apostolos Chalkis +// Copyright (c) 2024 Elias Tsigaridas + +// Licensed under GNU LGPL.3, see LICENCE file + + +#ifndef ANALYTIC_CENTER_H +#define ANALYTIC_CENTER_H + +#include + +#include "max_inscribed_ball.hpp" + +template +NT get_max_step(VT const& Ad, VT const& b_Ax) +{ + const int m = Ad.size(); + NT max_element = std::numeric_limits::lowest(), max_element_temp; + for (int i = 0; i < m; i++) { + max_element_temp = Ad.coeff(i) / b_Ax.coeff(i); + if (max_element_temp > max_element) { + max_element = max_element_temp; + } + } + + return NT(1) / max_element; +} + +template +void get_hessian_grad_logbarrier(MT const& A, MT const& A_trans, VT const& b, + VT const& x, VT const& Ax, MT &H, VT &grad, VT &b_Ax) +{ + const int m = A.rows(); + VT s(m); + + b_Ax.noalias() = b - Ax; + NT *s_data = s.data(); + for (int i = 0; i < m; i++) + { + *s_data = NT(1) / b_Ax.coeff(i); + s_data++; + } + + VT s_sq = s.cwiseProduct(s); + // Gradient of the log-barrier function + grad.noalias() = A_trans * s; + // Hessian of the log-barrier function + H.noalias() = A_trans * s_sq.asDiagonal() * A; +} + +/* + This implementation computes the analytic center of a polytope given + as a set of linear inequalities P = {x | Ax <= b}. The analytic center + is the minimizer of the log barrier function i.e., the optimal solution + of the following optimization problem (Convex Optimization, Boyd and Vandenberghe, Section 8.5.3), + + \min -\sum \log(b_i - a_i^Tx), where a_i is the i-th row of A. + + The function solves the problem by using the Newton method. + + Input: (i) Matrix A, vector b such that the polytope P = {x | Ax<=b} + (ii) The number of maximum iterations, max_iters + (iii) Tolerance parameter grad_err_tol to bound the L2-norm of the gradient + (iv) Tolerance parameter rel_pos_err_tol to check the relative progress in each iteration + + Output: (i) The analytic center of the polytope + (ii) A boolean variable that declares convergence +*/ +template +std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, + unsigned int const max_iters = 500, + NT const grad_err_tol = 1e-08, + NT const rel_pos_err_tol = 1e-12) +{ + VT x; + bool feasibility_only = true, converged; + // Compute a feasible point + std::tie(x, std::ignore, converged) = max_inscribed_ball(A, b, max_iters, 1e-08, feasibility_only); + VT Ax = A * x; + if (!converged || (Ax.array() > b.array()).any()) + { + std::runtime_error("The computation of the analytic center failed."); + } + // Initialization + const int n = A.cols(), m = A.rows(); + MT H(n, n), A_trans = A.transpose(); + VT grad(n), d(n), Ad(m), b_Ax(m), step_d(n), x_prev; + NT grad_err, rel_pos_err, rel_pos_err_temp, step; + unsigned int iter = 0; + converged = false; + const NT tol_bnd = NT(0.01); + + get_hessian_grad_logbarrier(A, A_trans, b, x, Ax, H, grad, b_Ax); + + do { + iter++; + // Compute the direction + d.noalias() = - H.llt().solve(grad); + Ad.noalias() = A * d; + // Compute the step length + step = std::min((NT(1) - tol_bnd) * get_max_step(Ad, b_Ax), NT(1)); + step_d.noalias() = step*d; + x_prev = x; + x += step_d; + Ax.noalias() += step*Ad; + + // Compute the max_i\{ |step*d_i| ./ |x_i| \} + rel_pos_err = std::numeric_limits::lowest(); + for (int i = 0; i < n; i++) + { + rel_pos_err_temp = std::abs(step_d.coeff(i) / x_prev.coeff(i)); + if (rel_pos_err_temp > rel_pos_err) + { + rel_pos_err = rel_pos_err_temp; + } + } + + get_hessian_grad_logbarrier(A, A_trans, b, x, Ax, H, grad, b_Ax); + grad_err = grad.norm(); + + if (iter >= max_iters || grad_err <= grad_err_tol || rel_pos_err <= rel_pos_err_tol) + { + converged = true; + break; + } + } while (true); + + return std::make_tuple(x, converged); +} + +#endif diff --git a/include/preprocess/max_inscribed_ball.hpp b/include/preprocess/max_inscribed_ball.hpp index 6fe70e9a0..672be24e4 100644 --- a/include/preprocess/max_inscribed_ball.hpp +++ b/include/preprocess/max_inscribed_ball.hpp @@ -27,7 +27,7 @@ */ template -void calcstep(MT const& A, MT const& A_trans, MT const& R, VT &s, +void calcstep(MT const& A, MT const& A_trans, Eigen::LLT const& lltOfB, VT &s, VT &y, VT &r1, VT const& r2, NT const& r3, VT &r4, VT &dx, VT &ds, NT &dt, VT &dy, VT &tmp, VT &rhs) { @@ -41,7 +41,8 @@ void calcstep(MT const& A, MT const& A_trans, MT const& R, VT &s, rhs.block(0,0,n,1).noalias() = r2 + A_trans * tmp; rhs(n) = r3 + tmp.sum(); - VT dxdt = R.colPivHouseholderQr().solve(R.transpose().colPivHouseholderQr().solve(rhs)); + + VT dxdt = lltOfB.solve(rhs); dx = dxdt.block(0,0,n,1); dt = dxdt(n); @@ -57,10 +58,12 @@ void calcstep(MT const& A, MT const& A_trans, MT const& R, VT &s, template -std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned int maxiter, NT tol) +std::tuple max_inscribed_ball(MT const& A, VT const& b, + unsigned int maxiter, NT tol, + const bool feasibility_only = false) { int m = A.rows(), n = A.cols(); - bool converge; + bool converge = false; NT bnrm = b.norm(); VT o_m = VT::Zero(m), o_n = VT::Zero(n), e_m = VT::Ones(m); @@ -81,7 +84,7 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned NT const tau0 = 0.995, power_num = 5.0 * std::pow(10.0, 15.0); NT *vec_iter1, *vec_iter2, *vec_iter3, *vec_iter4; - MT B(n + 1, n + 1), AtD(n, m), R(n + 1, n + 1), + MT B(n + 1, n + 1), AtD(n, m), eEye = std::pow(10.0, -14.0) * MT::Identity(n + 1, n + 1), A_trans = A.transpose(); @@ -105,16 +108,17 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned total_err = std::max(total_err, rgap); // progress output & check stopping - if (total_err < tol || ( t > 0 && ( (std::abs(t - t_prev) <= tol * t && std::abs(t - t_prev) <= tol * t_prev) - || (t_prev >= (1.0 - tol) * t && i > 0) - || (t <= (1.0 - tol) * t_prev && i > 0) ) ) ) + if ( (total_err < tol && t > 0) || + ( t > 0 && ( (std::abs(t - t_prev) <= tol * std::min(std::abs(t), std::abs(t_prev)) || + std::abs(t - t_prev) <= tol) && i > 10) ) || + (feasibility_only && t > tol/2.0 && i > 0) ) { //converged converge = true; break; } - if (dt > 1000.0 * bnrm || t > 1000000.0 * bnrm) + if ((dt > 10000.0 * bnrm || t > 10000000.0 * bnrm) && i > 20) { //unbounded converge = false; @@ -127,11 +131,11 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned vec_iter2 = y.data(); for (int j = 0; j < m; ++j) { *vec_iter1 = std::min(power_num, (*vec_iter2) / (*vec_iter3)); - AtD.col(j).noalias() = A_trans.col(j) * (*vec_iter1); vec_iter1++; vec_iter3++; vec_iter2++; } + AtD.noalias() = A_trans*d.asDiagonal(); AtDe.noalias() = AtD * e_m; B.block(0, 0, n, n).noalias() = AtD * A; @@ -141,11 +145,10 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned B.noalias() += eEye; // Cholesky decomposition - Eigen::LLT lltOfB(B); - R = lltOfB.matrixL().transpose(); + Eigen::LLT lltOfB(B); // predictor step & length - calcstep(A, A_trans, R, s, y, r1, r2, r3, r4, dx, ds, dt, dy, tmp, rhs); + calcstep(A, A_trans, lltOfB, s, y, r1, r2, r3, r4, dx, ds, dt, dy, tmp, rhs); alphap = -1.0; alphad = -1.0; @@ -172,7 +175,7 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned // corrector and combined step & length mu_ds_dy.noalias() = e_m * mu - ds.cwiseProduct(dy); - calcstep(A, A_trans, R, s, y, o_m, o_n, 0.0, mu_ds_dy, dxc, dsc, dtc, dyc, tmp, rhs); + calcstep(A, A_trans, lltOfB, s, y, o_m, o_n, 0.0, mu_ds_dy, dxc, dsc, dtc, dyc, tmp, rhs); dx += dxc; ds += dsc; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a3f8f03d1..e17848fc6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -297,6 +297,8 @@ add_test(NAME test_round_max_ellipsoid add_test(NAME test_round_svd COMMAND new_rounding_test -tc=round_svd) + + add_executable (logconcave_sampling_test logconcave_sampling_test.cpp $) add_test(NAME logconcave_sampling_test_hmc COMMAND logconcave_sampling_test -tc=hmc) @@ -348,6 +350,14 @@ add_test(NAME test_new_rdhr_uniform_MT COMMAND matrix_sampling_test -tc=new_rdhr add_test(NAME test_new_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_billiard_uniform_MT) add_test(NAME test_new_accelerated_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform_MT) +add_executable (test_internal_points test_internal_points.cpp $) +add_test(NAME test_max_ball + COMMAND test_internal_points -tc=test_max_ball) +add_test(NAME test_feasibility_point + COMMAND test_internal_points -tc=test_feasibility_point) +add_test(NAME test_analytic_center + COMMAND test_internal_points -tc=test_analytic_center) + set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") #set_target_properties(benchmarks_crhmc @@ -388,3 +398,4 @@ TARGET_LINK_LIBRARIES(logconcave_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} TARGET_LINK_LIBRARIES(crhmc_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) TARGET_LINK_LIBRARIES(order_polytope lp_solve coverage_config) TARGET_LINK_LIBRARIES(matrix_sampling_test lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(test_internal_points lp_solve ${MKL_LINK} coverage_config) diff --git a/test/test_internal_points.cpp b/test/test_internal_points.cpp new file mode 100644 index 000000000..fa44e9baf --- /dev/null +++ b/test/test_internal_points.cpp @@ -0,0 +1,107 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2024 Vissarion Fisikopoulos +// Copyright (c) 2024 Apostolos Chalkis +// Copyright (c) 2024 Elias Tsigaridas + +// Licensed under GNU LGPL.3, see LICENCE file + +#include "doctest.h" +#include +#include + +#include + +#include "misc/misc.h" +#include "cartesian_geom/cartesian_kernel.h" +#include "convex_bodies/hpolytope.h" + +#include "preprocess/max_inscribed_ball.hpp" +#include "preprocess/analytic_center_linear_ineq.h" + +#include "generators/known_polytope_generators.h" +#include "generators/h_polytopes_generator.h" + +template +void call_test_max_ball() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + typedef boost::mt19937 PolyRNGType; + Hpolytope P; + + std::cout << "\n--- Testing Chebychev ball for skinny H-polytope" << std::endl; + bool pre_rounding = true; // round random polytope before applying the skinny transformation + NT max_min_eig_ratio = NT(2000); + P = skinny_random_hpoly(4, 180, pre_rounding, max_min_eig_ratio, 127); + P.normalize(); + std::pair InnerBall = P.ComputeInnerBall(); + + NT tol = 1e-08; + unsigned int maxiter = 500; + auto [center, radius, converged] = max_inscribed_ball(P.get_mat(), P.get_vec(), maxiter, tol); + + CHECK(P.is_in(Point(center)) == -1); + CHECK(std::abs(radius - InnerBall.second) <= 1e-03); + CHECK(converged); +} + +template +void call_test_max_ball_feasibility() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + typedef boost::mt19937 PolyRNGType; + Hpolytope P; + + std::cout << "\n--- Testing feasibility point for skinny H-polytope" << std::endl; + bool pre_rounding = true; // round random polytope before applying the skinny transformation + NT max_min_eig_ratio = NT(2000); + P = skinny_random_hpoly(50, 500, pre_rounding, max_min_eig_ratio, 127); + P.normalize(); + + bool feasibility_only = true; // compute only a feasible point + NT tol = 1e-08; + unsigned int maxiter = 500; + auto [center, radius, converged] = max_inscribed_ball(P.get_mat(), P.get_vec(), maxiter, tol, feasibility_only); + + CHECK(P.is_in(Point(center)) == -1); + CHECK(converged); +} + +template +void call_test_analytic_center() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + typedef typename Hpolytope::MT MT; + typedef typename Hpolytope::VT VT; + typedef boost::mt19937 PolyRNGType; + Hpolytope P; + + std::cout << "\n--- Testing analytic center for skinny H-polytope" << std::endl; + bool pre_rounding = true; // round random polytope before applying the skinny transformation + NT max_min_eig_ratio = NT(100); + P = skinny_random_hpoly(3, 15, pre_rounding, max_min_eig_ratio, 127); + P.normalize(); + + auto [analytic_center, converged] = analytic_center_linear_ineq(P.get_mat(), P.get_vec()); + + CHECK(P.is_in(Point(analytic_center)) == -1); + CHECK(converged); + CHECK(std::abs(analytic_center(0) + 4.75912) < 1e-04); + CHECK(std::abs(analytic_center(1) + 4.28762) < 1e-04); + CHECK(std::abs(analytic_center(2) - 7.54156) < 1e-04); +} + +TEST_CASE("test_max_ball") { + call_test_max_ball(); +} + +TEST_CASE("test_feasibility_point") { + call_test_max_ball_feasibility(); +} + +TEST_CASE("test_analytic_center") { + call_test_analytic_center(); +} From d076bf0a67a24550408cae13ed79f8e68dccba02 Mon Sep 17 00:00:00 2001 From: Vladimir Necula <151810681+vgnecula@users.noreply.github.com> Date: Tue, 25 Jun 2024 05:17:14 -0400 Subject: [PATCH 27/44] Position Nudging after Position Update (#308) * Position Nudging after Position Update * Complexity improvements and Polytope Normalization * HPolytope Normalization Flag * Polytope normalization within Walk Constructor * Alias HPolytope Normalization for Nudging inside Gaussian HMC * Polytope Normalization in ComputeInner Ball Fixed * Polytope Normalization Style change * Nudge in function within Gaussian HMC, and restore Hpoly file * More efficient Nudge in Process --- include/convex_bodies/hpolytope.h | 2 +- ...ian_hamiltonian_monte_carlo_exact_walk.hpp | 55 +++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/include/convex_bodies/hpolytope.h b/include/convex_bodies/hpolytope.h index 9f4083bd7..d0e894faa 100644 --- a/include/convex_bodies/hpolytope.h +++ b/include/convex_bodies/hpolytope.h @@ -927,4 +927,4 @@ class HPolytope { } }; -#endif +#endif \ No newline at end of file diff --git a/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp b/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp index bda33630c..b0140a0a1 100644 --- a/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp +++ b/include/random_walks/gaussian_hamiltonian_monte_carlo_exact_walk.hpp @@ -53,6 +53,7 @@ struct Walk typedef typename Polytope::PointType Point; typedef typename Point::FT NT; typedef typename Polytope::VT VT; + typedef typename Polytope::MT MT; template Walk(GenericPolytope &P, Point const& p, NT const& a_i, RandomNumberGenerator &rng) @@ -80,7 +81,7 @@ struct Walk < typename GenericPolytope > - inline void apply(GenericPolytope& P, + inline void apply(GenericPolytope const& P, Point& p, NT const& a_i, unsigned int const& walk_length, @@ -89,6 +90,9 @@ struct Walk unsigned int n = P.dimension(); NT T; + GenericPolytope P_normalized = P; + P_normalized.normalize(); + for (auto j=0u; j - inline void get_starting_point(GenericPolytope& P, + inline void get_starting_point(GenericPolytope const& P, Point const& center, Point &q, unsigned int const& walk_length, @@ -141,7 +146,7 @@ struct Walk < typename GenericPolytope > - inline void parameters_burnin(GenericPolytope& P, + inline void parameters_burnin(GenericPolytope const& P, Point const& center, unsigned int const& num_points, unsigned int const& walk_length, @@ -191,7 +196,7 @@ private : < typename GenericPolytope > - inline void initialize(GenericPolytope& P, + inline void initialize(GenericPolytope const& P, Point const& p, NT const& a_i, RandomNumberGenerator &rng) @@ -204,6 +209,9 @@ private : NT T = rng.sample_urdist() * _Len; int it = 0; + GenericPolytope P_normalized = P; + P_normalized.normalize(); + while (it <= _rho) { auto pbpair @@ -218,12 +226,50 @@ private : } _lambda_prev = pbpair.first; update_position(_p, _v, _lambda_prev, _omega); + nudge_in(P_normalized, _p); T -= _lambda_prev; P.compute_reflection(_v, _p, pbpair.second); it++; } } + template + < + typename GenericPolytope + > + inline void nudge_in(GenericPolytope& P, Point& p, NT tol=NT(0)) + { + MT A = P.get_mat(); + VT b = P.get_vec(); + int m = A.rows(); + + VT b_Ax = b - A * p.getCoefficients(); + const NT* b_Ax_data = b_Ax.data(); + + NT dist; + + for (int i = 0; i < m; i++) { + + dist = *b_Ax_data; + + if (dist < NT(-tol)){ + //Nudging correction + NT eps = -1e-7; + + NT eps_1 = -dist; + //A.row is already normalized, no need to do it again + VT A_i = A.row(i); + NT eps_2 = eps_1 + eps; + + //Nudge the point inside with respect to the normal its vector + Point shift(A_i); + shift.operator*=(eps_2); + p.operator+=(shift); + } + b_Ax_data++; + } + } + inline void update_position(Point &p, Point &v, NT const& T, NT const& omega) { NT next_p, next_v; @@ -274,4 +320,3 @@ private : #endif // RANDOM_WALKS_GAUSSIAN_HMC_WALK_HPP - From 5bc28d68d73fe8a6d3ed1111f7a10c976f600de6 Mon Sep 17 00:00:00 2001 From: Apostolos Chalkis Date: Thu, 27 Jun 2024 02:17:47 -0600 Subject: [PATCH 28/44] Generalize the rounding loop and support sparse computations in preprocessing routines (#312) * generalize rounding loop * support sparse cholesky operator * complete sparse support in max_inscribed_ball * complete sparse support in preprocesing * add sparse tests * change main rounding function name * improve explaining comments * resolve PR comments * changing the dates in copyrights * use if constexpr instead of SNIFAE * update the examples to cpp17 * update to cpp17 order polytope example * fix templating in mat_computational_operators * fix templating errors and change header file to mat_computational_operators --------- Co-authored-by: Apostolos Chalkis --- examples/EnvelopeProblemSOS/CMakeLists.txt | 4 +- .../CMakeLists.txt | 1 + .../volesti_lecount.cpp | 2 +- examples/crhmc_prepare/CMakeLists.txt | 1 + examples/crhmc_sampling/CMakeLists.txt | 2 +- examples/ellipsoid-sampling/CMakeLists.txt | 2 +- examples/hpolytope-volume/CMakeLists.txt | 1 + examples/logconcave/CMakeLists.txt | 2 +- examples/mmcs_method/CMakeLists.txt | 2 +- examples/multithread_sampling/CMakeLists.txt | 2 +- .../optimization_spectrahedra/CMakeLists.txt | 1 + examples/order-polytope-basics/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../sampler.cpp | 17 +- examples/volume_spectrahedron/CMakeLists.txt | 2 +- examples/vpolytope-volume/CMakeLists.txt | 1 + include/convex_bodies/orderpolytope.h | 6 + include/generators/h_polytopes_generator.h | 4 +- .../preprocess/analytic_center_linear_ineq.h | 62 ++-- .../estimate_L_smooth_parameter.hpp | 4 +- include/preprocess/feasible_point.hpp | 34 ++ .../inscribed_ellipsoid_rounding.hpp | 134 ++++++++ .../preprocess/mat_computational_operators.h | 316 ++++++++++++++++++ include/preprocess/max_inscribed_ball.hpp | 48 ++- .../preprocess/max_inscribed_ellipsoid.hpp | 58 ++-- .../max_inscribed_ellipsoid_rounding.hpp | 94 ------ test/CMakeLists.txt | 18 +- test/max_ellipsoid_rounding_test.cpp | 4 +- ...ew_rounding_test.cpp => rounding_test.cpp} | 117 ++++++- test/test_internal_points.cpp | 63 +++- 30 files changed, 786 insertions(+), 220 deletions(-) create mode 100644 include/preprocess/feasible_point.hpp create mode 100644 include/preprocess/inscribed_ellipsoid_rounding.hpp create mode 100644 include/preprocess/mat_computational_operators.h delete mode 100644 include/preprocess/max_inscribed_ellipsoid_rounding.hpp rename test/{new_rounding_test.cpp => rounding_test.cpp} (61%) diff --git a/examples/EnvelopeProblemSOS/CMakeLists.txt b/examples/EnvelopeProblemSOS/CMakeLists.txt index e8f5b1a61..6d4e2a2a4 100644 --- a/examples/EnvelopeProblemSOS/CMakeLists.txt +++ b/examples/EnvelopeProblemSOS/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.15) project(EnvelopeProblem) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS_DEBUG_CUSTOM "-O0 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -DIPM_USE_DOUBLE -DIPM_DOUBLE=double") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG_CUSTOM}") @@ -83,4 +83,4 @@ else () target_link_directories(EnvelopeProblem PRIVATE ${OPENMP_LIBRARIES}) endif () target_link_libraries(EnvelopeProblem Python2::Python Python2::NumPy) -endif () \ No newline at end of file +endif () diff --git a/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt b/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt index f3e66b634..49f295303 100644 --- a/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt +++ b/examples/count-linear-extensions-using-hpolytope/CMakeLists.txt @@ -98,6 +98,7 @@ else () add_compile_definitions("EIGEN_NO_DEBUG") endif () + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/count-linear-extensions-using-hpolytope/volesti_lecount.cpp b/examples/count-linear-extensions-using-hpolytope/volesti_lecount.cpp index 9b0e99822..eb7133155 100644 --- a/examples/count-linear-extensions-using-hpolytope/volesti_lecount.cpp +++ b/examples/count-linear-extensions-using-hpolytope/volesti_lecount.cpp @@ -10,7 +10,7 @@ #include "volume_cooling_gaussians.hpp" #include "volume_cooling_balls.hpp" -#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" +#include "preprocess/inscribed_ellipsoid_rounding.hpp" #include "preprocess/min_sampling_covering_ellipsoid_rounding.hpp" #include "preprocess/svd_rounding.hpp" diff --git a/examples/crhmc_prepare/CMakeLists.txt b/examples/crhmc_prepare/CMakeLists.txt index 3575c4a46..9d99477c2 100644 --- a/examples/crhmc_prepare/CMakeLists.txt +++ b/examples/crhmc_prepare/CMakeLists.txt @@ -105,6 +105,7 @@ endif () #add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger +add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") add_definitions(${CMAKE_CXX_FLAGS} "-O3 " ${ADDITIONAL_FLAGS}) # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") diff --git a/examples/crhmc_sampling/CMakeLists.txt b/examples/crhmc_sampling/CMakeLists.txt index 91fe46a7f..e3dddb905 100644 --- a/examples/crhmc_sampling/CMakeLists.txt +++ b/examples/crhmc_sampling/CMakeLists.txt @@ -113,7 +113,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") add_definitions(${CMAKE_CXX_FLAGS} "-O3 -DTIME_KEEPING" ${ADDITIONAL_FLAGS}) # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") diff --git a/examples/ellipsoid-sampling/CMakeLists.txt b/examples/ellipsoid-sampling/CMakeLists.txt index b275ed9b9..d16704b17 100644 --- a/examples/ellipsoid-sampling/CMakeLists.txt +++ b/examples/ellipsoid-sampling/CMakeLists.txt @@ -99,7 +99,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++11 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/hpolytope-volume/CMakeLists.txt b/examples/hpolytope-volume/CMakeLists.txt index eff88889a..ad9bb7e39 100644 --- a/examples/hpolytope-volume/CMakeLists.txt +++ b/examples/hpolytope-volume/CMakeLists.txt @@ -88,6 +88,7 @@ include_directories (BEFORE ../../include/nlp_oracles) include_directories (BEFORE ../../include/misc) include_directories (BEFORE ../../include/optimization) +add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") diff --git a/examples/logconcave/CMakeLists.txt b/examples/logconcave/CMakeLists.txt index 33725d0c9..cc62d286c 100644 --- a/examples/logconcave/CMakeLists.txt +++ b/examples/logconcave/CMakeLists.txt @@ -123,7 +123,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++11 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/mmcs_method/CMakeLists.txt b/examples/mmcs_method/CMakeLists.txt index 01b8a040c..5ecd129f2 100644 --- a/examples/mmcs_method/CMakeLists.txt +++ b/examples/mmcs_method/CMakeLists.txt @@ -97,7 +97,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/multithread_sampling/CMakeLists.txt b/examples/multithread_sampling/CMakeLists.txt index ded4b4dbb..81ad78285 100644 --- a/examples/multithread_sampling/CMakeLists.txt +++ b/examples/multithread_sampling/CMakeLists.txt @@ -97,7 +97,7 @@ else () endif () - #add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/optimization_spectrahedra/CMakeLists.txt b/examples/optimization_spectrahedra/CMakeLists.txt index a35aee4c7..7c941640c 100644 --- a/examples/optimization_spectrahedra/CMakeLists.txt +++ b/examples/optimization_spectrahedra/CMakeLists.txt @@ -10,6 +10,7 @@ if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) +add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") add_executable (read_write_sdpa_file read_write_sdpa_file.cpp) diff --git a/examples/order-polytope-basics/CMakeLists.txt b/examples/order-polytope-basics/CMakeLists.txt index b45ef374c..70026f61b 100644 --- a/examples/order-polytope-basics/CMakeLists.txt +++ b/examples/order-polytope-basics/CMakeLists.txt @@ -99,7 +99,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/sampling-hpolytope-with-billiard-walks/CMakeLists.txt b/examples/sampling-hpolytope-with-billiard-walks/CMakeLists.txt index c10fb041c..5c47fe0ad 100644 --- a/examples/sampling-hpolytope-with-billiard-walks/CMakeLists.txt +++ b/examples/sampling-hpolytope-with-billiard-walks/CMakeLists.txt @@ -102,7 +102,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/sampling-hpolytope-with-billiard-walks/sampler.cpp b/examples/sampling-hpolytope-with-billiard-walks/sampler.cpp index 22dd6d9e5..803d38dc3 100644 --- a/examples/sampling-hpolytope-with-billiard-walks/sampler.cpp +++ b/examples/sampling-hpolytope-with-billiard-walks/sampler.cpp @@ -73,17 +73,16 @@ void sample_using_gaussian_billiard_walk(HPOLYTOPE& HP, RNGType& rng, unsigned i unsigned int max_iter = 150; NT tol = std::pow(10, -6.0), reg = std::pow(10, -4.0); VT x0 = q.getCoefficients(); - std::pair, bool> inscribed_ellipsoid_res = max_inscribed_ellipsoid(HP.get_mat(), - HP.get_vec(), - x0, - max_iter, - tol, - reg); - if (!inscribed_ellipsoid_res.second) // not converged + MT E; + VT center; + bool converged; + std::tie(E, center, converged) = max_inscribed_ellipsoid(HP.get_mat(), + HP.get_vec(), x0, max_iter, tol, reg); + + if (!converged) // not converged throw std::runtime_error("max_inscribed_ellipsoid not converged"); - MT A_ell = inscribed_ellipsoid_res.first.first.inverse(); - EllipsoidType inscribed_ellipsoid(A_ell); + EllipsoidType inscribed_ellipsoid(E); // -------------------------------------------------------------------- Generator::apply(HP, q, inscribed_ellipsoid, num_points, walk_len, diff --git a/examples/volume_spectrahedron/CMakeLists.txt b/examples/volume_spectrahedron/CMakeLists.txt index 424c457b3..57ecd27e0 100644 --- a/examples/volume_spectrahedron/CMakeLists.txt +++ b/examples/volume_spectrahedron/CMakeLists.txt @@ -98,7 +98,7 @@ else () endif () - add_definitions(${CMAKE_CXX_FLAGS} "-std=c++11") # enable C++11 standard + add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") # enable C++17 standard add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/examples/vpolytope-volume/CMakeLists.txt b/examples/vpolytope-volume/CMakeLists.txt index e1a0c2576..2f7020fb1 100644 --- a/examples/vpolytope-volume/CMakeLists.txt +++ b/examples/vpolytope-volume/CMakeLists.txt @@ -91,6 +91,7 @@ else () add_compile_definitions("EIGEN_NO_DEBUG") endif () +add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") diff --git a/include/convex_bodies/orderpolytope.h b/include/convex_bodies/orderpolytope.h index 2df5c6619..79f41e161 100644 --- a/include/convex_bodies/orderpolytope.h +++ b/include/convex_bodies/orderpolytope.h @@ -638,6 +638,12 @@ class OrderPolytope { return false; } + // Apply linear transformation, of square matrix T^{-1}, in H-polytope P:= Ax<=b + // This is most of the times for testing reasons because it might destroy the sparsity + void linear_transformIt(MT const& T) + { + _A = _A * T; + } // shift polytope by a point c void shift(VT const& c) diff --git a/include/generators/h_polytopes_generator.h b/include/generators/h_polytopes_generator.h index e9638b62f..0c9293baa 100644 --- a/include/generators/h_polytopes_generator.h +++ b/include/generators/h_polytopes_generator.h @@ -13,7 +13,7 @@ #include #include -#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" +#include "preprocess/inscribed_ellipsoid_rounding.hpp" #ifndef isnan using std::isnan; @@ -121,7 +121,7 @@ Polytope skinny_random_hpoly(unsigned int dim, unsigned int m, const bool pre_ro if (pre_rounding) { Point x0(dim); // run only one iteration - max_inscribed_ellipsoid_rounding(P, x0, 1); + inscribed_ellipsoid_rounding(P, x0, 1); } MT cov = get_skinny_transformation(dim, eig_ratio, seed); diff --git a/include/preprocess/analytic_center_linear_ineq.h b/include/preprocess/analytic_center_linear_ineq.h index c7918635a..80d731f6c 100644 --- a/include/preprocess/analytic_center_linear_ineq.h +++ b/include/preprocess/analytic_center_linear_ineq.h @@ -12,7 +12,9 @@ #include -#include "max_inscribed_ball.hpp" +#include "preprocess/max_inscribed_ball.hpp" +#include "preprocess/feasible_point.hpp" +#include "preprocess/mat_computational_operators.h" template NT get_max_step(VT const& Ad, VT const& b_Ax) @@ -33,22 +35,13 @@ template void get_hessian_grad_logbarrier(MT const& A, MT const& A_trans, VT const& b, VT const& x, VT const& Ax, MT &H, VT &grad, VT &b_Ax) { - const int m = A.rows(); - VT s(m); - b_Ax.noalias() = b - Ax; - NT *s_data = s.data(); - for (int i = 0; i < m; i++) - { - *s_data = NT(1) / b_Ax.coeff(i); - s_data++; - } - + VT s = b_Ax.cwiseInverse(); VT s_sq = s.cwiseProduct(s); // Gradient of the log-barrier function grad.noalias() = A_trans * s; // Hessian of the log-barrier function - H.noalias() = A_trans * s_sq.asDiagonal() * A; + update_Atrans_Diag_A(H, A_trans, A, s_sq.asDiagonal()); } /* @@ -66,39 +59,36 @@ void get_hessian_grad_logbarrier(MT const& A, MT const& A_trans, VT const& b, (iii) Tolerance parameter grad_err_tol to bound the L2-norm of the gradient (iv) Tolerance parameter rel_pos_err_tol to check the relative progress in each iteration - Output: (i) The analytic center of the polytope - (ii) A boolean variable that declares convergence + Output: (i) The Hessian computed on the analytic center + (ii) The analytic center of the polytope + (iii) A boolean variable that declares convergence + + Note: Using MT as to deal with both dense and sparse matrices, MT_dense will be the type of result matrix */ -template -std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, - unsigned int const max_iters = 500, - NT const grad_err_tol = 1e-08, - NT const rel_pos_err_tol = 1e-12) +template +std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, VT const& x0, + unsigned int const max_iters = 500, + NT const grad_err_tol = 1e-08, + NT const rel_pos_err_tol = 1e-12) { - VT x; - bool feasibility_only = true, converged; - // Compute a feasible point - std::tie(x, std::ignore, converged) = max_inscribed_ball(A, b, max_iters, 1e-08, feasibility_only); - VT Ax = A * x; - if (!converged || (Ax.array() > b.array()).any()) - { - std::runtime_error("The computation of the analytic center failed."); - } // Initialization + VT x = x0; + VT Ax = A * x; const int n = A.cols(), m = A.rows(); MT H(n, n), A_trans = A.transpose(); VT grad(n), d(n), Ad(m), b_Ax(m), step_d(n), x_prev; NT grad_err, rel_pos_err, rel_pos_err_temp, step; unsigned int iter = 0; - converged = false; + bool converged = false; const NT tol_bnd = NT(0.01); + auto llt = initialize_chol(A_trans, A); get_hessian_grad_logbarrier(A, A_trans, b, x, Ax, H, grad, b_Ax); do { iter++; // Compute the direction - d.noalias() = - H.llt().solve(grad); + d.noalias() = - solve_vec(llt, H, grad); Ad.noalias() = A * d; // Compute the step length step = std::min((NT(1) - tol_bnd) * get_max_step(Ad, b_Ax), NT(1)); @@ -128,7 +118,17 @@ std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, } } while (true); - return std::make_tuple(x, converged); + return std::make_tuple(MT_dense(H), x, converged); +} + +template +std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, + unsigned int const max_iters = 500, + NT const grad_err_tol = 1e-08, + NT const rel_pos_err_tol = 1e-12) +{ + VT x0 = compute_feasible_point(A, b); + return analytic_center_linear_ineq(A, b, x0, max_iters, grad_err_tol, rel_pos_err_tol); } #endif diff --git a/include/preprocess/estimate_L_smooth_parameter.hpp b/include/preprocess/estimate_L_smooth_parameter.hpp index 8f5a1e89c..180f20947 100644 --- a/include/preprocess/estimate_L_smooth_parameter.hpp +++ b/include/preprocess/estimate_L_smooth_parameter.hpp @@ -1,7 +1,7 @@ // VolEsti (volume computation and sampling library) -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2012-2024 Vissarion Fisikopoulos +// Copyright (c) 2018-2024 Apostolos Chalkis //Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. diff --git a/include/preprocess/feasible_point.hpp b/include/preprocess/feasible_point.hpp new file mode 100644 index 000000000..6e7f5db0a --- /dev/null +++ b/include/preprocess/feasible_point.hpp @@ -0,0 +1,34 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2024 Vissarion Fisikopoulos +// Copyright (c) 2024 Apostolos Chalkis +// Copyright (c) 2024 Elias Tsigaridas + +// Licensed under GNU LGPL.3, see LICENCE file + + +#ifndef FEASIBLE_POINT_HPP +#define FEASIBLE_POINT_HPP + +#include + +#include "preprocess/max_inscribed_ball.hpp" + +// Using MT as to deal with both dense and sparse matrices +template +VT compute_feasible_point(MT const& A, VT const& b) +{ + VT x; + bool feasibility_only = true, converged; + unsigned max_iters = 10000; + // Compute a feasible point + std::tie(x, std::ignore, converged) = max_inscribed_ball(A, b, max_iters, 1e-08, feasibility_only); + if (!converged || ((A * x).array() > b.array()).any()) + { + std::runtime_error("The computation of a feasible point failed."); + } + return x; +} + + +#endif diff --git a/include/preprocess/inscribed_ellipsoid_rounding.hpp b/include/preprocess/inscribed_ellipsoid_rounding.hpp new file mode 100644 index 000000000..dd20d533d --- /dev/null +++ b/include/preprocess/inscribed_ellipsoid_rounding.hpp @@ -0,0 +1,134 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2012-2024 Vissarion Fisikopoulos +// Copyright (c) 2018-2024 Apostolos Chalkis + +//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. + +// Licensed under GNU LGPL.3, see LICENCE file + + +#ifndef INSCRIBED_ELLIPSOID_ROUNDING_HPP +#define INSCRIBED_ELLIPSOID_ROUNDING_HPP + +#include "preprocess/max_inscribed_ellipsoid.hpp" +#include "preprocess/analytic_center_linear_ineq.h" +#include "preprocess/feasible_point.hpp" + +enum EllipsoidType +{ + MAX_ELLIPSOID = 1, + LOG_BARRIER = 2 +}; + +template +inline static std::tuple +compute_inscribed_ellipsoid(Custom_MT A, VT b, VT const& x0, + unsigned int const& maxiter, + NT const& tol, NT const& reg) +{ + if constexpr (ellipsoid_type == EllipsoidType::MAX_ELLIPSOID) + { + return max_inscribed_ellipsoid(A, b, x0, maxiter, tol, reg); + } else if constexpr (ellipsoid_type == EllipsoidType::LOG_BARRIER) + { + return analytic_center_linear_ineq(A, b, x0); + } else + { + std::runtime_error("Unknown rounding method."); + } + return {}; +} + +template +< + typename MT, + typename VT, + typename NT, + typename Polytope, + int ellipsoid_type = EllipsoidType::MAX_ELLIPSOID +> +std::tuple inscribed_ellipsoid_rounding(Polytope &P, + unsigned int const max_iterations = 5, + NT const max_eig_ratio = NT(6)) +{ + typedef typename Polytope::PointType Point; + VT x = compute_feasible_point(P.get_mat(), P.get_vec()); + return inscribed_ellipsoid_rounding(P, Point(x), max_iterations, max_eig_ratio); +} + +template +< + typename MT, + typename VT, + typename NT, + typename Polytope, + typename Point, + int ellipsoid_type = EllipsoidType::MAX_ELLIPSOID +> +std::tuple inscribed_ellipsoid_rounding(Polytope &P, + Point const& InnerPoint, + unsigned int const max_iterations = 5, + NT const max_eig_ratio = NT(6)) +{ + unsigned int maxiter = 500, iter = 1, d = P.dimension(); + VT x0 = InnerPoint.getCoefficients(), center, shift = VT::Zero(d); + MT E, L, T = MT::Identity(d, d); + bool converged; + NT R = 100.0, r = 1.0, tol = std::pow(10, -6.0), reg = std::pow(10, -4.0), round_val = 1.0; + + while (true) + { + // Compute the desired inscribed ellipsoid in P + std::tie(E, center, converged) = + compute_inscribed_ellipsoid(P.get_mat(), P.get_vec(), x0, maxiter, tol, reg); + + E = (E + E.transpose()) / 2.0; + E += MT::Identity(d, d)*std::pow(10, -8.0); //normalize E + + Eigen::LLT lltOfA(E.llt().solve(MT::Identity(E.cols(), E.cols()))); // compute the Cholesky decomposition of E^{-1} + L = lltOfA.matrixL(); + + // Computing eigenvalues of E + Spectra::DenseSymMatProd op(E); + // The value of ncv is chosen empirically + Spectra::SymEigsSolver> eigs(&op, 2, std::min(std::max(10, int(d)/5), int(d))); + eigs.init(); + int nconv = eigs.compute(); + if (eigs.info() == Spectra::COMPUTATION_INFO::SUCCESSFUL) { + R = 1.0 / eigs.eigenvalues().coeff(1); + r = 1.0 / eigs.eigenvalues().coeff(0); + } else { + Eigen::SelfAdjointEigenSolver eigensolver(E); + if (eigensolver.info() == Eigen::ComputationInfo::Success) { + R = 1.0 / eigensolver.eigenvalues().coeff(0); + r = 1.0 / eigensolver.eigenvalues().template tail<1>().value(); + } else { + std::runtime_error("Computations failed."); + } + } + // Shift polytope and apply the linear transformation on P + P.shift(center); + shift.noalias() += T * center; + T.applyOnTheRight(L); // T = T * L; + round_val *= L.transpose().determinant(); + P.linear_transformIt(L); + + reg = std::max(reg / 10.0, std::pow(10, -10.0)); + P.normalize(); + x0 = VT::Zero(d); + + // Check the roundness of the polytope + if(((std::abs(R / r) <= max_eig_ratio && converged) || iter >= max_iterations)) { + break; + } + + iter++; + } + + std::tuple result = std::make_tuple(T, shift, std::abs(round_val)); + return result; +} + +#endif diff --git a/include/preprocess/mat_computational_operators.h b/include/preprocess/mat_computational_operators.h new file mode 100644 index 000000000..af200d221 --- /dev/null +++ b/include/preprocess/mat_computational_operators.h @@ -0,0 +1,316 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2024 Vissarion Fisikopoulos +// Copyright (c) 2024 Apostolos Chalkis +// Copyright (c) 2024 Elias Tsigaridas + +// Licensed under GNU LGPL.3, see LICENCE file + + +#ifndef MAT_COMPUTATIONAL_OPERATORS_H +#define MAT_COMPUTATIONAL_OPERATORS_H + +#include + +#include "Spectra/include/Spectra/SymEigsSolver.h" +#include "Spectra/include/Spectra/MatOp/DenseSymMatProd.h" +#include "Spectra/include/Spectra/MatOp/SparseSymMatProd.h" + + +template +struct AssertFalseType : std::false_type {}; + +template +inline static auto +initialize_chol(MT const& mat) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + return std::make_unique>(); + } else if constexpr (std::is_same::value) + { + auto llt = std::make_unique>(); + llt->analyzePattern(mat); + return llt; + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static auto +initialize_chol(MT const& A_trans, MT const& A) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + return std::make_unique>(); + } else if constexpr (std::is_same::value) + { + MT mat = A_trans * A; + return initialize_chol(mat); + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static VT solve_vec(std::unique_ptr const& llt, + MT const& H, VT const& b) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + llt->compute(H); + return llt->solve(b); + } else if constexpr (std::is_same::value) + { + llt->factorize(H); + return llt->solve(b); + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static Eigen::Matrix +solve_mat(std::unique_ptr const& llt, + MT const& H, MT const& mat, NT &logdetE) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + llt->compute(H); + logdetE = llt->matrixL().toDenseMatrix().diagonal().array().log().sum(); + return llt->solve(mat); + } else if constexpr (std::is_same::value) + { + llt->factorize(H); + logdetE = llt->matrixL().nestedExpression().diagonal().array().log().sum(); + return llt->solve(mat); + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static void update_Atrans_Diag_A(MT &H, MT const& A_trans, + MT const& A, diag_MT const& D) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + H.noalias() = A_trans * D * A; + } else if constexpr (std::is_same::value) + { + H = A_trans * D * A; + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static void update_Diag_A(MT &H, diag_MT const& D, MT const& A) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + H.noalias() = D * A; + } else if constexpr (std::is_same::value) + { + H = D * A; + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static void update_A_Diag(MT &H, MT const& A, diag_MT const& D) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + H.noalias() = A * D; + } else if constexpr (std::is_same::value) + { + H = A * D; + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static auto +get_mat_prod_op(MT const& E) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + return std::make_unique>(E); + } else if constexpr (std::is_same::value) + { + return std::make_unique>(E); + } else + { + static_assert(AssertFalseType::value, + "Matrix type is not supported."); + } +} + +template +inline static auto get_eigs_solver(std::unique_ptr const& op, int const n) +{ + using DenseMatProd = Spectra::DenseSymMatProd; + using SparseMatProd = Spectra::SparseSymMatProd; + if constexpr (std::is_same::value) + { + using SymDenseEigsSolver = Spectra::SymEigsSolver + < + NT, + Spectra::SELECT_EIGENVALUE::BOTH_ENDS, + DenseMatProd + >; + // The value of ncv is chosen empirically + return std::make_unique(op.get(), 2, std::min(std::max(10, n/5), n)); + } else if constexpr (std::is_same::value) + { + using SymSparseEigsSolver = Spectra::SymEigsSolver + < + NT, + Spectra::SELECT_EIGENVALUE::BOTH_ENDS, + SparseMatProd + >; + // The value of ncv is chosen empirically + return std::make_unique(op.get(), 2, std::min(std::max(10, n/5), n)); + } else + { + static_assert(AssertFalseType::value, + "Matrix-vector multiplication multiplication is not supported."); + } +} + +template +inline static void +init_Bmat(MT &B, int const n, MT const& A_trans, MT const& A) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + if constexpr (std::is_same::value) + { + B.resize(n+1, n+1); + } else if constexpr (std::is_same::value) + { + // Initialize the structure of matrix B + typedef Eigen::Triplet triplet; + std::vector trp; + for (int i = 0; i < n; i++) + { + trp.push_back(triplet(i, i, NT(1))); + trp.push_back(triplet(i, n, NT(1))); + trp.push_back(triplet(n, i, NT(1))); + } + trp.push_back(triplet(n, n, NT(1))); + + MT ATA = A_trans * A; + for (int k=0; k::value, + "Matrix type is not supported."); + } +} + +template +inline static void +update_Bmat(MT &B, VT const& AtDe, VT const& d, + MT const& AtD, MT const& A) +{ + using DenseMT = Eigen::Matrix; + using SparseMT = Eigen::SparseMatrix; + const int n = A.cols(); + /* + B is (n+1)x(n+1) and AtD_A is nxn. + We set B(1:n), 1:n) = AtD_A, B(n+1, :) = AtD^T, B(:, n+1) = AtD, B(n+1, n+1) = d.sum() + */ + if constexpr (std::is_same::value) + { + B.block(0, 0, n, n).noalias() = AtD * A; + B.block(0, n, n, 1).noalias() = AtDe; + B.block(n, 0, 1, n).noalias() = AtDe.transpose(); + B(n, n) = d.sum(); + B.noalias() += 1e-14 * MT::Identity(n + 1, n + 1); + } else if constexpr (std::is_same::value) + { + MT AtD_A = AtD * A; + int k = 0; + while(k < B.outerSize()) + { + typename MT::InnerIterator it2(AtD_A, k <= n-1 ? k : k-1); + for (typename MT::InnerIterator it1(B, k); it1; ++it1) + { + if (it1.row() <= n-1 && it1.col() <= n-1) + { + it1.valueRef() = it2.value(); + } + else if (it1.row() == n && it1.col() <= n-1) + { + it1.valueRef() = AtDe.coeff(it1.col()); + } + else if (it1.col() == n && it1.row() <= n-1) + { + it1.valueRef() = AtDe.coeff(it1.row()); + } + else // then, (it1.row() == n && it1.col() == n) + { + it1.valueRef() = d.sum(); + } + + if (it1.row() == it1.col()) + { + it1.valueRef() += 1e-14; + } + if (it1.row()::value, + "Matrix type is not supported."); + } +} + + +#endif // MAT_COMPUTATIONAL_OPERATORS_H diff --git a/include/preprocess/max_inscribed_ball.hpp b/include/preprocess/max_inscribed_ball.hpp index 672be24e4..573813dd7 100644 --- a/include/preprocess/max_inscribed_ball.hpp +++ b/include/preprocess/max_inscribed_ball.hpp @@ -1,15 +1,17 @@ // VolEsti (volume computation and sampling library) -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis +// Copyright (c) 2012-2024 Vissarion Fisikopoulos +// Copyright (c) 2018-2024 Apostolos Chalkis //Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. // Licensed under GNU LGPL.3, see LICENCE file -#ifndef MAX_INNER_BALL -#define MAX_INNER_BALL +#ifndef MAX_INSCRIBED_BALL_HPP +#define MAX_INSCRIBED_BALL_HPP + +#include "preprocess/mat_computational_operators.h" /* This implmentation computes the largest inscribed ball in a given convex polytope P. @@ -26,10 +28,11 @@ radius r */ -template -void calcstep(MT const& A, MT const& A_trans, Eigen::LLT const& lltOfB, VT &s, - VT &y, VT &r1, VT const& r2, NT const& r3, VT &r4, - VT &dx, VT &ds, NT &dt, VT &dy, VT &tmp, VT &rhs) +template +void calcstep(MT const& A, MT const& A_trans, MT const& B, + llt_type const& llt, VT &s, VT &y, VT &r1, + VT const& r2, NT const& r3, VT &r4, VT &dx, + VT &ds, NT &dt, VT &dy, VT &tmp, VT &rhs) { int m = A.rows(), n = A.cols(); NT *vec_iter1 = tmp.data(), *vec_iter2 = y.data(), *vec_iter3 = s.data(), @@ -42,7 +45,7 @@ void calcstep(MT const& A, MT const& A_trans, Eigen::LLT const& lltOfB, VT & rhs.block(0,0,n,1).noalias() = r2 + A_trans * tmp; rhs(n) = r3 + tmp.sum(); - VT dxdt = lltOfB.solve(rhs); + VT dxdt = solve_vec(llt, B, rhs); dx = dxdt.block(0,0,n,1); dt = dxdt(n); @@ -56,12 +59,13 @@ void calcstep(MT const& A, MT const& A_trans, Eigen::LLT const& lltOfB, VT & } } - +// Using MT as to deal with both dense and sparse matrices template std::tuple max_inscribed_ball(MT const& A, VT const& b, unsigned int maxiter, NT tol, const bool feasibility_only = false) { + //typedef matrix_computational_operator mat_op; int m = A.rows(), n = A.cols(); bool converge = false; @@ -84,9 +88,10 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, NT const tau0 = 0.995, power_num = 5.0 * std::pow(10.0, 15.0); NT *vec_iter1, *vec_iter2, *vec_iter3, *vec_iter4; - MT B(n + 1, n + 1), AtD(n, m), - eEye = std::pow(10.0, -14.0) * MT::Identity(n + 1, n + 1), - A_trans = A.transpose(); + MT B, AtD(n, m), A_trans = A.transpose(); + + init_Bmat(B, n, A_trans, A); + auto llt = initialize_chol(B); for (unsigned int i = 0; i < maxiter; ++i) { @@ -135,20 +140,13 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, vec_iter3++; vec_iter2++; } - AtD.noalias() = A_trans*d.asDiagonal(); + update_A_Diag(AtD, A_trans, d.asDiagonal()); // AtD = A_trans*d.asDiagonal() AtDe.noalias() = AtD * e_m; - B.block(0, 0, n, n).noalias() = AtD * A; - B.block(0, n, n, 1).noalias() = AtDe; - B.block(n, 0, 1, n).noalias() = AtDe.transpose(); - B(n, n) = d.sum(); - B.noalias() += eEye; - - // Cholesky decomposition - Eigen::LLT lltOfB(B); + update_Bmat(B, AtDe, d, AtD, A); // predictor step & length - calcstep(A, A_trans, lltOfB, s, y, r1, r2, r3, r4, dx, ds, dt, dy, tmp, rhs); + calcstep(A, A_trans, B, llt, s, y, r1, r2, r3, r4, dx, ds, dt, dy, tmp, rhs); alphap = -1.0; alphad = -1.0; @@ -175,7 +173,7 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, // corrector and combined step & length mu_ds_dy.noalias() = e_m * mu - ds.cwiseProduct(dy); - calcstep(A, A_trans, lltOfB, s, y, o_m, o_n, 0.0, mu_ds_dy, dxc, dsc, dtc, dyc, tmp, rhs); + calcstep(A, A_trans, B, llt, s, y, o_m, o_n, 0.0, mu_ds_dy, dxc, dsc, dtc, dyc, tmp, rhs); dx += dxc; ds += dsc; @@ -216,4 +214,4 @@ std::tuple max_inscribed_ball(MT const& A, VT const& b, return result; } -#endif +#endif // MAX_INSCRIBED_BALL_HPP diff --git a/include/preprocess/max_inscribed_ellipsoid.hpp b/include/preprocess/max_inscribed_ellipsoid.hpp index 7a0c19a6f..f44f60ff0 100644 --- a/include/preprocess/max_inscribed_ellipsoid.hpp +++ b/include/preprocess/max_inscribed_ellipsoid.hpp @@ -15,9 +15,7 @@ #include #include -#include "Spectra/include/Spectra/SymEigsSolver.h" -#include "Spectra/include/Spectra/Util/SelectionRule.h" -#include "Spectra/include/Spectra/MatOp/DenseSymMatProd.h" +#include "preprocess/mat_computational_operators.h" /* @@ -37,14 +35,14 @@ matrix E2^{-1} = E_transpose * E */ -// using Custom_MT as to deal with both dense and sparse matrices, MT will be the type of result matrix -// TODO: Change the return data structure to std::tuple -template -std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT const& x0, - unsigned int const& maxiter, - NT const& tol, NT const& reg) +// Using MT as to deal with both dense and sparse matrices, MT_dense will be the type of result matrix +template +std::tuple max_inscribed_ellipsoid(MT A, VT b, VT const& x0, + unsigned int const& maxiter, + NT const& tol, NT const& reg) { typedef Eigen::DiagonalMatrix Diagonal_MT; + //typedef matrix_computational_operator mat_op; int m = A.rows(), n = A.cols(); bool converged = false; @@ -66,22 +64,23 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT VT const bmAx0 = b - A * x0, ones_m = VT::Ones(m); - MT Q(m, m), E2(n, n), YQ(m,m), G(m,m), T(m,n), ATP(n,m), ATP_A(n,n); + MT_dense Q(m,m), YQ(m,m), G(m,m), T(m,n), ATP(n,m), ATP_A(n,n); Diagonal_MT Y(m); - Custom_MT YA(m, n); + MT YA(m, n); A = (ones_m.cwiseProduct(bmAx0.cwiseInverse())).asDiagonal() * A, b = ones_m; - Custom_MT A_trans = A.transpose(); + MT A_trans = A.transpose(), E2(n,n); + + auto llt = initialize_chol(A_trans, A); int i = 1; while (i <= maxiter) { Y = y.asDiagonal(); - E2.noalias() = MT(A_trans * Y * A); - Eigen::LLT llt(E2); - - Q.noalias() = A * llt.solve(A_trans); + update_Atrans_Diag_A(E2, A_trans, A, Y); + Q.noalias() = A * solve_mat(llt, E2, A_trans, logdetE2); + h = Q.diagonal(); h = h.cwiseSqrt(); @@ -120,7 +119,6 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT res = std::max(r1, r2); res = std::max(res, r3); - logdetE2 = llt.matrixL().toDenseMatrix().diagonal().array().log().sum(); objval = logdetE2; //logdet of E2 is already divided by 2 if (i % 10 == 0) { @@ -128,15 +126,13 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT NT rel, Rel; // computing eigenvalues of E2 - Spectra::DenseSymMatProd op(E2); - // The value of ncv is chosen empirically - Spectra::SymEigsSolver> eigs(&op, 2, std::min(std::max(10, n/5), n)); - eigs.init(); - int nconv = eigs.compute(); - if (eigs.info() == Spectra::COMPUTATION_INFO::SUCCESSFUL) { - Rel = 1.0 / eigs.eigenvalues().coeff(1); - rel = 1.0 / eigs.eigenvalues().coeff(0); + auto op = get_mat_prod_op(E2); + auto eigs = get_eigs_solver(op, n); + eigs->init(); + int nconv = eigs->compute(); + if (eigs->info() == Spectra::COMPUTATION_INFO::SUCCESSFUL) { + Rel = 1.0 / eigs->eigenvalues().coeff(1); + rel = 1.0 / eigs->eigenvalues().coeff(0); } else { Eigen::SelfAdjointEigenSolver eigensolver(E2); // E2 is positive definite matrix if (eigensolver.info() == Eigen::ComputationInfo::Success) { @@ -176,7 +172,7 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT YQ.noalias() = Y * Q; G = YQ.cwiseProduct(YQ.transpose()); y2h = 2.0 * yh; - YA.noalias() = Y * A; + update_Diag_A(YA, Y, A); // YA = Y * A; vec_iter1 = y2h.data(); vec_iter2 = z.data(); @@ -190,10 +186,10 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT G.diagonal() += y2h_z; h_z = h + z; - Eigen::PartialPivLU luG(G); - T.noalias() = luG.solve(h_z.asDiagonal()*YA); + Eigen::PartialPivLU luG(G); + T.noalias() = luG.solve(MT_dense(h_z.asDiagonal()*YA)); - ATP.noalias() = MT(y2h.asDiagonal()*T - YA).transpose(); + ATP.noalias() = MT_dense(y2h.asDiagonal()*T - YA).transpose(); vec_iter1 = R3.data(); vec_iter2 = y.data(); @@ -256,7 +252,7 @@ std::pair, bool> max_inscribed_ellipsoid(Custom_MT A, VT b, VT x += x0; } - return std::pair, bool>(std::pair(E2, x), converged); + return std::make_tuple(E2, x, converged); } diff --git a/include/preprocess/max_inscribed_ellipsoid_rounding.hpp b/include/preprocess/max_inscribed_ellipsoid_rounding.hpp deleted file mode 100644 index da00a8867..000000000 --- a/include/preprocess/max_inscribed_ellipsoid_rounding.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2020 Vissarion Fisikopoulos -// Copyright (c) 2018-2020 Apostolos Chalkis - -//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. - -// Licensed under GNU LGPL.3, see LICENCE file - - -#ifndef MAX_ELLIPSOID_ROUNDING_HPP -#define MAX_ELLIPSOID_ROUNDING_HPP - -#include "max_inscribed_ellipsoid.hpp" - -template -< - typename MT, - typename VT, - typename NT, - typename Polytope, - typename Point -> -std::tuple max_inscribed_ellipsoid_rounding(Polytope &P, - Point const& InnerPoint, - unsigned int const max_iterations = 5, - NT const max_eig_ratio = NT(6)) -{ - std::pair, bool> iter_res; - iter_res.second = false; - - VT x0 = InnerPoint.getCoefficients(); - MT E, L; - unsigned int maxiter = 500, iter = 1, d = P.dimension(); - - NT R = 100.0, r = 1.0, tol = std::pow(10, -6.0), reg = std::pow(10, -4.0), round_val = 1.0; - - MT T = MT::Identity(d, d); - VT shift = VT::Zero(d); - - while (true) - { - // compute the largest inscribed ellipsoid in P centered at x0 - iter_res = max_inscribed_ellipsoid(P.get_mat(), P.get_vec(), x0, maxiter, tol, reg); - E = iter_res.first.first; - E = (E + E.transpose()) / 2.0; - E = E + MT::Identity(d, d)*std::pow(10, -8.0); //normalize E - - Eigen::LLT lltOfA(E.llt().solve(MT::Identity(E.cols(), E.cols()))); // compute the Cholesky decomposition of E^{-1} - L = lltOfA.matrixL(); - - // computing eigenvalues of E - Spectra::DenseSymMatProd op(E); - // The value of ncv is chosen empirically - Spectra::SymEigsSolver> eigs(&op, 2, std::min(std::max(10, int(d)/5), int(d))); - eigs.init(); - int nconv = eigs.compute(); - if (eigs.info() == Spectra::COMPUTATION_INFO::SUCCESSFUL) { - R = 1.0 / eigs.eigenvalues().coeff(1); - r = 1.0 / eigs.eigenvalues().coeff(0); - } else { - Eigen::SelfAdjointEigenSolver eigensolver(E); - if (eigensolver.info() == Eigen::ComputationInfo::Success) { - R = 1.0 / eigensolver.eigenvalues().coeff(0); - r = 1.0 / eigensolver.eigenvalues().template tail<1>().value(); - } else { - std::runtime_error("Computations failed."); - } - } - // shift polytope and apply the linear transformation on P - P.shift(iter_res.first.second); - shift += T * iter_res.first.second; - T = T * L; - round_val *= L.transpose().determinant(); - P.linear_transformIt(L); - - reg = std::max(reg / 10.0, std::pow(10, -10.0)); - P.normalize(); - x0 = VT::Zero(d); - - // check the roundness of the polytope - if(((std::abs(R / r) <= max_eig_ratio && iter_res.second) || iter >= max_iterations)){ - break; - } - - iter++; - } - - std::tuple result = std::make_tuple(T, shift, std::abs(round_val)); - return result; -} - -#endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e17848fc6..cdda6087c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -289,13 +289,17 @@ add_executable (volume_cb_vpoly_intersection_vpoly volume_cb_vpoly_intersection_ add_test(NAME volume_cb_vpoly_intersection_vpoly_random_vpoly_sphere COMMAND volume_cb_vpoly_intersection_vpoly -tc=random_vpoly_sphere) -add_executable (new_rounding_test new_rounding_test.cpp $) +add_executable (rounding_test rounding_test.cpp $) add_test(NAME test_round_min_ellipsoid - COMMAND new_rounding_test -tc=round_min_ellipsoid) + COMMAND rounding_test -tc=round_min_ellipsoid) add_test(NAME test_round_max_ellipsoid - COMMAND new_rounding_test -tc=round_max_ellipsoid) + COMMAND rounding_test -tc=round_max_ellipsoid) add_test(NAME test_round_svd - COMMAND new_rounding_test -tc=round_svd) + COMMAND rounding_test -tc=round_svd) +add_test(NAME test_round_log_barrier_test + COMMAND rounding_test -tc=round_log_barrier_test) +add_test(NAME round_max_ellipsoid_sparse + COMMAND rounding_test -tc=round_max_ellipsoid_sparse) @@ -357,6 +361,10 @@ add_test(NAME test_feasibility_point COMMAND test_internal_points -tc=test_feasibility_point) add_test(NAME test_analytic_center COMMAND test_internal_points -tc=test_analytic_center) +add_test(NAME test_max_ball_sparse + COMMAND test_internal_points -tc=test_max_ball_sparse) + + set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") @@ -380,7 +388,7 @@ TARGET_LINK_LIBRARIES(volume_cb_vpolytope lp_solve coverage_config) TARGET_LINK_LIBRARIES(volume_cb_zonotopes lp_solve coverage_config) TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly lp_solve coverage_config) TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(new_rounding_test lp_solve ${MKL_LINK} coverage_config) +TARGET_LINK_LIBRARIES(rounding_test lp_solve ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(mcmc_diagnostics_test lp_solve ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(sampling_test lp_solve ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(mmcs_test lp_solve ${MKL_LINK} coverage_config) diff --git a/test/max_ellipsoid_rounding_test.cpp b/test/max_ellipsoid_rounding_test.cpp index a9c25b8c1..edce7a7d2 100644 --- a/test/max_ellipsoid_rounding_test.cpp +++ b/test/max_ellipsoid_rounding_test.cpp @@ -22,7 +22,7 @@ #include "volume/volume_cooling_gaussians.hpp" #include "volume/volume_cooling_balls.hpp" -#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" +#include "preprocess/inscribed_ellipsoid_rounding.hpp" #include "generators/known_polytope_generators.h" @@ -64,7 +64,7 @@ void rounding_test(Polytope &HP, RNGType rng(d); std::pair InnerBall = HP.ComputeInnerBall(); - std::tuple res = max_inscribed_ellipsoid_rounding(HP, InnerBall.first); + std::tuple res = inscribed_ellipsoid_rounding(HP, InnerBall.first); // Setup the parameters int walk_len = 10; diff --git a/test/new_rounding_test.cpp b/test/rounding_test.cpp similarity index 61% rename from test/new_rounding_test.cpp rename to test/rounding_test.cpp index ab17ed939..7e15c99a5 100644 --- a/test/new_rounding_test.cpp +++ b/test/rounding_test.cpp @@ -22,7 +22,7 @@ #include "volume/volume_cooling_balls.hpp" #include "preprocess/min_sampling_covering_ellipsoid_rounding.hpp" -#include "preprocess/max_inscribed_ellipsoid_rounding.hpp" +#include "preprocess/inscribed_ellipsoid_rounding.hpp" #include "preprocess/svd_rounding.hpp" #include "generators/known_polytope_generators.h" @@ -110,8 +110,83 @@ void rounding_max_ellipsoid_test(Polytope &HP, typedef BoostRandomNumberGenerator RNGType; RNGType rng(d); std::pair InnerBall = HP.ComputeInnerBall(); - std::tuple res = max_inscribed_ellipsoid_rounding(HP, InnerBall.first); + std::tuple res = inscribed_ellipsoid_rounding(HP, InnerBall.first); + // Setup the parameters + int walk_len = 1; + NT e = 0.1; + + // Estimate the volume + std::cout << "Number type: " << typeid(NT).name() << std::endl; + + NT volume = std::get<2>(res) * volume_cooling_balls(HP, e, walk_len).second; + test_values(volume, expectedBilliard, exact); +} + +template +void rounding_max_ellipsoid_sparse_test(double const& expectedBilliard, + double const& expected) +{ + typedef typename Polytope::PointType Point; + typedef typename Point::FT NT; + typedef typename Polytope::MT MT; + typedef typename Polytope::VT VT; + typedef typename Poset::RT RT; + typedef typename Poset::RV RV; + typedef Eigen::SparseMatrix SpMT; + + // Create Poset, 4 elements, a0 <= a1, a0 <= a2, a1 <= a3 + RV poset_data{{0, 1}, {0, 2}, {1, 3}}; + Poset poset(4, poset_data); + + // Initialize order polytope from the poset + OrderPolytope OP(poset); + OP.normalize(); + SpMT Asp = OP.get_mat(); + + + NT tol = 1e-08; + unsigned int maxiter = 500; + auto [center, radius, converged] = max_inscribed_ball(Asp, OP.get_vec(), maxiter, tol); + CHECK(OP.is_in(Point(center)) == -1); + auto [E, x0, round_val] = inscribed_ellipsoid_rounding(OP, Point(center)); + + MT A = MT(OP.get_mat()); + VT b = OP.get_vec(); + int d = OP.dimension(); + + Polytope HP(d, A, b); + + typedef BoostRandomNumberGenerator RNGType; + // Setup the parameters + int walk_len = 1; + NT e = 0.1; + + // Estimate the volume + std::cout << "Number type: " << typeid(NT).name() << std::endl; + + NT volume = round_val * volume_cooling_balls(HP, e, walk_len).second; + test_values(volume, expectedBilliard, expected); +} + +template +void rounding_log_barrier_test(Polytope &HP, + double const& expectedBall, + double const& expectedCDHR, + double const& expectedRDHR, + double const& expectedBilliard, + double const& exact) +{ + typedef typename Polytope::PointType Point; + typedef typename Point::FT NT; + typedef typename Polytope::MT MT; + typedef typename Polytope::VT VT; + + int d = HP.dimension(); + typedef BoostRandomNumberGenerator RNGType; + RNGType rng(d); + std::pair InnerBall = HP.ComputeInnerBall(); + std::tuple res = inscribed_ellipsoid_rounding(HP, InnerBall.first); // Setup the parameters int walk_len = 1; NT e = 0.1; @@ -164,11 +239,11 @@ void call_test_min_ellipsoid() { typedef HPolytope Hpolytope; Hpolytope P; - std::cout << "\n--- Testing rounding of H-skinny_cube5" << std::endl; + std::cout << "\n--- Testing min ellipsoid rounding of H-skinny_cube5" << std::endl; P = generate_skinny_cube(5); rounding_min_ellipsoid_test(P, 0, 3070.64, 3188.25, 3140.6, 3200.0); - std::cout << "\n--- Testing rounding of H-skinny_cube10" << std::endl; + std::cout << "\n--- Testing min ellipsoid rounding of H-skinny_cube10" << std::endl; P = generate_skinny_cube(10); rounding_min_ellipsoid_test(P, 0, 122550, 108426, 105003.0, 102400.0); @@ -182,11 +257,33 @@ void call_test_max_ellipsoid() { typedef HPolytope Hpolytope; Hpolytope P; - std::cout << "\n--- Testing rounding of H-skinny_cube5" << std::endl; + std::cout << "\n--- Testing max ellipsoid rounding of H-skinny_cube5" << std::endl; P = generate_skinny_cube(5); rounding_max_ellipsoid_test(P, 0, 3070.64, 3188.25, 3262.61, 3200.0); } +template +void call_test_max_ellipsoid_sparse() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + + std::cout << "\n--- Testing max ellipsoid rounding of sparse Order Polytope" << std::endl; + rounding_max_ellipsoid_sparse_test(0.13979, 3070.64); +} + +template +void call_test_log_barrier() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + Hpolytope P; + + std::cout << "\n--- Testing log-barrier rounding of H-skinny_cube5" << std::endl; + P = generate_skinny_cube(5); + rounding_log_barrier_test(P, 0, 3070.64, 3188.25, 3262.77, 3200.0); +} + template void call_test_svd() { @@ -195,7 +292,7 @@ void call_test_svd() { typedef HPolytope Hpolytope; Hpolytope P; - std::cout << "\n--- Testing rounding of H-skinny_cube5" << std::endl; + std::cout << "\n--- Testing SVD rounding of H-skinny_cube5" << std::endl; P = generate_skinny_cube(5); rounding_svd_test(P, 0, 3070.64, 3188.25, 3140.6, 3200.0); } @@ -209,6 +306,14 @@ TEST_CASE("round_max_ellipsoid") { call_test_max_ellipsoid(); } +TEST_CASE("round_max_ellipsoid_sparse") { + call_test_max_ellipsoid_sparse(); +} + +TEST_CASE("round_log_barrier_test") { + call_test_log_barrier(); +} + TEST_CASE("round_svd") { call_test_svd(); } diff --git a/test/test_internal_points.cpp b/test/test_internal_points.cpp index fa44e9baf..8d4df0240 100644 --- a/test/test_internal_points.cpp +++ b/test/test_internal_points.cpp @@ -22,6 +22,9 @@ #include "generators/known_polytope_generators.h" #include "generators/h_polytopes_generator.h" +#include "convex_bodies/orderpolytope.h" +#include "misc/poset.h" + template void call_test_max_ball() { typedef Cartesian Kernel; @@ -40,12 +43,52 @@ void call_test_max_ball() { NT tol = 1e-08; unsigned int maxiter = 500; auto [center, radius, converged] = max_inscribed_ball(P.get_mat(), P.get_vec(), maxiter, tol); - CHECK(P.is_in(Point(center)) == -1); CHECK(std::abs(radius - InnerBall.second) <= 1e-03); CHECK(converged); } +template +void call_test_max_ball_sparse() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + typedef boost::mt19937 PolyRNGType; + typedef typename OrderPolytope::VT VT; + typedef typename OrderPolytope::MT MT; + typedef typename Poset::RT RT; + typedef typename Poset::RV RV; + typedef Eigen::SparseMatrix SpMT; + + // Create Poset, 4 elements, a0 <= a1, a0 <= a2, a1 <= a3 + RV poset_data{{0, 1}, {0, 2}, {1, 3}}; + Poset poset(4, poset_data); + + // Initialize order polytope from the poset + OrderPolytope OP(poset); + OP.normalize(); + SpMT Asp = OP.get_mat(); + MT A = MT(OP.get_mat()); + VT b = OP.get_vec(); + + std::cout << "\n--- Testing Chebychev ball for sparse order Polytope" << std::endl; + + NT tol = 1e-08; + unsigned int maxiter = 500; + auto [center, radius, converged] = max_inscribed_ball(Asp, b, maxiter, tol); + auto [center2, radius2, converged2] = max_inscribed_ball(A, b, maxiter, tol); + + VT center_(4); + center_ << 0.207107, 0.5, 0.593398, 0.792893; + + CHECK(OP.is_in(Point(center)) == -1); + auto [E, x0, round_val] = inscribed_ellipsoid_rounding(OP, Point(center)); + + CHECK((center - center_).norm() <= 1e-06); + CHECK(std::abs(radius - 0.207107) <= 1e-06); + CHECK(converged); +} + template void call_test_max_ball_feasibility() { typedef Cartesian Kernel; @@ -77,6 +120,7 @@ void call_test_analytic_center() { typedef typename Hpolytope::MT MT; typedef typename Hpolytope::VT VT; typedef boost::mt19937 PolyRNGType; + typedef Eigen::SparseMatrix SpMT; Hpolytope P; std::cout << "\n--- Testing analytic center for skinny H-polytope" << std::endl; @@ -85,13 +129,24 @@ void call_test_analytic_center() { P = skinny_random_hpoly(3, 15, pre_rounding, max_min_eig_ratio, 127); P.normalize(); - auto [analytic_center, converged] = analytic_center_linear_ineq(P.get_mat(), P.get_vec()); + auto [Hessian, analytic_center, converged] = analytic_center_linear_ineq(P.get_mat(), P.get_vec()); + SpMT Asp = P.get_mat().sparseView(); + auto [Hessian_sp, analytic_center2, converged2] = analytic_center_linear_ineq(Asp, P.get_vec()); + CHECK(P.is_in(Point(analytic_center)) == -1); CHECK(converged); CHECK(std::abs(analytic_center(0) + 4.75912) < 1e-04); CHECK(std::abs(analytic_center(1) + 4.28762) < 1e-04); CHECK(std::abs(analytic_center(2) - 7.54156) < 1e-04); + + CHECK(P.is_in(Point(analytic_center2)) == -1); + CHECK(converged2); + CHECK(std::abs(analytic_center(0) - analytic_center2(0)) < 1e-12); + CHECK(std::abs(analytic_center(1) - analytic_center2(1)) < 1e-12); + CHECK(std::abs(analytic_center(2) - analytic_center2(2)) < 1e-12); + + CHECK((Hessian - Hessian_sp).norm() < 1e-12); } TEST_CASE("test_max_ball") { @@ -105,3 +160,7 @@ TEST_CASE("test_feasibility_point") { TEST_CASE("test_analytic_center") { call_test_analytic_center(); } + +TEST_CASE("test_max_ball_sparse") { + call_test_max_ball_sparse(); +} From f1abc361c34be73ea2d83ce122fd385f26ca4365 Mon Sep 17 00:00:00 2001 From: atrayees <121290945+atrayees@users.noreply.github.com> Date: Fri, 5 Jul 2024 21:21:23 +0530 Subject: [PATCH 29/44] Function/is correlation (#315) * new function is_correlation_matrix * update example function call this example calls the is_correlation_matrix() function that is present in include/matrix_operations/EigenvaluesProblems.h * remove blank line * remove blank line * fix spaces, add function parameter --- examples/correlation_matrices/sampler.cpp | 7 ++++--- .../matrix_operations/EigenvaluesProblems.h | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/examples/correlation_matrices/sampler.cpp b/examples/correlation_matrices/sampler.cpp index f18f90a1b..0655767ea 100644 --- a/examples/correlation_matrices/sampler.cpp +++ b/examples/correlation_matrices/sampler.cpp @@ -150,10 +150,11 @@ void correlation_matrix_uniform_sampling_MT(const unsigned int n, const unsigned std::cout << "Elapsed time : " << time << " (ms)" << std::endl; int valid_points = 0; + EigenvaluesProblems> solver; for(const auto& points : randPoints){ - if(is_correlation_matrix(points.mat)){ - valid_points++; - } + if(solver.is_correlation_matrix(points.mat)){ + valid_points++; + } } std::cout << "Number of valid points = " << valid_points << std::endl; diff --git a/include/matrix_operations/EigenvaluesProblems.h b/include/matrix_operations/EigenvaluesProblems.h index 178d91666..7bad48cbc 100644 --- a/include/matrix_operations/EigenvaluesProblems.h +++ b/include/matrix_operations/EigenvaluesProblems.h @@ -439,6 +439,24 @@ class EigenvaluesProblems, E return false; } + /// Check if a matrix is indeed a correlation matrix + /// return true if input matrix is found to be a correlation matrix + /// |param[in] matrix + bool is_correlation_matrix(const MT& matrix, const double tol = 1e-8){ + + //check if all the diagonal elements are ones + for (int i=0 ; i tol){ + return false; + } + } + + //check if the matrix is positive definite + if (isPositiveSemidefinite(matrix)) return true; + + return false; + } + /// Minimum positive eigenvalue of the generalized eigenvalue problem A - lB /// Use Eigen::GeneralizedSelfAdjointEigenSolver ges(B,A) (faster) /// \param[in] A: symmetric positive definite matrix From e6dd7fd148099eb8f9c0c485753675d236c0e29a Mon Sep 17 00:00:00 2001 From: Apostolos Chalkis Date: Mon, 8 Jul 2024 04:15:55 -0600 Subject: [PATCH 30/44] Implement rounding method using the volumetric barrier (#313) * generalize rounding loop * support sparse cholesky operator * complete sparse support in max_inscribed_ball * complete sparse support in preprocesing * add sparse tests * change main rounding function name * improve explaining comments * resolve PR comments * changing the dates in copyrights * use if constexpr instead of SNIFAE * update the examples to cpp17 * update to cpp17 order polytope example * fix templating in mat_computational_operators * fix templating errors and change header file to mat_computational_operators * first implementation of the volumetric barrier ellipsoid * add criterion for step_iter * restructure code that computes barriers' centers * remove unused comments * resolve PR comments * remove NT typename from max_step() --------- Co-authored-by: Apostolos Chalkis --- .../preprocess/analytic_center_linear_ineq.h | 134 ------------------ .../preprocess/barrier_center_ellipsoid.hpp | 115 +++++++++++++++ .../inscribed_ellipsoid_rounding.hpp | 12 +- include/preprocess/max_inscribed_ball.hpp | 2 +- .../preprocess/max_inscribed_ellipsoid.hpp | 2 +- ...perators.h => rounding_util_functions.hpp} | 98 ++++++++++++- test/CMakeLists.txt | 6 +- test/rounding_test.cpp | 46 ++++++ test/test_internal_points.cpp | 47 +++++- 9 files changed, 307 insertions(+), 155 deletions(-) delete mode 100644 include/preprocess/analytic_center_linear_ineq.h create mode 100644 include/preprocess/barrier_center_ellipsoid.hpp rename include/preprocess/{mat_computational_operators.h => rounding_util_functions.hpp} (76%) diff --git a/include/preprocess/analytic_center_linear_ineq.h b/include/preprocess/analytic_center_linear_ineq.h deleted file mode 100644 index 80d731f6c..000000000 --- a/include/preprocess/analytic_center_linear_ineq.h +++ /dev/null @@ -1,134 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2024 Vissarion Fisikopoulos -// Copyright (c) 2024 Apostolos Chalkis -// Copyright (c) 2024 Elias Tsigaridas - -// Licensed under GNU LGPL.3, see LICENCE file - - -#ifndef ANALYTIC_CENTER_H -#define ANALYTIC_CENTER_H - -#include - -#include "preprocess/max_inscribed_ball.hpp" -#include "preprocess/feasible_point.hpp" -#include "preprocess/mat_computational_operators.h" - -template -NT get_max_step(VT const& Ad, VT const& b_Ax) -{ - const int m = Ad.size(); - NT max_element = std::numeric_limits::lowest(), max_element_temp; - for (int i = 0; i < m; i++) { - max_element_temp = Ad.coeff(i) / b_Ax.coeff(i); - if (max_element_temp > max_element) { - max_element = max_element_temp; - } - } - - return NT(1) / max_element; -} - -template -void get_hessian_grad_logbarrier(MT const& A, MT const& A_trans, VT const& b, - VT const& x, VT const& Ax, MT &H, VT &grad, VT &b_Ax) -{ - b_Ax.noalias() = b - Ax; - VT s = b_Ax.cwiseInverse(); - VT s_sq = s.cwiseProduct(s); - // Gradient of the log-barrier function - grad.noalias() = A_trans * s; - // Hessian of the log-barrier function - update_Atrans_Diag_A(H, A_trans, A, s_sq.asDiagonal()); -} - -/* - This implementation computes the analytic center of a polytope given - as a set of linear inequalities P = {x | Ax <= b}. The analytic center - is the minimizer of the log barrier function i.e., the optimal solution - of the following optimization problem (Convex Optimization, Boyd and Vandenberghe, Section 8.5.3), - - \min -\sum \log(b_i - a_i^Tx), where a_i is the i-th row of A. - - The function solves the problem by using the Newton method. - - Input: (i) Matrix A, vector b such that the polytope P = {x | Ax<=b} - (ii) The number of maximum iterations, max_iters - (iii) Tolerance parameter grad_err_tol to bound the L2-norm of the gradient - (iv) Tolerance parameter rel_pos_err_tol to check the relative progress in each iteration - - Output: (i) The Hessian computed on the analytic center - (ii) The analytic center of the polytope - (iii) A boolean variable that declares convergence - - Note: Using MT as to deal with both dense and sparse matrices, MT_dense will be the type of result matrix -*/ -template -std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, VT const& x0, - unsigned int const max_iters = 500, - NT const grad_err_tol = 1e-08, - NT const rel_pos_err_tol = 1e-12) -{ - // Initialization - VT x = x0; - VT Ax = A * x; - const int n = A.cols(), m = A.rows(); - MT H(n, n), A_trans = A.transpose(); - VT grad(n), d(n), Ad(m), b_Ax(m), step_d(n), x_prev; - NT grad_err, rel_pos_err, rel_pos_err_temp, step; - unsigned int iter = 0; - bool converged = false; - const NT tol_bnd = NT(0.01); - - auto llt = initialize_chol(A_trans, A); - get_hessian_grad_logbarrier(A, A_trans, b, x, Ax, H, grad, b_Ax); - - do { - iter++; - // Compute the direction - d.noalias() = - solve_vec(llt, H, grad); - Ad.noalias() = A * d; - // Compute the step length - step = std::min((NT(1) - tol_bnd) * get_max_step(Ad, b_Ax), NT(1)); - step_d.noalias() = step*d; - x_prev = x; - x += step_d; - Ax.noalias() += step*Ad; - - // Compute the max_i\{ |step*d_i| ./ |x_i| \} - rel_pos_err = std::numeric_limits::lowest(); - for (int i = 0; i < n; i++) - { - rel_pos_err_temp = std::abs(step_d.coeff(i) / x_prev.coeff(i)); - if (rel_pos_err_temp > rel_pos_err) - { - rel_pos_err = rel_pos_err_temp; - } - } - - get_hessian_grad_logbarrier(A, A_trans, b, x, Ax, H, grad, b_Ax); - grad_err = grad.norm(); - - if (iter >= max_iters || grad_err <= grad_err_tol || rel_pos_err <= rel_pos_err_tol) - { - converged = true; - break; - } - } while (true); - - return std::make_tuple(MT_dense(H), x, converged); -} - -template -std::tuple analytic_center_linear_ineq(MT const& A, VT const& b, - unsigned int const max_iters = 500, - NT const grad_err_tol = 1e-08, - NT const rel_pos_err_tol = 1e-12) -{ - VT x0 = compute_feasible_point(A, b); - return analytic_center_linear_ineq(A, b, x0, max_iters, grad_err_tol, rel_pos_err_tol); -} - -#endif diff --git a/include/preprocess/barrier_center_ellipsoid.hpp b/include/preprocess/barrier_center_ellipsoid.hpp new file mode 100644 index 000000000..0ab8c0457 --- /dev/null +++ b/include/preprocess/barrier_center_ellipsoid.hpp @@ -0,0 +1,115 @@ +// VolEsti (volume computation and sampling library) + +// Copyright (c) 2024 Vissarion Fisikopoulos +// Copyright (c) 2024 Apostolos Chalkis +// Copyright (c) 2024 Elias Tsigaridas + +// Licensed under GNU LGPL.3, see LICENCE file + + +#ifndef BARRIER_CENTER_ELLIPSOID_HPP +#define BARRIER_CENTER_ELLIPSOID_HPP + +#include + +#include "preprocess/max_inscribed_ball.hpp" +#include "preprocess/feasible_point.hpp" +#include "preprocess/rounding_util_functions.hpp" + +/* + This implementation computes the analytic or the volumetric center of a polytope given + as a set of linear inequalities P = {x | Ax <= b}. The analytic center is the tminimizer + of the log barrier function, i.e., the optimal solution + of the following optimization problem (Convex Optimization, Boyd and Vandenberghe, Section 8.5.3), + + \min -\sum \log(b_i - a_i^Tx), where a_i is the i-th row of A. + + The volumetric center is the minimizer of the volumetric barrier function, i.e., the optimal + solution of the following optimization problem, + + \min logdet \nabla^2 f(x), where f(x) the log barrier function + + The function solves the problems by using the Newton method. + + Input: (i) Matrix A, vector b such that the polytope P = {x | Ax<=b} + (ii) The number of maximum iterations, max_iters + (iii) Tolerance parameter grad_err_tol to bound the L2-norm of the gradient + (iv) Tolerance parameter rel_pos_err_tol to check the relative progress in each iteration + + Output: (i) The Hessian of the barrier function + (ii) The analytic/volumetric center of the polytope + (iii) A boolean variable that declares convergence + + Note: Using MT as to deal with both dense and sparse matrices, MT_dense will be the type of result matrix +*/ +template +std::tuple barrier_center_ellipsoid_linear_ineq(MT const& A, VT const& b, VT const& x0, + unsigned int const max_iters = 500, + NT const grad_err_tol = 1e-08, + NT const rel_pos_err_tol = 1e-12) +{ + // Initialization + VT x = x0; + VT Ax = A * x; + const int n = A.cols(), m = A.rows(); + MT H(n, n), A_trans = A.transpose(); + VT grad(n), d(n), Ad(m), b_Ax(m), step_d(n), x_prev; + NT grad_err, rel_pos_err, rel_pos_err_temp, step, obj_val, obj_val_prev; + unsigned int iter = 0; + bool converged = false; + const NT tol_bnd = NT(0.01), tol_obj = NT(1e-06); + + auto [step_iter, max_step_multiplier] = init_step(); + auto llt = initialize_chol(A_trans, A); + get_barrier_hessian_grad(A, A_trans, b, x, Ax, llt, + H, grad, b_Ax, obj_val); + do { + iter++; + // Compute the direction + d.noalias() = - solve_vec(llt, H, grad); + Ad.noalias() = A * d; + // Compute the step length + step = std::min(max_step_multiplier * get_max_step(Ad, b_Ax), step_iter); + step_d.noalias() = step*d; + x_prev = x; + x += step_d; + Ax.noalias() += step*Ad; + + // Compute the max_i\{ |step*d_i| ./ |x_i| \} + rel_pos_err = std::numeric_limits::lowest(); + for (int i = 0; i < n; i++) + { + rel_pos_err_temp = std::abs(step_d.coeff(i) / x_prev.coeff(i)); + if (rel_pos_err_temp > rel_pos_err) + { + rel_pos_err = rel_pos_err_temp; + } + } + + obj_val_prev = obj_val; + get_barrier_hessian_grad(A, A_trans, b, x, Ax, llt, + H, grad, b_Ax, obj_val); + grad_err = grad.norm(); + + if (iter >= max_iters || grad_err <= grad_err_tol || rel_pos_err <= rel_pos_err_tol) + { + converged = true; + break; + } + get_step_next_iteration(obj_val_prev, obj_val, tol_obj, step_iter); + } while (true); + + return std::make_tuple(MT_dense(H), x, converged); +} + +template +std::tuple barrier_center_ellipsoid_linear_ineq(MT const& A, VT const& b, + unsigned int const max_iters = 500, + NT const grad_err_tol = 1e-08, + NT const rel_pos_err_tol = 1e-12) +{ + VT x0 = compute_feasible_point(A, b); + return barrier_center_ellipsoid_linear_ineq(A, b, x0, max_iters, grad_err_tol, rel_pos_err_tol); +} + +#endif // BARRIER_CENTER_ELLIPSOID_HPP diff --git a/include/preprocess/inscribed_ellipsoid_rounding.hpp b/include/preprocess/inscribed_ellipsoid_rounding.hpp index dd20d533d..37468b9d9 100644 --- a/include/preprocess/inscribed_ellipsoid_rounding.hpp +++ b/include/preprocess/inscribed_ellipsoid_rounding.hpp @@ -12,14 +12,9 @@ #define INSCRIBED_ELLIPSOID_ROUNDING_HPP #include "preprocess/max_inscribed_ellipsoid.hpp" -#include "preprocess/analytic_center_linear_ineq.h" +#include "preprocess/barrier_center_ellipsoid.hpp" #include "preprocess/feasible_point.hpp" -enum EllipsoidType -{ - MAX_ELLIPSOID = 1, - LOG_BARRIER = 2 -}; template inline static std::tuple @@ -30,9 +25,10 @@ compute_inscribed_ellipsoid(Custom_MT A, VT b, VT const& x0, if constexpr (ellipsoid_type == EllipsoidType::MAX_ELLIPSOID) { return max_inscribed_ellipsoid(A, b, x0, maxiter, tol, reg); - } else if constexpr (ellipsoid_type == EllipsoidType::LOG_BARRIER) + } else if constexpr (ellipsoid_type == EllipsoidType::LOG_BARRIER || + ellipsoid_type == EllipsoidType::VOLUMETRIC_BARRIER) { - return analytic_center_linear_ineq(A, b, x0); + return barrier_center_ellipsoid_linear_ineq(A, b, x0); } else { std::runtime_error("Unknown rounding method."); diff --git a/include/preprocess/max_inscribed_ball.hpp b/include/preprocess/max_inscribed_ball.hpp index 573813dd7..5f95970ba 100644 --- a/include/preprocess/max_inscribed_ball.hpp +++ b/include/preprocess/max_inscribed_ball.hpp @@ -11,7 +11,7 @@ #ifndef MAX_INSCRIBED_BALL_HPP #define MAX_INSCRIBED_BALL_HPP -#include "preprocess/mat_computational_operators.h" +#include "preprocess/rounding_util_functions.hpp" /* This implmentation computes the largest inscribed ball in a given convex polytope P. diff --git a/include/preprocess/max_inscribed_ellipsoid.hpp b/include/preprocess/max_inscribed_ellipsoid.hpp index f44f60ff0..cc65006b9 100644 --- a/include/preprocess/max_inscribed_ellipsoid.hpp +++ b/include/preprocess/max_inscribed_ellipsoid.hpp @@ -15,7 +15,7 @@ #include #include -#include "preprocess/mat_computational_operators.h" +#include "preprocess/rounding_util_functions.hpp" /* diff --git a/include/preprocess/mat_computational_operators.h b/include/preprocess/rounding_util_functions.hpp similarity index 76% rename from include/preprocess/mat_computational_operators.h rename to include/preprocess/rounding_util_functions.hpp index af200d221..6b94ace8b 100644 --- a/include/preprocess/mat_computational_operators.h +++ b/include/preprocess/rounding_util_functions.hpp @@ -1,14 +1,15 @@ // VolEsti (volume computation and sampling library) -// Copyright (c) 2024 Vissarion Fisikopoulos -// Copyright (c) 2024 Apostolos Chalkis -// Copyright (c) 2024 Elias Tsigaridas +// Copyright (c) 2012-2024 Vissarion Fisikopoulos +// Copyright (c) 2018-2024 Apostolos Chalkis + +//Contributed and/or modified by Alexandros Manochis, as part of Google Summer of Code 2020 program. // Licensed under GNU LGPL.3, see LICENCE file -#ifndef MAT_COMPUTATIONAL_OPERATORS_H -#define MAT_COMPUTATIONAL_OPERATORS_H +#ifndef ROUNDING_UTIL_FUNCTIONS_HPP +#define ROUNDING_UTIL_FUNCTIONS_HPP #include @@ -17,9 +18,35 @@ #include "Spectra/include/Spectra/MatOp/SparseSymMatProd.h" +enum EllipsoidType +{ + MAX_ELLIPSOID = 1, + LOG_BARRIER = 2, + VOLUMETRIC_BARRIER = 3 +}; + +template +struct AssertBarrierFalseType : std::false_type {}; + template struct AssertFalseType : std::false_type {}; +template +auto get_max_step(VT const& Ad, VT const& b_Ax) +{ + using NT = typename VT::Scalar; + const int m = Ad.size(); + NT max_element = std::numeric_limits::lowest(), max_element_temp; + for (int i = 0; i < m; i++) { + max_element_temp = Ad.coeff(i) / b_Ax.coeff(i); + if (max_element_temp > max_element) { + max_element = max_element_temp; + } + } + + return NT(1) / max_element; +} + template inline static auto initialize_chol(MT const& mat) @@ -312,5 +339,64 @@ update_Bmat(MT &B, VT const& AtDe, VT const& d, } } +template +std::tuple init_step() +{ + if constexpr (BarrierType == EllipsoidType::LOG_BARRIER) + { + return {NT(1), NT(0.99)}; + } else if constexpr (BarrierType == EllipsoidType::VOLUMETRIC_BARRIER) + { + return {NT(0.5), NT(0.4)}; + } else { + static_assert(AssertBarrierFalseType::value, + "Barrier type is not supported."); + } +} + +template +void get_barrier_hessian_grad(MT const& A, MT const& A_trans, VT const& b, + VT const& x, VT const& Ax, llt_type const& llt, + MT &H, VT &grad, VT &b_Ax, NT &obj_val) +{ + b_Ax.noalias() = b - Ax; + VT s = b_Ax.cwiseInverse(); + VT s_sq = s.cwiseProduct(s); + // Hessian of the log-barrier function + update_Atrans_Diag_A(H, A_trans, A, s_sq.asDiagonal()); + if constexpr (BarrierType == EllipsoidType::LOG_BARRIER) + { + grad.noalias() = A_trans * s; + } else if constexpr (BarrierType == EllipsoidType::VOLUMETRIC_BARRIER) + { + // Computing sigma(x)_i = (a_i^T H^{-1} a_i) / (b_i - a_i^Tx)^2 + MT_dense HA = solve_mat(llt, H, A_trans, obj_val); + MT_dense aiHai = HA.transpose().cwiseProduct(A); + VT sigma = (aiHai.rowwise().sum()).cwiseProduct(s_sq); + // Gradient of the volumetric barrier function + grad.noalias() = A_trans * (s.cwiseProduct(sigma)); + // Hessian of the volumetric barrier function + update_Atrans_Diag_A(H, A_trans, A, s_sq.cwiseProduct(sigma).asDiagonal()); + } else { + static_assert(AssertBarrierFalseType::value, + "Barrier type is not supported."); + } +} + +template +void get_step_next_iteration(NT const obj_val_prev, NT const obj_val, + NT const tol_obj, NT &step_iter) +{ + if constexpr (BarrierType == EllipsoidType::LOG_BARRIER) + { + step_iter = NT(1); + } else if constexpr (BarrierType == EllipsoidType::VOLUMETRIC_BARRIER) + { + step_iter *= (obj_val_prev <= obj_val - tol_obj) ? NT(0.9) : NT(0.999); + } else { + static_assert(AssertBarrierFalseType::value, + "Barrier type is not supported."); + } +} -#endif // MAT_COMPUTATIONAL_OPERATORS_H +#endif // ROUNDING_UTIL_FUNCTIONS_HPP \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cdda6087c..b524403ce 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -300,6 +300,8 @@ add_test(NAME test_round_log_barrier_test COMMAND rounding_test -tc=round_log_barrier_test) add_test(NAME round_max_ellipsoid_sparse COMMAND rounding_test -tc=round_max_ellipsoid_sparse) +add_test(NAME round_volumetric_barrier_test + COMMAND rounding_test -tc=round_volumetric_barrier_test) @@ -363,7 +365,9 @@ add_test(NAME test_analytic_center COMMAND test_internal_points -tc=test_analytic_center) add_test(NAME test_max_ball_sparse COMMAND test_internal_points -tc=test_max_ball_sparse) - +add_test(NAME test_volumetric_center + COMMAND test_internal_points -tc=test_volumetric_center) + set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") diff --git a/test/rounding_test.cpp b/test/rounding_test.cpp index 7e15c99a5..3817cebb3 100644 --- a/test/rounding_test.cpp +++ b/test/rounding_test.cpp @@ -198,6 +198,36 @@ void rounding_log_barrier_test(Polytope &HP, test_values(volume, expectedBilliard, exact); } +template +void rounding_volumetric_barrier_test(Polytope &HP, + double const& expectedBall, + double const& expectedCDHR, + double const& expectedRDHR, + double const& expectedBilliard, + double const& exact) +{ + typedef typename Polytope::PointType Point; + typedef typename Point::FT NT; + typedef typename Polytope::MT MT; + typedef typename Polytope::VT VT; + + int d = HP.dimension(); + + typedef BoostRandomNumberGenerator RNGType; + RNGType rng(d); + std::pair InnerBall = HP.ComputeInnerBall(); + std::tuple res = inscribed_ellipsoid_rounding(HP, InnerBall.first); + // Setup the parameters + int walk_len = 1; + NT e = 0.1; + + // Estimate the volume + std::cout << "Number type: " << typeid(NT).name() << std::endl; + + NT volume = std::get<2>(res) * volume_cooling_balls(HP, e, walk_len).second; + test_values(volume, expectedBilliard, exact); +} + template void rounding_svd_test(Polytope &HP, @@ -284,6 +314,18 @@ void call_test_log_barrier() { rounding_log_barrier_test(P, 0, 3070.64, 3188.25, 3262.77, 3200.0); } +template +void call_test_volumetric_barrier() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + Hpolytope P; + + std::cout << "\n--- Testing volumetric barrier rounding of H-skinny_cube5" << std::endl; + P = generate_skinny_cube(5); + rounding_volumetric_barrier_test(P, 0, 3070.64, 3188.25, 3262.77, 3200.0); +} + template void call_test_svd() { @@ -314,6 +356,10 @@ TEST_CASE("round_log_barrier_test") { call_test_log_barrier(); } +TEST_CASE("round_volumetric_barrier_test") { + call_test_volumetric_barrier(); +} + TEST_CASE("round_svd") { call_test_svd(); } diff --git a/test/test_internal_points.cpp b/test/test_internal_points.cpp index 8d4df0240..50965128c 100644 --- a/test/test_internal_points.cpp +++ b/test/test_internal_points.cpp @@ -17,7 +17,7 @@ #include "convex_bodies/hpolytope.h" #include "preprocess/max_inscribed_ball.hpp" -#include "preprocess/analytic_center_linear_ineq.h" +#include "preprocess/barrier_center_ellipsoid.hpp" #include "generators/known_polytope_generators.h" #include "generators/h_polytopes_generator.h" @@ -129,10 +129,10 @@ void call_test_analytic_center() { P = skinny_random_hpoly(3, 15, pre_rounding, max_min_eig_ratio, 127); P.normalize(); - auto [Hessian, analytic_center, converged] = analytic_center_linear_ineq(P.get_mat(), P.get_vec()); - SpMT Asp = P.get_mat().sparseView(); + auto [Hessian, analytic_center, converged] = barrier_center_ellipsoid_linear_ineq(P.get_mat(), P.get_vec()); - auto [Hessian_sp, analytic_center2, converged2] = analytic_center_linear_ineq(Asp, P.get_vec()); + SpMT Asp = P.get_mat().sparseView(); + auto [Hessian_sp, analytic_center2, converged2] = barrier_center_ellipsoid_linear_ineq(Asp, P.get_vec()); CHECK(P.is_in(Point(analytic_center)) == -1); CHECK(converged); @@ -149,6 +149,41 @@ void call_test_analytic_center() { CHECK((Hessian - Hessian_sp).norm() < 1e-12); } +template +void call_test_volumetric_center() { + typedef Cartesian Kernel; + typedef typename Kernel::Point Point; + typedef HPolytope Hpolytope; + typedef typename Hpolytope::MT MT; + typedef typename Hpolytope::VT VT; + typedef boost::mt19937 PolyRNGType; + typedef Eigen::SparseMatrix SpMT; + Hpolytope P; + + std::cout << "\n--- Testing volumetric center for skinny H-polytope" << std::endl; + bool pre_rounding = true; // round random polytope before applying the skinny transformation + NT max_min_eig_ratio = NT(100); + P = skinny_random_hpoly(3, 15, pre_rounding, max_min_eig_ratio, 127); + P.normalize(); + + auto [Hessian, volumetric_center, converged] = barrier_center_ellipsoid_linear_ineq(P.get_mat(), P.get_vec()); + SpMT Asp = P.get_mat().sparseView(); + auto [Hessian_sp, volumetric_center2, converged2] = barrier_center_ellipsoid_linear_ineq(Asp, P.get_vec()); + CHECK(P.is_in(Point(volumetric_center)) == -1); + CHECK(converged); + CHECK(std::abs(volumetric_center(0) + 1.49031) < 1e-04); + CHECK(std::abs(volumetric_center(1) + 1.51709) < 1e-04); + CHECK(std::abs(volumetric_center(2) - 2.49381) < 1e-04); + + CHECK(P.is_in(Point(volumetric_center2)) == -1); + CHECK(converged2); + CHECK(std::abs(volumetric_center(0) - volumetric_center2(0)) < 1e-12); + CHECK(std::abs(volumetric_center(1) - volumetric_center2(1)) < 1e-12); + CHECK(std::abs(volumetric_center(2) - volumetric_center2(2)) < 1e-12); + + CHECK((Hessian - Hessian_sp).norm() < 1e-12); +} + TEST_CASE("test_max_ball") { call_test_max_ball(); } @@ -161,6 +196,10 @@ TEST_CASE("test_analytic_center") { call_test_analytic_center(); } +TEST_CASE("test_volumetric_center") { + call_test_volumetric_center(); +} + TEST_CASE("test_max_ball_sparse") { call_test_max_ball_sparse(); } From 348aab40d614c6a1de56bcb0dcff84c6b0017573 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 28 Jun 2024 17:20:00 +0200 Subject: [PATCH 31/44] Order Polytopes generation --- examples/crhmc_sampling/.gitignore | 1 + examples/crhmc_sampling/simple_crhmc.cpp | 96 +++++++++++++++---- include/convex_bodies/orderpolytope.h | 6 ++ include/generators/order_polytope_generator.h | 79 ++++++++++++++- include/misc/poset.h | 65 +++++++------ include/preprocess/svd_rounding.hpp | 4 +- 6 files changed, 198 insertions(+), 53 deletions(-) diff --git a/examples/crhmc_sampling/.gitignore b/examples/crhmc_sampling/.gitignore index 60b43389a..1819f71c8 100644 --- a/examples/crhmc_sampling/.gitignore +++ b/examples/crhmc_sampling/.gitignore @@ -5,3 +5,4 @@ CRHMC_SIMD_* sampling_functions simple_crhmc libQD_LIB.a +liblp_solve.a diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp index 8f07065b0..733d2031e 100644 --- a/examples/crhmc_sampling/simple_crhmc.cpp +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -15,6 +15,8 @@ // Monte Carlo in a Constrained Space" #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" +#include "generators/h_polytopes_generator.h" +#include "generators/order_polytope_generator.h" #include "volume/sampling_policies.hpp" #include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" @@ -22,15 +24,42 @@ #include "sampling/random_point_generators.hpp" #include "sampling/sampling.hpp" #include "misc/misc.h" +#include "misc/poset.h" #include "random.hpp" #include #include "random_walks/random_walks.hpp" #include "generators/known_polytope_generators.h" #include "helper_functions.hpp" +#include "volume/rotating.hpp" +#include "convex_bodies/orderpolytope.h" + + +template +< +typename Polytope, +typename Point, +typename RandomNumberGenerator +> +void sample_cdhr (Polytope &P, RandomNumberGenerator &rng, std::list &randPoints, unsigned int const&N) +{ + Point p = P.ComputeInnerBall().first; + typedef typename CDHRWalk::template Walk + < + Polytope, + RandomNumberGenerator + > walk; + + typedef RandomPointGenerator RandomPointGenerator; + PushBackWalkPolicy push_back_policy; + + RandomPointGenerator::apply(P, p, N, 1, randPoints, + push_back_policy, rng); +} + template void sample_hpoly(int n_samples = 80000, - int n_burns = 20000, int dim = 2) { + int n_burns = 20000, int dim = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false) { using NT = double; using Kernel = Cartesian; using Point = typename Kernel::Point; @@ -40,18 +69,46 @@ void sample_hpoly(int n_samples = 80000, using PolytopeType = HPolytope; using VT = Eigen::Matrix; using MT = PolytopeType::MT; + typedef boost::mt19937 PolyRNGType; using RNG = BoostRandomNumberGenerator; - std::string problem_name("simplex"); - std::cerr << "CRHMC on " << problem_name << "\n"; - RNG rng(1); - PolytopeType HP=generate_simplex(dim,false); - int dimension = HP.dimension(); + + + RNG rng(dim); + PolytopeType HP; + if(order_poly) { + HP = random_orderpoly(dim, m); + std::cout << "Sampling from Order Polytope" << std::endl; + } else { + HP = skinny_random_hpoly(dim, m, false, NT(4000)); + std::cout << "Sampling from Random skinny Polytope" << std::endl; + // HP = generate_skinny_cube(20); + // rotating(HP); + } + + // HP.print(); Func * f = new Func; Grad * g = new Grad; std::list PointList; - execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( + + + std::chrono::time_point start, stop; + start = std::chrono::high_resolution_clock::now(); + + if(crhmc_walk) { + std::cout << "Using CRHMC walk" << std::endl; + execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( HP, rng, PointList, 1, n_samples, n_burns, g, f); - MT samples = MT(dimension, PointList.size()); + } else { + std::cout << "Using CDHR walk" << std::endl; + sample_cdhr(HP, rng, PointList, n_samples); + } + + stop = std::chrono::high_resolution_clock::now(); + + std::chrono::duration total_time = stop - start; + std::cout << "Done in " << total_time.count() << '\n'; + + MT samples = MT(dim, PointList.size()); int i=0; for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ samples.col(i) = (*it).getCoefficients(); @@ -59,36 +116,35 @@ void sample_hpoly(int n_samples = 80000, } std::cerr<<"max_psrf: "<< max_interval_psrf(samples)<<"\n"; std::ofstream samples_stream; - samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + - problem_name + "_samples.txt"); + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_simplex" + "_samples.txt"); samples_stream << samples.transpose() << std::endl; delete f; delete g; } + template void run_main(int n_samples = 80000, int n_burns = 20000, - int dimension = 2){ - std::cerr<<"Sampling HPolytope\n"; - sample_hpoly(n_samples, n_burns, dimension); + int dimension = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false){ + sample_hpoly(n_samples, n_burns, dimension, m, order_poly, crhmc_walk); } int main(int argc, char *argv[]) { - if (argc != 5) { + if (argc != 8) { std::cerr << "Example Usage: ./simple_crhmc " - "[simdLen] [n_samples] [n_burns] [dimension]\n"; - std::cerr << "i.e.: ./simple_crhmc 4 1000 500 2\n"; + "[simdLen] [n_samples] [n_burns] [dimension] [facets] [if_order_poly] [if_crhmc_walk]\n"; + std::cerr << "i.e.: ./simple_crhmc 4 1000 500 20 150 1 0\n"; exit(1); } std::cerr << "To plot: python3 ../python_utilities/plot_samples.py (atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<1>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (atoi(argv[1]) == 4) { - run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (atoi(argv[1]) == 8) { - run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (atoi(argv[1]) == 16) { - run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } return 0; } diff --git a/include/convex_bodies/orderpolytope.h b/include/convex_bodies/orderpolytope.h index 2df5c6619..7e3e72640 100644 --- a/include/convex_bodies/orderpolytope.h +++ b/include/convex_bodies/orderpolytope.h @@ -94,6 +94,12 @@ class OrderPolytope { return _A.sparseView(); } + // return the matrix A + MT get_full_mat() const + { + return _A; + } + VT get_vec() const { diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index bfece556e..6d8449c89 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -9,11 +9,25 @@ #ifndef ORDER_POLYTOPES_GEN_H #define ORDER_POLYTOPES_GEN_H +#include #include +#include #include -#include "misc.h" +#include +#include + +#include "misc/misc.h" #include "misc/poset.h" +#include +#include +#include +#include + +#include "generators/boost_random_number_generator.hpp" + +#include "convex_bodies/orderpolytope.h" + // Instances taken from: https://github.com/ttalvitie/le-counting-practice static const std::unordered_map instances = @@ -38,6 +52,21 @@ static const std::unordered_map instances = }; +// generates a Polytope from a poset +/// @tparam Polytope Type of returned polytope +template +Polytope get_orderpoly(Poset &poset) { + typedef typename Polytope::PointType Point; + + OrderPolytope OP(poset); + if constexpr (std::is_same< Polytope, OrderPolytope >::value ) { + return OP; + } else { + Polytope HP(OP.dimension(), OP.get_full_mat(), OP.get_vec()); + return HP; + } +} + // generates an Order Polytope from an instance name // Instances taken from: https://github.com/ttalvitie/le-counting-practice /// @tparam Polytope Type of returned polytope @@ -45,7 +74,7 @@ template Polytope generate_orderpoly(std::string& instance_name) { std::stringstream in_ss(instances.at(instance_name)); Poset poset = read_poset_from_file_adj_matrix(in_ss).second; - return Polytope(poset); + return get_orderpoly(poset); } // Generates a cube as an Order Polytope @@ -56,8 +85,50 @@ Polytope generate_cube_orderpoly(unsigned int dim) { RV order_relations; Poset poset(dim, order_relations); - Polytope OP(poset); - return OP; + return get_orderpoly(poset); +} + +// Generates a random Order Polytope with given dimension and number of facets +/// @tparam Polytope Type of returned polytope +/// @tparam RNGType RNGType Type +template +Polytope random_orderpoly(unsigned int dim, unsigned int m, int seed = std::numeric_limits::signaling_NaN()) { + + typedef typename Poset::RV RV; + + int rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); + if (!isnan(seed)) { + int rng_seed = seed; + } + + typedef BoostRandomNumberGenerator RNG; + RNG rng(dim); + rng.set_seed(rng_seed); + + + std::vector order(dim); + for(int i = 0; i < dim; ++i) { + order[i] = i; + } + boost::mt19937 shuffle_rng(rng_seed); + std::shuffle(order.begin(), order.end(), shuffle_rng); + + + RV order_relations; + for(int i = 0; i < m - 2 * dim; ++i) { + unsigned int x = rng.sample_uidist(); + unsigned int y = rng.sample_uidist(); + while(x == y) { + y = rng.sample_uidist(); + } + if(x > y) + std::swap(x, y); + order_relations.push_back(std::make_pair(order[x], order[y])); + } + + + Poset poset(dim, order_relations); + return get_orderpoly(poset); } #endif diff --git a/include/misc/poset.h b/include/misc/poset.h index 69ba02ec7..c8ddb94be 100644 --- a/include/misc/poset.h +++ b/include/misc/poset.h @@ -25,6 +25,36 @@ class Poset { unsigned int n; // elements will be from 0 to n-1 RV order_relations; // pairs of form a <= b + static void sorted_list(std::vector &res, const unsigned int &n, const RV &relations) + { + std::vector > adjList(n); + std::vector indegree(n, 0); + + for(auto x: relations) { + adjList[x.first].push_back(x.second); + indegree[x.second] += 1; + } + + std::queue q; + for(unsigned int i=0; i order; + sorted_list(order, n, relations); + + if(order.size() < n) { + throw "corresponding DAG is not acyclic"; + } return relations; } @@ -96,34 +131,8 @@ class Poset { std::vector topologically_sorted_list() const { - std::vector > adjList(n); - std::vector indegree(n, 0); - - for(auto x: order_relations) { - adjList[x.first].push_back(x.second); - indegree[x.second] += 1; - } - - std::queue q; - for(unsigned int i=0; i res; - while(!q.empty()) { - unsigned int curr = q.front(); - res.push_back(curr); - q.pop(); - - for(unsigned int i=0; i svd_rounding(Polytope &P, bool done = false, last_round_under_p, fail; - unsigned int tries=0, num_rounding_steps = 10 * n, rounding_samples = 0, round_it; + unsigned int tries=0, num_rounding_steps = 50 * n, rounding_samples = 0, round_it; NT max_s, s_cutof, p_cutof, num_its, prev_max_s = std::numeric_limits::max(), s_cutoff, p_cutoff; MT V(n,n), S(n,n); From 65056ed03de4623b1e34696152100a1e0b8132c4 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Thu, 11 Jul 2024 14:46:14 +0200 Subject: [PATCH 32/44] minor changes for PR --- examples/crhmc_sampling/simple_crhmc.cpp | 98 +++++------------------- 1 file changed, 21 insertions(+), 77 deletions(-) diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp index 733d2031e..0a68dbc33 100644 --- a/examples/crhmc_sampling/simple_crhmc.cpp +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -15,8 +15,6 @@ // Monte Carlo in a Constrained Space" #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" -#include "generators/h_polytopes_generator.h" -#include "generators/order_polytope_generator.h" #include "volume/sampling_policies.hpp" #include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" @@ -24,42 +22,15 @@ #include "sampling/random_point_generators.hpp" #include "sampling/sampling.hpp" #include "misc/misc.h" -#include "misc/poset.h" #include "random.hpp" #include #include "random_walks/random_walks.hpp" #include "generators/known_polytope_generators.h" #include "helper_functions.hpp" -#include "volume/rotating.hpp" -#include "convex_bodies/orderpolytope.h" - - -template -< -typename Polytope, -typename Point, -typename RandomNumberGenerator -> -void sample_cdhr (Polytope &P, RandomNumberGenerator &rng, std::list &randPoints, unsigned int const&N) -{ - Point p = P.ComputeInnerBall().first; - typedef typename CDHRWalk::template Walk - < - Polytope, - RandomNumberGenerator - > walk; - - typedef RandomPointGenerator RandomPointGenerator; - PushBackWalkPolicy push_back_policy; - - RandomPointGenerator::apply(P, p, N, 1, randPoints, - push_back_policy, rng); -} - template void sample_hpoly(int n_samples = 80000, - int n_burns = 20000, int dim = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false) { + int n_burns = 20000, int dim = 2) { using NT = double; using Kernel = Cartesian; using Point = typename Kernel::Point; @@ -69,46 +40,18 @@ void sample_hpoly(int n_samples = 80000, using PolytopeType = HPolytope; using VT = Eigen::Matrix; using MT = PolytopeType::MT; - typedef boost::mt19937 PolyRNGType; using RNG = BoostRandomNumberGenerator; - - - RNG rng(dim); - PolytopeType HP; - if(order_poly) { - HP = random_orderpoly(dim, m); - std::cout << "Sampling from Order Polytope" << std::endl; - } else { - HP = skinny_random_hpoly(dim, m, false, NT(4000)); - std::cout << "Sampling from Random skinny Polytope" << std::endl; - // HP = generate_skinny_cube(20); - // rotating(HP); - } - - // HP.print(); + std::string problem_name("simplex"); + std::cerr << "CRHMC on " << problem_name << "\n"; + RNG rng(1); + PolytopeType HP=generate_simplex(dim,false); + int dimension = HP.dimension(); Func * f = new Func; Grad * g = new Grad; std::list PointList; - - - std::chrono::time_point start, stop; - start = std::chrono::high_resolution_clock::now(); - - if(crhmc_walk) { - std::cout << "Using CRHMC walk" << std::endl; - execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( + execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( HP, rng, PointList, 1, n_samples, n_burns, g, f); - } else { - std::cout << "Using CDHR walk" << std::endl; - sample_cdhr(HP, rng, PointList, n_samples); - } - - stop = std::chrono::high_resolution_clock::now(); - - std::chrono::duration total_time = stop - start; - std::cout << "Done in " << total_time.count() << '\n'; - - MT samples = MT(dim, PointList.size()); + MT samples = MT(dimension, PointList.size()); int i=0; for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ samples.col(i) = (*it).getCoefficients(); @@ -116,35 +59,36 @@ void sample_hpoly(int n_samples = 80000, } std::cerr<<"max_psrf: "<< max_interval_psrf(samples)<<"\n"; std::ofstream samples_stream; - samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_simplex" + "_samples.txt"); + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_samples.txt"); samples_stream << samples.transpose() << std::endl; delete f; delete g; } - template void run_main(int n_samples = 80000, int n_burns = 20000, - int dimension = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false){ - sample_hpoly(n_samples, n_burns, dimension, m, order_poly, crhmc_walk); + int dimension = 2){ + std::cerr<<"Sampling HPolytope\n"; + sample_hpoly(n_samples, n_burns, dimension); } int main(int argc, char *argv[]) { - if (argc != 8) { + if (argc != 5) { std::cerr << "Example Usage: ./simple_crhmc " - "[simdLen] [n_samples] [n_burns] [dimension] [facets] [if_order_poly] [if_crhmc_walk]\n"; - std::cerr << "i.e.: ./simple_crhmc 4 1000 500 20 150 1 0\n"; + "[simdLen] [n_samples] [n_burns] [dimension]\n"; + std::cerr << "i.e.: ./simple_crhmc 4 1000 500 2\n"; exit(1); } std::cerr << "To plot: python3 ../python_utilities/plot_samples.py (atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<1>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } else if (atoi(argv[1]) == 4) { - run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } else if (atoi(argv[1]) == 8) { - run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } else if (atoi(argv[1]) == 16) { - run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } return 0; -} +} \ No newline at end of file From f533e95fafb8da740dd4ec6228f46d5d51ad677d Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 09:32:01 +0200 Subject: [PATCH 33/44] remove space and comment --- examples/crhmc_sampling/simple_crhmc.cpp | 2 +- include/preprocess/svd_rounding.hpp | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp index 0a68dbc33..8f07065b0 100644 --- a/examples/crhmc_sampling/simple_crhmc.cpp +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -91,4 +91,4 @@ int main(int argc, char *argv[]) { run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } return 0; -} \ No newline at end of file +} diff --git a/include/preprocess/svd_rounding.hpp b/include/preprocess/svd_rounding.hpp index ac8793e75..e62c03d28 100644 --- a/include/preprocess/svd_rounding.hpp +++ b/include/preprocess/svd_rounding.hpp @@ -46,8 +46,6 @@ void svd_on_sample(Polytope &P, Point &p, unsigned int const& num_rounding_steps RetMat.row(jj) = (*rpit).getCoefficients().transpose(); } - //std::cout << RetMat << std::endl; - for (int i = 0; i < P.dimension(); ++i) { Means(i) = RetMat.col(i).mean(); } @@ -103,7 +101,7 @@ std::tuple svd_rounding(Polytope &P, bool done = false, last_round_under_p, fail; - unsigned int tries=0, num_rounding_steps = 50 * n, rounding_samples = 0, round_it; + unsigned int tries=0, num_rounding_steps = 10 * n, rounding_samples = 0, round_it; NT max_s, s_cutof, p_cutof, num_its, prev_max_s = std::numeric_limits::max(), s_cutoff, p_cutoff; MT V(n,n), S(n,n); From 3087d98f4ce212896f708404c7472519abec1658 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 09:42:46 +0200 Subject: [PATCH 34/44] remove bug --- include/generators/order_polytope_generator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index 6d8449c89..1cf020336 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -98,7 +98,7 @@ Polytope random_orderpoly(unsigned int dim, unsigned int m, int seed = std::nume int rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); if (!isnan(seed)) { - int rng_seed = seed; + rng_seed = seed; } typedef BoostRandomNumberGenerator RNG; From 5fb206aedee3c464a3fafa76dc198f06b126a950 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 13:51:04 +0200 Subject: [PATCH 35/44] Unit test for Random Order Polytope, and minor changes --- include/generators/order_polytope_generator.h | 8 ++++++-- include/misc/poset.h | 8 ++++---- test/order_polytope.cpp | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index 1cf020336..e9199ba2c 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -27,6 +27,7 @@ #include "generators/boost_random_number_generator.hpp" #include "convex_bodies/orderpolytope.h" +#include "convex_bodies/hpolytope.h" // Instances taken from: https://github.com/ttalvitie/le-counting-practice @@ -55,15 +56,18 @@ static const std::unordered_map instances = // generates a Polytope from a poset /// @tparam Polytope Type of returned polytope template -Polytope get_orderpoly(Poset &poset) { +Polytope get_orderpoly(Poset const &poset) { typedef typename Polytope::PointType Point; OrderPolytope OP(poset); if constexpr (std::is_same< Polytope, OrderPolytope >::value ) { return OP; - } else { + } else if constexpr (std::is_same >::value ){ Polytope HP(OP.dimension(), OP.get_full_mat(), OP.get_vec()); return HP; + } else { + // TODO: implement functionality for more polytope types + throw "Unable to generate an Order Polytope of requested type"; } } diff --git a/include/misc/poset.h b/include/misc/poset.h index c8ddb94be..084bf66aa 100644 --- a/include/misc/poset.h +++ b/include/misc/poset.h @@ -25,7 +25,7 @@ class Poset { unsigned int n; // elements will be from 0 to n-1 RV order_relations; // pairs of form a <= b - static void sorted_list(std::vector &res, const unsigned int &n, const RV &relations) + static void sorted_list(const unsigned int &n, const RV &relations, std::vector &res) { std::vector > adjList(n); std::vector indegree(n, 0); @@ -75,9 +75,9 @@ class Poset { } std::vector order; - sorted_list(order, n, relations); + sorted_list(n, relations, order); - if(order.size() < n) { + if(order.size() < n) { // TODO: accept cycles in the poset throw "corresponding DAG is not acyclic"; } @@ -132,7 +132,7 @@ class Poset { std::vector topologically_sorted_list() const { std::vector res; - sorted_list(res, n, order_relations); + sorted_list(n, order_relations, res); return res; } }; diff --git a/test/order_polytope.cpp b/test/order_polytope.cpp index e2ad4300d..9a83e13a4 100644 --- a/test/order_polytope.cpp +++ b/test/order_polytope.cpp @@ -21,6 +21,10 @@ #include "cartesian_geom/cartesian_kernel.h" #include "cartesian_geom/point.h" #include "convex_bodies/orderpolytope.h" +#include "convex_bodies/hpolytope.h" + +#include "generators/order_polytope_generator.h" + #include "misc/poset.h" #include "misc/misc.h" @@ -150,6 +154,16 @@ void call_test_basics() { CHECK(OP.is_in(Point(4, {0.5, 0.5, 0.0, 1.0})) == 0); // a0 <= a2 violated CHECK(OP.is_in(Point(4, {-0.1, 0.5, 1.0, 1.0})) == 0); // a0 >= 0 violated CHECK(OP.is_in(Point(4, {1.0, 0.5, 1.0, 1.1})) == 0); // a3 <= 1 violated + + // Create a random Order Polytope of dimension 10 with 30 facets as an Hpolytope class + HPolytope HP = random_orderpoly, NT>(10, 30); + + d = HP.dimension(); + m = HP.num_of_hyperplanes(); + + CHECK(d == 10); + CHECK(m == 30); + } From 159ec1dd8e6e073c17af3de797504faa8e3d292e Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 18:05:39 +0200 Subject: [PATCH 36/44] remove comment --- include/generators/order_polytope_generator.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index e9199ba2c..3cd907bd9 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -66,7 +66,6 @@ Polytope get_orderpoly(Poset const &poset) { Polytope HP(OP.dimension(), OP.get_full_mat(), OP.get_vec()); return HP; } else { - // TODO: implement functionality for more polytope types throw "Unable to generate an Order Polytope of requested type"; } } From 12c1f8a05a9025753015dd3970ea0845adf7f230 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 28 Jun 2024 17:20:00 +0200 Subject: [PATCH 37/44] Order Polytopes generation --- examples/crhmc_sampling/.gitignore | 1 + examples/crhmc_sampling/simple_crhmc.cpp | 96 +++++++++++++++---- include/convex_bodies/orderpolytope.h | 6 ++ include/generators/order_polytope_generator.h | 79 ++++++++++++++- include/misc/poset.h | 65 +++++++------ include/preprocess/svd_rounding.hpp | 4 +- 6 files changed, 198 insertions(+), 53 deletions(-) diff --git a/examples/crhmc_sampling/.gitignore b/examples/crhmc_sampling/.gitignore index 60b43389a..1819f71c8 100644 --- a/examples/crhmc_sampling/.gitignore +++ b/examples/crhmc_sampling/.gitignore @@ -5,3 +5,4 @@ CRHMC_SIMD_* sampling_functions simple_crhmc libQD_LIB.a +liblp_solve.a diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp index 8f07065b0..733d2031e 100644 --- a/examples/crhmc_sampling/simple_crhmc.cpp +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -15,6 +15,8 @@ // Monte Carlo in a Constrained Space" #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" +#include "generators/h_polytopes_generator.h" +#include "generators/order_polytope_generator.h" #include "volume/sampling_policies.hpp" #include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" @@ -22,15 +24,42 @@ #include "sampling/random_point_generators.hpp" #include "sampling/sampling.hpp" #include "misc/misc.h" +#include "misc/poset.h" #include "random.hpp" #include #include "random_walks/random_walks.hpp" #include "generators/known_polytope_generators.h" #include "helper_functions.hpp" +#include "volume/rotating.hpp" +#include "convex_bodies/orderpolytope.h" + + +template +< +typename Polytope, +typename Point, +typename RandomNumberGenerator +> +void sample_cdhr (Polytope &P, RandomNumberGenerator &rng, std::list &randPoints, unsigned int const&N) +{ + Point p = P.ComputeInnerBall().first; + typedef typename CDHRWalk::template Walk + < + Polytope, + RandomNumberGenerator + > walk; + + typedef RandomPointGenerator RandomPointGenerator; + PushBackWalkPolicy push_back_policy; + + RandomPointGenerator::apply(P, p, N, 1, randPoints, + push_back_policy, rng); +} + template void sample_hpoly(int n_samples = 80000, - int n_burns = 20000, int dim = 2) { + int n_burns = 20000, int dim = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false) { using NT = double; using Kernel = Cartesian; using Point = typename Kernel::Point; @@ -40,18 +69,46 @@ void sample_hpoly(int n_samples = 80000, using PolytopeType = HPolytope; using VT = Eigen::Matrix; using MT = PolytopeType::MT; + typedef boost::mt19937 PolyRNGType; using RNG = BoostRandomNumberGenerator; - std::string problem_name("simplex"); - std::cerr << "CRHMC on " << problem_name << "\n"; - RNG rng(1); - PolytopeType HP=generate_simplex(dim,false); - int dimension = HP.dimension(); + + + RNG rng(dim); + PolytopeType HP; + if(order_poly) { + HP = random_orderpoly(dim, m); + std::cout << "Sampling from Order Polytope" << std::endl; + } else { + HP = skinny_random_hpoly(dim, m, false, NT(4000)); + std::cout << "Sampling from Random skinny Polytope" << std::endl; + // HP = generate_skinny_cube(20); + // rotating(HP); + } + + // HP.print(); Func * f = new Func; Grad * g = new Grad; std::list PointList; - execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( + + + std::chrono::time_point start, stop; + start = std::chrono::high_resolution_clock::now(); + + if(crhmc_walk) { + std::cout << "Using CRHMC walk" << std::endl; + execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( HP, rng, PointList, 1, n_samples, n_burns, g, f); - MT samples = MT(dimension, PointList.size()); + } else { + std::cout << "Using CDHR walk" << std::endl; + sample_cdhr(HP, rng, PointList, n_samples); + } + + stop = std::chrono::high_resolution_clock::now(); + + std::chrono::duration total_time = stop - start; + std::cout << "Done in " << total_time.count() << '\n'; + + MT samples = MT(dim, PointList.size()); int i=0; for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ samples.col(i) = (*it).getCoefficients(); @@ -59,36 +116,35 @@ void sample_hpoly(int n_samples = 80000, } std::cerr<<"max_psrf: "<< max_interval_psrf(samples)<<"\n"; std::ofstream samples_stream; - samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + - problem_name + "_samples.txt"); + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_simplex" + "_samples.txt"); samples_stream << samples.transpose() << std::endl; delete f; delete g; } + template void run_main(int n_samples = 80000, int n_burns = 20000, - int dimension = 2){ - std::cerr<<"Sampling HPolytope\n"; - sample_hpoly(n_samples, n_burns, dimension); + int dimension = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false){ + sample_hpoly(n_samples, n_burns, dimension, m, order_poly, crhmc_walk); } int main(int argc, char *argv[]) { - if (argc != 5) { + if (argc != 8) { std::cerr << "Example Usage: ./simple_crhmc " - "[simdLen] [n_samples] [n_burns] [dimension]\n"; - std::cerr << "i.e.: ./simple_crhmc 4 1000 500 2\n"; + "[simdLen] [n_samples] [n_burns] [dimension] [facets] [if_order_poly] [if_crhmc_walk]\n"; + std::cerr << "i.e.: ./simple_crhmc 4 1000 500 20 150 1 0\n"; exit(1); } std::cerr << "To plot: python3 ../python_utilities/plot_samples.py (atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<1>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (atoi(argv[1]) == 4) { - run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (atoi(argv[1]) == 8) { - run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (atoi(argv[1]) == 16) { - run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); + run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } return 0; } diff --git a/include/convex_bodies/orderpolytope.h b/include/convex_bodies/orderpolytope.h index 79f41e161..3aa9fe8ed 100644 --- a/include/convex_bodies/orderpolytope.h +++ b/include/convex_bodies/orderpolytope.h @@ -94,6 +94,12 @@ class OrderPolytope { return _A.sparseView(); } + // return the matrix A + MT get_full_mat() const + { + return _A; + } + VT get_vec() const { diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index bfece556e..6d8449c89 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -9,11 +9,25 @@ #ifndef ORDER_POLYTOPES_GEN_H #define ORDER_POLYTOPES_GEN_H +#include #include +#include #include -#include "misc.h" +#include +#include + +#include "misc/misc.h" #include "misc/poset.h" +#include +#include +#include +#include + +#include "generators/boost_random_number_generator.hpp" + +#include "convex_bodies/orderpolytope.h" + // Instances taken from: https://github.com/ttalvitie/le-counting-practice static const std::unordered_map instances = @@ -38,6 +52,21 @@ static const std::unordered_map instances = }; +// generates a Polytope from a poset +/// @tparam Polytope Type of returned polytope +template +Polytope get_orderpoly(Poset &poset) { + typedef typename Polytope::PointType Point; + + OrderPolytope OP(poset); + if constexpr (std::is_same< Polytope, OrderPolytope >::value ) { + return OP; + } else { + Polytope HP(OP.dimension(), OP.get_full_mat(), OP.get_vec()); + return HP; + } +} + // generates an Order Polytope from an instance name // Instances taken from: https://github.com/ttalvitie/le-counting-practice /// @tparam Polytope Type of returned polytope @@ -45,7 +74,7 @@ template Polytope generate_orderpoly(std::string& instance_name) { std::stringstream in_ss(instances.at(instance_name)); Poset poset = read_poset_from_file_adj_matrix(in_ss).second; - return Polytope(poset); + return get_orderpoly(poset); } // Generates a cube as an Order Polytope @@ -56,8 +85,50 @@ Polytope generate_cube_orderpoly(unsigned int dim) { RV order_relations; Poset poset(dim, order_relations); - Polytope OP(poset); - return OP; + return get_orderpoly(poset); +} + +// Generates a random Order Polytope with given dimension and number of facets +/// @tparam Polytope Type of returned polytope +/// @tparam RNGType RNGType Type +template +Polytope random_orderpoly(unsigned int dim, unsigned int m, int seed = std::numeric_limits::signaling_NaN()) { + + typedef typename Poset::RV RV; + + int rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); + if (!isnan(seed)) { + int rng_seed = seed; + } + + typedef BoostRandomNumberGenerator RNG; + RNG rng(dim); + rng.set_seed(rng_seed); + + + std::vector order(dim); + for(int i = 0; i < dim; ++i) { + order[i] = i; + } + boost::mt19937 shuffle_rng(rng_seed); + std::shuffle(order.begin(), order.end(), shuffle_rng); + + + RV order_relations; + for(int i = 0; i < m - 2 * dim; ++i) { + unsigned int x = rng.sample_uidist(); + unsigned int y = rng.sample_uidist(); + while(x == y) { + y = rng.sample_uidist(); + } + if(x > y) + std::swap(x, y); + order_relations.push_back(std::make_pair(order[x], order[y])); + } + + + Poset poset(dim, order_relations); + return get_orderpoly(poset); } #endif diff --git a/include/misc/poset.h b/include/misc/poset.h index 69ba02ec7..c8ddb94be 100644 --- a/include/misc/poset.h +++ b/include/misc/poset.h @@ -25,6 +25,36 @@ class Poset { unsigned int n; // elements will be from 0 to n-1 RV order_relations; // pairs of form a <= b + static void sorted_list(std::vector &res, const unsigned int &n, const RV &relations) + { + std::vector > adjList(n); + std::vector indegree(n, 0); + + for(auto x: relations) { + adjList[x.first].push_back(x.second); + indegree[x.second] += 1; + } + + std::queue q; + for(unsigned int i=0; i order; + sorted_list(order, n, relations); + + if(order.size() < n) { + throw "corresponding DAG is not acyclic"; + } return relations; } @@ -96,34 +131,8 @@ class Poset { std::vector topologically_sorted_list() const { - std::vector > adjList(n); - std::vector indegree(n, 0); - - for(auto x: order_relations) { - adjList[x.first].push_back(x.second); - indegree[x.second] += 1; - } - - std::queue q; - for(unsigned int i=0; i res; - while(!q.empty()) { - unsigned int curr = q.front(); - res.push_back(curr); - q.pop(); - - for(unsigned int i=0; i svd_rounding(Polytope &P, bool done = false, last_round_under_p, fail; - unsigned int tries=0, num_rounding_steps = 10 * n, rounding_samples = 0, round_it; + unsigned int tries=0, num_rounding_steps = 50 * n, rounding_samples = 0, round_it; NT max_s, s_cutof, p_cutof, num_its, prev_max_s = std::numeric_limits::max(), s_cutoff, p_cutoff; MT V(n,n), S(n,n); From cff93cb90b9b206e34509f89ac00067e7c4b9a89 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Thu, 11 Jul 2024 14:46:14 +0200 Subject: [PATCH 38/44] minor changes for PR --- examples/crhmc_sampling/simple_crhmc.cpp | 98 +++++------------------- 1 file changed, 21 insertions(+), 77 deletions(-) diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp index 733d2031e..0a68dbc33 100644 --- a/examples/crhmc_sampling/simple_crhmc.cpp +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -15,8 +15,6 @@ // Monte Carlo in a Constrained Space" #include "Eigen/Eigen" #include "cartesian_geom/cartesian_kernel.h" -#include "generators/h_polytopes_generator.h" -#include "generators/order_polytope_generator.h" #include "volume/sampling_policies.hpp" #include "ode_solvers/ode_solvers.hpp" #include "preprocess/crhmc/crhmc_input.h" @@ -24,42 +22,15 @@ #include "sampling/random_point_generators.hpp" #include "sampling/sampling.hpp" #include "misc/misc.h" -#include "misc/poset.h" #include "random.hpp" #include #include "random_walks/random_walks.hpp" #include "generators/known_polytope_generators.h" #include "helper_functions.hpp" -#include "volume/rotating.hpp" -#include "convex_bodies/orderpolytope.h" - - -template -< -typename Polytope, -typename Point, -typename RandomNumberGenerator -> -void sample_cdhr (Polytope &P, RandomNumberGenerator &rng, std::list &randPoints, unsigned int const&N) -{ - Point p = P.ComputeInnerBall().first; - typedef typename CDHRWalk::template Walk - < - Polytope, - RandomNumberGenerator - > walk; - - typedef RandomPointGenerator RandomPointGenerator; - PushBackWalkPolicy push_back_policy; - - RandomPointGenerator::apply(P, p, N, 1, randPoints, - push_back_policy, rng); -} - template void sample_hpoly(int n_samples = 80000, - int n_burns = 20000, int dim = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false) { + int n_burns = 20000, int dim = 2) { using NT = double; using Kernel = Cartesian; using Point = typename Kernel::Point; @@ -69,46 +40,18 @@ void sample_hpoly(int n_samples = 80000, using PolytopeType = HPolytope; using VT = Eigen::Matrix; using MT = PolytopeType::MT; - typedef boost::mt19937 PolyRNGType; using RNG = BoostRandomNumberGenerator; - - - RNG rng(dim); - PolytopeType HP; - if(order_poly) { - HP = random_orderpoly(dim, m); - std::cout << "Sampling from Order Polytope" << std::endl; - } else { - HP = skinny_random_hpoly(dim, m, false, NT(4000)); - std::cout << "Sampling from Random skinny Polytope" << std::endl; - // HP = generate_skinny_cube(20); - // rotating(HP); - } - - // HP.print(); + std::string problem_name("simplex"); + std::cerr << "CRHMC on " << problem_name << "\n"; + RNG rng(1); + PolytopeType HP=generate_simplex(dim,false); + int dimension = HP.dimension(); Func * f = new Func; Grad * g = new Grad; std::list PointList; - - - std::chrono::time_point start, stop; - start = std::chrono::high_resolution_clock::now(); - - if(crhmc_walk) { - std::cout << "Using CRHMC walk" << std::endl; - execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( + execute_crhmc< PolytopeType, RNG, std::list, Grad, Func, Hess, CRHMCWalk, simdLen>( HP, rng, PointList, 1, n_samples, n_burns, g, f); - } else { - std::cout << "Using CDHR walk" << std::endl; - sample_cdhr(HP, rng, PointList, n_samples); - } - - stop = std::chrono::high_resolution_clock::now(); - - std::chrono::duration total_time = stop - start; - std::cout << "Done in " << total_time.count() << '\n'; - - MT samples = MT(dim, PointList.size()); + MT samples = MT(dimension, PointList.size()); int i=0; for (std::list::iterator it = PointList.begin(); it != PointList.end(); ++it){ samples.col(i) = (*it).getCoefficients(); @@ -116,35 +59,36 @@ void sample_hpoly(int n_samples = 80000, } std::cerr<<"max_psrf: "<< max_interval_psrf(samples)<<"\n"; std::ofstream samples_stream; - samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_simplex" + "_samples.txt"); + samples_stream.open("CRHMC_SIMD_" + std::to_string(simdLen) + "_" + + problem_name + "_samples.txt"); samples_stream << samples.transpose() << std::endl; delete f; delete g; } - template void run_main(int n_samples = 80000, int n_burns = 20000, - int dimension = 20, int m = 150, bool order_poly = false, bool crhmc_walk = false){ - sample_hpoly(n_samples, n_burns, dimension, m, order_poly, crhmc_walk); + int dimension = 2){ + std::cerr<<"Sampling HPolytope\n"; + sample_hpoly(n_samples, n_burns, dimension); } int main(int argc, char *argv[]) { - if (argc != 8) { + if (argc != 5) { std::cerr << "Example Usage: ./simple_crhmc " - "[simdLen] [n_samples] [n_burns] [dimension] [facets] [if_order_poly] [if_crhmc_walk]\n"; - std::cerr << "i.e.: ./simple_crhmc 4 1000 500 20 150 1 0\n"; + "[simdLen] [n_samples] [n_burns] [dimension]\n"; + std::cerr << "i.e.: ./simple_crhmc 4 1000 500 2\n"; exit(1); } std::cerr << "To plot: python3 ../python_utilities/plot_samples.py (atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<1>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } else if (atoi(argv[1]) == 4) { - run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<4>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } else if (atoi(argv[1]) == 8) { - run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<8>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } else if (atoi(argv[1]) == 16) { - run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); + run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } return 0; -} +} \ No newline at end of file From 634d3cc12823e84f8fe1427ffbb793dfa18ce16b Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 09:32:01 +0200 Subject: [PATCH 39/44] remove space and comment --- examples/crhmc_sampling/simple_crhmc.cpp | 2 +- include/preprocess/svd_rounding.hpp | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/crhmc_sampling/simple_crhmc.cpp b/examples/crhmc_sampling/simple_crhmc.cpp index 0a68dbc33..8f07065b0 100644 --- a/examples/crhmc_sampling/simple_crhmc.cpp +++ b/examples/crhmc_sampling/simple_crhmc.cpp @@ -91,4 +91,4 @@ int main(int argc, char *argv[]) { run_main<16>(atoi(argv[2]), atoi(argv[3]), atoi(argv[4])); } return 0; -} \ No newline at end of file +} diff --git a/include/preprocess/svd_rounding.hpp b/include/preprocess/svd_rounding.hpp index ac8793e75..e62c03d28 100644 --- a/include/preprocess/svd_rounding.hpp +++ b/include/preprocess/svd_rounding.hpp @@ -46,8 +46,6 @@ void svd_on_sample(Polytope &P, Point &p, unsigned int const& num_rounding_steps RetMat.row(jj) = (*rpit).getCoefficients().transpose(); } - //std::cout << RetMat << std::endl; - for (int i = 0; i < P.dimension(); ++i) { Means(i) = RetMat.col(i).mean(); } @@ -103,7 +101,7 @@ std::tuple svd_rounding(Polytope &P, bool done = false, last_round_under_p, fail; - unsigned int tries=0, num_rounding_steps = 50 * n, rounding_samples = 0, round_it; + unsigned int tries=0, num_rounding_steps = 10 * n, rounding_samples = 0, round_it; NT max_s, s_cutof, p_cutof, num_its, prev_max_s = std::numeric_limits::max(), s_cutoff, p_cutoff; MT V(n,n), S(n,n); From e388d4383e543994bfb54f03f86dc0410488f0ce Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 09:42:46 +0200 Subject: [PATCH 40/44] remove bug --- include/generators/order_polytope_generator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index 6d8449c89..1cf020336 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -98,7 +98,7 @@ Polytope random_orderpoly(unsigned int dim, unsigned int m, int seed = std::nume int rng_seed = std::chrono::system_clock::now().time_since_epoch().count(); if (!isnan(seed)) { - int rng_seed = seed; + rng_seed = seed; } typedef BoostRandomNumberGenerator RNG; From d67be4b7a233374509257203a75c7cc9e0f97455 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 13:51:04 +0200 Subject: [PATCH 41/44] Unit test for Random Order Polytope, and minor changes --- include/generators/order_polytope_generator.h | 8 ++++++-- include/misc/poset.h | 8 ++++---- test/order_polytope.cpp | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index 1cf020336..e9199ba2c 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -27,6 +27,7 @@ #include "generators/boost_random_number_generator.hpp" #include "convex_bodies/orderpolytope.h" +#include "convex_bodies/hpolytope.h" // Instances taken from: https://github.com/ttalvitie/le-counting-practice @@ -55,15 +56,18 @@ static const std::unordered_map instances = // generates a Polytope from a poset /// @tparam Polytope Type of returned polytope template -Polytope get_orderpoly(Poset &poset) { +Polytope get_orderpoly(Poset const &poset) { typedef typename Polytope::PointType Point; OrderPolytope OP(poset); if constexpr (std::is_same< Polytope, OrderPolytope >::value ) { return OP; - } else { + } else if constexpr (std::is_same >::value ){ Polytope HP(OP.dimension(), OP.get_full_mat(), OP.get_vec()); return HP; + } else { + // TODO: implement functionality for more polytope types + throw "Unable to generate an Order Polytope of requested type"; } } diff --git a/include/misc/poset.h b/include/misc/poset.h index c8ddb94be..084bf66aa 100644 --- a/include/misc/poset.h +++ b/include/misc/poset.h @@ -25,7 +25,7 @@ class Poset { unsigned int n; // elements will be from 0 to n-1 RV order_relations; // pairs of form a <= b - static void sorted_list(std::vector &res, const unsigned int &n, const RV &relations) + static void sorted_list(const unsigned int &n, const RV &relations, std::vector &res) { std::vector > adjList(n); std::vector indegree(n, 0); @@ -75,9 +75,9 @@ class Poset { } std::vector order; - sorted_list(order, n, relations); + sorted_list(n, relations, order); - if(order.size() < n) { + if(order.size() < n) { // TODO: accept cycles in the poset throw "corresponding DAG is not acyclic"; } @@ -132,7 +132,7 @@ class Poset { std::vector topologically_sorted_list() const { std::vector res; - sorted_list(res, n, order_relations); + sorted_list(n, order_relations, res); return res; } }; diff --git a/test/order_polytope.cpp b/test/order_polytope.cpp index e2ad4300d..9a83e13a4 100644 --- a/test/order_polytope.cpp +++ b/test/order_polytope.cpp @@ -21,6 +21,10 @@ #include "cartesian_geom/cartesian_kernel.h" #include "cartesian_geom/point.h" #include "convex_bodies/orderpolytope.h" +#include "convex_bodies/hpolytope.h" + +#include "generators/order_polytope_generator.h" + #include "misc/poset.h" #include "misc/misc.h" @@ -150,6 +154,16 @@ void call_test_basics() { CHECK(OP.is_in(Point(4, {0.5, 0.5, 0.0, 1.0})) == 0); // a0 <= a2 violated CHECK(OP.is_in(Point(4, {-0.1, 0.5, 1.0, 1.0})) == 0); // a0 >= 0 violated CHECK(OP.is_in(Point(4, {1.0, 0.5, 1.0, 1.1})) == 0); // a3 <= 1 violated + + // Create a random Order Polytope of dimension 10 with 30 facets as an Hpolytope class + HPolytope HP = random_orderpoly, NT>(10, 30); + + d = HP.dimension(); + m = HP.num_of_hyperplanes(); + + CHECK(d == 10); + CHECK(m == 30); + } From 81aeb518d1361a6ee34e85e7e295a5a5fa25e4a4 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Fri, 12 Jul 2024 18:05:39 +0200 Subject: [PATCH 42/44] remove comment --- include/generators/order_polytope_generator.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/generators/order_polytope_generator.h b/include/generators/order_polytope_generator.h index e9199ba2c..3cd907bd9 100644 --- a/include/generators/order_polytope_generator.h +++ b/include/generators/order_polytope_generator.h @@ -66,7 +66,6 @@ Polytope get_orderpoly(Poset const &poset) { Polytope HP(OP.dimension(), OP.get_full_mat(), OP.get_vec()); return HP; } else { - // TODO: implement functionality for more polytope types throw "Unable to generate an Order Polytope of requested type"; } } From fee95791dcae04237bb8b19608bd9eb14662216a Mon Sep 17 00:00:00 2001 From: lucaperju Date: Wed, 17 Jul 2024 15:56:07 +0200 Subject: [PATCH 43/44] fix rebase bugs --- test/CMakeLists.txt | 214 +------------------------------------------- 1 file changed, 1 insertion(+), 213 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d676f0ca9..61e499a9e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,8 +28,6 @@ option(DISABLE_NLP_ORACLES "Disable non-linear oracles (used in collocation)" ON option(BUILTIN_EIGEN "Use eigen from ../external" OFF) option(BUILTIN_AUTODIFF "Use autodiff from ../external" ON) option(USE_MKL "Use MKL library to build eigen" OFF) -option(BUILTIN_AUTODIFF "Use autodiff from ../external" ON) -option(USE_MKL "Use MKL library to build eigen" OFF) if(DISABLE_NLP_ORACLES) add_definitions(-DDISABLE_NLP_ORACLES) @@ -112,9 +110,6 @@ endif(COMMAND cmake_policy) include("../external/cmake-files/Autodiff.cmake") GetAutodiff() -include("../external/cmake-files/Autodiff.cmake") -GetAutodiff() - include("../external/cmake-files/Eigen.cmake") GetEigen() @@ -145,31 +140,14 @@ if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") endif() endif(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") -if (BUILTIN_AUTODIFF) - include_directories (BEFORE ../../external/_deps/Autodiff) if (BUILTIN_AUTODIFF) include_directories (BEFORE ../../external/_deps/Autodiff) else () include_directories(BEFORE /usr/local/include) endif(BUILTIN_AUTODIFF) - include_directories(BEFORE /usr/local/include) -endif(BUILTIN_AUTODIFF) -set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") -if (USE_MKL) - find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) - find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) - find_library(LAPACK NAME liblapack.dylib PATHS /usr/lib) - find_library(OPENMP NAME libiomp5.dylib PATHS /opt/intel/oneapi/compiler/2021.1.1/mac/compiler/lib) - include_directories (BEFORE ${MKLROOT}/include) - set(PROJECT_LIBS ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${GFORTRAN_LIBRARIES}) - set(MKL_LINK "-L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl") - add_definitions(-DEIGEN_USE_MKL_ALL) -else() - set(MKL_LINK "") -endif(USE_MKL) if (USE_MKL) find_library(BLAS NAMES libblas.so libblas.dylib PATHS /usr/local/Cellar/lapack/3.9.1_1/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/local/Cellar/openblas/0.3.15_1/lib /usr/lib) find_library(GFORTRAN NAME libgfortran.dylib PATHS /usr/local/Cellar/gcc/10.2.0_4/lib/gcc/10) @@ -183,17 +161,9 @@ else() set(MKL_LINK "") endif(USE_MKL) -include_directories (BEFORE ../external) -include_directories (BEFORE ../include) include_directories (BEFORE ../external) include_directories (BEFORE ../include) -#for Eigen -if (${CMAKE_VERSION} VERSION_LESS "3.12.0") - add_compile_options(-D "EIGEN_NO_DEBUG") -else () - add_compile_definitions("EIGEN_NO_DEBUG") -endif () #for Eigen if (${CMAKE_VERSION} VERSION_LESS "3.12.0") add_compile_options(-D "EIGEN_NO_DEBUG") @@ -201,22 +171,10 @@ else () add_compile_definitions("EIGEN_NO_DEBUG") endif () -add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger -#add_definitions(${CMAKE_CXX_FLAGS} "-Wint-in-bool-context") -#add_definitions(${CMAKE_CXX_FLAGS} "-Wall") add_definitions(${CMAKE_CXX_FLAGS} "-g") # enable debuger #add_definitions(${CMAKE_CXX_FLAGS} "-Wint-in-bool-context") #add_definitions(${CMAKE_CXX_FLAGS} "-Wall") -add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler -add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") #enable the c++17 support needed by autodiff -#add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") -add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lm") -add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-ldl") -add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-DBOOST_NO_AUTO_PTR") -add_definitions(${CMAKE_CXX_FLAGS} "-DMKL_ILP64") -#add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgslcblas") -#add_definitions( "-O3 -lgsl -lm -ldl -lgslcblas" ) add_definitions(${CMAKE_CXX_FLAGS} "-O3") # optimization of the compiler add_definitions(${CMAKE_CXX_FLAGS} "-std=c++17") #enable the c++17 support needed by autodiff #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgsl") @@ -227,25 +185,13 @@ add_definitions(${CMAKE_CXX_FLAGS} "-DMKL_ILP64") #add_definitions(${CXX_COVERAGE_COMPILE_FLAGS} "-lgslcblas") #add_definitions( "-O3 -lgsl -lm -ldl -lgslcblas" ) -add_executable (new_volume_example new_volume_example.cpp) -add_executable (benchmarks_sob benchmarks_sob.cpp) -add_executable (benchmarks_cg benchmarks_cg.cpp) -add_executable (benchmarks_cb benchmarks_cb.cpp) add_executable (new_volume_example new_volume_example.cpp) add_executable (benchmarks_sob benchmarks_sob.cpp) add_executable (benchmarks_cg benchmarks_cg.cpp) add_executable (benchmarks_cb benchmarks_cb.cpp) -add_library(test_main OBJECT test_main.cpp) add_library(test_main OBJECT test_main.cpp) -add_executable (mcmc_diagnostics_test mcmc_diagnostics_test.cpp $) -add_test(NAME test_psrf COMMAND mcmc_diagnostics_test -tc=psrf) -add_test(NAME test_univariate_psrf COMMAND mcmc_diagnostics_test -tc=univariate_psrf) -add_test(NAME test_interval_psrf COMMAND mcmc_diagnostics_test -tc=interval_psrf) -add_test(NAME test_ess COMMAND mcmc_diagnostics_test -tc=ess) -add_test(NAME test_geweke COMMAND mcmc_diagnostics_test -tc=geweke) -add_test(NAME test_raftery COMMAND mcmc_diagnostics_test -tc=raftery) add_executable (mcmc_diagnostics_test mcmc_diagnostics_test.cpp $) add_test(NAME test_psrf COMMAND mcmc_diagnostics_test -tc=psrf) add_test(NAME test_univariate_psrf COMMAND mcmc_diagnostics_test -tc=univariate_psrf) @@ -263,26 +209,11 @@ add_test(NAME test_bcdhr COMMAND sampling_test -tc=bcdhr) add_test(NAME test_grdhr COMMAND sampling_test -tc=grdhr) add_test(NAME test_gbaw COMMAND sampling_test -tc=gbaw) add_test(NAME test_ghmc COMMAND sampling_test -tc=ghmc) -add_executable (sampling_test sampling_test.cpp $) -add_test(NAME test_dikin COMMAND sampling_test -tc=dikin) -add_test(NAME test_john COMMAND sampling_test -tc=john) -add_test(NAME test_vaidya COMMAND sampling_test -tc=vaidya) -add_test(NAME test_brdhr COMMAND sampling_test -tc=brdhr) -add_test(NAME test_bcdhr COMMAND sampling_test -tc=bcdhr) -add_test(NAME test_grdhr COMMAND sampling_test -tc=grdhr) -add_test(NAME test_gbaw COMMAND sampling_test -tc=gbaw) -add_test(NAME test_ghmc COMMAND sampling_test -tc=ghmc) +add_test(NAME test_gabw COMMAND sampling_test -tc=gabw) -add_executable (mmcs_test mmcs_test.cpp $) -add_test(NAME test_mmcs COMMAND mmcs_test -tc=mmcs) add_executable (mmcs_test mmcs_test.cpp $) add_test(NAME test_mmcs COMMAND mmcs_test -tc=mmcs) -add_executable (ode_solvers_test ode_solvers_test.cpp $) -add_test(NAME ode_solvers_test_first_order - COMMAND ode_solvers_test -tc=first_order) -add_test(NAME ode_solvers_test_second_order - COMMAND ode_solvers_test -tc=second_order) add_executable (ode_solvers_test ode_solvers_test.cpp $) add_test(NAME ode_solvers_test_first_order COMMAND ode_solvers_test -tc=first_order) @@ -290,26 +221,12 @@ add_test(NAME ode_solvers_test_second_order COMMAND ode_solvers_test -tc=second_order) add_executable (root_finders_test root_finders_test.cpp $) -add_test(NAME root_finders_test_root_finders - COMMAND root_finders_test -tc=root_finders) -add_executable (root_finders_test root_finders_test.cpp $) add_test(NAME root_finders_test_root_finders COMMAND root_finders_test -tc=root_finders) #add_executable (benchmarks_crhmc benchmarks_crhmc.cpp ) #add_executable (benchmarks_crhmc_sampling benchmarks_crhmc_sampling.cpp ) -#add_executable (benchmarks_crhmc benchmarks_crhmc.cpp ) -#add_executable (benchmarks_crhmc_sampling benchmarks_crhmc_sampling.cpp ) -add_executable (crhmc_polytope_preparation_test crhmc_polytope_preparation_test.cpp $) -add_test(NAME crhmc_polytope_test_preparation - COMMAND crhmc_polytope_preparation_test -tc=test_preparation_crhmc) -add_test(NAME crhmc_test_fixed_vars - COMMAND crhmc_polytope_preparation_test -tc=test_fixed_vars_crhmc) -add_test(NAME crhmc_test_dep_vars - COMMAND crhmc_polytope_preparation_test -tc=test_dep_vars_crhmc) -add_test(NAME crhmc_test_center_computation - COMMAND crhmc_polytope_preparation_test -tc=test_center_computation) add_executable (crhmc_polytope_preparation_test crhmc_polytope_preparation_test.cpp $) add_test(NAME crhmc_polytope_test_preparation COMMAND crhmc_polytope_preparation_test -tc=test_preparation_crhmc) @@ -321,9 +238,6 @@ add_test(NAME crhmc_test_center_computation COMMAND crhmc_polytope_preparation_test -tc=test_center_computation) add_executable (boundary_oracles_test boundary_oracles_test.cpp $) -add_test(NAME boundary_oracles_test_h_poly_oracles - COMMAND boundary_oracles_test -tc=h_poly_oracles) -add_executable (boundary_oracles_test boundary_oracles_test.cpp $) add_test(NAME boundary_oracles_test_h_poly_oracles COMMAND boundary_oracles_test -tc=h_poly_oracles) @@ -336,32 +250,12 @@ add_test(NAME volume_sob_hpolytope_simplex COMMAND volume_sob_hpolytope -tc=simp add_test(NAME volume_sob_hpolytope_skinny_cube COMMAND volume_sob_hpolytope -tc=skinny_cube) add_test(NAME volume_sob_hpolytope_cube_overflow COMMAND volume_sob_hpolytope -tc=cube_overflow) set_property(TEST volume_sob_hpolytope_cube_overflow PROPERTY TIMEOUT 1) -add_executable (volume_sob_hpolytope volume_sob_hpolytope.cpp $) -add_test(NAME volume_sob_hpolytope_cube COMMAND volume_sob_hpolytope -tc=cube) -add_test(NAME volume_sob_hpolytope_cross COMMAND volume_sob_hpolytope -tc=cross) -add_test(NAME volume_sob_hpolytope_birkhoff COMMAND volume_sob_hpolytope -tc=birk) -add_test(NAME volume_sob_hpolytope_prod_simplex COMMAND volume_sob_hpolytope -tc=prod_simplex) -add_test(NAME volume_sob_hpolytope_simplex COMMAND volume_sob_hpolytope -tc=simplex) -add_test(NAME volume_sob_hpolytope_skinny_cube COMMAND volume_sob_hpolytope -tc=skinny_cube) -add_test(NAME volume_sob_hpolytope_cube_overflow COMMAND volume_sob_hpolytope -tc=cube_overflow) -set_property(TEST volume_sob_hpolytope_cube_overflow PROPERTY TIMEOUT 1) -add_executable (volume_sob_vpolytope volume_sob_vpolytope.cpp $) -add_test(NAME volume_sob_vpolytope_cube COMMAND volume_sob_vpolytope -tc=cube) -add_test(NAME volume_sob_vpolytope_cross COMMAND volume_sob_vpolytope -tc=cross) -add_test(NAME volume_sob_vpolytope_simplex COMMAND volume_sob_vpolytope -tc=simplex) add_executable (volume_sob_vpolytope volume_sob_vpolytope.cpp $) add_test(NAME volume_sob_vpolytope_cube COMMAND volume_sob_vpolytope -tc=cube) add_test(NAME volume_sob_vpolytope_cross COMMAND volume_sob_vpolytope -tc=cross) add_test(NAME volume_sob_vpolytope_simplex COMMAND volume_sob_vpolytope -tc=simplex) -add_executable (volume_cg_hpolytope volume_cg_hpolytope.cpp $) -add_test(NAME volume_cg_hpolytope_cube COMMAND volume_cg_hpolytope -tc=cube) -add_test(NAME volume_cg_hpolytope_cross COMMAND volume_cg_hpolytope -tc=cross) -add_test(NAME volume_cg_hpolytope_birkhoff COMMAND volume_cg_hpolytope -tc=birk) -add_test(NAME volume_cg_hpolytope_prod_simplex COMMAND volume_cg_hpolytope -tc=prod_simplex) -add_test(NAME volume_cg_hpolytope_simplex COMMAND volume_cg_hpolytope -tc=simplex) -add_test(NAME volume_cg_hpolytope_skinny_cube COMMAND volume_cg_hpolytope -tc=skinny_cube) add_executable (volume_cg_hpolytope volume_cg_hpolytope.cpp $) add_test(NAME volume_cg_hpolytope_cube COMMAND volume_cg_hpolytope -tc=cube) add_test(NAME volume_cg_hpolytope_cross COMMAND volume_cg_hpolytope -tc=cross) @@ -370,22 +264,11 @@ add_test(NAME volume_cg_hpolytope_prod_simplex COMMAND volume_cg_hpolytope -tc=p add_test(NAME volume_cg_hpolytope_simplex COMMAND volume_cg_hpolytope -tc=simplex) add_test(NAME volume_cg_hpolytope_skinny_cube COMMAND volume_cg_hpolytope -tc=skinny_cube) -add_executable (volume_cg_vpolytope volume_cg_vpolytope.cpp $) -add_test(NAME volume_cg_vpolytope_cube COMMAND volume_cg_vpolytope -tc=cube) -add_test(NAME volume_cg_vpolytope_cross COMMAND volume_cg_vpolytope -tc=cross) -add_test(NAME volume_cg_vpolytope_simplex COMMAND volume_cg_vpolytope -tc=simplex) add_executable (volume_cg_vpolytope volume_cg_vpolytope.cpp $) add_test(NAME volume_cg_vpolytope_cube COMMAND volume_cg_vpolytope -tc=cube) add_test(NAME volume_cg_vpolytope_cross COMMAND volume_cg_vpolytope -tc=cross) add_test(NAME volume_cg_vpolytope_simplex COMMAND volume_cg_vpolytope -tc=simplex) -add_executable (volume_cb_hpolytope volume_cb_hpolytope.cpp $) -add_test(NAME volume_cb_hpolytope_cube COMMAND volume_cb_hpolytope -tc=cube) -add_test(NAME volume_cb_hpolytope_cross COMMAND volume_cb_hpolytope -tc=cross) -add_test(NAME volume_cb_hpolytope_birkhoff COMMAND volume_cb_hpolytope -tc=birk) -add_test(NAME volume_cb_hpolytope_prod_simplex COMMAND volume_cb_hpolytope -tc=prod_simplex) -add_test(NAME volume_cb_hpolytope_simplex COMMAND volume_cb_hpolytope -tc=simplex) -add_test(NAME volume_cb_hpolytope_skinny_cube COMMAND volume_cb_hpolytope -tc=skinny_cube) add_executable (volume_cb_hpolytope volume_cb_hpolytope.cpp $) add_test(NAME volume_cb_hpolytope_cube COMMAND volume_cb_hpolytope -tc=cube) add_test(NAME volume_cb_hpolytope_cross COMMAND volume_cb_hpolytope -tc=cross) @@ -394,26 +277,16 @@ add_test(NAME volume_cb_hpolytope_prod_simplex COMMAND volume_cb_hpolytope -tc=p add_test(NAME volume_cb_hpolytope_simplex COMMAND volume_cb_hpolytope -tc=simplex) add_test(NAME volume_cb_hpolytope_skinny_cube COMMAND volume_cb_hpolytope -tc=skinny_cube) -add_executable (volume_cb_vpolytope volume_cb_vpolytope.cpp $) -add_test(NAME volume_cb_vpolytope_cube COMMAND volume_cb_vpolytope -tc=cube) -add_test(NAME volume_cb_vpolytope_cross COMMAND volume_cb_vpolytope -tc=cross) -add_test(NAME volume_cb_vpolytope_simplex COMMAND volume_cb_vpolytope -tc=simplex) add_executable (volume_cb_vpolytope volume_cb_vpolytope.cpp $) add_test(NAME volume_cb_vpolytope_cube COMMAND volume_cb_vpolytope -tc=cube) add_test(NAME volume_cb_vpolytope_cross COMMAND volume_cb_vpolytope -tc=cross) add_test(NAME volume_cb_vpolytope_simplex COMMAND volume_cb_vpolytope -tc=simplex) -add_executable (volume_cb_zonotopes volume_cb_zonotopes.cpp $) -add_test(NAME volume_cb_zonotopes_uniform_zonotopes - COMMAND volume_cb_zonotopes -tc=uniform_zonotopes) add_executable (volume_cb_zonotopes volume_cb_zonotopes.cpp $) add_test(NAME volume_cb_zonotopes_uniform_zonotopes COMMAND volume_cb_zonotopes -tc=uniform_zonotopes) add_executable (volume_cb_vpoly_intersection_vpoly volume_cb_vpoly_intersection_vpoly.cpp $) -add_test(NAME volume_cb_vpoly_intersection_vpoly_random_vpoly_sphere - COMMAND volume_cb_vpoly_intersection_vpoly -tc=random_vpoly_sphere) -add_executable (volume_cb_vpoly_intersection_vpoly volume_cb_vpoly_intersection_vpoly.cpp $) add_test(NAME volume_cb_vpoly_intersection_vpoly_random_vpoly_sphere COMMAND volume_cb_vpoly_intersection_vpoly -tc=random_vpoly_sphere) @@ -435,19 +308,6 @@ add_test(NAME round_vaidya_barrier_test -add_executable (logconcave_sampling_test logconcave_sampling_test.cpp $) -add_test(NAME logconcave_sampling_test_hmc - COMMAND logconcave_sampling_test -tc=hmc) -add_test(NAME logconcave_sampling_test_uld - COMMAND logconcave_sampling_test -tc=uld) -add_test(NAME logconcave_sampling_test_exponential_biomass_sampling - COMMAND logconcave_sampling_test -tc=exponential_biomass_sampling) -add_test(NAME logconcave_sampling_test_nuts_hmc_truncated - COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc_truncated) -add_test(NAME logconcave_sampling_test_nuts_hmc - COMMAND logconcave_sampling_test -tc=benchmark_nuts_hmc) - - add_executable (logconcave_sampling_test logconcave_sampling_test.cpp $) add_test(NAME logconcave_sampling_test_hmc COMMAND logconcave_sampling_test -tc=hmc) @@ -462,26 +322,6 @@ add_test(NAME logconcave_sampling_test_nuts_hmc -add_executable (crhmc_sampling_test crhmc_sampling_test.cpp $) -add_test(NAME crhmc_sampling_test_crhmc - COMMAND crhmc_sampling_test -tc=crhmc) -add_test(NAME crhmc_test_polytope_sampling - COMMAND crhmc_sampling_test -tc=test_polytope_sampling_crhmc) -add_test(NAME crhmc_test_sparse_sampling - COMMAND crhmc_sampling_test -tc=test_sampling_sparse_problem) -add_executable (simple_mc_integration simple_mc_integration.cpp $) -add_test(NAME simple_mc_integration_over_limits - COMMAND simple_mc_integration -tc=rectangle) -add_test(NAME simple_mc_integration_over_cubes - COMMAND simple_mc_integration -tc=cube) -add_test(NAME simple_mc_integration_over_simplices - COMMAND simple_mc_integration -tc=simplex) -add_test(NAME simple_mc_integration_over_product_simplices - COMMAND simple_mc_integration -tc=prod_simplex) -add_test(NAME simple_mc_integration_over_cross_polytopes - COMMAND simple_mc_integration -tc=cross) -add_test(NAME simple_mc_integration_over_birkhoff_polytopes - COMMAND simple_mc_integration -tc=birkhoff) add_executable (crhmc_sampling_test crhmc_sampling_test.cpp $) add_test(NAME crhmc_sampling_test_crhmc COMMAND crhmc_sampling_test -tc=crhmc) @@ -508,21 +348,7 @@ add_test(NAME order_polytope_basics COMMAND order_polytope -tc=basics) add_test(NAME order_polytope_line_intersect COMMAND order_polytope -tc=line_intersect) add_test(NAME order_polytope_reflection COMMAND order_polytope -tc=reflection) add_test(NAME order_polytope_vec_mult COMMAND order_polytope -tc=vec_mult) -add_executable (order_polytope order_polytope.cpp $) -add_test(NAME order_polytope_basics COMMAND order_polytope -tc=basics) -add_test(NAME order_polytope_line_intersect COMMAND order_polytope -tc=line_intersect) -add_test(NAME order_polytope_reflection COMMAND order_polytope -tc=reflection) -add_test(NAME order_polytope_vec_mult COMMAND order_polytope -tc=vec_mult) -add_executable (matrix_sampling_test sampling_correlation_matrices_test.cpp $) -add_test(NAME test_corre_spectra_classes COMMAND matrix_sampling_test -tc=corre_spectra) -add_test(NAME test_new_ball_uniform COMMAND matrix_sampling_test -tc=new_ball_uniform) -add_test(NAME test_new_billiard_uniform COMMAND matrix_sampling_test -tc=new_billiard_uniform) -add_test(NAME test_new_accelerated_billiard_uniform COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform) -add_test(NAME test_new_ball_uniform_MT COMMAND matrix_sampling_test -tc=new_ball_uniform_MT) -add_test(NAME test_new_rdhr_uniform_MT COMMAND matrix_sampling_test -tc=new_rdhr_uniform_MT) -add_test(NAME test_new_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_billiard_uniform_MT) -add_test(NAME test_new_accelerated_billiard_uniform_MT COMMAND matrix_sampling_test -tc=new_accelerated_billiard_uniform_MT) add_executable (matrix_sampling_test sampling_correlation_matrices_test.cpp $) add_test(NAME test_corre_spectra_classes COMMAND matrix_sampling_test -tc=corre_spectra) add_test(NAME test_new_ball_uniform COMMAND matrix_sampling_test -tc=new_ball_uniform) @@ -551,14 +377,6 @@ add_test(NAME test_vaidya_center set(ADDITIONAL_FLAGS "-march=native -DSIMD_LEN=0 -DTIME_KEEPING") -#set_target_properties(benchmarks_crhmc -# PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) -#set_target_properties(benchmarks_crhmc_sampling -# PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) -set_target_properties(crhmc_polytope_preparation_test - PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) -set_target_properties(crhmc_sampling_test - PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) #set_target_properties(benchmarks_crhmc # PROPERTIES COMPILE_FLAGS ${ADDITIONAL_FLAGS}) #set_target_properties(benchmarks_crhmc_sampling @@ -598,33 +416,3 @@ TARGET_LINK_LIBRARIES(crhmc_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTH TARGET_LINK_LIBRARIES(order_polytope lp_solve coverage_config) TARGET_LINK_LIBRARIES(matrix_sampling_test lp_solve ${MKL_LINK} coverage_config) TARGET_LINK_LIBRARIES(test_internal_points lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(new_volume_example lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(new_volume_example lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_sob_hpolytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_sob_vpolytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cg_hpolytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cg_vpolytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cb_hpolytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cb_vpolytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cb_zonotopes lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly lp_solve coverage_config) -TARGET_LINK_LIBRARIES(volume_cb_vpoly_intersection_vpoly lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(rounding_test lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(mcmc_diagnostics_test lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(sampling_test lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(mmcs_test lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(benchmarks_sob lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(benchmarks_cg lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(benchmarks_cb lp_solve ${MKL_LINK} coverage_config) -#TARGET_LINK_LIBRARIES(benchmarks_crhmc_sampling lp_solve ${MKL_LINK} QD_LIB coverage_config) -#TARGET_LINK_LIBRARIES(benchmarks_crhmc lp_solve ${MKL_LINK} QD_LIB coverage_config) -TARGET_LINK_LIBRARIES(simple_mc_integration lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(ode_solvers_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) -TARGET_LINK_LIBRARIES(boundary_oracles_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(root_finders_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(crhmc_polytope_preparation_test ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) -TARGET_LINK_LIBRARIES(logconcave_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(crhmc_sampling_test lp_solve ${IFOPT} ${IFOPT_IPOPT} ${PTHREAD} ${GMP} ${MPSOLVE} ${FFTW3} ${MKL_LINK} QD_LIB coverage_config) -TARGET_LINK_LIBRARIES(order_polytope lp_solve coverage_config) -TARGET_LINK_LIBRARIES(matrix_sampling_test lp_solve ${MKL_LINK} coverage_config) -TARGET_LINK_LIBRARIES(test_internal_points lp_solve ${MKL_LINK} coverage_config) From e764a69c6c45cc0a639591d05d7269b710a71b67 Mon Sep 17 00:00:00 2001 From: lucaperju Date: Wed, 17 Jul 2024 15:56:52 +0200 Subject: [PATCH 44/44] remove accidental line --- test/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 61e499a9e..615791148 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -209,7 +209,6 @@ add_test(NAME test_bcdhr COMMAND sampling_test -tc=bcdhr) add_test(NAME test_grdhr COMMAND sampling_test -tc=grdhr) add_test(NAME test_gbaw COMMAND sampling_test -tc=gbaw) add_test(NAME test_ghmc COMMAND sampling_test -tc=ghmc) -add_test(NAME test_gabw COMMAND sampling_test -tc=gabw) add_executable (mmcs_test mmcs_test.cpp $) add_test(NAME test_mmcs COMMAND mmcs_test -tc=mmcs)
  • =c?xxaN^tBk>mXE*?fYi!)J$PY zfH__s%4vnZXKA`UYhZFPsDHWvd$*U3(M0L8gI zk5Nx>ya{|kvDP~mikIQ1BHIN@Nmi5V7hlRj2n}`N)+p6}hZM&)3qvnBdH!ym#m@#o zL-x3Z^P;$c?=C;~EYoLODABV1Z#4wIobdJqy#yuYSBODYwoQ$DDtiPBi{qa1Ae@LF z^U8rO_|#QyMqJW=A-|m61A?+DRvt_mvBf5yXu$gbxLp>lUW&bPSV679Kf|%wYM|!v zysJNF!ite@cKMV-AUmB)>LLagz%l|Z9c&c4*=7DiilvvBEII9W>?8nzb;t`8UWPWq z1filwi2AbyrjEQT)qB%n!E1S5k=b7od?cAIZ%HN=%M5Rip@~rv-_#@CF`yvv9RX+? z<-kq9yK-H0?y|q^->r~1X6&%ph&MrhTu00q4qdfNsBB{;*j?g3d~gqXg>lKoOyac0 zWs}CS^FzeRM+)})Ax>?9rn)T*r&R>-3trL<`jT$K+OpYlKY<`?^+A|S9ecd$1~o>h z2^r4%WX9nC!~Y^XM1r82}3T9Uy$T>H($RiTAxk((#Lm>MTDQOtUht1GVtZ%ul8>i z>_xGv$ev!MOP3lDP3gtYaba7Nx~#snn=RtNxkjNC#M)NEm3T%e4;T8UYfTvuY9>n*=jh?%#Fj2j6CTmkJ>%gRlMU89sWh`KiWr+OSz{xML~q z!;sz?fO4WXbeC||BK<0MVuxulDwk`%LGmA2IK><`p7Va}!jGyT7N<%XYFi*Ud5#oaWFNhEY3STni{ZzH~%oHkB87GXu>z@ z!RZF2g~2T|`XQ5;+PBimF2+Od01PA)F3n>M*jToOxeGs9URoGUn2K{o#WGu?>{k^( zSSE3L^jP6$1RT#u>cOnBhuPx!W^BEwV2Dr-EB0AdW;UHc@37L1DL6%Bs3A0Nx|>x(!6aTlcGC0qY#*-?QjL6v`aRHt zAH+}v%6NHCh09>Hf44c}wikV*)y$ABu z?J)vI^y(05L2Tj3Q9Vt$FClLq$`}>vx1+xf@Oe;fs0EOh88n|gUqR&0{q;U50Slrl=G(((;5&>Ty==Gkyt}l zB&NaBOIOL(dxAReUVNXuyoDc}>6Iz=_Q*RAa($&pP&VQcwuXo*8w$dTOiqfw* z{P=%K&%so!>k1?tAy1`~G=r&FZPHs%_O>yLZ>_+B;u8k6_>z zeikDpB<&7n0R@sti&jvJ8^zMSWi2g`vJ`#GeCbIdp#sAvFyyhW=+G0a%5kd0v4Zr{ zDH;KF^Zfuw-6zTfyQnT7N%rzgdxxKfYNWuM^`qi7X%($@psnI~4G(^@x z0X-oQul`v08P3H&*|#JhB{mqB7+W&aaXigek6V(b2FSS2%H=&UbWPS{z zU(0AUA7X-;m*%kbB6HR2i%2~91^ks}_1UH$KUD&1FZhfrz4~;u-u6?W;T0+N6RU2Z zqiaTaa}7HMH3DM~~iy)aK#?3#S zTGPyP-ndZ$%{n@8vww?VZ#_e)42^(rLu_(qvTAO87!05 zrdr(lAGf{XyKq^-AHIoV%aZ`^jr>2tyNNOuJ4qSAKZ=qz_h2n4Kd!gX%t1Gi4%bGI zmcy|Kl5mCOj>kLZS%xf|px*D(f*Wxvh1SbrsX`(NVl=ej2iuT;%m%9zW0usZ<7j~N zG>_(`s(0DpAzvF&4mLag{L5Jzo0N1r-Njohp-JMu1Mk0@7I>QqdN0!Yn?YQ{sWmg+ zYxFlWSo%sLHXUR5)Ute^p9IkAxUSJ%2uFTf&B$ttJ%W=oX6x@zhTxyK-h>Kwz}X&l z^T-j<_q#Owdrt41<_8}Wi*F`A&pbKY?#+nxJo`RnWOwehU8#54=zFXtKIVE;zG zG)8QS%&oY{r9PZNy!$6+RDX#cr%tB;-r^+zrGF2BB+q&sqV#PjL-hh$jv6W!I{xAt&Mb6d&VXuUJ0vh_9$gAxnxVK1CN|;kB^vzmeT%OCRB0g zNI?WsgqxbrU;#yYA3qC2bDDU(?dNG29HWV0p)}HuE#A+ce^}n(RZpPy7%2YLReBA_ z@g2#3GQYFz6drvvH5|#Z+eD*2J8%6J!#)xZ+EwzTphICc^fUYjGR-;BYYh`3!oVic z)Ot!zY;~PoYYlgKQ`p2@H6*xsG~PyOd0b?o=!5NRX7(UN(0aahx3gEvM|Z}IU!t-eH^wsIl=w==dEJ-7+|JZDbm^UuAqu z&D&e>dSaBp%cH+&!s*tQNNQ)K-`Gp2h9xYVel{ku>sQ|MN%V(mjsN|=thxtnLL=|C zbEru0{)t9=42w~A*YT~u$A_&B+Z4^Hr@f5jnTeVfk(&AO{eDuAHPY^U_b{3lM4S82 zEp5)tsB7Nqid|SzHe<~k;rkn_HjUm)f!pk|cQah=tcz|b63)Dr6;nYI1GkQx5`p>b zVx8BCo1BFXKm)fb{OpSNktuU`D$?#IU6a&ClrO6x7A`r0cTPM@%xWUPm% zSw2dRs0N_{YxwTP+d6oxir(4^KyDVZ<2V3UQH+2a+=lkcGlykF=exCcu1J&sp2`ZesYF6d) z2k(s`9i%RsyJeLfRc*o^QyDCtRT!RJlC9uzzl5qVYQD?9;CR5U`Zt|7!ywoqq+BOJ zK7|InPRlfM0^K*etv_E;104map&U$P;cN!Q8v6(_&$$CS2PMG$grc(rvyEWfV5?0H z6-+EOu;_4$kp8$m)~bkJ7D&U0E&V4M&Tcilg(=4Qi;fneJ%f50pQCx$qMMxZ(y_6_ zkgy-~T~f3~q3-Hv;{maTd)c>4$iDE2!xaq_J9*Z|Phjp}POF^2TU|3ERhI-UI)ERl zL|`1M4Qp+gw=3y8;m;=ya^&Da{o&*Ef}+nIh`>uFk!+5*VT#2AH~1{i(J4he`yh}8 zEY(@=rhd;#jzFVo176&~6i@Uf^cD|X^nz2f>gI&FdE_Hb!^e=@fwBAvanQ!mWatFp z^_`CV_h)tMbTvWpGuGW?iKYXTX{o6jF4X8%H0&VE z?f}N6bC*JK)ZTZv#-|y2otMG*0TiGyo-eqbm_#GQfFo#<_7(g$=AeD;^6wkm1UMl# z9;%a4(%UM27K7M7P4x5jbKJ!;)$~&3fj0}(YNFvTMWiIrnohhkcNjq!<$lm$Oh(F% zUt|>tl(RaQ=?eSKm|}cxNCdWlwTFpjrdijq3fNvemzYh1YFk#T7=XiiMfXAiQ z-dN*k6dNFd>ba_sU>AN+^T)D3xt_;qNIl`6Fg&202fw>Cq7A7g+JcVAVdx_xK*E^w zcr%gpG-4;MV7%FKbj+#BMRMb7F_Q@1P4IUyw$ErNUHR{Vxzhilrhutcxigy{pA0EQ zqIhs@%d?ijL(t5+K-&b|96 zkB4EB&heDi2;YuDW<75wVwWpEp0`!RlmL1O5e$>|%ckaSiPqz-3!N69cUsiYvnG67 z5@O!lzttVi@`?P1ycO{O~_*oc}{9K#nN2 zbE?u*@Pg#HeR$m8N$0p*N+=iB2TW%0PdNe%b5|~J0%7F3MSBi!9H71-l}o%hw6uF& z9Ooo7c7M1#&~4fUB;hNMB2@8!*F@{&I;og0v$E!hE^nfdJi!GVcfR6jy-m68q^Pojml7d^z)Q8 zsR%pN)7;KOpN={u4oasF(h6jWM2nMc1YCIb?C559)9x3FL|&gP4msqOZrsrNp4wDu ze)Pr$sOQL|dVT<`2jjYhb08aje5Blght|i|%a>5n7@ks9SBcaC>1w=uqT#ZJFD~hA z06WXYo0PAcXwq)o|1F~La7yN_aDCeJvPACPZhvY!s#548dh`)MQTDTa0aO#M7xUeD zle@zKG%J~JyPH6BKZ_XSyqG6>cD2_ZXD*h~iurL@Jg6)59MrHHPnJ+%LMopVY}vfV zZ|MOEL=P|fcI4;qo$&WUxm4uFCTgfU-yjjEzWs#cQdzz7gdq_}Pg#w;`t}BrSaCd{ zL+*1s>hH-xs5 zt!6C(;ZnPQOh&l#qekw? z{KEl!(gKz+bZ#f=Fy(D5h z+pJcfjGC@RBi>Y`YwPo@+AUrk*?_blE@&Mr#&(#_z?ez3YHw2Sz+AZ_uXmV@d@CL& zVHsN7wamEPl(FGl{k_DCQT3S(j*3u|R%!CVYA|yk*Hy3yg<{gPRKwp<=qZrIFVQCP z3UByd?;QF}@?M>?V0Z0Q8&|XYPS<^|HsZ2?`E&4Jl#8MJ+@M>7?xo()Sjy#3N+%|W zBw*&jO-f%wmFKKg+hp$48*IcvxG(Mfi3z(h+kfdu4-U_+jb;J$vLqylgGP_mjDW)M z%G#*neb?d#&%ume^JagAu>g39r;pp>-lZ#>L(q2OI?cnZvs&fjx$#McAg!P17hVI~ z8hxIE*ViI0m#<9FHJGG7db?u!eT0LZ@cAA&cx`4aY=XW;zc)Gwxr4z=C)$^OcbWHg zIY<+f*hgY+Z?V5>Pp)=-Fb_!pgKIS&9-Pib-?E;Cfv=s!*13A~QxEP_S2lV_GhY38 zvLZT^0r?x1xOx3g)YrkW#)m%ykksG&#r(dxcL7!IiFmso7T4)&9vwAJ`g8xhG13zt z>L7=SgmT2p?QSo@VF5`mH##1MRFGbF>6VtARGtDrTT^_&wS$qXy|L5iDmfTArp5vk z2l0tsVxQSbBz`4yo*$O>j3`r;M-BaWvYurSw;PWNp|h;fPhb=p&s?;-hS~Q)?wNUB zM2{>4*k=dGdj@XpAb>YV0!iPs%W9AE6LJyh59~W`6~mBWbtV2Hz8o7l50I$?g`D44 zQBZKPmJ8#k1a3F1^J{yG)(C>XXE;$h5}Eq^T;S`a?d`O+hr}8yKr7Z>n0`IYh|#aN z-(;)IPrw`1BdCLXv?4khd8h34Zs_q|f73vqJS+nYVwV%LJ6T0FvJoDcQu|USOf}N@ zRM#o77Cer-)2tD1@uhkZ%=1S$nM_|2cz+rvYm|@0g9S+6erwB#1UQ9K!F?qk$3QO; zjX=Fc0i;;r-SADX*y(+?3G(M2L3fS04{O+uxI&g?D*pXlTPgry2BQq zr{RwylO!Q5KA6gd@AbY<+n&o%w$;f)!Nf;+_&(J?eJAZwcI_Y05}la#?xCTarhjdnefZwt#&G+OF(}&W7Y$?LxV_wL#k&~5XvZd7U_bx%S zN;zW7^S`V};+{U#AC;#*GVo#iT+jMtf2)BL0(e9MNDLr~A9FBSjw%}sxM|(q><*x< z>d5-uvzZ}Yc*7t9$mmPyyX!|Gn@LN$C}nZh1dS4&5U~PMM>4@UMUxkE4p$$yD|QvY z%(x}+QC~8*4yk^aW%VRFUpT=V4xu~7tcuYA;LoSD*HvMOsZy}AAgbfL(lvAIs{ z^!8})cF`3?k|TL~!6Wv3KFi8D$&rtV>Bv)Vca0paL{?KpBq&dx(pw^)zmAGga%DyVEz*-Q?87`_(ZK3lYvYyR zA&5+diop~^uxy`|COJ1g&pAj!A;lY;Q1Wp2`rjo-K9$wxpnF$8%$PY)h@LRK9Tc7H~grkN9tx< zqH}0gcEk~@Pn+wz?jciX!@x_7frEBs$<=6jh@AxlQok~>`Q7TPv|YVn%5_jW0KMg2 z@Mrzg$vVf3W!}65+Pt{cfZc71_u2NKD9^OdOD04TFQ6Jl-u6Tfm02wU-Ovb@0@bt1@ifaAWSw>7b!u}`ftl}32!mus;OTw zE}?;{@1vX&Bbi)2Vlg5t8DRGU`Bm@i+^(`_J|f=iau*|f03J?`|4R8$vj-GZ@**Au z(7RNo4e9mi=nA0p_hT#^>US;m#DsEik1MuAyGCdipzu?1^7-ZjY zeNtt6+&rM0H+D{L^iznLe7u3OjWQ5VdzPQsnKBRAz$|KV8T!k(f3Pkxikmobzhbz; zvs#Y~+B#A|c9}#^$q!I1dX36@KY)40_m3y@vst&df2Z_PJlDt0x;+2#BR`oFs8|Ti z6hh%OkYxwuyw?8kI8d(hbLmp|iC$7`P+#a_&tdZOK~`?+-N>}v%M@X6lfKFI$em7- zG`4~7o64G%sLklX^+sCZ&a8;xx^D6nm%6IUD3L`6kq+Cu5j&mAL!ow6Vg8&%BtW{q`miBhPsOPXXD#1R;WwbZ?lO z@t2u*==)WFwmsS>do^MO<2Dlib0&xbEd8*>vBA(^P`qh>n0kq9&jdbh%N*T#5#eY3 z+vswuehF1nHWLM?A1u|BDshQXdengybUD}-lq;?~avlJRsHw_C@Nh_(xcF;mfe4sE zGbP^H4?9Z{+?KIP{!@*cq~T5_+T-W1_Sm*qZ2uRhvgbPZ#(Gh(4NR}V`U|n+dGz%{yNW9$3P;NdYI2iM&2u zy?BVoyWg+-?qz*?OTdaN^LoEkJQT>Da+W#_8;e~FX3f-6Li3_m`7AX&kaFR;H*Acw z_y_$-Pw&J0a`|Q3u)RX-NeJWYqn^SA|Ds6=Wz3)7Z}_ABaP&GD0YM`t3>muv8?&uU z$9r^2#-2mMx*~U?6pwWm;fAR?XOH~!2PV!8!D}eWGeFma3;+3f(V*NprQc)mIXmzX zNI^IEVYPf0)ukz97$rxW5siH)yHVG9Hl3_MXM%G*C|`;l$E6}mQk!e@eO^4cs1=N67i9@C@<0{&p6Lu;(9>qBBh7d9|z`zaZ7s77VzrkS2pJs&e zmHv6BZ$GqaYNWL2xv9jzcY&2^nm zsPuyC97!kD-?%=qOzB)VgsG-oNCS&PvGk~}aG_ylxG62mmOl5o|{XR!m)m zwJI-DnJ}WN%ycIozy_}OeKI*_0>|4Ro;ro`<9&DLw_;Otv9`-6~<7MLD9;u zHrH<52Cp?%S~7`cMCKXby&GScg}KP>XA;3zZR4&UUW)IL*noj)-Pv~kRtu|6Gb-_` z+*n?y{UN=sUKN&MGnC4SPUk{|!e22A@Sn1$Z*!es6D0I_hr(*viA)00yOA<8j1_mo zya~HQnNxm$lQs$wToCHEz;F<_Q?>V5Ub;kQmLgI!ed?XSQe_dYh@`f)BVZqcp*ww` zZy!E&0$Dk9G|51=XwK(iTKh+llH%kh{`xZEzx1>07uc|DXS&e92r=-Z+hzM#QEuQ6 z%tV&#Q0!`RK7(C^P`2-^va;X4%a;P3r|nrh<(6;NdMxw)g@zMTqz+AZkbcf5jE?lV z4fbHqnVAvTp@#BENci78blPd&Gc*{{c-P3wHJj!U$S#rR_if_c;Xsw?(Tl>-Grs3` zTc0?x`MzojT-f!DDlQshP|yMm*m>!};W@E8wZF204oF z^h~bWouTAt*NW8W5ov7_QF3HZ>{&j#>$i$M27=*sE%<0g<+l%-rD1>Uu@T+#rz8e> z7tlqDn0_ z$%p~;p8ZYg;bia^ip1WZWEGYOt{E4R@2!53za;fO1(8*)@y{iLnW5)X8h(=5tEMhi zUS0*CKA>YgKB;5DyI}&nr!0AQW%^TEF3t?uC%qn@F#L;`5W)7TO^Ghi@12DLW$atL zuZQpow3i?_pdrRPhf`YP$QcDN#?;0%CznPkqb8xIF|$0x*XS2;>T2fhB|F3Y>B4LX z{bY28a*GS>d>9r|(|85G)v|@(8-H3_Hpq&40xdk6hDdw3a_que-B*Dy0QZk73}Tpl zT_6dQeVIx*F^*j;SQe`tZNHS4M@&X{&7R%_TM#_(Bg}P;6~~?x2l=9x?(+v#pQe`@ zK)`OmsawUqsFbQ{IoVaPZD_DU$a|tuF5AsG4ZKQCYea7DJ6D#bWWekSp1j<4SO*Ee zb<-dLAPhd_{8|jy3ULIeowPc6-D=fva!aL#{a~GINDzEexte`EKVPl%1XA6x?9lN# z1eB!Rm za04EPQ`b|(2brUh-_|Nr=lA<;pSx=qMN;aP$!|P8pl-fLfOvtenNj$(Zkz3IiXJQg z!z$D~>Cy90NLUr+(-(`LlM%qcQf?dUugx>>$;(BP&B%A%M_r$d7gop{-)ca?l~&#J zwa$c}r{gO;4d>hLXW*ntX1oPPo(FcSr5o%1q5B@OZTiGC=M-;A_^Qbn>HJe85Xg6P zf*Iw;Hx!Hfv|`b^806;vHf0t~&tW^On&NHKj!l0819?#w6gcVJ{J;T3xef*|wr}p! zkv-8kCFWjJ3fuVC89_@&373_Z5R7Rr9Dy>^pgI(@!8+T(ooJ>gOU)~^-} zpv6r+G8E9Xz~By*iTV_?YfZ2o(5Wb-w~16B$dyX7s|I)r08n8!78D@CPcMbALp{Tyj)V}1i3Ay*m@)!r3* zi+U8>gLKDFia-3gZD5&sw)oD<*SDto%F{2CebD*sb-Q)h)SOi{^_u~ns+6&MPgex3<9C?Mw$;BkCz|61Jm^zl?<+`0#t)dOlc z)`QB4+9v?W_m{I^K5re^n?pUP%hLi<${sq%D04>*n@2_KBi^svR`Y>XORjGce2-eY zyxJ$e9^mk)p3jpi*R8z<>yxp#O{eRp-@UF2?_SLM_cw|jP1(A-5}V}*{BCc8+m%t> zc>$?WtmT(sAhJ2jU@s~xz*OE4rGT-aNy0^0ZZ5_|&Uj5mL2%I-*HA3{&J=@agH6Z4 z6}ATI^&CPMny-kY08f>W$`V0fiPCk{MnO|!|jji6ecEiq1{xS6b z#^3+1r;pHpi~396=hg576O?rpsFanEv?*w%Jg?-oVo_%Ub z+QRq99L6{61%Ee$kV|KEF3d;8&yRhRxIjfI7Jb(3e|Aw|n-KgQ!g#gw^_#T|{nKuw zmb(hQJ=M)l5KZyCbo-c>9qbIeNVGG(+RaTWRSy;x7TfE!Mw#g;8OFaf?*BVb+WbD( z-fJ}4G$eYojYx?uZ65yiS-9I;4X7GL!KK9mP z(8@c3|1B}A{6pAC@w{>SSRmDBZ7TggmWXr7ufJGJ+;%`nMFrZ0$e23U?m8P!{au42 z{ntb(Uq+@J%eIP10G8ENLqPB36C3DNjd|XN2$4=96ihlE zY<>+5(LhxyQd6_||g-?5-Bw=5kk+}vF)O&yRRB_}gmBwk*A za(426B_SblHfbAscS~2uzrCrurKF{~lZ7QYo1&$omAf@LCp!l}xrhkTf5CgNHtFic z?nS4Fw;Z7waT7WVK-a69HLav0 zp%#Ow7Ldgop#;>A2mAjH4lwlZX!G^Kju3TDxz>cuG$L>Nf~X^AZ3r z%aZu(__@TkeLZqog+r~b6Q+1_@wlcD3<(OX0bl3B?q4ztdwfC+vk~x(3)rE$GXrrTI1K4~vHYa5^?o-wjebN`(Ici9J`gb(8OM%C=Hp zVX6ZR-V_x&nq7)sgA*Bg+&W_|jdq3oi+q6XEe~4LMnQ)qUY3+8k=r%K{Ga%XF(ZrX zuBc7?yYz`B`M!=fPMup}aI4P)eE4T~D`!p2AhNr7* z`0phYHEAahe!xd6`IJf)bGQGy3baSBSv9JDSv9Gs`w8*sHz7Qz=#u2gJKV17BM|<`GS4P?%BHS%2Wz|6ai~jYFmM_}PD)Z5`p$+ZI~2%*V}gh3hJK zq|MYY@lI_gV+?#{8b#q7xXJI*NMVosxgS3Ekf`ax(#E96<4rj$*#!|6HKDCiE`NZ{ zLCj3f;=lhO{(XivK9B^H@Jk+wT)EsOy`>AI+^$sqp-DJ4lPil@V+vPpryb)q_=CjL z;iI_i$B|pQXYmhw&@B60bMi9ccqSQXIQXh^I4Vs>KC3K;P`~z)4aNx#gp*?Wv7$O+ z$g$f)wPWPUG}Uj`Kk^fQ%UHu*H@lg^E5bqdX{& zH&DjU+`IT)LA}gIUucWQ+e+<|BWc!r`{OirqP7ODd72{jlt+hdGGEkiO#ax~^>X60 zgNyY^jZ;JS(Vw`mkJ&dl&BJ_2fBR?Si4876%@6S(V0{h@T`za~l#yILl{RtI#zPbj zFNzT0e-5W0_WENT|B}Z?8as!&E3LRJxf6eKj8XmgmiNv6A&6`f+PJHkGl39eMGBYl zD@kPuo!VY*%;fF96@B0qarSxKEE(`rh}`P=Oj1bcmz0o@45P?!yia+8!pgI)bUoXN zU}g{5W!@?C^!T~z!X#g;lHNmh8c0KRYX;A?$F*#;FPl58_R9FWqMQIogvF)_B35P0+KhJ)aX&$s>94yzQI>Ty!GE`$kv1NYq@a& zz*jFANoAUjU6F510}Xm58_amYVXjMTbC9_F!-~7|lWEg@UT23Ues7vpJ_bkPu=nDt zS^U?WXy=D5=97_oBi_Rjvce=`iATB?ul^to&kPfRba4~?$7ON4EC3!$hTEU#W^f=C z*;Ie3N}*p-L(7i#X=gbr>UF;R%%9(G)}bN*p6MbSgmZ>G)5Vu~gKId9;Tmp@Iw|Tw zDalzv8LhJ{j6P%H&w|e)@RRWu(3374b{mL38i#NULAZ_`u50tx;|pG*^$5{iZh0uO z4!DDC3vdLg^s~!7?q_zgp}dcu1e!!wNi&*%8_P&j9Tu(jjyDN&%}A_K-MOw&m4`On z=M#P-sW!krt80G`${L zimla4%K}ev@U4jZw(P%_vt?$q{Z)dY(6#;P{sX)H8v`t1mF~ciPJ%&z0td8X?%l21 zr}46}KruaY7^qK7eCyR4R$5I-)Vg`SIzwG$Jl%49U-?(>)6QST?ba&1_M4q2`((*Y z&Xhf3d|OeMP><{O`I_ObcP$U4mQbVPdt_w7Cq_Yg8EIqerV{j$%-4YLdeNUlVs*Y( zWwlT&H-Pf}Lp%$tFQ=&pTvd8ys?yXYbXKkIQ{@{;(8t!7jw_2D3SDTNXnXwq@~Vr& zTbMr&4X4ohxIyW?1#V`3Hl!V06UbV);!``Wl3zg%1uh799DDH(VrBc)``{;xSYN3x z#`7U8fag7U;u>E*!*sthd~^z+dW9UtkF%hXsSpO8CuW(ag@eZsNw^?2=cf2f9;j0`z}27I=96 zCu2d=#~ETB=&G36TAI6)vuSvkx&Nm|&cW0Q(jac*?xt$#D&ged?BrF}IX)HTC)bVt2?|+E`h;lXGx!BK>z89Ih&4+1;ifV=lWmG zk@NKc`*|;tVUR{?rouXc{iG5mBFYXJbAm9joFe1MtmLvXEQS@e9I+%EEK74lP^f1o zplcfp+s6h|7=;*+R7EJk678`5`_mAcPRowH06{Sz52(;ac5ZaJy18`e-{U0{)NwDk zy8hs{C2WHD;2+TQdY>?L=zaAHyl8Ey!4^lL2*LQT!_zNX%(Ey?)lBWk zM@E5k9PxRD;?8W=hj7Ao{;xkU7G^KTR2^{3k0Y9s<>k_RC?v~^ZQhw^5=t_3sfe(L zn)})A6j3P{jnq=pc{>>@QYG~#3Zxe~cthxuns;_~ED0-Qimd-I>q|l_qEXmdvP*dM zRJB9`zlbaarw6vBg zJk%X=yD0JVkhIDwo>Y?6Ay-lhsBHFRHWP!nt1JovUm^G9~J$_ z;1;R7wv}A(+gj|H7Ga;-;obC}(|`lxF>}(X(MoAhfy*@4gGsGOPibkL{fd~<>Du$7 z|3kpx9skH~6iUv!-uqpf$sL`FZ^Pem()a?325U@2$k-{DCg&S;Y`{L$dg~39%Ul$IRZwhOdNvu3(86o|CgZb| z07O{222LAWu^zn4hi!*X58Tx=%z%zBGpRxvdxgBCVMsZ))tY*P;eQCr z#1}?{YzqX+qt`KbPPP4S1RHyNF32~(m$vIQ7jK&AGqOMgPkgG6s8EU$W{+rd0za-y zZGBh(;0i4?)w5|O%Lju992^}lP*z6cNDo68B1P(90KKjNv{H@c7ZYAmT;M6o)Z#+S<381S6kmT$phCKY~9T|eZ$ zJgjyYzPUKN595^1r(a4yGSRMc7+7ij*Q`ivz(x5e^U>Z?6&LB=6~~at$3D^lF~}AvR>PRFO2Tf%grD| zZ8=Fsvt6Wy$bE-^+e-tqN#&wko7QclVIZR>iSnJKMMpimqJN+7k~w-w`STp$S(c{^ z9sFi=zA;5pnTnKk!U6g*Ucg`kxt^2z(~@7Eto7F#a^=p!1J73_0m*It@-I@ZH%hxY zIm)@f0Na-zCS6ZW<8EMzr>a`k+wpSxTd%;{NMhco>iVE}T?DOCx4X3wDcjfCm!A`C z6I41???H_h;Qo}(fQ*i{Cf491ueG1pCtOaqz|~c48~q39hUdqG=lL7sBeq9$yIZAt z0Wb7i%JyOhz*hkEpZ^H#v7&Rb3smavKfO=K>vEraqd-?pAJ(ZJAuH`J=; zF+{@uOphP8*wWt)Hj&d)GygslJWkLt57#$dQl&i zFYfjJnJwUP;`&=#{8{xkE+JxvIdL6_*H0?;lNeLjJJWA;#yyCKY3ZP~vXrsS`8q6q zdm&?xZB$mPPAbCXJ*a>Pa|HP^of=tIAZis}EMiqzt>I=96UEfIA08?@iM$V(~C|1_eL<_A}h@}K6e#Ak^d6mJ_pXj+lfB}q7>k|6=Y(ALCuJEiB7VU#ONTP)YiwGR zAM{_Tto|D~uy3zYN(=FSZe^*EU;eWqcD@*DOC4)^y-;uxhnh(;@AwaxfYyYi0&V5j z|GBxIN0aIaF|ig;i^hKMEH9-A!ng`#Riup3^dBu7h+uQ5|Gk+fI@H#p{U7p*kbi<* zbmo6b_e}FE{@2|LzDdxjOuB^RA2G(|w4&fu5?%;6dSWe(7OuVGq8J1kEp$XDl9A{C zWr4L)yu**3zx{u*V0r)lV8L?o|91=aGY1#@|FB^B{+9){^K2h)9I4IW7oXh2jl-1( zpN9<{$5aKhLh?Uml1V!FS8!rQv>$_hVSW!3ZAFRv?J9fC3@shfx*h4-K3WO;J)8g< zk^X_OhFTPXf@1FiAsvyLI%s@NYhfe(o4^SBF-gxBpro=gV8KYsC|AJBcKj>Cck=)I zEEWiEnBtHziX^giy(RX!O|d9Ke-Qq`L72_%8=)C&OJRqjrP3jnwUYl_Rzyle&DpXe zj)2H2(JdO66Iv`K_&q}0c7mI;MOvT)KEdJ7CxltGZvqK-o|ftji2S3(@fIJiKYqV0 zL>3bhqta6MiVy466ZLM5w&+iN zSyZZ1i=Ho7O#XO}FE29YY| z$U&|cf5bx+@h0|d2X19RvQ7~oDl7x z|DaH)@M#HpZKkCjMo|}IlwDveKbRjZgrRf%1*Sm#4;K8QcFcbT+hfe$tf6p{`^c3-JxcK6-&V>JwqPA#Jk;=`k$lRBFXtxo~(= z`R;48QS3&x)1^VDX&?Ndkn~CPQ@@pon>$5qp7F!j)Duf$#y9LDefrF}!f{Nwuik0% zJHnZht~&R;nKi41M3e~PnHIGcx?;DjKB->Kc(6S;c$mxY8@R_9lu{CW=M?HrA}kwK z=AqdEqflZ;O>;&^*<`G8hc#JO+gx)+3D3>sxBMEs>NnSo1UaAPyhf8{5|*SYp{37f z4Ka=IYn9GFyT?kXbA=-HReF?~3yf?k~Ea{NR;N z6%nT%o8Ws&Q@$RPUqxz1hfr-^&3aK9f`I)vG9}T0B1jR5NI|uTyF~TCIm~S*GUIcq zAr!8S6gzj=Maq?DLj5gsrK@_44pU$yV7qvw6-j;t4*0HEHqy2`$lC z0{GlgbCJ}iD6M+PJI;TQsC}lphW^LZIJ$V8K;U6-TQKCK_nbqORRd9Nsv(!nT^`RG z{|`KAD>!45WyTKdu3t-X=i?Xa{XRk_aVI%*+WY-#B((AR>pzWlaGkHM-dj&t)iTrl zah!}*ax_n1I8uDQMm*SwSDSaWjkdgSzWuRV%yClfIZqK`DN{j)NSr0^Z8goE*IA-=L>C876 z#=J{wn55+Sf~bT)A1WK&Lf?_P#yPim)?kz0p&M)J870LL!!I4_L-zdS?|tP{o>G1; za@}%WZuGZ$JRoaVFn9m5?>Nz(@3It{396o--?*1xVQ*t&lb@Nii$TN+W`5OIveQKAr$)+ALYEXru_x-ukK0*0g zmH1Dr9bu+xeBDrM{i15iaQuMn4{yxf3g`iQMm$oTOB`D~_RrtO0aq`^6D9{&RmUr) zjhsjS2YK%u6vfxAjs6f30RaI4$&xcjP68%!k}O$~AYq0Kl0}dx8Od3KWF*XxlSIim z%nVtAFd!f~-94W7eBU|et?$;Yd;h%D6a~}WyZ2tb!n2;Wx|`QR%;u*n$80B4CPZiY zkwUYXUPe>9`n5$0iFweU_q9jIQLo|Qc|%D>CDGfmF{l0z>xEda`^agIut@ITMt-|>Gv*b^g^M=DaJ3H^hv!O(i#-AmouJGSWi&DJp zrf!uK-QRMcwza{iN>uwnw~uXnzRQflDGM@Szi`)``=9#NY)K^=03wK3Jq;`-VncO*{l9GURMt06U|lzyME>S4rUt3!V!d3vN5!|x?Ah~ zDECvoFZMb<7sclOkbfdna>i+3TF`cv9lD=?7CyEoS;k+lu=HC?y>pPmlWiBI_IIQ4 zpHj)RA@$z>hxzzAgt{)twv*wT2Vy-8FJ$*?OWM7y5*uVSR6yt2Pa8iG8j>o3j^gld_JD`s%0lup&)cwn*pk=TZ++F9eJn zx?g%1O6U*RG6l$3GPrz9Rc*qd8!o4mZ<630w2++8QCgr^!ztDwD0*#?v5n96ZOl5L zwbkDh)xwI@8$9MXsQxn&eV#>pCN14BoOXN@2kOINBOz!(S_B2#S=t!I$OT6x-NPouf?U-k4H>?B_PHA5r=}Nd5f5z8pe1jYw zv7XnR6D0O)Q+RG&HdPKaF0<;vP8*tIPu3q7_BMEQ>mVxicTm2Xj}%_Oxf3H9>88OD z@-+!O!)nn)#02-J$j)0+PmOXth~F#v_WfDfd4w*XUrrDMhcH#i&)Tec_b&TPCR{^{ zCqpV#?aiEnoBagqCKIyj+!?&H_8pB)U-&)uppE+sS#&c7T(T*0X)x#h^`WXfS09zv zj#lj&>*;(Ce#ot1Rr>`?ItMTWL5W#Qp>0&JkxLG)#Y?LGWxhDI^3Nk zt6aCjA<4-P-#$gj&2hhcrqODZcx!et<8$jT%FP&VmA+fb#cUtAYVUuH|LNRv^RD4n zdg{pTbJkQ>guQuB#Y7VWE4)IkN^alG`zC!AUROz4gq|OzN1;;I?ADh!%V>9>$2N4% zDv+K{ZTFef;q5DK5$5WtUldz*?1`VggxpLES>O3IsFj|>n~LN6P_+1AYLZufNWO~1 z4!c~_`y)rTIo2j=f<2+gcl=K_d~HahCvW>5jvx7N`!mHK{xpDl)Sjp7nAux*DOk9* z^%=%*@e~=Y3dw}ttNJ zTcC@7JU`^^#i@VYM!OV8xqG%7`~4dgV(R07@8ep{&)2U*-2GoDFtX;xZ|E9k1y_gN z?Q>G)#o{)}k7|ydn@-$6;Kh|M%?x)vu{E0MvAd2@zn16s{Y+AO^6)@nU|AqU`qj94 zrujT^im6ui^J+-2XhKa4wOmL2m-LwG!}N1sdbnQ z2}Y;Aq0a~2FuJaS8cBWhC;G(RG=>!j2xwHUVF+^3Tc&YCCdA}CsNO_Q{al|4*;!{u`6S?UTT5_75sOCx(YwClhmV4r}?Z(Z5 z4rr>{+gfpX3J;%C(wzuFeara$^n&@^_Iu{u?zW@kx}87;E9dJ?tF+I$^ARsu!tM25 zo9tt2l#gw*-Xe2h;fQL8|50b#-lDHvnK#VMZLA@)c3Fo)YYo)%X?=8UyHeq07c5&R zZNzhDJ-Tyn)`=D~Oyz>iXnJiYSc>s;So9G@r=f2Y`cv#hRMQ+h*@oM<%?}*?Y#4Fw zsjU~XmHjpE217Hw#xaYX*$@@ZdKR(6f|be>K1!4*5WJT%D#TT^zrAy4bA`>y!~d|A z7rA@EABCv6Fs)(tDW|U!XZ{==H5_J|G?zT=4p9i(k<+))@TvLzHDp@*U#Uy!nO|Cr z^Q27Q7X$5>gqV`{ZDri^j>qh8ZlKCJ!=FPUk7+V}&zn%GypTlx(Y`8c=dF7#Q*WT& z(r!A9>n+)3Ke9+gZhi8VIza?m8p?e_QjYwY3=uW(RN5w>S#Cd#uuqDwXyyyxaubMu zrbJVFT0{Fr@%!4x9eNiRM!Yggy&=VB`Nr+5Ju6B=D{ySu5AWJ}>5EF}_`=v~ z>ACnffpCLS#Rhya3tiMx&*cA-xm|Yq9lEOp^nP#k>TjG-#4G+vQNb`gZIS9Mu5s>r z&}>4u^;_Se&^>Qb;!~l&QVXKZPl-M*&@Apcf}mAnGU-uEwAQcX(Eu{B1al7xOd_eq zb;Ne_|80url{CSnRxGNoe;P!8rYvde!%U~!5=V4^4RJpnDacimOADXp|9_e^Lhcud zbYI~A&9{k^q`&^7IaY(BG`DfmtM-55Ye3)M)Gs48)%Jyww6dZF zwCm$tQsY~H6IqfXk^f00{N4L9CiTCQ34hZ=**w$R`1sUCaSahSD_f1l*h#ehrn-}p z;)gKhUtaq%9`{J%u>OwBS=6s|(*w!Adgt$VHuNoTK&i_1%b69b3LeG#QuJnY`qV?C(fdWchxi1yW#P((0syLhFm7xJLq+ zGsTL|Cv5@s$xU%LA-t8SM^6R+X2z1NZu|nt$;?lj-X;o25}>FFG$i1iK)0$dQh*{ItL6m_-sZHuBYWo%t#ULC&rvg#+1)Ewiu*-X&!&TkC#$` zy%|cV4>lvg=COz;Yhq{IBV;suV1zm_0v+Q4O|$eQ`G5Pu=#!|& zd~l2!EOO!n)jf8Fa`a*4}|~8!9Cb8Gr1Cy9|vSbRw~ ziV|L8>^@6M9oE+IfY{Fr>!1dvbGMCT4 zsh|Z>bxUBrwZvUyrBkWQT2i_4YHM}lVd@K#9?gf3*n4u_;#}O*A#0^klU74rPDNwP z;Q<2GRS`i^245lsvZIS5%n#l^>4F7cCo5)Tt0+tMeSA?QYG^F{p1Klo!;vaprHx+b zh|l8YS1N4gukW##U^=|&&XrlkWaRC?7xNOtHSJk&tbAT4-Hs7?o^+r2UZ)Bv)hg## zj@MsRHUiClGqRT4=6b1tB}%^i1n>NI0K0OV{3Yc;+e|9ygD^t&Z`xS+%JMnk_@X8= zF>^NWGi`NBlT~Mr-YO8qv@txa=B3?Z&F#nz6||y+$s}_x#Z35#K7Gqlh|@U|T0x%n z4z=;%y~Vk3?2dsA|8MqMLe@@ zt#5TRKWtRbe3YV^)ksX0c4wz7?dmA&`h%@#eGk?UpN594y5H%~HK+ycE>%hNWVF`) z(vK?swQ7Rn)v&ade}qVTXNljvc8*}SB@|RL5q;1rUOe^w?gwr|><_nLCc)ZDSOzKS{mA)pQ+M@~_hSqv^8wifu z)fOK4FBR-Iw(=out9M(kXO}|052Gy3?$GR7QLc{=UCOYJ!%?Rf``dL=yX5lMn{LOO ztG{1eC7r)A!V({m2t?ua9FvsLWxmGmbu@JKmrNTJSP3!Bpk~o7j1a69glieq&*W^5 z$u;u*K+d5bt48zv5Oshato`d3b0z0U%YmeR3mL!J*#9M><#ITFHmUE=E5D;6 zsVxtB8Fl}RmQz@X6Axgq-Y!@l5!9{bv8^c|ErF z75Zc~_rM|A)T6NW0ySiRk43XsLuX1+`0O^!`!>sjSfXO~ok!#&EMb(@pVEDT*pa9cBXQ79$(gU6t#)6JY;?jIh>K9c-pMfZ_}7}rkUaRXna z)b!A)Qn7n3R{tfb&_=@Xo6}k;v{i^sPoUO~mt=m5x(ov=N+Zi_%t83J(j27fzXENg2j9J^Y?>6ruBAVJsB=IpaymK(|Hj3E)S*#`W#FRS{V$MP zX5Zi02^pJ9&3kD#)k^aqD9qK&6osv3$tqC-q~ngfq}9fKmrUR0nDT?i$7mv|q{k<0+T!8p9H{xpdB@%XNtHOu)+?$)ASD+c6ikFkd`XsmOmUu<@ z*98kBp5g?$xQUFx7P4s0@l_JNikLqVkCqi4Gd+fz7X zuH%R1#ma4>FWn+p*cnuJrNv2$9b+D(iqkfVhTrUpsH3os_jtJ$czUdHAj{vaR!-`$ z82bAG$=EzrsEu^Pq}pUQO}kMHK>d|!bW$tNb?9p*xQMKJX15q|? z;W=T=_QRpMi2-*PlO!+G-WyXi%$2pNEl-3HpM@%ftFy@!CI>VtY}S%@ic&nEU^PnY z^v?*p(#eKBvC_Tsgbp*}Q z5uaKkQ=$X6ss7?XKARM0Dd%GK<+n3;F+k zG!iXsEus0asv?e}H){}{03LJxcnbXNVO1TMa*~|FtfcN1uX^s5doTr)`MBDN1&RA? zIdpNyyWgu1$Re4SD@_nmW%RfqizUrTUXHYjh^t&8zT%3zBv0Rx7 z!IsPfvivoIJ@JdgYj-0xD`OIZCk7qY-=^t*Wa96dZ<1u4;^oid*xhIOu}tKT8;Yj& z)u4*@ReYQDeDpbzR923XFSHXk7uRVgD`vKl$UA}1>!tCJ0N>mY$$L>0ga~bi7c6t} zlG*P$8H2rgJ+DoyF7PzCsT0AC%XBZP<$j%La6g#K={)QY&;IRiA)8iE60YB0c5l~8 z%;h{!iw94EPf{XO{_ace&*4jNCPX<}` ziA-00)0@qPcXq=5DBdg3RBk$)R|#eRct@M9>2S#V52u-r!L^qM!+6fU0BJQX@lO29 z+Uzhh@?skocD3L!9{e}Tl1mJfSnJ4Zm)M6R5?K>WuRfj1P9HKoXfeIpYWQNab+xc` zu!OYUp#J+HgFJ`Sq?{>zOkC0s8_irE3Gv6(jM2}rDRO)}&`V2cA*dXE9rtpK@-Mu^ zU|J?brqzNKV+5W?Y3D0D1D+^!$SdJ{bf-H@om#ukM9%5_7BsAKR;#q{P_ch%6gn@n z+~aVz4tq&7v^x4T1uO6cbDURu+rlQ|-t(ZMgyi7!3&$z8rEh<<>ux_uzD}Ei2gjXI z3CiF&k{vxYL*T>JaU8H%5MRFBOOa`-WftL2D;vss{Os(9l8mJs$p=QhOI<(l)TcK5 zLvIC*upd9|-;ey+X&6isw20mDv|antx`adYOB{`^Sqjo)xUQy+zDV8Mk#hCkNnN{s zu5_MI=to=XpCkiMN!ales#R`~Xf9m`^*{Mc^X839Y5T!&Z0Ls6Y9|zu(AV==ZtUJ_ zua2tQ=Ol;_Y$Q2cpT>d;TV+|jdq#BFV9za2b5+gm=6bLY!?(3veFmAbweA+FJlZ{_ zoBq3{c0qkH1TyZw)gI;&v)<EexwABxYhFu#?Hnwv`^kHW zm7=+3^`7~bsb5S-%rUOo44?H}KE;w!b@R}tW$y0BbJ1`leDm}8=8}QlcM-DsWu!&j zsl-v#B$A)RFZs_sK?c*uava))tum7LP+9$Da%w@Hv9>%X$Zl$V` z9vUJBu=cgDC6`u^_jUCCK}q>oLVlWp7eT)JwC0(3>!yAG3;y2JHkz$l&D20;-#DPf><^GA|9)1;rH zaLwl?os^w{iKyw>kReUUB*(WLrh8;YKVB4i<56Cv82gI(y~FaRXlagtU@e zQ&!9%GJ7PVpo8uVyR_K-%O^%jt1pHYRwtJd<`-Qswd^G{&HlWo(1R3p1s{)BSr1~` zUIok?OFVe0p(Sa@O*okJz1n+5irr|{V~F0_C+z3FfAsSQc~tGX6^05_0;}i6%pHe& zjf5&C#q5`yI{(Q&it1>I4nin?Y8345zzNqw8zd2in@f7)a!ciz9&G;TeMP)<*V8&# z!BOzt#N&d-*zu8USUB>&KnLAuQ!<4TJb>b3eO&x%R)XPOf`HH=^d;p-y3j0ir=6nJ zk76TN#gaAS8bU!;n_0&we1gPoTKUrmt1q}N_jTk=ba*=|eS<0+I7x6>PTF4-6PvXNGfo4xQR9uv6>&d!l?c2q_qxkM z?b7;K>{d+K)W17Tv47A1|3CKKYbiYaKX3>CYP%N`c=*4XmITCwFjT^S^xX>s5B^_o z14N_n-jV;zx!y~Tcc}_tVdts3{S{A2SnDqN?1u+ccpuDf2Qc-L-oE+7aM9uA9ixu8 zn4ss4*?RdZBS*!<5ZxNja>(9?ktwclOENNw3XU5%caE-qac(*d4fGjUUtVP{jI(#O zty);gcpeOSTU{OU|L;C~((-g|Zc2Vr@D#!y5|PfEW2}T?W$3BextbZ2d7)j^=E3^# z^+DG4gvGcSNL=;Jd|6xmQG@ZdEK%|qk64VGH!gp)dzT)u+r*Yep)mKeKgoolWbKHm zmdSl<+RWcq{!6GsX>i(<`<5ZZa2xt%ek7yj41Y9>p>gvQjVlMIj^?gVu`t0ls+|eKknNz&g$EX2lSVtPT z6ZjxNhj49ewe|20cyOW{G;D;gE)oGgiEigB(XyGsHgWe^6u^(1+^oGQb z9Owhxovki(SZIMDV372>(1%Z{dk&V@70u0;7uy55xw*&3##pl4e=j~k!s-yeDKRlTo)Ye4BnxGb@p;$&0S7%-OK_~}oUBS==B}!$+7m?w z6wny$^5~iq39CX>H0_6r`^iVsqc&jTW>wYI(X4`*QA+}wN?e8-^9@pY~I-bK_BtZN<4 zuAV-#aa3;7_@lqygdt1ZiAhWhzBk?po9La@6Z2{$#bVDAZZ{1b%Tr=xUt-(ptO@i?>!r8l)|MBy?+(R8;Kx@>*J2UNa^3ogS>OtgJ+uSCLM9 z*Z>z*pGGuu!9Plsy9b4yo16R0t=}Lce&*pb7qo8^szje3yS~|GoUO0qu58%T+D3lkx(D)2skAocIuG7~hrXAx z8MXSHR_Ud+xNgQho;-Alfkx~ut@g!tjTpW#Fg6}=Q?eU!SYKUDj)-{fcfQ&C0Q~Il|M>CaCGJ~JxS9XuVWlJQmD*@;ZzzYt^PU!x z2wNtKOVJtilF+v(&W@dvV_EtJenhR{bGU1WjoJe!%@AbXBM^~^UEk&#rS_?J{@#t0 zK$}+FmQw+en)Rn$Mh?xo`p}-99+j5f3@MLg;5=Y%NO}SD=Zo0(N#TQ1Z&hoeo2`|e z=kdPk?(*PdWtGc%wi8o|*9k#(Loymobad`Lm|k``q=nx3+U&6-L;`z!pK<}7m&XD@ zwE%@;F`KM>{T*Xkhy>{MVTFI>r%!)qZ1?mFbW_`H`Oz~7v+p>IyoNOo2N8~#-HaTd z=f2fauMg{bRH3z6@#%h4d@bMN+0?XV(Pc((<(50&BL14`O=#l|HM(bHj>Jy0#8T?D zWsq!Z<_y|hWYb-oHjaOBqDUKKxR4icGjFuWb={8O?fkT_!|_YYQWbL$RhBe$4UHbm zD&EusrQQq*x+z+(aQg`u)PYmB=M`DNatMs?o_3eT++mF(TT5)CiM39R*v!3kI?@9*Zk?=1o-$D$;2eBn=6oBsYOP!;01Fra&q#I-_as= zQ;IMV=T${;TI5t3g2DGsEJOck5Z4?1f9z-MqW9!>Syd7@T)>qBXAJ2>1J7{&Esa&Q^g$kPOahgvmY={a7o?Et6>4|O`1jgDR^V>vPr`ixI#PeRj{6J zNbCN^!7#3~M~g$J9|?qrd6;jQf>pad+}b8P|Gf6o(i+9P{KLPJBdIH+@w z)%_S-Os4BR?|81(PS=zy6mz2a`1EwzlP~x?W+C2eHuhS*?9I{(!Q;U6Frp(8$G&yv z_OH!I5A}9Qq4N8m_N#_Nh#BZFV$T0;j$6&dLQq^wO&6;=-B zvUMbbr5;}#ycKWFUlG-Vjb)qerly&@#$t9;1Bm9Fw8uUpkXc<;k!k;ID!N)ik0&@vfjmf zVEf#scPw8;dYCS4ut0pkw2my{ZH&;o?Ad6vPpil=z#S35iuB+{a3~t=+I&2}b-r6X zZAC-(^7-W!GK-tA373fW{y+@I#z&yCM>B6)Tr%R~mVfF`baXuJYW3-{xR;ybn;bPJ z885Zlq`jX4pZDSh_JoI=Z}h0xB}R~E8R+S)`I>%v(-URFpZeAJJRBUqjU#}HLd4g%X)e$5*S%7WbOYfzrsksyKb)Aq4 zgF-Ool?5fH6(3P3SBRpenmNdEc5xwRtN8+M*%|dY-GugiR?cS>1LvMcLgTh}eRsXv zA1QcWob2siyBgv?%1Lc48_U=k%8*jIveVO}_`9RuN~Bm5&pJ0he+3aAe4eY7iF-MK z@ZnRpss=;`bXFt)T*n4ygiA`+qTvy01B*pOM3){dA@xs??bOCig9f<60w2+w0=?(+ z{Va2HbKqaye!?tV1svv^e%+O$MI#@l{i-R0CeppAo9ADXSe5bEp#>-QLnhK@itL-al9nXW>nyxrLo^1z*{;K0m=^a}&y6#37xs@9Y`8W9K}Bk(87A(?UMvve2a-7Fm6uHh5ET=NAZ`BpW0}9_@Hv1ABU530|9?W!=5jKXe1m48??fP*dD@$ zb*^u)LRZ{h#User)e|JN)}_CPsT!CrE1R1$fw9Vwi4v-f3tgP5_3}j>7-KhLk&;4G zM8pY>&mp&>og>GXM@L7&bY43fEjubJhxhVRzP}oHd<$V;EKKwC7wy*1a1t($ha7>gb-rS>q8@R8%cPF$4ao@d;WC`hSlZ zftax=Sy(A9$4f|a9{T1=1q~AcQA5Yj=R1wjRHVw6TdRV@jK{Ie3P3o49^SxtsHsD% ze@Bl!wvE6aPkoF*>~V;Hykyb_pm3GZop%I$Ba;Oq z$79A87s3L;A}SFYvX?bU5pe@CFQ`-J-TmKA-&}@$Mn#2%#Wv;lBR-(_O2n}^2`6!W zNP8avvEnYmEY2G0>SjJ3bw|=r*=tiz&Bna~aRnTtmx@emr0w%mu!-rf&!^<@{<9H) zIP*BqvXyHRHWOvvI;wM8c|<=)GOVOvBhL5Ymiq^@dS^K`4HlcXZ|}O=)!GO!x%rl+ zBC?7;M^N&I>#twB>@**n&PK%DfpHS*8(At2m3{sC^&j=$Ao(TG7|N7BPob#)i+(9& z`ER1iqst^TnCkauKofcZ?8J<7&g7PJgC=zgLBc@%!&Y=7qAH%nI4V!LX^@x552Lp3 zUl72_|2iV(5+CItJdQd45-rp5_hNlfi1t#43e6Pgd~UhBin%BS2=zj3=b7F+Fap0m zPI;SmP(vnPGX#K5nDE`mYal#UVI~`mdnNDetXVt^Us{BTpb}|?fU~hiGvxnjAyn|P zJ}07+1Y$hj5ech&t4&oKkfAQH4Yr$E0m9x*tawbNKv-)u3p;A#r`0F-F5LGgf7LJf9cA9J1`4 zfmhOVX)GuRZWql552{<29_|8BALzDN_nOne(Y3|Co;s8A;ltIV77zi;)?mwWO1BUR zwv*lzz0DC!q;RLkus(EvyGV%~WhlTq#mq637) zEjcF9lS;!N!a(TY3%styrFt{J?CtH1h#GYPFJ0ukXq4*T`;kXpoLNnR29{?pUdT5E7Pv*qSPP zQ>j+uMCsgE@v|EeQAfAw$x>;brseBCUyYd~*hi3(HQvzq!wcKeB2vu%s&OxDKVbf> z!TedgK9uA?d=7A?BZ3JEvMNOne^t`LTlv9hTq%-nTmW1_QX=Bg?%7aN z@rVTK3T6gfL;O&Lo@<&n7;y$O;s->bMpoj^Nl39cGl$5A4j$B~9TQdrz(N?)oTZ^g zy%eYTs}guvIjkB_Y)T{OObi1t_deLz^b8F^{OA;66B;dDf}(6mX&rd*#lh4Y2B?FUY%lkE!3 z0A=NzrWOCEu@w^-wUrO&8HrVftdOGl2*6GJ%w@^9%2@7(XgBa?AlJZuz=NH+8%Zh& zLM0Sr@(b#PPmwOeOR!VaT4mwHb12|CmSBCzL{Cww5b6A2sBx}^5*{>d0KK|u0oG=W z`Uns~nsvOU?U@Qt1VMOyAcP|R1uzZ>5Bxl8CAo0IB8kljp$gU4)fK2$E80Zyad5Oj z#_Q0ol3=0Z3;CT^)k`oNWXsUX=6%}V38^{X#`53SL8#%0QINtcMBZ6S^y8NdE$xO&v+F~%I>-&UC7&`; zM%So%5oeNPPgmCxOais`qHrP)YFCwa6aFj>T;C;8%(1tejjWt$;G816Mrm8S#y1O5N_(V-j9UdNTYim2;^+79^;zx=Ln4vg*RDIr`YJom ztui=YFfWNRW|=#fV8Bjy=~-} zrq$n&k(xS}ZQgQqwsk9V{}ArvOMCIC@5g6u69xux$L#Fv$3H#eM!zTk!6mvG{mg&A zmdq~Ue{}(z#n#qV7x9PXW%I)d6)ts*Xek_xegZKV;MRHU&R<+yG&MCj9$P|istJ?yUl02@)E!!myb#+TDVSA zBETN?^usvakni<$bacF)`#4~vH7?XC89Z_Y2Eb$x9$63qC?f5zgw%o`4pCRXzY{wl z?n1r)u4c-$5nRhU2tC{-Tw;z>q#02x{op=4urJ#G;>|FCOi;6hFrcGkt()>dFm-gQ z_M&O$rYh>{?)AL&FR2)1BEi<`#;ur`RgW?^K+f*)?fl9Wj2y`B}3Q#dTRBOm}*>iTm&fR?NtosiQW zB%}^NX3ff-KrYDe=-o*FDoinNbxmm03A4#w01ryjk4{LqH;nkFp%CoDgOhg;;6z!d zO2HFAv1p@7fVb#`a-*hiz}>bms38pb)P5HlynP7pp1|ov_#NkdMnOF?HV0Eh zT&@oQaf_VFK>!}}x1Xk#pHkmNmdmQPZE6<_AO_2Ye7nNQx%hE9(f=?Ra4&mmYR#i( zSfYHC)!a3;;(<4!yO8SxRDuB<0e2YAS5gMJ;BXPfACFLV0+z|=Gk1JWvV<|jS_jo! zO1Q2m2nbhJL+KJN#ux)q^U_3i(+t)_Itz9Ty*lt9`Ma!IVV0;^12c4wr+cC&yWL?TK@V4=Y zUzqh)s>g+v8dL`tfq087`ixa~322@bm=nq>JWWeT4az+j#m2%?=WnR2j1S#vM`Pm> zok-R5%69pVm!%UVP`f&NZ_j+IDm(>tt!o70N((zL@1Sq%jJ+ts-!WV?pe0QpWMQ{( zNC3);0cG0iC#}tzKwZ_`gX3dHfSd|M1gJrUy3~qn*pw2WuxLbqtC3_EB>Ly4>cz- z@I>9{egI#BDG zY8d0~;CM~!_?<#GM&U!q{Ji|3Qb7SKz`3~l=Iuk=f&=`t*6Rw5w&~JNIyYxMzq!L7$ zG*v(+1Su#hE8lQwEG_*6F5Tg!JB`u9t-Fp!St}6zsR}cO)S|eVn?v`M-Mr-lnVFfB z$!OuV&gU5(^RfBfvsIQ@b#x32!!c=E8AmOjpO_AJKrWkh*G6)lRk;o)3oze&wsR^a zVa74JMBew$d}#opp&@!}Z>7g_lU@vJTzSkD7QXD0qZ1O(f_0(JE76$cf8~jsI;wBW z6iaqy<>v0MkoKN7@elxFxJrcd;IwY&S6OX$(>QcO22pys0E!5GEh1GAwkFJPptc9p z^*_kOPd{$1VDkRY8&Ke(776O9oVAM~A!{Fh(YY^S>$~}eX0fV3+q)rs6=VKq<5`Y?OpXY} zg0Z7o2BK?iC&NqP6Ks(u6L*PVaxAUE3y$9j>&l+NCPA$5Jr`JobBklYiC;($9au?Z{FhsB-l#MxCgse@>aQR=^;hK5lok7hXk)C&`u$3 zEJJL{B2@Oc)fXDI7|*kBVPSEi0{>GVf2W>Pw~!Z_knRa;5*VZ`m&j-GixLG`;j!VU zr2=3QZj}JKxEihMx1N389>fOKB400JqGwR$@2HxiI2Y*mV8R?{BWL;6!zrV>GJiOx z<{%WV=hr<8gCO#B>cSxA! zh4+s7B!(SxLAqyj4Ui{Dd5!uYtPMhff=z_=_55P_Ilr3d7+Yz=qE)c2uZ~**|4^T+ z2QW^8D7(rrsG8Auzz0w`-l#z;1)JNyoQ`xucr%G_6Or@l11cm}v$LQpbmH)vTQ|Z~ z9tGmXn_e}W`-lVjzA$nI1_l`nX?cm7d@b6I2zEdJ)Um?ZmFb4wlkq)Myf!ixT&K%t zY@(%_YKJKr7#Jic-dKj|L9;a9y-;7Vr?I=iNw_s9Dg6MAOnHg&ZGBS-2{yEPJVrPL?v7^DX#-13)j9xqS>Q5vg}m&xTCZRgtGG#KX+ zqt%)^rd3<(Kc95NZ@-TngKp)_-@LKhbeGI%3XIdjHi`PPub5Epvc3#JCdKAhegqFn zkdlMFe8nP9xRNRk<44wDt61&sjdXCeHJBnG<9SfV*?Gb-R)3~foh{yoLXr2Q0H7%2 zhRazEXQIhaNB4)6mEEMCkxl`XEE9vvnS#pnZ8Je1EOxg1mf@JZ{Cp7pLi!-Fpt^GQ zTx^{!zY2noLr{TaC>z1#&~j=u4y}d-X*CbU^zz}9V#sB(M&A87y9yDtW3`2Kmi&qH zJ4#ko1?tG1g;rT;8UhkaEOYXH7O*OBb!ybD6pfVtuDLd+#pEjU5R$zJT{37jPmGp+ z$iT?(oiOeay)yh$t;fizRs<6!`)am?Bj{eyrB^3-Wm37U4HQjDGPVLR9_)zt%(h{b zncjaHk>zF7$tn(~@jn4tOw~P%w7pt}MjvPVMz>-*5*)=jd zAtm*Ms06>l>a4v-#B8d`*+%f5PgH>j3Rj~}D4ctYj;_C6wd_$D>Lgt+1Aw6?&c_ZI ze!==)ChYg_AKLa!)v_>{UqLNRd{PqS940w2hRczXk&$l>&2}iM)l=B~z$8C!;c55X zTuime#25z;V*Izi^p%<#%F+u+k)NCDc0FMlgF&$J z`GK8j04}>B!%e?C2=-kUeoL$S+fvs|ml;{VfCn}Kc^9~z@Bi%QZ~hba2(<|h{6_?9 zF8a~FVr>rK*-?3jW&h*tS!NB7t)Ul>2_ugHb6Xslc$W{S^RIr4Dlj;u#HHRrUtON- z(>x@FC-E47<9N4@sQ8D)Rcwd|CLG^-fb4%RISde6$Qr=)1K*&(x~Z;+g=_nu#-VAi z+xEK^AjoqJ0Xm^@GK$^dn2&oF8Q>1mq!L1UFn52HULL{<8^1WMg(Jcp@G-@aSuc1& zs8^{kQxrRXnB%qaUCN>&cfs!*Jy~!YLvKR4#|AU7i(qv1&neKa!5hQVSaUEW0EH_} zL(z`cmkSgR=mju@VngpwJaYhhPOgQo=0#wT zH1en)BG(|dV{nsAC!dQp2!Oy+Q4{biY_d4q#udQAQN%V;wxRbJ)fID6OOJ(qlo^N^ zW6tSe)Vb-ppG{lr&cLPrt}-)alxQ-J6f7(jl+X9yDHod}4qx2oe6E)!4b&R=e~XE) znk33pg1EMCH`r<*RSE_GOw{6##sPhdL_}hWAxx;Kmu)#uj&Wx3AhDnprEA1Y3eWOf zqXO#j3b^Z{BF(%s2{LNc-Cn)ak$D)zsMeB{f#EuXhD*#2klX;oG7U=~8wVwQIwiR| z`hxdJ=u%g4_zwLe@e>d*A`zLMr$3XLM+bese%;MDNEkyZIy*bpvSO%9BDmbq?!s;) z)QN5AoQh+VjXLeC>rLR7OXiC4`~YXL0@I3OkfmReUM>w{`!(!sTPh(2w4y8(!E|_d zIL(>v3#H`tkJS7l1)0>`d>0lKRSxs{U%P0bDFe4ilsMoWTgfO|L~+R5-W^x9)fNje&QdoYEQXFQZ{0@hToAGT}Z-Q zH?>{@z8R!3OhDO5{PNZGM})SFY>brv6kKgfywP&HmIg%2RY!Ll#dKMilhwy3<9sRb zUXhIkL~0<~vM2--Cnsl>wG&wq&$xra)A7(|+et3kBe7<$LwqZYXx(F|KzVw56Zwbs z9Rm9Gt?@U5WI9zYE-v7JK8B;-Ran3xL(QSGD;I;${c8cyk2Wy%&>Xh9H3 z3va0b2r>hhHG3cejH?0FX-kdMNE)$*sL786lxKM!X?J*Zzu@pcKdHQzbv*jD@}A@M z)g@T5A><6?#9y}S&0f41dDkfes)sVoW~M&s^Wz)TiSG1wm%j6bMn~h$JY*FW)!TpW z4UB_O>~gP%p`WSp-JbdJiaV&>w)~=_i>S%joEW>ku=8-d+(havq21Zx7Uge@HKAi1 z3|9e`sG?R)6)x%v2oY;@Xdw5-He}KwTSAyv2GMI5s^jRAS6TK`fZ|`x!qh%hOrz$u1hB~1Wzy%ljTW_!AgPdG6Q^e&tPu5mPE#%xQobks+20|Z$%)G-l=GWva1JrZu0nC;>2ToSN?m~0`+xrefOl;xm|6<767zgCv;if#Nm;# zf$*~R11*HFVWg<2_gHd)fY)uNRUrLKOpHNK5*6cN3Z^Hh z689#U4nQBIsAWgO?MgTTJ<$>wllpO`OSDbW3s5l)3ekjxl-qkarruO>FrLYv9}i zcyWZk{;SpLVmX4J`r6{Z@?1rZ*zm(mSZJH*>TVuI>nl@AT34-skLfmI&p&bB`7%s( z*!4 z@OD6?8+qeWQ;R!R%B==dS>^X%TN|S)m#N{AQmxWX%boIYAZJ}u)19*u4Cbw`kIZ5- zH5sbiM%Ev2*E$2v?Au|5aQI1V&QgId@(i@5W$(x110}V4-fa^2i=108JAE_h2L2s4 zzYhen)bO2*4OF8CrB50rL0>*f;MAs;Rr66Ft!)Ct+O-aMIpv{7BvT8V8aj7eW^H9< zdmb~JkdUy|66qI85f&a!E#=NrU@(FPp!URhSy)*3t=oqPH3GN^1Fpn;d0ClBy>tH7 zo7atZGd)Q&hU0~;Kwp)Yx6BD(ut-TsjhPP|WBgFHp=veuv(BK|?6>7?4HPB${(sPQ zIG?+^x{Q;AV-QTBYfZU^hh*KaWZ7rX|7k*LeEKXLOq zg566|NlED+6|BLfe`{yrfy;pcxn)Sf=g*(h=Ymw?n|5!(-8Nvoz@2ld!0*R6+L8fd z{OdDYFVPN`n^v4S05Ww$d>eS37uy2Z7&MeZQ<&Vq+HqhTobC?KmPW`Uyx_A?HWm@m1x;tT)zFUf2n_CfML=243B zY#@?>6RP~>vZFnVzFZ&OMk@Kz&gz^OX{<}>2a$ztG$+5pM$ zUjt1WgT#g~_|0Swi!*mdAizsG+Q0}U2qsWEOZ>mMd(WV#x~^@|07_B;$%;hDL9%2~ zl0*q289`71X(UTl6lp;v3L*$fmYk!2k~5M;Xiy|cl$_yPryHO5si~=%AK&+9ri!}j zw!6U+Li9N6%_F4NE5-m{kk{(>ctC~Ptm*~W=*N3XFM2CTgUM%&~5J} z2R16oKvTthu?zk2!_c5y?7{cPgmn+2*edyd!IB`BVDaIe600FfG|%)09T+&JuXj5&n7E7+K6>Q*j$ZXEc9m?CE|5$ zVV&4k(34_kT9_J4uut%SYhJ&4g--;JgVYAr#a}7Jx5&g^P2~nFbM05zB6nBT(8a@# zj94Wk=*nN9Sj1)O`Cq_QrM%tgH@Ti7&*4&s+gDc$kd--Cg3*DE;kj~UX^1_?r@k$k-qyOY3cvy69W2={-X z2QVixV^OTEte0lkke9N{q~=p~b9NSP`Zp*yiT6@=Ptr)6@s|cnJpnC%cLBzkgmd`A z#$OLh8E(VefUgFQtf0$`?lhZuJMhYegR`5Ou#CFXf{25XT#=qmB%#QZ{eyBm&BZ$AZ1|j zX{lfkhiwnb4eoCRFF7skpX()?*KRPYr)b8@gvBFNveGQSA?7eo&TC>z0y$_=dFvyBP@^i(?E87R{9pU|G=Zi@>(A(zje#)@Q}T`1VbrjZR7 z08ef!&=r{1o;VbutQSMf6B85P)Q^=ySPJ7YEaP3CjInR&u6!^k_?fwMzU7|H#8`dM znEbw4qA~Cnu)Jd6#JiS!|8sP=eq+Q_GjhRwWm1l6$=T?O1u%I9C?f=&p)bVD7`cE5)@TDF>A8}ssKSDOw;UPSa`6Z1P#g8Z(-No9$EV;Z%;fd z;d8h@b%@!u0u#OfL|fAT`3ML&QgLCA_&6cYCUt12LLv1P=b*^yhTqoFfe3>grkuAM z#Asp1W+^EprF?M@NwFYWp9Ej!|p(-uFAfA7i(cYZ>;xAz2pW zso*_C#5ojO)DwLW+5_kaMlYH$#EkH1c`(4;KOy17kJFD&!CP1!zdpEA1&Wex7I`ep z`}8{0RdmM7@~dvZ&i&bud8nPfp@3h$^s=Uh$^(cpk5ZgHTO)a~Pjp6ho2KST>9a{D z6|M^vMG8Sw*e{MDUnnbokxpdi=hs}pDR_v4-%JCn_pK2(IApyGL54J2tbFzAu?=r4NVg%c-((lMy6QX)##?r0uoF97UZ|j#=f%Ssb>6X9 zTU#$kB78~g7*t?KeqK^k#IQBho{{A#Gkk(9#$6X9R&H+Maswok#jcIKprNhQ24Kre zA-HiO=r<%C_;IRG8O!R%x?JG9hbLD+ev$I{|z>4{Uv5X=hxyusqT zZ7g6MaL`9-7NQOz|3I%hGYGVPL*!Rb)9}p>4Kl9c!;Y8@J8l4E4VdNvYkwV4dq2Lv zvlul;hy7vc5VL@QfYk4oIE9QTwI9H5@ixQS{lmEnCOVXI2{)r8z@NWiMZOgIv0(}7 z6h^{~sMK=5?Kz7GvO zn){y*UMv7ic_))d^(ZJ^p!C5|=5vOaL9xX-v$L{(dC>IRSprkt93y6ro#x@wUm%n% znVVdSVCpQi?isGG1(*bPyC-Gd&reRIg@K`cvxwUR;5b?WZ}6L4{^2yDN))!&=ZXJE zeOYe){q+XlOMn5$SWw6`5vF0nZb!(?JvaEAW8lEbDofPz*Hjwg|i)};{iSpG9U9q z?0Vk?VcOiG>Vv(-dw|@z%=Cg;_JVvxw(KzQiGec?7`>^XA(w_JG9QovLm={RCH7`& z>lZ;=>ezAKzKw#i9}9qP0ePqJ-T0FlZ~FOB-sUxjD$9HK7{ncuK7RZN8Q+wY6Nl!3 z9Ft{OIkf0DmCwl+@lbLaAvTBsf zO>Vvt***?G{!?P!6D^d)RS%H*V8Z&JTK&_Y5pN_V+XI8$L z)1w!tmEO@@sE|2*JH;^eBa}cqq^$z3!}9WS!%=q>3iUg+Z(v}fDl$Jm-@p|*N-4sWL)Bh|(VVlosQ3P^yTHpXo1QVA3IMVQ4%z{v(JY6Q@7F<9 z)&jLLu@9H#9hQbxq5Q;zVFy)uS(1yJ8&GsdnAZl`Ol)Lt^;s|pa z4y62#LyZrHOSRr#97ZB|_`Gr|B?je(GU0_x03snMK{)MZ8YjF!RADZ-+df8n54S~u zaFvvqskUB~126!3K2XBV3F|-(uS)|49m|6O)Zv54{L;BbQwrfUx+GjV|(#2v4@e{(LDO(AIpRD9ky45AmY`xk44u-;okZ>WVL_J0ncN0YiBTEPv^%6ZH z$F#sN3fz8VJXm~z9OL-UNC9{$gN{h%741ciGX zVzhaeyH)ui(7oGEhqGqz2H)&L-A3FSiGoujq!=H81RaV3q?&OwhIrXgVH5BzEJF_ZkYB(ViEgUkP?r3j6^qvsA=c=$A`A|rjLdFZ{ zZy_i+)&y;DEaHqD78DeJB^zQ0C`tu2Rg$S zBo|6+KcG^Rl1i&Xs=Rk_x<97PF7)kN8qIQ}!u#g(B~Ffx!)E?He+~y1Kg2vgR3g^y zZH6)PJB*eQGA45g#x;f=1Ccim0<0in25SyP>Ww5xK0YLoi?!=uC@q1jqZoe)@IIUf zL3t1J-p+=YFlLMzZzE?H0L{ZiE*WBmNG{Gf$YBml>Dr=e2?{e@JqJJ?63~Nv9A-c0v!hnAMCy?M$p2h}DP|kJA!HpBQfie!^IX54ls(l91-KgqaeB8v^;Lvl| zY@+~8D)6Kq9uR?3fiqfQ0lD)vjcA1Lhhz@}h8M9Db?@JH;hio1?yRjH#*Sf8eEBVS z2&9pzx&k3;!pIyjRQytapoA}64`+*h^l!i)G5f1MnpW|}KY@6P-E>IVPEhbgw}*}w zMMR*;0{h|GpLJUQn3KS)(6c||D*Na!)+L7fsmk|7aiNp5b{<+pcmuRiSBxw-V)W$k4FRC0bp5~RrIqR~UlFl*%=`48{o zVk=miPJr(&cqq$uUd9>bhIuyd-_p`Tkbp`Bz^Z?f91*|2nwsyNvHM5`Jj{K3fZnhr zYcT#d39FArB^a??GPs@C^=K_p@wj1o1%Zuk|*v82`8Zd=%D~BEZ~}gb#%&rQ3~srafGMy;pNj z9X;0PXit|w`JB&2mNVc|hu*C-`Na1)=Tt2B0V^*ufLL@T2C!ow41hfA@;CQ?ca^F1 z+*nVN6crU^ML`*4_g=h7kqzbHjGl~#;-W|0b_Ii1eQteeYg7Ao)pcMA)-FA20UcX* z@D!oU;~q?(&SO&E8;+{LT&PhEKPvm(JzgP zD0teb&OHP(VNp&i$!v|E)hw@%hlIuE#5ypEFbDoPrYClv)kXl8UEk2)@wyxwo3RRn zJ{d85?B7b)s+7z=9urQoT0Ceg_aPXPQ=9;fqG#b13zAQT*Vj&z(ce;fI z1CWO^g7>0cx1_ zM1&mCi^Zs*CYiWy08`@}Ciep%T)}Ch2B7y*i9;3qGh8&HkBiq_j=}WPx?D@lfp| z`MPdM-71z0a`0vIUrd3{ptD{dK zD0~fSWVgh9>;=2pfk#%cFK%&ZvM6N!`c^;sToh6LtVG9@*2%zk+vQV?`iPHnj!m&a!x?g|dSU-~XKU`#TZ)tEmoL_Hi|qcgd3@{RXU2GI9$;HgIj982 z&$RMa?+$<40*ZJ23+uT74vp(f=sdGTnp^l0@b*#sW>l$3n_up1*7hCAx#})g)umsz z#o@yxumccie=EZr4iTjo zYWTY@`>$WW{?q?EF5h+DFg!rmy8Ax^N3699DTYiJBg>ECNPST=`U9Ba8sM^Z4@n_jX)4NZy2{yibib3weU z_@*JX&PXd;LGn5=AQ7hyf|+qoLTBSc_nZe%wj}j~iBEcRf9wQ9?WClyJJ_hhv5>d; zkW15|KDcD4e>k)RZ#fwtV}Q@-UYNK;6YP39{kqXqHNXPs!<#>+ z9tSII1S}&dQ;%l~?;;mAY8qeN)W17by*g06PkA`2FL{;0OiujJbIV*s1*FBMnk=3c zIQjSAena=;833oJ?KwI{&R{LSR?D0(IO0dH`SHWU6=}3Xpt7#>oRNXrS)aM5^x7G@ z$9A|5CqSOqFIL*KA63$-?#|=UaZl!X8}Xd$!oOD#ksD8GRez;cJGJv5pjU&9`&PF6 z;gz)nP<=X;l={z-;oPu3Ztm!a9HL(8aQRwPtF=xrbub5|l>g?u6>&w{ z?iMtv2BQ++HE*v>JM(YBsF-(XrPcRrk( zPnv)Rv)og%k$f}%P**;-^)=`9>;ERlBF=p>no-72^sUo0(24L4$DbAk0bVnP>3f=% z&4>=&*qsr63e*2cPT0~i%~vL;`Va5do6gaZ*NrXz4TW6v;q$aEZwxyH$I`!w={x=7 z2YHSSyD_-6C@a&or2V=uYg2D~`hONfJ_!>2j!_rfvU4O+w#uX*V{{XG_bZ;ka_*_;m?qTLscvcu%*bII*J*A*Ggw);EfGd+51m#GP%gg+%qfyN1(= zgq(8Fv4U01MCMX!YM0Sjztu{k`a^+K<{(%`XeX!^mL)b>MSFFEvF!xW2j4#s%lWLt zjJ83V3v#1SAR*zq|M_8UcT_xbnERrXO^ zF3GqU>F*P2YiS9%FOS1pLjRz7sNOXMj`(H*&4(2A7+1LWyLaz^rwf%E4A>WyH<3e? z|6waD?#pr$u{?6iETp%%BZm#Rx72>;Wqm#;CDkoW0f=mM_imtU1TbT#rX;H#fqn*j z9=C2qc%hznS=Dyj?S$P;6Q{R<$fHi}*EDbm9b6_} z$&P20jBG33A*+48$yDF8^6DcCA5HyY>-QWj;{&KW#K8ZY&mOY^KSsji=h&O=je*MH z3G<>dJB{umaz2S{3>$CCD+O=*82GF>Kn73TX;Nx`^Y_@JY;K_8=*_zYp4sa0ZGvV- zp6Z@tvPq992T14z3hDMmd=7Gqg*@tVy1(;(6G+;0D{W|OY@KUFl~1J}Jzsm1s_tep zf-8tT+NN^|qoSsk1r-n4Ib+Ylz+ey%PTL`4z)KVVnfLl~eS|eUoUAkudX%9yW}-U# z{d={#DOY4@1lp#iRgmjxoO<>HSSlBVgaGK&-qgNvSJB83Hxb{TR)5ws0A z&ssK}cX1QMshO@sMqmbp7qD+?{7{+|@}S8{xV zC!QAiPiL4AbSEefm#GGuuiPx7x}g-p5ta4FKmAZ?FmpB`_0Zyy+CS1CDLt3)D+PZ> z?>v9p~Pt&Rw9V%R54s@T*n}XljE{2ajXA=2+Pc$yx%r`vT z<4K~xV-2@8O5PZ#OKk1~%>i_TtB1-s6d;zCqO33@+s4x_c+JBfiw?IUdIpl%VlnM7 z3uV>c=oq*NEQsBFZoLz>#=R=}m|qiSf=SRh`^5YWCDH-d4LG*|bb~t(U&rT^m3uPj zxd;S(l1~^NIt49L6H#W71uRmEzg^Q9(Ss8zS!UHfxL5qh)&$)6&zZgN4^&P5ek^3n z{*<1M8z!g>U=;AW{prfDFrB+$7-F>8-EsFb?mD6==%y1uDRO)ATqsmPUByOjO0{+kClHR}L;^=dcyey9I-| zsR6g+!Gp|L`u8Vhf1FmpcW8&~z~MJs2z@7(-kj`2?lp0_$jY>dfBNggG64DYttuGW z`scr{G0CCckL^;y7GlAUl}3|PptRY<qzX zilw)+Kcy~tzEAj(U#aN=#(nBNZZHz$b*&Lfvqo13U;iXZnEz*iEtg^On&v-o>l^&F z-6VZe&UV>P7&Wu&W5h#+8!7CWd@I#K&S3X1WX^KN2onVN#VcaOVHcMii@Ek3-h06^ zVd-!cntUNTY#lTwK1n=*msbHb9cRwqY)@ATW4zb$i+YQtT>`_PKl|(bgZtjI6@d8zF$~v<`-TKStk6R(Ii7eu;xV4R$A>UGWe& zaBh;7swZLUqa3IN1O>(!(fjhG;*zN0tz80+G|r~>v(5uGh)9RrAO(J{VaMwR>xUnz z7_+O~W_k&+s|^MR5)SP50%(eIudw({TMC&XuSce9_yz8jMDBK*@ z{q+;JA2D9&zSDHR!PgEf_=~gbxQBD_BVFGn=5l|~Zi%p?vqf=>c#SCEc7TuHj{CW{ z9nn~M_>0%LCA2sq2O0GVQFb!d;iA_^%_=~c@)|E(!!Ep*VhC96rlPD9>i5zH3K?~X zSBJ2#Lb^v379Gu5k&2>u`uQ}Tz|g>L46ddpx}AxmO;2cCe@YH2tjGRM>0)%$BX5CNja$!b)wnee;-euSkFS}?byB;rqIwwy$ z(DqIQD-@)x`Z^bQ?eEr!zGe*CpiT5o4rII~OeIhl7_UMia|^MkK6`5e5dQ)xDdW?p zE=;gAYWVVC`}G>yj3NW|mC?T|i;9gEMY*e<-JJYQ7hg?4f#Fyx`DpSP^zG%N2Ua?v#9mDkFtzX-B z>$g-?D~MWYVTaPqj@N|?Bpr%WbyRm>-o$F+gojWK%X=?iuqO9`7sxBpeiA2sGQeg5 zW*)f2(L=Q1Yd1N42$+3ZPuSpQ^jPT7ca@|?la~!2nbFcUTVkWY3CC?mOGGV1}3JjuMfA@E-QdMFr(Wv z*pLB}zw@)ad$(nw@xs^XKt@5{OrV%!H=vx{i0^^-;G1%)o?SD+LT0q;#IA}XPM?B( zN=Qf;=aZHgZuk($NKQ%h$LsB35DgKuBQ%w184T?W{6!%*Ggu?xFoul>o}n3mY4g|d zsrVgEzoy=|C#CEfu)*L7s-*nDWvbrG+Hokxxz@bO%Ic)d3h6b?M-8%w4 z+G{Y=V|TE7ghoFkGm}SLlE+n1BfZLRm4{tk^OCj*{?bnJ5y zTI?J@r>L{YYXXDRWd0?|i%Nd|Nii}Bpa~3%Z0aXjb${Z&Ku7t;Q6RsbHVgsR58{DS zcS4eOsp~{^Qq-`sdxt>VzyL4?o8BhjDMCf%7GJ0qZZ5$(CtypUbpdG9j|H^nK0PP0 zIJ2>>j18f>q8NcG6akJ@oK`5&OU7(YE-tLO-y_PmAC<9>3IE&_qKvN?5*k!ljJp@L zpE0yM?mu1dXF;9hxh^BVgY*b1&bI)x0iqgM`z#M367452x}2(QF6^*XL!ip5Y0&)4 zy(39}%uOLXGd(zwu_IaroXgYNh}Y*yS1?f|V|Jq{_;$!N%k%r`XX(MPeR^m%(td)< znVGRc-HaFSej)_x~%h-Q|fkK(uvGV1cPYSVcrGfjl-? z$srT51Zc&v3BF*{-?Z%QE<~%W3OCcNY2xn7 zNuX|GrAaIz*zg=ov@bx%UPPmCDK3x|id|s29PlfsJA^SCfQd`UG^d3@rlDn!jH>yI zg0*VMNcir3tj6bh91~QgSgQ1Vk-l0f#ku%PD4=(*< zWME%A0Qce_Di(}cj=T3bp^&dhbAPBB=Xx*kPr(t)`3yUylqBjAd@bjx{9uwwDiLulA`n|*4fJhG0RA0a-|~_uMReHQ)w+hWk=pSQQBkeMS#2rCDN-Et zk+WJR@rQOewP}#4+ll9RsBF>Phd(1q>LyCV`q_7bFGXjGF&2MU%R-4xRMzbzsu0@( z$p_hH1r0k8m@4E11hhhq!G7dV zr+QyWFi4z!m+v}qpP^nf_1wE_0=(%5PK_*Vj-&(tM*E%0G*)bA~DXXg^PBEWZmGRCS;0ngZ#?H;n zLEo*VNk(NfK{s?KF8j#Cc74fd_p!BC+$Z;2It8awB3#8HiERH0eqFq58uW#ar=>UP z)u+~nJ*!zM9krP1cAGnCx9(Ev0WFTSZs0t$`hkEL*b-@!@+3DvD$d?=x*GW}L?_{I z;?DUzX6F=k{HQI1I`<_PTJu2kR_8OnuQ%>n3ivC%vj|tOY`~Nbd>JTdGMG)XWK*e?fTa21{M!cNo3zdmTpa0=bOPkHl1zJ-WEvbLW1GgwE_p%G(Ap z<4faj{5U+HahARL)Ox9BFPK{@zpIr2o)gOp^%*FB|=K_fEX{n&+|NrR_Jc8 zj}f#wS!B@G)m`@oTXjY#7sF@kaVK{#E5?*slOZuMZ(jT{jGwug_8`Zt~*~VqeK24zCCsnU0dHp1- zMxWScK_c!mG2w0Q%Ze4I)VGMJDn4De)rpZwsW?!b`fc>yRIkE^Wantc#goG$nCG$T z;GGD4`9jVi2dQoVBxg5QAk>WFHBzK*RW`|lW{I_`LtIl)2QsYzD^^o)~jkm2&acl7Ntfh^MZ5AR&J=|A0*PfeS6Ovh!ws$Oiu&icO9 zLFO;XXhs4zisxv?VCnU@JV)=wH%|+{)l%*=?RWajdo=bAIrSv64YkD>d^XJ!udF53 zRSP*EeHu(8;z3)P`5|E!{8z00G=gTq$BqQ>4j2BUZ8%@#Y2cE5Hm2ZWezgc2e=aW% zD5j@`f);h?=ccG67xT2P<#uARe44@Imx?Tluu*tjD0muMqs2Cs0&C|R2@<>BtC(;-Lf8R+TU zsGXLJze*=G6wf@>H7t>sonU@sG;>qT<RQ~{bAD_mHS^vu!3)#=)%nl7 zRaN%D{s5&YP|OGgC>yk|-?E9V(_58ZTCU3P>}g#ti>xHYBFg9#M`)r4oi}_Vbp=$O zX(T79N-KrAH8>5{7?1J_fguXTgJR`dpQRSBH@wcg`kcVSAcc(B-DpNUz!X|JVjT~l z7}FKH+_dpL5pW|bYTBx=BxRAn6j9dlTQARvWq;dXJem9PEG=$$+7)u|iDmx`N8a-qkI70hxa0YbkNA^OR3pvY%&<-=#` zE6+;mKM4~1{XiT7Ld6U2<75ScbH9uHd4#PoG^aRT(1kSDeBLg}4GRwkn<>n#49NIm2%Hb}x@d82k4b>|-YNMyQ%?3&9Rkz*u$sbaizh%GvTL6S)8F1C$0s z3b^$J%YF{NCk-A)wTA)!Qt|NjPWC3O{2VNING@)6rIK4l?342QNRg*^5lxc1myNGSscZI78O#w|DaE~-*bWX|s z3wsT9bxftF+b3JV6>BG1BOEI;lRE`EUd}!#ge(N&W6`dJzGBPqp-)h>J@Eb?d z(fS*S8P*jyycitgZ{9{+q9jp-apU4wYg0r;K@riC0?p(d59F^posj05j^XS0LGNhq zH<+M?EbVxKuiY!7gVtAoc)bB~lt(L2D=G`Kme+-bwVvdZdH%5~t328o#SdXTVH~4r zj!d1{Djda8I1=hfm9=TFZrpxF2|tfcET`a0jx|B$?woc#)?hQoo$x#==j!VEiGOMN zZ7|gXjjNw}TU)q@+Nt!uU_p&g1SN5S3W8*ryLD(XN7wH)H2oYCHcL()EB++d0H=nbr!p~q?a01u+Gyk8xjn7O zVVi{cZPqmcjx!khtlRlw$?1>3S5i=cm=mx=m<4V7d8*mvTo;BpzbXYUy)=x7JSQn8 z_;=*S^pB$ZUB~1|S=0QWXa4h~2b5~ec(zUrgqH$E|O z{cql5Nf{0g1FjLdtwJskUqUOnVKzaCDYO~nST$-puF<~dpx3STJT=tnXu|tJA6EFP z0jaE^K6$~^*f*>D39H)XS_>y1ddU7ZF-6*7fpppWmGTZ-tj7wf@XsoES0`A@-pl}> zhl#rh4rlRthX-uLlLb=|WHy^piQc4+^CWNE?}FyLO+3~gY}1$ihJ*of0OVdTo9|ps za5gBubWPgri->*Y8YH@ubMcox`Ct61WI=Zv4o)@g-}7|Yx+)l%_8r;vOI!qS-=nh~ zMJGVW;^J^A;jdIlP?EeBi}we@QTSefTcUaIJ1RD1Bj^)kj{z;hGa@Z%4Frz!bs3~^ z>C@oKaT1vbb9>$D148M&U5ru&;3J@!lVo@^f$XgMS71}-Iep7zmxJHiRdueExnL1M z7U;<2Ew&STZa187c^Jc2>?qs8V&S}8Tb;CxPvH0L10!Io*Morep@(T zcK7?QE}MBvKgN$d=%M<0q~>>X8j29b&S*2~ig)&Ue@j`I{Kl^S?inLN!eho|-pt)y zFG88SvK^PN(U!d{a+95$CwsU5WNNYNDzY}}A&?GfA!h#CXeUH#o_1r->QrntCcfX| zrUS&cga$}tWyL1Pdbcz2ER9jxx3s9$-p?-TK0Y!atH=CGX$5Y7d2A@tmK{v9Ilz97 z`#3S>)xKii_gkbvRK6X96(Zd*6F1J*=@7Th^SRvZ1kHBP(SBBB|5`dMK}ZNWV!gur zkg^HC;Jh;eaW@{6r_~2*XNzMaWq8D}bB}shI3szgnvDbtA!R}z@3kJW^a1y(7v(Hx z{GPpLM1?a#3;8#3()SkS15G21%3pq)?1V;nLU@4Jk6QDOrNRL~p#--!b?Wf3O#ubL%XEV{TmS_rv1b} z%BHl4kzt}4*|sk2$!WRF^6^TOhzXh!$1E``6A&#!`N8R#VmFDY<)N_@ z2nSlw56-lZ(+Kh3q2b_Y2{7&7HRIY7;@NzIAnN4Ie#&hgyZ2^IE*Pt7<%`Ux&X^S& znWU_-Ff$`D)Y&=~hU;PiGB+YN0@3L!M?#e;bDlzPZ$v6yGQz10=G#vbj`=2f^cQ~{ zhUn_5N(dB=Tg%a$*_(R&4)%=AKn&AVB*^zg4=1k~c_@Sjo@_x{su8ZZV}JsaHtHbQ$N+X36+^(nJGx?YSpI;b2+%Kyy@qh<{h)zDUyPp zD^k|k6sed!)_)MYNkLg>+W&X!XeF79-fvJ_0&$FXKMI#h1Dbo=W7jB>V@xA$eU`)H zA(+Iw83MgIO;Be{JKO?^9$=)ZH2Ar%%;r-`CGSDNO>;d2gl2`5G*G*or}%@HZqHwE zpe&T-q%?eYcNA+bX}AVzCq#+3X?{6qhlaybu$Es{;oyuqg@D!(;&YdKI8|P>hTMIB zZu`vXciBP6Ew6<@y;JzW!*@EmAvRws`KAnwRc;&U-z}g8jjp@}bIty%9__E@cOydL zRp#?}R5s*i5Ob)_x>>rW5k5G!Emice!y!-`#l`ygmM|TV2hbz102{*>*c_xZhrWty zXl;|$ttC}WL>hs7_=Q4^W3Z}gG~P!J%0C}b$CT5 zaXqi}_yY~y&wMCA&P<4x0p3>mD_}lRedem|+gVrrVM2h>vxn~CPu_`{EmDIH1t7bi z?5#1NK7KvGT3kGhL_zEGIYxHnwlEp5@j^@8FL5!Ix`}F0Ow_uf4NloGR!l;^ z4uWMuU8Dxk`jQdr>6(2VWKQmkG1)pbiQ=C)RZjYqYMA|a zAPOevvHbSeqK!BGvqww|gTvn?I5VPc5v(5jmCY=sBI5hVtAw-@e2wK!>XrL?8zk?+ zPmuo&n>Vh}eZ)R>Lw?`|xzIgf1x~|X*(-1I)OR1UL&*_%P`@BOwc)t(VRtINzfwGr zQ>E)&#G-duP)WZWkaEDX9T#$6wv3P0o!xKecTm)c=uf?xK)(9u9D(0`gAiFDqLO>5 z4biQtQ*s1q>yr+UFv!5(WBpq&rQTDi-tcNtgEX)^no-rPck#T0-+dj@7lSL?Z7(YJ zvI?_fTPc$F9W%+q^GlxSJ7d69W)YH8Q%?=eiSzOVcIzsX^1cbOKLEWBbMbW2YpFdN0CiJiH`*6$;Bhy z!beWd@P=P@=Tvd>BWYQ7J_^~A7mNhm-v(D!jh=cgk}GJb=sDW{QBt2+5YmPhjG#uW z&_ZpM2+y=zwKhevWjj}7+*qOht6ngc<*@5JA=2yU;N#(;u-Ev4ANu`(>kpf3aCd_> zvJXApskya7`xDYSWk0XAzFPp9NCG<;pc<$T+*lmVxj}8aKXPQ%aA^HkVKT=&k)T8J zS9tX?q_`9OgvR(_ddW!W=}02?`n-6JglQmA*@XT!f&n*8K?Vm{6OOxO2?-VuRdhtL z@Ax+DKuL;KZP?ql(=z*wtUHg;RnK7N&&f$(CS9wjC@H-^9RM@1{YVb8vLAGr>)SU2 zXrR&;z1b(WTYb^t+IBCm%=!2i*wO#U+SJ_;>J>RqB8h_W0EJUx-wO&nq4@*;V%#be zYl=>%Torr#+Fc?SRR_!2uNdlfcrEC3lCMq0qq%(+<7BZsX|ohAPN6 zypm$aSmc#5SXyJ=BBIXUXk!?4=FTv<@9)U#uJPMeubP+rwT7?gd&8z?8Wf|kU4wSzW&xE%qrMad8*xOmbeiA~NpCc{MOVVrgZAD#f>SPNf7 zJM-J#6+qsNL=LDjj{#Sdk{j{avE#4I9Hu6P_t4V0An^SxAsOf#G<1V%#Guie2j|1Z zTwJ}^Y2Cn}pcYOF#I(aZ$x)6AHJ|Hamu2==8>xt1iAY!#eAOWZE&yW_gn`pbiY~}z z44RQ?`CD?987+!WMk|uu@#~&w%;bU`Y=X5&B#S}>L(Zh8E1IS)5h^My?41`J2ZlKK{aS*^S&?;C%Kf4m`hneg(OD>79wziq@sQL6 zl^li7le=evTgRUzbMThrPIkug;~^!GTI@Y!^3;Bhj6fJm!Tbzp!AGEYc z%POvJV``&Swdg*d0=!F^$RerP8Lz8~u{)e`HJ?Leh&L003M4}3Q-1WQbcp4|%#OTE zU;;%(cCB<#?hId}1RP!hrjv^|6X|}U7F0L`2MlTbur`08>Cxd=>U|n%z>WOCPuY~B zr!|2CC?HT-^&THsg_p)HL5CZMz?rC33(Jn7L#T>Zrc?^n$*38oo*Kcwj-ZK48L5Km zx4uAQ{q+^?Y$8BQpcPcoLL#1RLobsoC8kKyPMkaRFPUycfdTyg;xRo(9BZs;ltzl zN{Zy}^W|kSygZ3~jaNzO37MTN8|vzMqe%svTy-L9cr)SfhkhN>J8CH`=)3sMt*sdc z_s;z>)eClr{Ry7lI|JQ=V0U<=3elJ=I~vlXvX|ii&p%dL5rHL7F55R4#Rt3RRIbw@ zUN&zgH1Ub_P=!Vt)9?dB-po_yM4RG2qAKpdp-?2?uC4(&qcYQVPrQed>u=vLQ8UeM zAP#ok4*x@tpe`2)#acbA=%{mjE9(wbI=VNE^r2^@Pi!1K|0`0SHx$|rrLi7FW9#Ap z=lVERo>2AQ36_2ib4n&ROl2Vs8+`T!aClq}S_#|5Cpfuozv=!_%?Gm%!H@2(TdFdh z{fo!f6z@_wjp^tD#}?X_?zij8K*1LF5ef?ab%mSNVKFhYYgbGvJwz&b0*N##$49SH zhl1L#u)7IPKl$fJSCf1X_DzHPzJJ%>sHVEm`bSgiR8}rcHFY`CH%-y-wLjwz-i(a z#zEU6l8yrLL<1D%K65`yKkw?~L%Y$c${n*yM%XwYU#UD+?JfcauH!qf^6_bqhr)Sf zJN>OQg0UYTC(w=5KxNIx9DoCgp~fDlTxg53->)TE$wCi!LBtffD!3PaH`-uvD_*LdiUxmBq+Am z^U3Wk)IM-j8|gzXnRAW%c{F%idqm944vhhGXZtQzxpbL6#}7=u<#N9FFZPXG@yMc~ zg~Q&4EG-xfWOkK_xuHWEh{mEH+H18-DUS40g<0C*1J{G9aZ!@f6ce_@tv#`c3>9~H zjfxQws`uL8nu<$NfNoO@l~HdDnl`U!Irceaj!H)Ns_W`T4E=Th-@BJmepeUO`7N^@ zN@d;$kHE#brBMlV-8F!6+`NW|P^(_%!Rx$aZ9*J8DCg~)LWKf1qj&4HWFnrz^?@+z zVCh(6G-#dp{t2w-Ho_#aLJ6jJ2GR=*7oXL$krZS#NAAiZURJULs2?ta!h@!9|8 ztq|ayn0A{(Elq{$cJQ*FahLux`mxk09t2qzCZ)-=6mam@0q736!uax*NdD633;eiq9SBkqd?7FAK0Y)df%M(t{}bKRe93TC&y2!Fq6YsCD|WlA7s60nU>RH z3ljO6fh3YwIhyX}57nr8xitHnAPuC7bOM4E#T7Y{T$tCZDx{&%AqAuxRCY_U#HrJ! z#2ML)z`Z>KveIAbOiaN^70=$ zh3LVWM_2tf@s+{Vg3*%73qrdWQ&L)q049H;kA|+7(wwHB8^Bg27;A$39;h_k8*YN1 z&XpK>g8~Z#rJ^J!548LGG1I{Gp&DT9X@}tb`JR{9I@Z{PFuUIqjiHANl?z_KXk-i>$d*ZDcM4F*(P+}p)+--aQDG8+n zZzkk>vDuLvI1U4?ByT}ZdynHz|Fkh6uVJlue8#2ViU5<~vs%!lJPleW_Ok^m<`+QX z9>}%bjXD^EHiGbWBrIrU=#MJR;usQc6ALe4>FOYc%SYe;HK?*ursJh*~P zvZ(YhpGfI>kx^RT9@Z<6l#Xg?E0zCK=r3Z`LP3e&)djYiQMneHZe5t{=cFHad6g2I z{%7JtD_dD5H@@yKJxPpOmO)WA z&V0{ff!n1KGD8FQ+CqZl)bihr=_R@HCr;5NHG&TUQ7Uxf3brOw5u5P%#UpdEd4I@U~lwb zZSz5>7BOujhYJ^*+}hBUSRwNoJd8T>z%*IjZmY|Qw8`7}=*>2>bXTnOvq2D8TZn#h z^p!Rcw0d=kRa3DmOq2>O$1bEQP%YlEOpN&Pa$wSPcgU8|5)+MiWlhHQMP&Wsxt{ZJ%@13V z^o+<^Z*_z$kroGC?mVSRDqh`{O8PwTIX-6Y*BbjZof2#As^3z598ceM1gM?AzTJg1s6}%TM#j#h8U^`0dd%&*&gBO;#j9t{0X93YcRLvyPY$-E86l?rH#Z@7A4zw}e~?#F@;t9|;+~L{0ZURg_nv4Esz;dxh4r6#67UuFd>M7nz~gZ=x?EMz3rx#j{JjK ze&IP+PoSr(zR&?MI57&72kW{T2E3!DSMp~EE~TF=5iE&*u>N>8MO#M){KL?iBRb%q zGfK3;UxMXw@F@X51waEo#-kMDLR<4*3WggE zLFbD8{<&f&YE?1>x%!5`*;n9*lFXn9eI~yDCt?OV65m1obZE$Xsy~m6t~8+o1N}%+ zu7Z&PQaIE?Y(XDn8+@|kz0f=iPJLpr9E8FhDC;GY-|<5W+x^gWHMFc=YNiqHu_Po$ z(;>}&RzU$Sy#um6QcHuhQ=)_(Mm*4*c4-PqbCEVAXg<6p!4kf(yx#kkYNIxR*GZa4 z9>KA=FyJ=yE3jiqDQeN$+)ZG#UFUyHY&t0@)W4(^vZ+=l>H1HZf`jlxHmwBI6-K$g zLOSA|Ry!M^8l5}viXF{t=7UC%-4 zHDs^|gip-obj4TzkV~f1*MUC)rOXTIA6Yj47kh6RRb|w*je>+oH-dC`cc+vHNGjdZ z-5tV48VPA6MUYfF1*AbiLcvW-mw+_;tPT3S?=!wJ&iH9x{0gYE$I2vb@-@$QTF>IOLhq*I>AblW*U@O*7C)hI zP0;ea%+Ae8vO$l*gpdLBI5Tegn+4g+kk`!a7;`=(d-TxUdsBPON3s9{dYb}2~aP+sH3b;y=_UuRUr1B8s-m>)rHw^sf%MXR!;4#vE zY73QL^w^%!tQ&%hDBK>9TbV%{4f*b1txxyT3W%^wBltSQsCf@Q%;{zK0%#&r7djfr zjClBm#ugt{q^RsbIuoW7_%(cFNdR4%C=X)WsRwb);u*%8nm3n@D89TUa0xz&!R0_3 z2iXDer$Hv>je7Ipi#K>DOb>b`Wp(xGU+~QU_W+qXWDaB$#d^{grCGpbBZSKJ;*ow9 zfLe_d!x#Na4U;)ZV$onp%f^3%5b^(0Q5vrc(tpA!?*ZSa@SmGyO@|5NKX||v-4D*> zXrtmCqL|*L01qomOZaPmY6d(Ia4n?=V6HiD5|HV;qj0?amk{9VxG#sBq(~K*(xLz{ z*P_7A4H^PuG?XLLVMvq_O|l4GeM0RRM_HCoBi zlD?bz-Z!@jAg6AW*8^lcpuVDc$0T-swyqPQQUzhen^FfkbXtJwuwx6*4Cb0*qk5)e zsidH1%(XYZDKv9!8FFPMr9^qSL5&$LzjwQB^fT~oH1xEc{(HitvB`xOz(9Z} zFk}C153mH`!6t4&e5o{xHUJ6=-X9*)gLrIyQ^rpMaXM~s{3-zL;w|X_vPa;=1KQu& z@L~Nvam)+6hGsUGEsm!<|c^%4LDT0eZp5p{vBuq|C6H@z*0s|;VOfxZ7yvMepb-Je29ART7HiH zqj=f<*@Z^~fkj~=1 zyxr{Je4wJ7-4+Fw^}ve)-FJQnxb}b|z^QNF3_(@kbO%VDp^t_G=hD5`T>dj)20VF# zRFy&Gm`s%@S6DEDoPt* z;CJMesKOiTpjaP$l~dOdfRWIA|B7!i_tBn2uCi;XUQAbC|Nh?s{!3!{pl5KX(Aefj zH&O~Mte=UI@gY9EaS!h%{G@?@kbvFx3nyjyPu<<5K5?SA41G(Nb)fx=r}r&& zyD?~gf5PB$Y4|Iv!>F%UK@v4!IDmv=$qe)rIK$w=N)+IDrq73Oj|-qRypje#2?9Yw zwfxy@_fZsvpXal5@8;>md~1*=`6%W-9RTz3zQ(Et(EK-}(9e`rR$4#nK>(fSvR?j` z1N^ss0uacyc7eMj;M2)Vf|QR``5p&BKHt$+-K^&yEzUr$+JOU}#N!gsllYc%-{yk4d1d(u zUAE|im_=IM4TpY;R4XbH6#0F2G+XHNr65|8Ui09SPT%jZl^{+&|*=`{+` z@E9}#(MnzYTL5@G4D?HSJlh{1SS);=KZaXAG=5lCbqLhK;{3RE7 z%hV*p_aN72%|y}43b?-EY$QlPNy+KU!|S!JkLrHYIeX2d=kJXQlJwyHi+MN-a$@iE zd^&5OhTPbm$Y0%pfW`OQ0WYp+XP|fRAFXYbK+TiHPH=6|l^?2?h5FwW@rwhBJ&Ysk z?Yy~P!K}aW^p$9nb8|;$DhJ&vfZ=}2)awkuLWwQCQoj!+Qj(XCn04>Ewra^A8g_9AWc;NZb%}2;z z{eeBj6s-iB6m$n6yh=)Xv+|EQtlR*O?_d7A_A|UyG0+Mu*@Ny)&BI)e=PGU zL&Uv=o)$2%)#WWsWpFd#0tJqJtv-bHWUlfzfc3d$NZ_6XFxc*!-&oYgh*>x}QSWpR zP*Ch#2Gu*yQ{F7A$23g%dV9ku38Y7xh6ZPV*05Rqw{I9pD8B+~^3vsje;6B^UlN46 z;a`C0EN#bWFV_t0Kb(RqU-a(Xpq8RNI2QRgN*;JH7dS~k)(35JQc@^J&|bXf`WKqp zUjV@XPa=+10$mpPzwtReNIL#k^hi&Lj0gIKiA>O94S{&!PYE z?EE$H&CA2}RM5ma3>L!9d z*#obb;DGL+P8$xD1d7diNqP|kz^uR`{`Tz~$iQ+1ZGUcP%_1WYPn%Vr{RA}n2g30D zPtd9ir0Fi59)gyPynKAUR3Kj*fVokah=Y>|kZ^ZSVqTrE;DEB-^Qg~m0J$nE1jg;r zQ%#q`51?QaGf%ZGwx@m0ep~VU=3g6!LA^08ygHLckh0wW_EaV5!iqhqafTp%j0~+0C&!+)7>o&|!@7!_q zr#4u@FhscB?SHD?0UC`b3h*MjMgHo?!JB4J=O;dRGwO=vHt?khv}ynt)Bxyay%80T z1w@j(6oK9^CEyGdSC;Qth^7WMfOn8Oh^G_pn-ufJ>qzmR0i5)hm>787VVBGf2|xe@ zIr9dyzwoEHaXyKo9a2Bby6ZXwC_Q3bxAK#g=K8}N2qHC>4T>w}{{jbj2tW^PHy*tm z0kw{RiU5871s4hm%5V{og&?$|I43Ij5rp@xS&P!Nk?*BYgS6Q;5CCC>B?74^)*b}Z zKG3insJ$SxUXux`j6kgt1YmK<;PbHT8yWJp9*)ZZ%y z+{|kLEF@R(D|(kLUIS?X>?{v%oE;9SD=Yu|t_lP|3g~G; z{qGyP{z$9`VgD|0koP1HH`{Gt1i+DSd(hN)uSRmU5Fz#=Dj#|)frW+0TiZ?IE)3{9jEd>#%v@hx5je`VNy3xBoefs;R^coqw zRxd+I&YL+bK;h)=^3d=*FFRl-FkqR0Y-V^^;r8j3W!q=)h7jg(tMca2{!(D+gNwj% zHtoha1%FOn5Cm&`X%0B_$;tty-#|b^1%l z#Qe__6K?QgQ!W{JSU5N+ruXkW)Lroguu?&|@cyfgAj_;A0u3KTN$~J)Ohfp3X!C&3 zSLQsL{K^sKBn1P(-oMn5uK{I;D#o#(_Eq&F3@l9qHvAuL09+WTIFw)qfoZ|d*$+HM z*})5-dBrU+AZrT4J1WuB>Xz#ag#mSdZ{dRNpGsH-%GU{vm7EF~Q05AF~(# z_VVq@+L|iuc%!R@+^*w4dLj-31ibQ9+rRVy`UQx1ENs{|fqp4d-*)u@q|Lt-ml-yD zlz~7USvE1;x;@0H1Ior<+I-EVUP{RZT@dJL?~r^%e){2g(xEyp0G|B!eLgiDiV$`_ z-JwDYgxv>jB9LkGj~RXt_8dqtlq&R)z%gvM;GX^)M!Q!}O$#9C(pv9>+?U%jb+8yn zEC_T+93|eER~oJ&Q$V2n+g^|w5&&@Wf#-=6?(G2-e77Ah0L-m_>u9Hr2SyQ*(AQ_x zrlE(y{F0Kl*EsN}(n9({*ARL<5E}KUM)3tE@R1m7T`Edf>Kou%Sdyx1;UGPP4e%N6jd#Qr_{euVOt zp#C5k;;}WwaUUN3$OPum-)(^#Q2-y2xsIb17r+nqok=AnC;!{Bb0T?oVJ%P%L_wv) zC<4d~uxXaQHBmv-fCEC8+(7;C&OR!L>4B>;8G=d1&#Vy!dI1Ss zru}^hWUzy@@a_N%!0{9;jSO5T-q$v8zwkd6=K(GT09P|xJNrX55(HRKbQ3{o(?1Kq z4B52^i1=g@I#60-2cZUmp8Ug(DS#95m+~NpOKU$>k#vLO6NIr;PtFF~<@^;Wu}qMD zkgUmow=r3sJ|8ArMgGV6Ke7cLsNdY&?C z!~WF=0P{?Ur>PCYU9dh0Ko+ZH?Dzm&nX>%n1ggCW0VUv2&W4?XhKxghK};YuC}-Oy z7=aVxprdMOZ71zEOs+)L<%)69Qk3y zx;zHtS#WT2rs2smFJE2(xNge-c_zN`{rh(#FNxU1@A0}W$*=8!77sVk5HJcz#-{}h zSCZx7;h$u<9Gf_s1ywo!uB10CkbbefR-gcaL|?f$U?qx~Bn$63Ca0u;OHum5t&$Yya==06Yl1bDnrW z`7vp5GI|eBUUt0>28Hnetl%#*!uxG}Q;;{zU0GQXMkWQw@Q1MDLaHmYe-HE|0n3Gv zkr5asz94BKr{nei+^J|w4#L*|57Es zjQ|mn)0TJ>qPf`wO8}KH4^lHoWk5HTf22WMVsTQf&aMOLJ^xv11|boV$b6!47SOQ% zTQvbCC{AIZ+cC&u{Y$rFWji}N4l2+S;~mW8F8~`HV#*Q}(#l0*W`Gk9k`MkJNSQE- z|IG6L{{g1}k6lkS@Ch7&yzSq*>k=UC=?4Z^Yv)D&NdN$JTS_6+{jH0;vj(nOaA`<- ztm8VrfY!OK4uZ_iyc3zdvt=q6kOTl~=};FJnFdW37cjI8ZWwih@EWizL6xjY;4u;S z&0#Nz3CLDDlw6kp{eXx{SAgHR&p-z4FF@zFl9Cc@5L5yvl9g8~z<7NO8lii6nVBs% z%m)n_6s7OSEI*=`ANXHIzYUk=je<{KOT{mxTM`e^>DK zIfAbB08W2-3>bq$Lqp3(;|iy}u8jBvD)8`<{~V>Tiz!f!;-&PowE^r|_=zIPB1vC{ zl2SDs0fy^B4{qS(Eeo=-#R#b-gzd-hy{5jDjpmFuaNTJISTlWjFL*zZL8*))Ovr6$ zY2Hya=v5jH3=e}|hL^x7z(7ZT-7%qhJLS16o7;bB>X90XHtAgvFeKQP z&BFfy0V~WS@V_8nAKE&2Sh-PiJ#;Yhu#&g3aJICf=6Yo1WaIIinomGbwKY6cbu99U2!C4`7YGev+uQ{v2w1}>a=(Jsi&ec37zys z&+4v=msh(@+I8=*PaUVby$uaqmCm$*Zvs=#%i0^;TDaSFqn){yxOL00xSS4SaG+UN ztEtMZ%{!a5PFz(LAEC33xt!7?Y;B|0TEO8?<>D$#&=GvKe{Rn$uk|549-~ z=;zZ3M~}p}%xD*MfsBGFl{+sLP)}KTOYR0S(4$R@>Mc$iC8f$*j;ws}JoA)RLu(_FKs#7Bz?fvAiPf%)&2T^U-o5n&zSOJrc-o0cR zpWi6q6Be#|nEl$0rCYq^p%4 zg*EBanDq*j>1tN2;XC6=Xvk$A-uoc+5z1-bPt}CILnE+I!1=0E?nRH)7Y|AggD9ls zCN9!!N+FQO?o;c~Hg&bOpn}?_m^)~be-Ks^wdJERe-CFQmP1e{sb0cFwysBvg5?#m zL~LW^)tli6pOfN-q&SQE8QeJw)<5jcXxFSvEyxTlV%j1bMhKVKSKiE#2Ifi_dzqp7 z7n(W;U(hc0@_fxXoXTiOyFQ`gSx%PXt&X&GB)lf87uUbTxgWcQ9ryh5y84a{LT)5A zuNzxB&9+GjsW5kLyM5<1Ge7fD#kB$wo^0eEkA{3-B=01|ae8OA!`P(3NH>&VFm(uL zdW+Y7)_(1Sa~0^}_;b=qv)r+PEy3ao=EvwK#fmx)_w4TM5&K#uerdMMYGP7!F#m$6 zu^8BA!LN;sBr)I{nL?Cnm9tv#t+snEE(y1jW%X%#8R-kUVx~vjxG(XC?gtGvpY(W9 z)9}AJ5enkx9MXx(e%RC&kfzfJ6Bw$}`I)}EYG3edRv*QTTdQem$Ht&7;3_#K%wqH? z{5mD!i}2&%#%FXH=K@^!dzh9JRH0OFJ>3nTmQT%A3{2(N<4!^@xH{HD#bNBt2-BQf znM*_DU+)?RN|Xv<;$HMgHTFWN1k16-(EPW~oCt`u)dHn1M7g}&O>;l1ORgu-iYQgf z_Un}-mrr^63ep~G)|*I>?*$+J>dTu~vy}Y#PRa+R8O7;rW5=?vFKkJE#F;zfl?hJZ z?@w=XEyeE}Pw^^OlA^AspuNVIDnXea*y#34SP`!1oV%|Zf+E99@3f@$OeQ3Q1iMGQ z?l)0~#mbPc)eD}L&=V9bF0x!=DG^N)JY2E0=Lq#?n=<*AJ%tw>MWi7vLscmhoprNr zt;OjyY@ZCnHIm#JxidPudzQ_N4;&`g5Iz;8NG|Jo-fPl+YRX<(nBU2L!h`w}5pBJZ zuSAo48gYc4mMbItqLxEfq2WHi9MPHFfN8o1t!6t#9hQojJjxf?56I}tF`_Xik!`}a zLa51B;%TS)c}tj)4@hMj5sT)RG*wM8&?tFn_Qa-lYTsRbTT5U}L3_D=t#FqkWli}ffGXpdGd@QSAG~LM&?2MPol`~Dc%%ZvqwVj>s`WfAIU-|u@m((1~ zF7^M}<7z;h#eouxKBGL&rfgtZFcOV>C;r(Tu8Q{v*#{T#94y|+q@5`%2}Sbk+-8;w zs?fXAQCE|11!M8lF_ZPb(WDfhnY<)@C!iZeB;O)A5xTk<;u9cF6&lCX`SJy!@LIZ? zQnuQ;@M2^C-6)x$=Z)Na8=5a;D2vrylY}42SiI%gveS}e&w1~b6)XJsED)h=R+_8* z%V*(*LuBdkf(-M~yXPrIcqQEL^PAmC7u>?^^-ct|g&ZcEE6hAy<3ir}_XN5{-AlNi z#_sqt3`g#(QS<{p(_Q3Fi$1c|cW*@RXZIn6qwRtoKyp#&_}Pu~dg5Z1S)s(yoh!9- z-<}j(#OcZe1QjFMKEs&{nSAx!tnV3w{3mxS?v=p$(d)(wFHSp7irjr7v!%9?K@-Py z)p#J5#0J(i=UQ1A2YDL=FwSN z`Tk^YgoS-|gl6{5y{^LTq^R*1r%$$dD}C`I48_D*VrjPDE%=3rA@r=Fsl2lgIyK-3 zL>%oqyfa*-PvMe>jTO1CiWQDf+8kL|VLzQ@#Z^@PCON!POFG- zaq8QQlk&Y|k0di~m@$kkHYKopUcX_*DlNb8}^>pz3&;6kkn;MlRk5HS#<*sA1TnExRvtI5M9wb@@_g(uQyYvQub;MUYE1US%mnA$%0_EogTWHGA@0C;yn| zRS9~I#@M=wTr&w@N{2(A*>f&NjqJ;)nY#|1VllI2Zn0x>5OgHIm=%mqz2^)CkL|Z* z1eJ}HAG(^ak$LWrt4j5KdBuk*;Wz$8iwMa+T_+D)pvO5NiIq2*mDl(k0^MGFXMzjA zu1BA&Kzr3AatS8wA=$WGT-KI%_Xw?ho@HuxSrj7@TA}l9(#2Q@kB(foXOMqyUnM6^ z2^1fsoRd_r)-_KBhuD#-8YhUDRWjFt4_*>J0rG_c^L2%T{lPuz4Pmu4KS(kEF=~L4$=4-&r|iW?3j0?8VDHY{>+MLHR4ED#$ zH6LQniX!e{krMSx`!!{C6DKr4B;7>AQskC4IlPyi@C1@O&gjiqh>vK=vr4ikU>_7x`zsW&taJAPf#$f-^%G|)2k*6A-^3QrG%W@UuGtDI!mOPy zcy4D)S8OO0R9Vtb&%T(?gv=#%7YA=g`*3u#5pE+^6jyW)C`UBOHQST#eEwYU%6T?O zC@AW@V4h}cNbDI^GEatSShBM7yQLS44|O??xbQmCG=incCg|1g%ZO-%y;hP*{4(Yn1d_S z3Hj7UpFEo9bd??z8L-2hZ+G3+?+Z3%egxqx8AxtW75P4zX^u+*Yfbi%i^^)$bYQLA zWEe~&#E-^-C@jgT94y+^P>eo()iwW6SpW4mm%&k~lm&|*rat$zebPmx<4w6SLaa2| zAgcsi5v0_M|7Vb?@7PM&ov$dwiob( zn0fNj#iV09|4u|WFh{Bg6%Ie`62w#!vdOfkpip)kqn-&?CyEh$`)g*@nyOiWD8{m8 zmz5#wLap}fV5v$7guiMWx|17~(CeF;W>*|um9cY1{FvJo+M~^NlA61`>Mc*O@oy#!yWmLDU;1!`fM|I`I_ue}$u6m(eGt7Xg zon6ZEzJ@T($T{~!y0*Wdw%J*Xk9?EON8RdZ)zr)95b5z+(#D4G_Opl}LH{-Y*wZdG ze!BZ@d%F$tJOP{Y>9CF{e&BS@`J#5P!=B_H)XEAfC=+WaRblTn!~O6FL$)=Ac(2iI zwstFb?7ZVD+g=2^VzhD@3NL2aGn%@}sCqjFiesf+R7a2~e1m?iliJY`yzA#~eiu)a zUpRt!d9aY($~Du9&gug9*w?UMSwXtUt79?0PsV>!=I#P{68*#_mk*8@D+S^?29}+c zPRVo&@l=nGBi_|F>Zb5r4YjO`O}t)z1qV~ox6DIna9qN=S&DIBS; znXKy5qeZWJ?CL{DVLXXuRj2W?YwY2fmy3m@K)gDAddYGX;X zt>qm@p%8MlE#Uy>6aFpw7`yjkHiVCQNqrF2ADmOnv>%I*Dn=tSB)!ys8-Onl38(Zo zM%}~wlwGgnqmebPU-Zfy2}REqzfIxAl>9;&)!jImiPH2Suk3xV>5rZoIh}@lJYP>G zm9sk*H&AKi()256Q6+F)5vPrw32+e$yA5E?*jPgJ7m8{InM!*H|EVWL`}12kQDtg zgRC=c_?zX!TOT8Ddq#(@yzHb3Q>2HIDsQK__PCRiKN=D5xvrt|pg=ODqkz@eQtE~GH(rcn!PHF!mKgtY~zaR zD{S}BN^hyPeNe|%&NF8`p3CwUYwVJP>%^t43xwBO*Rz9b~xNJSMl3E74UG~BJ1Y}_%L<)al%CS=lS49 z9XE~6@YoX+t;4F>kQdLW@Tr-y*V~$&@xK1dM^S#Ut5W{OX4=a?KdGI7YHoJbpV89Y z*Yn|I>b^n+A1zRk*o|bhMW3ySQ18KM^cXHu;C{dpna=P`Uk@6n?3gub<N_&AEQiI@9{~Yol z5JK_d<)q@$H`ZjT7==h{@3DvXKZ4;@dGs`qMsZNn<*(Z6JF&t=MpC^0O^ER#AB^4d76N@(^)C3C-y^{wE z?VRN*vm{NwtgPkeJDGU%?YQM71-$lml_}dK)*1Vc@30<6Z%Ey>cOWWV_)0!lvz?gz z^0}D4Ykb>B3mw5`rZB@AUrsCH@VYB1Z1I?V7j}6c_YZG=vK03`?0v_}WAS0{BZoc% z-EPz+;Y@CSP^m1;f0*y$;TtZiUpnWeX$c-LBv!sA))ly^Jb>c*%x6d-_CFeH(MddY z{kU|_>N4=UTsqff>W|9zh9aiJfz*VDFJS(KjySw(IV>ue!+lyhe>||J=fgF>H=VWZ zW{d9GT02Zh)3UmiGZ|w!{UnKysuBoAcyP6FZ%{S-Uh0n>4p!I5Un)PLzF1G)>OWW_ z)@g$b>B{??zh3%Jrxn+9cw9BYVL*a1FK4D7I_(e*g{Li65YIsn!l!hot6zK zcFNJv4UqpFE$LHak*s(a<3PTqWHi@IFzDX-WmUIcW~|Q&-)5lbz&USxRfMC9{>k3s z!eCEJO>q|wO(galw<-6*HO6cei?kT&tUC{ED#IDOQ;DcG3cbEZO_Zm$9AG5pCDV<* zPNpMEirxAFRU13|kTUq4wH|@Q#9?&Mpd=(`q0-QIh(?u55bc$FXv@1?q+-WVNgTnU z&JSJ6qV!ya^6xJp z=L zYn8B3jGD=v*-Zu!`}gn(rrMPTSnku)6w2Q648rp;DujWl4|Njep=S9%K>wnty^2eV8+}3G1TUJGD5m^#U+0z|ur0gc-eO4IC`s70X|EZDkbN^p! zr2PNgZLaO<&xE;pyx@)wSu|Yj7(c5ZNWls<%G@_>a(a{{%FQTY;dT0-mH6*JBz^F1 z5FOS z&2Xuo{!Eyj7Y`meHq0huU&@I5d0$4B?kiErJs`-041ctkPY(0IPE;guUv zFOMp3o$!N9hBAHn6kifi*Tb=Sa&yYd!j^N±Vt<)V++mOVPwq!_PbqYwD`Rqv(a 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%0DIC1b?|rbDII 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%0Dap=fbKX0BMj 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