2014-02-28 103 views
0

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模块不能找到sst,或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 

例如。

有没有办法引用外部模块的本地作用域?

回答

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; 
+0

谢谢。不完全是我所希望的答案。我将不得不使用宏来执行此操作,因为这些全局变量的名称会发生​​更改,并且在运行时间之前不会知道。 – DomPazz

+0

当你打算使用它们时,你肯定知道变量的名字。 JUst定义了一个名为SetGlobal()的模块,用于从您想要使用的任何局部变量中分配全局变量。 – Rick