R Under development (unstable) (2026-02-18 r89435 ucrt) -- "Unsuffered Consequences" Copyright (C) 2026 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(digits=12) > if(!require("BB"))stop("this test requires package BB.") Loading required package: BB > if(!require("setRNG"))stop("this test requires setRNG.") Loading required package: setRNG > > # Use a preset seed so test values are reproducable. > test.rng <- list(kind="Wichmann-Hill", normal.kind="Box-Muller", seed=c(979,1479,1542)) > old.seed <- setRNG(test.rng) > > ############################################################### > cat("BB test vmmix ...\n") BB test vmmix ... > > # Use a preset seed so test values are reproducable. > test.rng <- list(kind="Wichmann-Hill", normal.kind="Box-Muller", seed=c(979,1479,1542)) > old.seed <- setRNG(test.rng) > > dvm <- function (theta, mu, kappa) + { + 1/(2 * pi * besselI(x = kappa, nu = 0, expon.scaled = TRUE)) * + (exp(cos(theta - mu) - 1))^kappa + } > > ## > rmixedvm <- function (n, mu1, mu2, kappa1, kappa2, p) { + temp <- runif(n) + n1 <- sum(temp <= p) + y <- c(rvm(n1,mu1,kappa1),rvm(n-n1,mu2,kappa2)) + return(y) + } > > ## > rvm <- function (n, mean, k) + { + vm <- c(1:n) + a <- 1 + (1 + 4 * (k^2))^0.5 + b <- (a - (2 * a)^0.5)/(2 * k) + r <- (1 + b^2)/(2 * b) + obs <- 1 + while (obs <= n) { + U1 <- runif(1, 0, 1) + z <- cos(pi * U1) + f <- (1 + r * z)/(r + z) + c <- k * (r - f) + U2 <- runif(1, 0, 1) + if (c * (2 - c) - U2 > 0) { + U3 <- runif(1, 0, 1) + vm[obs] <- sign(U3 - 0.5) * acos(f) + mean + vm[obs] <- vm[obs]%%(2 * pi) + obs <- obs + 1 + } + else { + if (log(c/U2) + 1 - c >= 0) { + U3 <- runif(1, 0, 1) + vm[obs] <- sign(U3 - 0.5) * acos(f) + mean + vm[obs] <- vm[obs]%%(2 * pi) + obs <- obs + 1 + } + } + } + vm + } > > # > vmmix.loglik <- function(x,y){ + p <- x + - sum(log(p[5]*dvm(y,p[1],p[2])+(1-p[5])*dvm(y,p[3],p[4]))) + } > > y <- rmixedvm(n=500, mu1=pi/2, mu2=3*pi/2, kappa1=1.9, kappa2=2.2, p=0.67) > p <- c(pi/4,2,pi,1,0.5) > > lo <- rep(0.001,5) > hi <- c(Inf, Inf, Inf, Inf, 0.999) > > p <- c(runif(5,c(0,0.1,0,0.1,0.2),c(2*pi,5,2*pi,5,0.8))) > system.time(ans.spg <- spg(par=p, fn=vmmix.loglik, y=y, + lower=lo, upper=hi, + control=list(maxit=2500, gtol=1.e-06, M=20, trace=T)))[1] iter: 0 f-value: 1109.37057176 pgrad: 144.875004935 iter: 10 f-value: 885.441456003 pgrad: 3.02386980671 iter: 20 f-value: 861.239961838 pgrad: 2.60846296427 iter: 30 f-value: 859.059163015 pgrad: 0.725777416718 iter: 40 f-value: 859.025858134 pgrad: 0.529671524419 iter: 50 f-value: 859.032965904 pgrad: 0.991955175778 iter: 60 f-value: 858.983058765 pgrad: 0.472191459266 iter: 70 f-value: 858.971748572 pgrad: 2.16440071199 iter: 80 f-value: 858.96530957 pgrad: 0.551825678485 iter: 90 f-value: 858.933564683 pgrad: 1.1576810266 iter: 100 f-value: 858.917372168 pgrad: 0.738290421758 iter: 110 f-value: 858.886167106 pgrad: 0.264889195023 iter: 120 f-value: 858.880871728 pgrad: 0.253501184488 iter: 130 f-value: 858.872221718 pgrad: 0.255812679485 iter: 140 f-value: 858.867740162 pgrad: 0.215463842324 iter: 150 f-value: 858.857492793 pgrad: 0.321607558362 iter: 160 f-value: 858.85359187 pgrad: 0.221317577598 iter: 170 f-value: 858.852026056 pgrad: 0.162392552738 iter: 180 f-value: 858.850753286 pgrad: 0.157328940986 iter: 190 f-value: 858.849995806 pgrad: 0.2516858452 iter: 200 f-value: 858.848385696 pgrad: 0.148230583363 iter: 210 f-value: 858.846783484 pgrad: 0.250398441832 iter: 220 f-value: 858.845362293 pgrad: 0.135428308567 iter: 230 f-value: 858.844484217 pgrad: 0.823962409413 iter: 240 f-value: 858.842837028 pgrad: 0.124013013192 iter: 250 f-value: 858.838934354 pgrad: 0.105011395135 iter: 260 f-value: 858.838460158 pgrad: 0.101805426311 iter: 270 f-value: 858.837903017 pgrad: 0.209217887459 iter: 280 f-value: 858.837141487 pgrad: 0.094498773251 iter: 290 f-value: 858.836274204 pgrad: 0.0888576323632 iter: 300 f-value: 858.835857583 pgrad: 0.247268427214 iter: 310 f-value: 858.835462272 pgrad: 0.0975092007138 iter: 320 f-value: 858.835302389 pgrad: 0.326743929691 iter: 330 f-value: 858.834455129 pgrad: 0.246927520297 iter: 340 f-value: 858.831532608 pgrad: 0.0528962118551 iter: 350 f-value: 858.83206227 pgrad: 0.754166882022 iter: 360 f-value: 858.831098863 pgrad: 0.0481691131426 iter: 370 f-value: 858.83087454 pgrad: 0.244712305719 iter: 380 f-value: 858.830516756 pgrad: 0.172668706 iter: 390 f-value: 858.830405416 pgrad: 0.0401257693738 iter: 400 f-value: 858.830324089 pgrad: 0.039059386836 iter: 410 f-value: 858.830254699 pgrad: 0.0938939592743 iter: 420 f-value: 858.830142206 pgrad: 0.0366105723515 iter: 430 f-value: 858.829945889 pgrad: 0.141792497743 iter: 440 f-value: 858.829779772 pgrad: 0.0311172243528 iter: 450 f-value: 858.829728567 pgrad: 0.0302804892272 iter: 460 f-value: 858.829694989 pgrad: 0.243722896262 iter: 470 f-value: 858.829636129 pgrad: 0.0287161583401 iter: 480 f-value: 858.82958199 pgrad: 0.0277407252725 iter: 490 f-value: 858.829517071 pgrad: 0.0265310973191 iter: 500 f-value: 858.829483373 pgrad: 0.0259001353697 iter: 510 f-value: 858.829052355 pgrad: 0.0156455826072 iter: 520 f-value: 858.82916566 pgrad: 0.75577171389 iter: 530 f-value: 858.82899885 pgrad: 0.0606996763963 iter: 540 f-value: 858.82896368 pgrad: 0.18019250092 iter: 550 f-value: 858.828925411 pgrad: 0.0249281129072 iter: 560 f-value: 858.828908394 pgrad: 0.0101590558188 iter: 570 f-value: 858.828876058 pgrad: 0.00849922798807 iter: 580 f-value: 858.82887154 pgrad: 0.0116733644973 iter: 590 f-value: 858.828866948 pgrad: 0.00792510945757 iter: 600 f-value: 858.828877604 pgrad: 0.251098981607 iter: 610 f-value: 858.828858766 pgrad: 0.00740783434594 iter: 620 f-value: 858.828853695 pgrad: 0.0264935806626 iter: 630 f-value: 858.828839954 pgrad: 0.00608451955486 iter: 640 f-value: 858.82882789 pgrad: 0.004999947123 iter: 650 f-value: 858.828825051 pgrad: 0.0613874817645 iter: 660 f-value: 858.828820348 pgrad: 0.00421437107434 iter: 670 f-value: 858.828820171 pgrad: 0.0333227490046 iter: 680 f-value: 858.828818355 pgrad: 0.0348643425241 iter: 690 f-value: 858.828817374 pgrad: 0.0038619418774 iter: 700 f-value: 858.828816692 pgrad: 0.0169745817402 iter: 710 f-value: 858.828815337 pgrad: 0.00358909346687 iter: 720 f-value: 858.828814352 pgrad: 0.0330601324094 iter: 730 f-value: 858.828809293 pgrad: 0.0270449618256 iter: 740 f-value: 858.828807314 pgrad: 0.00227942109632 iter: 750 f-value: 858.828806622 pgrad: 0.00381646714231 iter: 760 f-value: 858.82880628 pgrad: 0.00381533027394 iter: 770 f-value: 858.828806071 pgrad: 0.00202817318495 iter: 780 f-value: 858.828805899 pgrad: 0.00197132976609 iter: 790 f-value: 858.828805679 pgrad: 0.0165493929671 iter: 800 f-value: 858.828805465 pgrad: 0.00186219040188 iter: 810 f-value: 858.828805258 pgrad: 0.00892327989277 iter: 820 f-value: 858.828804987 pgrad: 0.00173486114363 iter: 830 f-value: 858.828804826 pgrad: 0.00168029146153 iter: 840 f-value: 858.828804669 pgrad: 0.00262161847786 iter: 850 f-value: 858.828804561 pgrad: 0.00161207935889 iter: 860 f-value: 858.828804499 pgrad: 0.0184888904187 iter: 870 f-value: 858.828804225 pgrad: 0.00150748746819 iter: 880 f-value: 858.828803967 pgrad: 0.00987824932963 iter: 890 f-value: 858.828803831 pgrad: 0.00138470568345 iter: 900 f-value: 858.828803609 pgrad: 0.00185423232324 iter: 910 f-value: 858.828803576 pgrad: 0.0192835614143 iter: 920 f-value: 858.828803391 pgrad: 0.00121531229524 iter: 930 f-value: 858.828803282 pgrad: 0.00569229996472 iter: 940 f-value: 858.828803215 pgrad: 0.00795125743025 iter: 950 f-value: 858.828803054 pgrad: 0.00107547748485 iter: 960 f-value: 858.828802552 pgrad: 0.000819682099973 iter: 970 f-value: 858.828802452 pgrad: 0.000757154339226 iter: 980 f-value: 858.8288024 pgrad: 0.00437580638391 iter: 990 f-value: 858.828802291 pgrad: 0.00369595909433 iter: 1000 f-value: 858.828802257 pgrad: 0.00606291905569 iter: 1010 f-value: 858.82880222 pgrad: 0.000594582161284 iter: 1020 f-value: 858.828802203 pgrad: 0.000651425580145 iter: 1030 f-value: 858.828802186 pgrad: 0.000568434188608 iter: 1040 f-value: 858.828802143 pgrad: 0.000528643795406 iter: 1050 f-value: 858.828802175 pgrad: 0.0133786670631 iter: 1060 f-value: 858.828802088 pgrad: 0.0012573764252 user.self 2.4 > > # this should give the same reult. It just tests passing project arg > Userproject <- function(x, lower, upper, ...) { + x[x < lower] <- lower[x < lower] + x[x > upper] <- upper[x > upper] + return(x) + } > > ans.spg2 <- spg(par=p, fn=vmmix.loglik, y=y, + project="Userproject", + projectArgs=list(lower=lo, upper=hi), + control=list(maxit=2500, gtol=1.e-06, M=20, trace=T))[1] iter: 0 f-value: 1109.37057176 pgrad: 144.875004935 iter: 10 f-value: 885.441456003 pgrad: 3.02386980671 iter: 20 f-value: 861.239961838 pgrad: 2.60846296427 iter: 30 f-value: 859.059163015 pgrad: 0.725777416718 iter: 40 f-value: 859.025858134 pgrad: 0.529671524419 iter: 50 f-value: 859.032965904 pgrad: 0.991955175778 iter: 60 f-value: 858.983058765 pgrad: 0.472191459266 iter: 70 f-value: 858.971748572 pgrad: 2.16440071199 iter: 80 f-value: 858.96530957 pgrad: 0.551825678485 iter: 90 f-value: 858.933564683 pgrad: 1.1576810266 iter: 100 f-value: 858.917372168 pgrad: 0.738290421758 iter: 110 f-value: 858.886167106 pgrad: 0.264889195023 iter: 120 f-value: 858.880871728 pgrad: 0.253501184488 iter: 130 f-value: 858.872221718 pgrad: 0.255812679485 iter: 140 f-value: 858.867740162 pgrad: 0.215463842324 iter: 150 f-value: 858.857492793 pgrad: 0.321607558362 iter: 160 f-value: 858.85359187 pgrad: 0.221317577598 iter: 170 f-value: 858.852026056 pgrad: 0.162392552738 iter: 180 f-value: 858.850753286 pgrad: 0.157328940986 iter: 190 f-value: 858.849995806 pgrad: 0.2516858452 iter: 200 f-value: 858.848385696 pgrad: 0.148230583363 iter: 210 f-value: 858.846783484 pgrad: 0.250398441832 iter: 220 f-value: 858.845362293 pgrad: 0.135428308567 iter: 230 f-value: 858.844484217 pgrad: 0.823962409413 iter: 240 f-value: 858.842837028 pgrad: 0.124013013192 iter: 250 f-value: 858.838934354 pgrad: 0.105011395135 iter: 260 f-value: 858.838460158 pgrad: 0.101805426311 iter: 270 f-value: 858.837903017 pgrad: 0.209217887459 iter: 280 f-value: 858.837141487 pgrad: 0.094498773251 iter: 290 f-value: 858.836274204 pgrad: 0.0888576323632 iter: 300 f-value: 858.835857583 pgrad: 0.247268427214 iter: 310 f-value: 858.835462272 pgrad: 0.0975092007138 iter: 320 f-value: 858.835302389 pgrad: 0.326743929691 iter: 330 f-value: 858.834455129 pgrad: 0.246927520297 iter: 340 f-value: 858.831532608 pgrad: 0.0528962118551 iter: 350 f-value: 858.83206227 pgrad: 0.754166882022 iter: 360 f-value: 858.831098863 pgrad: 0.0481691131426 iter: 370 f-value: 858.83087454 pgrad: 0.244712305719 iter: 380 f-value: 858.830516756 pgrad: 0.172668706 iter: 390 f-value: 858.830405416 pgrad: 0.0401257693738 iter: 400 f-value: 858.830324089 pgrad: 0.039059386836 iter: 410 f-value: 858.830254699 pgrad: 0.0938939592743 iter: 420 f-value: 858.830142206 pgrad: 0.0366105723515 iter: 430 f-value: 858.829945889 pgrad: 0.141792497743 iter: 440 f-value: 858.829779772 pgrad: 0.0311172243528 iter: 450 f-value: 858.829728567 pgrad: 0.0302804892272 iter: 460 f-value: 858.829694989 pgrad: 0.243722896262 iter: 470 f-value: 858.829636129 pgrad: 0.0287161583401 iter: 480 f-value: 858.82958199 pgrad: 0.0277407252725 iter: 490 f-value: 858.829517071 pgrad: 0.0265310973191 iter: 500 f-value: 858.829483373 pgrad: 0.0259001353697 iter: 510 f-value: 858.829052355 pgrad: 0.0156455826072 iter: 520 f-value: 858.82916566 pgrad: 0.75577171389 iter: 530 f-value: 858.82899885 pgrad: 0.0606996763963 iter: 540 f-value: 858.82896368 pgrad: 0.18019250092 iter: 550 f-value: 858.828925411 pgrad: 0.0249281129072 iter: 560 f-value: 858.828908394 pgrad: 0.0101590558188 iter: 570 f-value: 858.828876058 pgrad: 0.00849922798807 iter: 580 f-value: 858.82887154 pgrad: 0.0116733644973 iter: 590 f-value: 858.828866948 pgrad: 0.00792510945757 iter: 600 f-value: 858.828877604 pgrad: 0.251098981607 iter: 610 f-value: 858.828858766 pgrad: 0.00740783434594 iter: 620 f-value: 858.828853695 pgrad: 0.0264935806626 iter: 630 f-value: 858.828839954 pgrad: 0.00608451955486 iter: 640 f-value: 858.82882789 pgrad: 0.004999947123 iter: 650 f-value: 858.828825051 pgrad: 0.0613874817645 iter: 660 f-value: 858.828820348 pgrad: 0.00421437107434 iter: 670 f-value: 858.828820171 pgrad: 0.0333227490046 iter: 680 f-value: 858.828818355 pgrad: 0.0348643425241 iter: 690 f-value: 858.828817374 pgrad: 0.0038619418774 iter: 700 f-value: 858.828816692 pgrad: 0.0169745817402 iter: 710 f-value: 858.828815337 pgrad: 0.00358909346687 iter: 720 f-value: 858.828814352 pgrad: 0.0330601324094 iter: 730 f-value: 858.828809293 pgrad: 0.0270449618256 iter: 740 f-value: 858.828807314 pgrad: 0.00227942109632 iter: 750 f-value: 858.828806622 pgrad: 0.00381646714231 iter: 760 f-value: 858.82880628 pgrad: 0.00381533027394 iter: 770 f-value: 858.828806071 pgrad: 0.00202817318495 iter: 780 f-value: 858.828805899 pgrad: 0.00197132976609 iter: 790 f-value: 858.828805679 pgrad: 0.0165493929671 iter: 800 f-value: 858.828805465 pgrad: 0.00186219040188 iter: 810 f-value: 858.828805258 pgrad: 0.00892327989277 iter: 820 f-value: 858.828804987 pgrad: 0.00173486114363 iter: 830 f-value: 858.828804826 pgrad: 0.00168029146153 iter: 840 f-value: 858.828804669 pgrad: 0.00262161847786 iter: 850 f-value: 858.828804561 pgrad: 0.00161207935889 iter: 860 f-value: 858.828804499 pgrad: 0.0184888904187 iter: 870 f-value: 858.828804225 pgrad: 0.00150748746819 iter: 880 f-value: 858.828803967 pgrad: 0.00987824932963 iter: 890 f-value: 858.828803831 pgrad: 0.00138470568345 iter: 900 f-value: 858.828803609 pgrad: 0.00185423232324 iter: 910 f-value: 858.828803576 pgrad: 0.0192835614143 iter: 920 f-value: 858.828803391 pgrad: 0.00121531229524 iter: 930 f-value: 858.828803282 pgrad: 0.00569229996472 iter: 940 f-value: 858.828803215 pgrad: 0.00795125743025 iter: 950 f-value: 858.828803054 pgrad: 0.00107547748485 iter: 960 f-value: 858.828802552 pgrad: 0.000819682099973 iter: 970 f-value: 858.828802452 pgrad: 0.000757154339226 iter: 980 f-value: 858.8288024 pgrad: 0.00437580638391 iter: 990 f-value: 858.828802291 pgrad: 0.00369595909433 iter: 1000 f-value: 858.828802257 pgrad: 0.00606291905569 iter: 1010 f-value: 858.82880222 pgrad: 0.000594582161284 iter: 1020 f-value: 858.828802203 pgrad: 0.000651425580145 iter: 1030 f-value: 858.828802186 pgrad: 0.000568434188608 iter: 1040 f-value: 858.828802143 pgrad: 0.000528643795406 iter: 1050 f-value: 858.828802175 pgrad: 0.0133786670631 iter: 1060 f-value: 858.828802088 pgrad: 0.0012573764252 > > > z <- sum(ans.spg$par) > good <- 11.28100000000000 > #on Windows 11.28096954777041 > #on Linux64 11.28094286243805 > #on Linux32 11.28105871638063 > #on Linux32 11.28061301609979 > print(z, digits=16) [1] 11.28026328102907 > # test tol relaxed from 1e-3 to 5e-3 when ftol arg added to spg 2011.2-1 > if(any(abs(good - z) > 5e-3)) stop("BB test vmmix.loglik a1 FAILED") > > > z <- sum(ans.spg2$par) > print(z, digits=16) [1] 11.28026328102907 > # test tol relaxed from 1e-3 to 5e-3 when ftol arg added to spg 2011.2-1 > if(any(abs(good - z) > 5e-3)) stop("BB test vmmix.loglik a2 FAILED") > > > proc.time() user system elapsed 5.00 0.04 5.03