/*
* CXSPARSE: a Concise Sparse Matrix package - Extended.
* Copyright (c) 2006-2009, Timothy A. Davis.
* http://www.cise.ufl.edu/research/sparse/CXSparse
*
* CXSparse is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* CXSparse is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this Module; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "cs.h"
/* consider A(i,j), node j in ith row subtree and return lca(jprev,j) */
CS_INT cs_leaf (CS_INT i, CS_INT j, const CS_INT *first, CS_INT *maxfirst, CS_INT *prevleaf,
CS_INT *ancestor, CS_INT *jleaf)
{
CS_INT q, s, sparent, jprev ;
if (!first || !maxfirst || !prevleaf || !ancestor || !jleaf) return (-1) ;
*jleaf = 0 ;
if (i <= j || first [j] <= maxfirst [i]) return (-1) ; /* j not a leaf */
maxfirst [i] = first [j] ; /* update max first[j] seen so far */
jprev = prevleaf [i] ; /* jprev = previous leaf of ith subtree */
prevleaf [i] = j ;
*jleaf = (jprev == -1) ? 1: 2 ; /* j is first or subsequent leaf */
if (*jleaf == 1) return (i) ; /* if 1st leaf, q = root of ith subtree */
for (q = jprev ; q != ancestor [q] ; q = ancestor [q]) ;
for (s = jprev ; s != q ; s = sparent)
{
sparent = ancestor [s] ; /* path compression */
ancestor [s] = q ;
}
return (q) ; /* q = least common ancester (jprev,j) */
}