/** @file MathUtil.h
*
* @author Robert Fourer, Jun Ma, Kipp Martin,
* @version 1.0, 10/05/2005
* @since OS1.0
*
* \remarks
* Copyright (C) 2005, Robert Fourer, Jun Ma, Kipp Martin,
* Northwestern University, and the University of Chicago.
* All Rights Reserved.
* This software is licensed under the Common Public License.
* Please see the accompanying LICENSE file in root directory for terms.
*
*
The MathUtil
class contains methods for performing
* mathematics related operations used by many classes in the
* Optimization Services (OS) framework.
*
*/
#ifndef MATHUTIL_H
#define MATHUTIL_H
#include "OSParameters.h"
#include "OSdtoa.h"
#include "OSErrorClass.h"
#include
#include
#ifdef __cplusplus
extern "C" std::string os_dtoa_format(double x);
extern "C" double os_strtod_wrap(const char *str, char **strEnd);
#else
#ifdef __STDC__
std::string os_dtoa_format(double x);
double os_strtod_wrap(const char *str, char **strEnd);
#endif
#endif
using std::ostringstream;
/*! \class MathUtil
* \brief this class has routines for linear algebra.
*
* @author Robert Fourer, Jun Ma, Kipp Martin
* @version 1.0, 03/14/2004
* @since OS 1.0
*
* \remarks
* This class will hold linear algebra routines used by other
* OS classes. Right now it has a routine to change the column/row
* storage of a sparse matrix
*/
class MathUtil{
public:
/** the class constructor */
MathUtil();
/** the class destructor */
~MathUtil();
/**
* Round a double number to the precision specified.
*
* @param X holds the number to be rounded.
* @param precision holds the number of digit after (or before if negative) the decimal point.
* @return the rounded number.
*/
/*public static double round (double x, int precision){
double mask = 0.0, y, result;
try{
mask = Math.pow (10.0, -(double)precision);
}
catch(ArithmeticException e){
return x;
}
y = mod(x, mask);
result = x - y;
if (y / mask >= 0.5) result += mask;
return result;
}//round
*/
/**
* Calculation of x mod y.
*
* @param x holds the number before the mod operator.
* @param x holds the number after the mod operator.
* @return the result of x mod y.
*/
/*public static double mod (double x, double y){
return x - Math.floor(x / y) * y;
}//mod
*/
/**
*
* @param isColumnMajor holds whether the coefMatrix (AMatrix) holding linear program
* data is stored by column. If false, the matrix is stored by row.
* @param start holds an integer array of start elements in coefMatrix (AMatrix),
* which points to the start of a column (row) of nonzero elements in coefMatrix (AMatrix).
* @param index holds an integer array of rowIdx (or colIdx) elements in coefMatrix (AMatrix).
* If the matrix is stored by column (row), rowIdx (colIdx) is the array of row (column) indices.
* @param value holds a double array of value elements in coefMatrix (AMatrix),
* which contains nonzero elements.
* @param dimension holds the column count if the input matrix is row major (row count = start.length-1)
* or the row number if the input matrix is column major (columnh count = start.length -1)
* @return Linear constraint coefficient matrix in the other major of the input matrix. Return null if input matrix not valid.
*/
static SparseMatrix* convertLinearConstraintCoefficientMatrixToTheOtherMajor(
bool isColumnMajor, int startSize, int valueSize, int* start, int* index,
double* value, int dimension);
/**
*
* @param x is the double that gets converted into a string
* this takes the David Gay dtoa and converts to a formatted string
*/
std::string format_os_dtoa( double x);
/**
*
* @param str is the char* string that gets converted to double
* this method actually wraps around os_strtod (which is really the
* David Gay version of strtod) and will throw an exception
* if the str contains text or is in anyway not a valid number
* str should be null terminated
*/
//double os_strtod_wrap(const char *str) throw(ErrorClass);
/**
*
* @param str is the char* string that gets converted to double
* @param strEnd should point to the end of str
* this method actually wraps around os_strtod (which is really the
* David Gay version of strtod) and will throw an exception
* if the str contains text or is in anyway not a valid number
*/
//double os_strtod_wrap(const char *str, const char *strEnd) throw(ErrorClass);
};//class MathUtil
#endif