/* Import from Gabor API
Copyright (c) 2002-3 Adriaan Tijsseling
All Rights Reserved
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/*
Author: Adriaan Tijsseling (AGT)
Copyright: (c) Copyright 2002 Adriaan Tijsseling. All rights reserved.
Description: Generic utilities
*/
#include
#include
#include "Utilities.h"
using namespace std;
namespace celeste
{
long gPrecision;
long gWidth;
// for Permute
struct tmp
{
int p; /* permutation */
int r; /* random number */
};
// Permutes an array
void Permute( int* array, size_t size )
{
struct tmp *t;
size_t i;
t = new tmp[size];
for( i = 0; i < size; i++ ) // load up struct with data
{
t[i].r = rand();
t[i].p = array[i];
}
qsort( t, size, sizeof(struct tmp), cmp ); // shuffle
// data back to original array
for( i = 0; i < size; i++ ) array[i] = t[i].p;
delete[] t;
}
// use for permuted qsort
int cmp( const void *s1, const void *s2 )
{
struct tmp *a1 = (struct tmp *)s1;
struct tmp *a2 = (struct tmp *)s2;
return((a1->r) - (a2->r));
}
float Heavyside( float a )
{
// if a is larger than 0.5, return 1.0, else return 0.0
return (float)( ( a > 0.5 ) ? 1.0 : 0.0 );
}
float Sigmoid( float act )
{
return (float)( 1.0 / ( 1.0 + exp( -1.0 * act ) ) );
}
// beta must be negative
// untested
float Sigmoid( float beta, float a_pot )
{
return (float)( 1.0 / ( 1.0 + exp( beta * a_pot ) ) );
}
float Sigmoid( float beta, float a_pot, float thresh )
{
return (float)( 1.0 / ( 1.0 + exp( beta * a_pot + thresh ) ) );
}
// Create a matrix and fill it with constant given in parameter
int **CreateMatrix( int val, int row, int col )
{
int **matrix = new int*[row];
for ( int i = 0; i < row; i++ )
{
matrix[i] = new int[col];
for ( int j = 0; j < col; j++ ) matrix[i][j] = val;
}
return matrix;
}
// Reset a matrix with new value val
void ResetMatrix( int ** matrix, int val, int row, int col )
{
for ( int i = 0; i < row; i++ )
for ( int j = 0; j < col; j++ )
matrix[i][j] = val;
}
// Dispose allocated matrix
void DisposeMatrix( int** matrix, int row )
{
for ( int i = 0; i < row; i++ ) delete[] matrix[i];
delete[] matrix;
}
// Create a matrix and fill it with constant given in parameter
float **CreateMatrix( float val, int row, int col )
{
float **matrix = new float*[row];
for ( int i = 0; i < row; i++ )
{
matrix[i] = new float[col];
for ( int j = 0; j < col; j++ ) matrix[i][j] = val;
}
return matrix;
}
// Reset a matrix with new value val
void ResetMatrix( float ** matrix, float val, int row, int col )
{
for ( int i = 0; i < row; i++ )
for ( int j = 0; j < col; j++ )
matrix[i][j] = val;
}
// Dispose allocated matrix
void DisposeMatrix( float** matrix, int row )
{
for ( int i = 0; i < row; i++ ) delete[] matrix[i];
delete[] matrix;
}
// Returns Euclidean distance between two vectors
float ReturnDistance( float *pat1, float *pat2, int size )
{
float dist = 0.0;
for ( int i = 0; i < size; i++ )
dist += ( pat1[i] - pat2[i] ) * ( pat1[i] - pat2[i] );
return (float)( sqrt( dist ) / sqrt( (float)size ) );
}
// For file reading purposes. Skips blanks and lines starting with #
void SkipComments( ifstream* infile )
{
bool garbage = true;
char c;
while ( garbage )
{
// ignore any line feeds left in the stream
while ( infile->peek() == '\n' || infile->peek() == ' ' || infile->peek() == '\t' )
infile->get();
while ( infile->peek() == '#' )infile->ignore( 1000, '\n' );
infile->get(c);
if ( c == '\n' || c == '\t' || c == ' ' || c == '#' )
garbage = true;
else
garbage = false;
infile->putback(c);
}
}
void FileCreateError( char* filename )
{
char folder[FILENAME_MAX];
getcwd( folder, FILENAME_MAX );
cerr << "Error: Could not create file " << filename << " in directory ";
cerr << folder << endl;
}
void FileOpenError( char* filename )
{
char folder[FILENAME_MAX];
getcwd( folder, FILENAME_MAX );
cerr << "Error: Could not open file " << filename << " in directory ";
cerr << folder << endl;
}
// cout, cerr and ostream formatting utilities
void GetStreamDefaults( void )
{
gWidth = cout.width();
gPrecision = cout.precision();
}
void AdjustStream( ostream &os, int precision, int width, int pos, bool trailers )
{
os.precision( precision );
os.width( width );
os.fill( ' ' );
if ( trailers )
os.setf( ios::showpoint, ios::showpoint );
else
os.unsetf( ios::showpoint );
if ( pos == kLeft )
os.setf( ios::left, ios::adjustfield );
else
os.setf( ios::right, ios::adjustfield );
}
void SetStreamDefaults( ostream &os )
{
os.precision( gPrecision );
os.width( gWidth );
os.unsetf( ios::showpoint );
os.setf( ios::left, ios::adjustfield );
}
// return absolute value
double SafeAbs( double val1, double val2 )
{
double diff = val1 - val2;
if ( diff < 0.0 ) return ( 0.0 - diff );
else return diff;
}
float SafeAbs( float val1, float val2 )
{
float diff = val1 - val2;
if ( diff < 0.0 ) return (float)( 0.0 - diff );
else return diff;
}
int SafeAbs( int val1, int val2 )
{
int diff = val1 - val2;
if ( diff < 0 ) return ( 0 - diff );
else return diff;
}
double SafeAbs( double val )
{
if ( val < 0.0 ) return ( 0.0 - val );
else return val;
}
float SafeAbs( float val )
{
if ( val < 0.0 ) return (float)( 0.0 - val );
else return val;
}
int SafeAbs( int val )
{
if ( val < 0 ) return ( 0 - val );
else return val;
}
}; // namespace