/* util.c */
#include "../Perm.h"
/*--------------------------------------------------------------------*/
/*
---------------------------------------
return the storage taken by this object
created -- 96jan05, cca
---------------------------------------
*/
int
Perm_sizeOf (
Perm *perm
) {
int bytes = sizeof(struct _Perm) ;
if ( perm == NULL ) {
fprintf(stderr, "\n fatal error in Perm_sizeOf(%p)"
"\n bad input\n", perm) ;
exit(-1) ;
}
if ( perm->newToOld != NULL ) {
bytes += perm->size * sizeof(int) ;
}
if ( perm->oldToNew != NULL ) {
bytes += perm->size * sizeof(int) ;
}
return(bytes) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------------
check that the permutation object does house a permutation
return value --
1 if a true permutation
0 otherwise
----------------------------------------------------------
*/
int
Perm_checkPerm (
Perm *perm
) {
int inew, iold, rc, size ;
int *counts, *newToOld, *oldToNew ;
/*
---------------
check the input
---------------
*/
if ( perm == NULL
|| perm->isPresent < 1 || perm->isPresent > 3
|| (size = perm->size) <= 0 ) {
fprintf(stderr, "\n fatal error in Perm_checkPerm(%p)"
"\n bad input\n", perm) ;
exit(-1) ;
}
rc = 1 ;
counts = IVinit(size, 0) ;
if ( (newToOld = perm->newToOld) != NULL ) {
for ( inew = 0 ; inew < size ; inew++ ) {
if ( 0 <= (iold = newToOld[inew]) && iold < size ) {
counts[iold]++ ;
} else {
IVfree(counts) ;
return(0) ;
}
}
for ( iold = 0 ; iold < size ; iold++ ) {
if ( counts[iold] != 1 ) {
IVfree(counts) ;
return(0) ;
}
}
}
if ( (oldToNew = perm->oldToNew) != NULL ) {
IVzero(size, counts) ;
for ( iold = 0 ; iold < size ; iold++ ) {
if ( 0 <= (inew = oldToNew[iold]) && inew < size ) {
counts[inew]++ ;
} else {
IVfree(counts) ;
return(0) ;
}
}
for ( inew = 0 ; inew < size ; inew++ ) {
if ( counts[inew] != 1 ) {
IVfree(counts) ;
return(0) ;
}
}
}
IVfree(counts) ;
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------
if the old-to-new vector is not present,
create it and fill its entries
created -- 96mar16, cca
----------------------------------------
*/
void
Perm_fillOldToNew (
Perm *perm
) {
int size ;
/*
---------------
check the input
---------------
*/
if ( perm == NULL
|| perm->isPresent < 1 || perm->isPresent > 3
|| (size = perm->size) <= 0 ) {
fprintf(stderr, "\n fatal error in Perm_fillOldToNew(%p)"
"\n bad input\n", perm) ;
exit(-1) ;
}
if ( perm->isPresent == 1 ) {
int inew ;
int *newToOld = perm->newToOld ;
int *oldToNew = perm->oldToNew = IVinit(size, -1) ;
for ( inew = 0 ; inew < size ; inew++ ) {
oldToNew[newToOld[inew]] = inew ;
}
perm->isPresent = 3 ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------
if the new-to-old vector is not present,
create it and fill its entries
created -- 96mar16, cca
----------------------------------------
*/
void
Perm_fillNewToOld (
Perm *perm
) {
int size ;
/*
---------------
check the input
---------------
*/
if ( perm == NULL
|| perm->isPresent < 1 || perm->isPresent > 3
|| (size = perm->size) <= 0 ) {
fprintf(stderr, "\n fatal error in Perm_fillNewToOld(%p)"
"\n bad input\n", perm) ;
exit(-1) ;
}
if ( perm->isPresent == 2 ) {
int iold ;
int *newToOld = perm->newToOld = IVinit(size, -1) ;
int *oldToNew = perm->oldToNew ;
for ( iold = 0 ; iold < size ; iold++ ) {
newToOld[oldToNew[iold]] = iold ;
}
perm->isPresent = 3 ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------
if the old-to-new vector is present,
release it and free its entries
created -- 96mar16, cca
------------------------------------
*/
void
Perm_releaseOldToNew (
Perm *perm
) {
int size ;
/*
---------------
check the input
---------------
*/
if ( perm == NULL
|| perm->isPresent < 1 || perm->isPresent > 3
|| (size = perm->size) <= 0 ) {
fprintf(stderr, "\n fatal error in Perm_fillOldToNew(%p)"
"\n bad input\n", perm) ;
exit(-1) ;
}
switch ( perm->isPresent ) {
case 1 :
break ;
case 2 :
IVfree(perm->oldToNew) ;
perm->isPresent = 0 ;
break ;
case 3 :
IVfree(perm->oldToNew) ;
perm->isPresent = 1 ;
break ;
default :
break ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------
if the new-to-old vector is present,
release it and free its entries
created -- 96mar16, cca
------------------------------------
*/
void
Perm_releaseNewToOld (
Perm *perm
) {
int size ;
/*
---------------
check the input
---------------
*/
if ( perm == NULL
|| perm->isPresent < 1 || perm->isPresent > 3
|| (size = perm->size) <= 0 ) {
fprintf(stderr, "\n fatal error in Perm_fillOldToNew(%p)"
"\n bad input\n", perm) ;
exit(-1) ;
}
switch ( perm->isPresent ) {
case 1 :
IVfree(perm->newToOld) ;
perm->isPresent = 0 ;
break ;
case 2 :
break ;
case 3 :
IVfree(perm->newToOld) ;
perm->isPresent = 1 ;
break ;
default :
break ;
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1