IML模块中的嵌套范围如何工作?
我正在尝试创建一个优化模块。它包含其他模块。内部模块需要访问本地范围外部模块,因为IML中的优化功能如何工作。
这就是我喜欢的工作方式。
start mvo_cvar(m,s,ub,lb,st);
start C_VAR(x) global(s, st);
r = st - x*s*x`;
return (r);
finish C_VAR;
start F_RETURN(x) global(m);
r = m`*x`;
return (r);
finish F_RETURN;
nvar = nrow(s);
ones = J(1,nvar,1);
ubound = ones*ub;
lbound = ones*lb;
con = (lbound || {. .}) //
(ubound|| {. .}) //
(ones || {0 1});
optn = j(1,11,0);
optn[1] = 1;
optn[2] = 0;
optn[10] = 1;
optn[11] = 1;
x = J(1,nvar,0);
x[1]=1;
call nlpqn(rc,results,"F_RETURN",x,optn,con) nlc="C_VAR";
return (results);
finish mvo_cvar;
但是,F_RETURN和C_VAR模块找不到s
,st
或m
矩阵。我得到了
ERROR: (execution) Matrix has not been set to a value.
operation : ` at line 6948 column 14
operands : m
m 0 row 0 col (type ?, size 0)
statement : ASSIGN at line 6948 column 9
traceback : module F_RETURN at line 6948 column 9
module MVO_CVAR at line 6940 column 1
例如。
有没有办法引用外部模块的本地范围?
答案 0 :(得分:2)
没有本地模块或嵌套模块这样的东西。所有模块都是全球知名的。请参阅文档 http://support.sas.com/documentation/cdl/en/imlug/66112/HTML/default/viewer.htm#imlug_programstatements_sect023.htm
变量m,s和st是mvo_cvar模块的本地变量。为了使其他模块可以访问它们,它们都需要具有相同的全局名称。我喜欢用“g_”为我的全局变量添加前缀。 所以代码可能如下所示:
start mvo_cvar(m,s,ub,lb,st) global(g_m, g_s, g_st);
g_m = m; g_s=s; g_st = st; /* assign shared global vars */
nvar = nrow(s);
ones = J(1,nvar,1);
...
call nlpqn(rc,results,"F_RETURN",x,optn,con) nlc="C_VAR";
return (results);
finish mvo_cvar;
start C_VAR(x) global(g_s, g_st);
r = g_st - x*g_s*x`;
return (r);
finish C_VAR;
start F_RETURN(x) global(g_m);
r = g_m`*x`;
return (r);
finish F_RETURN;