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 43 44 45 46
|
//------------------------------------------------------------------------------
// GB_zombie.h: definitions for zombies
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
#ifndef GB_ZOMBIE_H
#define GB_ZOMBIE_H
// GB_FLIP is a kind of "negation" about (-1) of a zero-based index.
// If i >= 0 then it is not flipped.
// If i < 0 then it has been flipped.
// Like negation, GB_FLIP is its own inverse: GB_FLIP (GB_FLIP (i)) == i.
// The "nil" value, -1, doesn't change when flipped: GB_FLIP (-1) = -1.
// GB_UNFLIP(i) is like taking an absolute value, undoing any GB_FLIP(i).
// An entry A(i,j) in a matrix can be marked as a "zombie". A zombie is an
// entry that has been marked for deletion, but hasn't been deleted yet because
// it's more efficient to delete all zombies all at once, instead of one at a
// time. Zombies are created by submatrix assignment, C(I,J)=A which copies
// not only new entries into C, but it also deletes entries already present in
// C. If an entry appears in A but not C(I,J), it is a new entry; new entries
// placed in the pending tuple lists to be added later. If an entry appear in
// C(I,J) but NOT in A, then it is marked for deletion by flipping its row
// index, marking it as a zombie.
// Zombies can be restored as regular entries by GrB_*assign. If an assignment
// C(I,J)=A finds an entry in A that is a zombie in C, the zombie becomes a
// regular entry, taking on the value from A. The row index is unflipped.
// Zombies are deleted and pending tuples are added into the matrix all at
// once, by GB_wait.
#define GB_FLIP(i) (-(i)-2)
#define GB_IS_FLIPPED(i) ((i) < 0)
#define GB_IS_ZOMBIE(i) ((i) < 0)
#define GB_IS_NOT_FLIPPED(i) ((i) >= 0)
#define GB_UNFLIP(i) (((i) < 0) ? GB_FLIP(i) : (i))
#define GBI_UNFLIP(Ai,p,avlen) \
((Ai == NULL) ? ((p) % (avlen)) : GB_UNFLIP (Ai [p]))
#endif
|