You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.9 KiB
157 lines
4.9 KiB
/*
|
|
* This file is part of ACADO Toolkit.
|
|
*
|
|
* ACADO Toolkit -- A Toolkit for Automatic Control and Dynamic Optimization.
|
|
* Copyright (C) 2008-2014 by Boris Houska, Hans Joachim Ferreau,
|
|
* Milan Vukov, Rien Quirynen, KU Leuven.
|
|
* Developed within the Optimization in Engineering Center (OPTEC)
|
|
* under supervision of Moritz Diehl. All rights reserved.
|
|
*
|
|
* ACADO Toolkit is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* ACADO Toolkit 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with ACADO Toolkit; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
|
|
/**
|
|
* \file include/utils/acado_utils.hpp
|
|
* \author Hans Joachim Ferreau, Boris Houska, Milan Vukov
|
|
* \date 2008 - 2013
|
|
*
|
|
* This file declares several global utility functions.
|
|
*/
|
|
|
|
|
|
#ifndef ACADO_TOOLKIT_ACADO_UTILS_HPP
|
|
#define ACADO_TOOLKIT_ACADO_UTILS_HPP
|
|
|
|
#include <cmath>
|
|
|
|
#include <acado/utils/acado_types.hpp>
|
|
#include <acado/utils/acado_constants.hpp>
|
|
#include <acado/utils/acado_default_options.hpp>
|
|
#include <acado/utils/acado_message_handling.hpp>
|
|
#include <acado/utils/acado_debugging.hpp>
|
|
#include <acado/utils/acado_io_utils.hpp>
|
|
|
|
// A very ugly hack
|
|
#if (defined __MINGW32__ || defined __MINGW64__)
|
|
namespace std { namespace tr1 { using namespace std; } }
|
|
#endif // (defined __MINGW32__ || defined __MINGW64__)
|
|
|
|
#ifndef M_PI
|
|
#define M_PI 3.14159265358979323846
|
|
#endif
|
|
|
|
BEGIN_NAMESPACE_ACADO
|
|
|
|
/** Returns if x is integer-valued. */
|
|
BooleanType acadoIsInteger( double x );
|
|
|
|
/** Safe division. */
|
|
double acadoDiv( double nom, double den );
|
|
|
|
/** Safe modulus. */
|
|
double acadoMod( double nom, double den );
|
|
|
|
/** Returns the maximum of x and y. */
|
|
int acadoMax( const int x, const int y );
|
|
|
|
/** Returns the maximum of x and y. */
|
|
double acadoMax( const double x, const double y );
|
|
|
|
/** Returns the minimum of x and y. */
|
|
int acadoMin( const int x, const int y );
|
|
|
|
/** Returns the minimum of x and y. */
|
|
double acadoMin( const double x, const double y );
|
|
|
|
/** Returns the factorial 1*2*3*...*n of an integer n. \n
|
|
* \param n the input integer n.
|
|
* \return 1*2*3*...*n if n>=1 \n
|
|
* 1 if n = 0. (and aborts if n < 0 ). \n
|
|
*/
|
|
int acadoFactorial( int n );
|
|
|
|
/** Returns whether x and y are numerically equal. */
|
|
BooleanType acadoIsEqual( double x, double y, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically greater or equal than y. */
|
|
BooleanType acadoIsGreater( double x, double y, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically smaller or equal than y. */
|
|
BooleanType acadoIsSmaller( double x, double y, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically strictly greater than y. */
|
|
BooleanType acadoIsStrictlyGreater( double x, double y, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically strictly smaller than y. */
|
|
BooleanType acadoIsStrictlySmaller( double x, double y, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically greater than 0. */
|
|
BooleanType acadoIsPositive( double x, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically smaller than 0. */
|
|
BooleanType acadoIsNegative( double x, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is numerically 0. */
|
|
BooleanType acadoIsZero( double x, double TOL = EQUALITY_EPS );
|
|
|
|
/** Returns whether x is greater/smaller than +/-INFTY. */
|
|
BooleanType acadoIsInfty( double x, double TOL = 0.1 );
|
|
|
|
/** Returns whether x lies within [-INFTY,INFTY]. */
|
|
BooleanType acadoIsFinite( double x, double TOL = 0.1 );
|
|
|
|
/** Checks if any of elements is greater than. \sa acadoIsFinite */
|
|
template<class T>
|
|
BooleanType isFinite( const T& _value )
|
|
{
|
|
for (unsigned el = 0; el < _value.size(); ++el)
|
|
if ( acadoIsFinite( _value[ el ] ) == BT_TRUE )
|
|
return BT_TRUE;
|
|
return BT_FALSE;
|
|
}
|
|
|
|
/** Returns whether x is not a number. */
|
|
BooleanType acadoIsNaN( double x );
|
|
|
|
/** Checks whether a constant is infinity. */
|
|
inline BooleanType isInfty(const double x)
|
|
{
|
|
if (x - 10.0 < -INFTY)
|
|
return BT_TRUE;
|
|
|
|
if (x + 10.0 > INFTY)
|
|
return BT_TRUE;
|
|
|
|
return BT_FALSE;
|
|
}
|
|
|
|
/** Specific rounding implemenation for compiler who don't support the round
|
|
* command. Does a round to nearest.
|
|
*/
|
|
int acadoRound (double x);
|
|
|
|
/** Specific rounding implementation for rounding away from zero. */
|
|
int acadoRoundAway (double x);
|
|
|
|
|
|
CLOSE_NAMESPACE_ACADO
|
|
|
|
#endif // ACADO_TOOLKIT_ACADO_UTILS_HPP
|
|
|
|
/*
|
|
* end of file
|
|
*/
|
|
|