IML 模块中的嵌套作用域



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模块找不到sstm矩阵。 我得到

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

例如。

有没有办法引用外部模块的本地范围?

没有本地模块或嵌套模块这样的东西。所有模块均享誉全球。请参阅文档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;

相关内容

  • 没有找到相关文章

最新更新