* *************************************************************************
subroutine nbstat( x, xst, su, nsu, ba, nba, nb,
+ nacti, naibs, iss, ip, kdist )
* *************************************************************************
* Purpose :
* ---------
* This routine modifies the status of the superbasic
* variables that are bounded. These variables become
* nonbasic. The superbasic set SU is reordered.
* Parameters :
* ------------
* x ( dble )
* input : the current iterate vector.
* output : unmodified.
* xst ( int )
* input : vector containing the status of the variables.
* output : the status of the superbasic variables that are
* bounded are modified and correspond to the status
* of nonbasic variables.
* su ( int )
* input : vector containing the indices of the superbasic
* variables.
* output : the vector contains only the indices of the
* superbasic variables that are not bounded.
* nsu ( int )
* input : the number of superbasic variables.
* output : the number of superbasic variables that are not
* bounded.
* ba ( int )
* input : vector containing the indices of the basic variables.
* output : unmodified.
* nba ( int )
* input : the number of basic variables.
* output : unmodified.
* nb ( int )
* input : the number of nonbasic variables.
* output : this number increases by one each time a
* superbasic variable is detected as bounded.
* nacti ( int )
* input : the number of variables that have been activated.
* output : this number increases by one each time a
* superbasic variable is detected as bounded.
* naibs ( int )
* input : vector whose IPth component contains the number
* of superbasic variables in independent set IP.
* output : the component decreases by one each time a
* superbasic variable is detected as bounded.
* iss ( int )
* input : vector whose kth component contains the indice of
* independent superbasic set in which the kth variable
* is included. If the kth component is zero, then
* variable k is not included in one independent set.
* output : the components corresponding to the indices of the
* superbasic variables that are bounded are set to zero.
* If the superbasic set becomes empty, the components
* corresponding to the indices of the basic variables are
* also set to zero.
* ip ( int )
* input : the indice of the independent superbasic set
* in which where are working.
* output : unmodified.
* kdist ( int )
* input : vector containing for each superbasic variable
* the length of its flow augmenting path.
* output : only the components of the superbasic variables
* that are not bounded are maintained.
* Routines used :
* ---------------
* abs.
* snxdej, sxdej, sxnbl, sxnbu, gxbdg, xlower, isetcd.
* Programming :
* -------------
* D. Tuyttens
* ========================================================================
* Routine parameters
integer xst(*), su(*), nsu, ba(*), nba, nb,
+ nacti, naibs(*), iss(*), ip, kdist(*)
double precision x(*)
* Internal variables
integer ik, k, next
logical gxbdg
double precision lb, xlower
* Common specifications
double precision epsmch, huge, tiny, tol
common / prbmch / epsmch, huge, tiny, tol
double precision zero, one, two, three, half, tenm1, tenm2, tenm4
common / prbcst / zero, one, two, three, half, tenm1, tenm2, tenm4
*
* Initialize the status of the independent set IP to
* an independent set that does not need to be de-joined.
*
call snxdej(xst(ip))
*
* Loop on the superbasic variables and test if
* some of them are bounded.
*
next = 0
do 10 ik = 1 , nsu
k = su(ik)
if( gxbdg(xst(k)) ) then
*
* The superbasic variable K is bounded.
* Modify its status such that it corresponds
* to a nonbasic variable.
*
lb = xlower(k)
if( x(k)-lb .le. tol*(one+abs(lb)) ) then
call sxnbl(xst(k))
else
call sxnbu(xst(k))
endif
*
* The nonbasic set is increased, but the
* superbasic set is decreased.
* The status of the independent set IP,
* is modified and correspond to the status of
* an independent set that need to be de-joined.
*
nb = nb + 1
naibs(ip) = naibs(ip) - 1
iss(k) = 0
nacti = nacti + 1
call sxdej(xst(ip))
else
*
* The superbasic variable is not bounded.
* The vectors SU and KDIST are reordered.
*
next = next + 1
su(next) = su(ik)
kdist(next) = kdist(ik)
endif
10 continue
nsu = next
*
* If the superbasic set becomes empty,
* then the independent set IP disappears.
*
if( naibs(ip).eq.0 ) then
call snxdej(xst(ip))
call isetcd(nba, ba, iss, 0 )
endif
*
return
end