Revision 7a08558618effad71194d79d35ebf5e296428452 authored by Hans Kestler on 11 June 2012, 00:00:00 UTC, committed by Gabor Csardi on 11 June 2012, 00:00:00 UTC
1 parent 32b4d77
Raw File
common.c
#include "common.h"
#include <string.h>
#include <stdio.h>

AllocatedMemory * memoryMap = NULL;

/**
 * Common utilities for the BoolNet package
 *
 * This is part of the BooleanNetwork R package.
 *
 * Copyright 2009/2010 by Christoph Müssel and Zhou Dao
 *
 * Contact christoph.muessel@uni-ulm.de
 */

void freeAllMemory()
{  
  AllocatedMemory * m, * tmp;
  HASH_ITER(hh, memoryMap, m, tmp) 
  {
    HASH_DEL(memoryMap, m);
    free(m->ptr);
    free(m);
  }
  //Rprintf("Freed all memory\n");
}

/**
 * Encode a vector of binary values in an integer.
 * The rightmost element in <bin> is the leftmost bit in <dec>
 * <dec> is an array of <num> elements, and <bin> points
 * to an integer to which the result is written.
 */
void bin2dec(int *dec, int *bin, int *numBits)
{
	// clear output first
	unsigned int numElts;
	if (*numBits % BITS_PER_BLOCK_32 == 0)
		numElts = *numBits / BITS_PER_BLOCK_32;
	else
		numElts = *numBits / BITS_PER_BLOCK_32 + 1;

	memset(dec,0,numElts*sizeof(int));

	// decode input and write binary integers
	unsigned int * unsigned_dec = (unsigned int *) dec;
	unsigned int i;

	for(i = 0; i < *numBits; ++i)
	{
		unsigned_dec[i / BITS_PER_BLOCK_32] |= (bin[i] << (i % BITS_PER_BLOCK_32));
	}
}

/**
 * Decode an integer to a vector of binary values.
 * The rightmost element in <bin> is the leftmost bit in <dec>
 * <bin> points to the result vector, <dec> is a number
 * to be decoded, and <num> is the number of bits/elements in bin
 */
void dec2bin(int *bin, int *dec, int *numBits)
{
	unsigned int i;
	unsigned int * unsigned_dec = (unsigned int *) dec;

	for(i = 0; i < *numBits; ++i)
		if( (unsigned_dec[i / BITS_PER_BLOCK_32] & (1 << (i % BITS_PER_BLOCK_32))) != 0)
			bin[i] = 1;
		else
			bin[i] = 0;
}

/**
 * Inserts values of fixed genes into states - this is required as
 * fixed genes are not encoded in the internal state representations.
 * <value> is a pointer to a state to be corrected.
 * <fixedGenes> is an array specifying which genes are fixed, as contained in
 * the BooleanNetwork structure.
 * <numGenes> is the length of <fixedGenes>.
 * The function changes the state pointed to by <value> and has no return value.
 */
void insertFixedGenes(unsigned int * value, int* fixedGenes, unsigned int numGenes)
{
	unsigned int tmp[numGenes];
	unsigned int i, j = 0;

	// build an array of Boolean values for the genes
	for (i = 0; i < numGenes; ++i)
	{
		if (fixedGenes[i] != -1)
		// this gene is fixed
		{
			tmp[i] = fixedGenes[i];
		}
		else
		// not a fixed gene => take value from original state
		{
			tmp[i] = ((value[j / BITS_PER_BLOCK_32] & (1 << (j % BITS_PER_BLOCK_32))) != 0) ? 1 : 0;
			++j;
		}
	}

	// re-encode Boolean array to integer value
	bin2dec((int *)value,(int*)tmp,(int*)&numGenes);
}

/**
 * Removes values of fixed genes from states - this is required as
 * fixed genes are not encoded in the internal state representations.
 * <value> is a pointer to a state to be corrected.
 * <fixedGenes> is an array specifying which genes are fixed, as contained in
 * the BooleanNetwork structure.
 * <numGenes> is the length of <fixedGenes>.
 * The function changes the state pointed to by <value> and has no return value.
 */
void removeFixedGenes(unsigned int * value, int* fixedGenes, unsigned int numGenes)
{	
	unsigned int tmp[numGenes];
	memset(tmp,0,sizeof(unsigned int) * numGenes);
	unsigned int i, j = 0;
	
	// build an array of Boolean values for the genes
	for (i = 0; i < numGenes; ++i)
	{
		if (fixedGenes[i] == -1)
		{
			tmp[j] = ((value[i / BITS_PER_BLOCK_32] & (1 << (i % BITS_PER_BLOCK_32))) != 0) ? 1 : 0;
			++j;
		}
	}

	// re-encode Boolean array to integer value
	bin2dec((int *)value,(int*)tmp,(int*)&numGenes);
}
back to top