summaryrefslogtreecommitdiff
path: root/modules/optimization/macros/recons.sci
blob: 791198cdea3df74307f9e5719666d5009e404344 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
//
function [r,ind]=recons(r,ind)
    //reconstruct a list from a flat list (see aplat)
    if ind==-1 then return;end
    nr=size(r)
    ma=0
    for k=nr:-1:1
        mm=size(ind(k),"*");
        if ma<=mm then ma=mm;ki=k; end
    end

    if ma<=1 then return; end
    vi=ind(ki);vi=vi(1:ma-1);
    k=ki
    vj=vi

    while vj==vi
        k=k+1
        if k>nr then break; end
        vv=ind(k);
        if size(vv,"*")==ma then vj=vv(1:ma-1); else vj=[]; end
    end
    kj=k-1
    rt=list(r(ki))
    for k=ki+1:kj
        rt(k-ki+1)=r(ki+1)
        r(ki+1)=null()
        ind(ki+1)=null()
    end
    ind(ki)=vi
    r(ki)=rt
    [r,ind]=recons(r,ind)

endfunction