Operations Research topics: SAS/OR,
SAS Optimization, and SAS Simulation Studio

proc OPTMODEL taking too long

Reply
New Contributor
Posts: 3

proc OPTMODEL taking too long

I am trying to do an optimization and it's taking too long (around 150 mins), on the other hand implementation in R takes only 10 mins approx. Here is the SAS code; I guess there might be an efficient way of implementing it.

SAS Code:

*************

proc optmodel;

num n = &n; number ysq = &mysq; number y{1..n};

read data ret into [_n_] y;

var omega init 3.442868e-07, alpha init -4.391689, beta init 9.766483e-01, theta init -3.954835e-03,

delta init 5.340570e-03, lambda0 init 2.626132e-02, rho init 9.763934e-01, gamma init 9.025426e-01,

alphaj init -6.635340e-04, alphan init -9.694536e+00, alphanj init  -1.194563e-01, mu init 2.360808e-04, v init 8.541275;

impvar pars {i in 1..n, j in 1..27} =

(if (i =1 and j = 1) then lambda0 / (1-rho)

else if (i =1 and j = 2) then 0

else if (i =1 and j = 3) then ysq

else if (i=1 and 4 <= j <= 24) then (gamma(0.5*(v+1))) * (1/(gamma(0.5*v)*sqrt(3.141592653*v*(pars[i,3]+(j-4)*(delta)**2)))) * (1 + ((y-(mu-theta*(pars[i,1]-(j-4))))**2)/(v*(pars[i,3]+(j-4)*(delta)**2)))**(-0.5*(v+1))

else if (i=1 and j = 25) then sum{k in 1..21}(pars[i,(k+3)]* pars[i,1]**(k-1) * exp(-pars[i,1])/fact((k-1)) )

else if (i=1 and j = 26) then sum{k in 1..21}((k-1)*pars[i,(k+3)]* pars[i,1]**(k-1) * exp(-pars[i,1])/fact((k-1)) )

else if (i=1 and j = 27) then pars[i,26]/pars[i,25]

else if (i <> 1 and j = 1) then lambda0 + rho*pars[(i-1),1] + gamma * pars[(i-1),27]

else if (i <> 1 and j = 2 and (y[(i-1)]-mu < 0 )) then exp(alpha + (alphaj + alphanj)*pars[(i-1),26] + alphan)

else if (i <> 1 and j = 2 and (y[(i-1)]-mu >= 0 )) then exp(alpha + alphaj*pars[(i-1),26])

else if (i <> 1 and j = 3) then omega + pars[i,2]*(y[(i-1)]-mu)**2 + beta*pars[(i-1),3]

else if (i <> 1 and 4 <= j <= 24) then (gamma(0.5*(v+1))) * (1/(gamma(0.5*v)*sqrt(3.141592653*v*(pars[i,3]+(j-4)*(delta)**2)))) * (1 + ((y-(mu-theta*(pars[i,1]-(j-4))))**2)/(v*(pars[i,3]+(j-4)*(delta)**2)))**(-0.5*(v+1))

else if (i <> 1 and j = 25) then sum{k in 1..21}(pars[i,(k+3)]* pars[i,1]**(k-1) * exp(-pars[i,1])/fact((k-1)) )

else if (i <> 1 and j = 26) then sum{k in 1..21}((k-1)*pars[i,(k+3)]* pars[i,1]**(k-1) * exp(-pars[i,1])/fact((k-1)) )

else if (i <> 1 and j = 27) then pars[i,26]/pars[i,25] - pars[i,1] );

max z = sum{k in 1..n}(log(pars[k,25]));

omega.lb = 1e-12; alpha.lb = -100; beta.lb = -100; theta.lb=-100; delta.lb=1e-06; lambda0.lb=1e-06; rho.lb=0;

gamma.lb=0; alphaj.lb = -100; alphan.lb = -100; alphanj.lb = -100; mu.lb = -1; v.lb = 3+1e-06;

omega.ub = 1-1e-06; alpha.ub = 100; beta.ub = 100; theta.ub=100; delta.ub=100; lambda0.ub=30; rho.ub=1-1e-06;

gamma.ub=1-1e-06; alphaj.ub = 100; alphan.ub = 100; alphanj.ub = 100; mu.ub = 1; v.ub = 1800;

con c: rho >= gamma;

solve with NLP / tech=IP ; print omega; print alpha; print beta; print mu; print v; print lambda0; print rho;

print gamma; print alphan; print alphaj; print alphanj; print theta; print delta;

quit;

SAS Employee
Posts: 448

Re: proc OPTMODEL taking too long

Can you please attach the ret data set?

Note that <> is the MAX operator, so your IMPVAR declaration is not doing what you want.  Instead, use ne or ~= or ^= for not equals.

Also, I suspect that replacing the IMPVAR with explicit variables and constraints will reduce the solve time.

Ask a Question
Discussion stats
  • 1 reply
  • 268 views
  • 0 likes
  • 2 in conversation