#include <math.h>
#include <Rcpp.h>
using namespace Rcpp;
if !defined(max)
define max(a,b) (a>b?a:b)
endif
if !defined(min)
define min(a,b) (a<b?a:b)
endif
// [[Rcpp::export]]
NumericVector mexsigma_update(double sigma, double sigmamax, double sigmamin, double prim_win, double dual_win,
int sigma_update_iter, int iter, int inner_breakyes, int i,
double sigmascale = 5.0) {
/** main body ****/
/***
if !defined(max)
define max(a,b) (a>b?a:b)
endif
if !defined(min)
define min(a,b) (a<b?a:b)
endif
// [[Rcpp::export]] NumericVector mexsigma_update(double sigma, double sigmamax, double sigmamin, double prim_win, double dual_win, int sigma_update_iter, int iter, int inner_breakyes, int i, double sigmascale = 5.0) { /** main body ****/
if ( iter < 10) sigma_update_iter = 2; else if(iter < 20) sigma_update_iter = 3; else if(iter < 200) sigma_update_iter = 3; else if(iter < 500) sigma_update_iter = 10; else sigma_update_iter = 20;
if ((iter%sigma_update_iter == 0) && (inner_breakyes < 0)) { if (prim_win > max(1, 1.2dual_win)){ prim_win = 0.0; sigma = min(sigmamax,sigmasigmascale); }else if (dual_win > max(1, 1.2*prim_win)){ dual_win = 0.0; sigma = max(sigmamin,sigma/sigmascale); } }
if (inner_breakyes >= 0 && iter >= 10) { sigma = max(sigmamin,2*sigma/sigmascale); }
NumericVector out(3);
out[0]=sigma; out[1]=prim_win; out[2]=dual_win;
return out; }
// [[Rcpp::export]] NumericVector mexscale(double sigma, double normx, double normuxi, double bscale, double cscale) { double bscale2, cscale2, cst = 1.0; double sbc, sboc;
/** main body ****/ if (normx < pow(10,-7)) { normx = 1; normuxi = 1; } bscale2 = normxcst; cscale2 = normuxicst; sbc = sqrt(bscale2cscale2);
sboc = sqrt(bscale2/cscale2); sigma = sigma(cscale2/bscale2); cscale = cscalecscale2; bscale = bscalebscale2;
NumericVector out(7);
out[0] = sigma; out[1] = bscale2; out[2] = cscale2; out[3] = sbc; out[4] = sboc; out[5] = bscale; out[6] = cscale;
return out; }