mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-24 16:51:59 +01:00
235 lines
4.3 KiB
C++
235 lines
4.3 KiB
C++
|
//
|
||
|
// C++ Interface: BuiltinFuncs
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
//
|
||
|
// Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2007
|
||
|
//
|
||
|
// Copyright: See COPYING file that comes with this distribution
|
||
|
//
|
||
|
//
|
||
|
|
||
|
#ifndef _BUILTIN_FUNCS_HPP
|
||
|
#define _BUILTIN_FUNCS_HPP
|
||
|
|
||
|
#include "Common.hpp"
|
||
|
#include "Func.hpp"
|
||
|
#include <cmath>
|
||
|
#include <cstdlib>
|
||
|
#include <cassert>
|
||
|
|
||
|
#include "RandomNumberGenerators.hpp"
|
||
|
|
||
|
/* Wrappers for all the builtin functions
|
||
|
The arg_list pointer is a list of floats. Its
|
||
|
size is equal to the number of arguments the parameter
|
||
|
takes */
|
||
|
class FuncWrappers {
|
||
|
|
||
|
/* Values to optimize the sigmoid function */
|
||
|
static const int R = 32767;
|
||
|
static const int RR = 65534;
|
||
|
|
||
|
public:
|
||
|
|
||
|
static inline float int_wrapper(float * arg_list) {
|
||
|
|
||
|
return floor(arg_list[0]);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float sqr_wrapper(float * arg_list) {
|
||
|
|
||
|
return pow(2, arg_list[0]);
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float sign_wrapper(float * arg_list) {
|
||
|
|
||
|
return -arg_list[0];
|
||
|
}
|
||
|
|
||
|
static inline float min_wrapper(float * arg_list) {
|
||
|
|
||
|
if (arg_list[0] > arg_list[1])
|
||
|
return arg_list[1];
|
||
|
|
||
|
return arg_list[0];
|
||
|
}
|
||
|
|
||
|
static inline float max_wrapper(float * arg_list) {
|
||
|
|
||
|
if (arg_list[0] > arg_list[1])
|
||
|
return arg_list[0];
|
||
|
|
||
|
return arg_list[1];
|
||
|
}
|
||
|
|
||
|
/* consult your AI book */
|
||
|
static inline float sigmoid_wrapper(float * arg_list) {
|
||
|
return (RR / (1 + exp( -(((float)(arg_list[0])) * arg_list[1]) / R) - R));
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float bor_wrapper(float * arg_list) {
|
||
|
|
||
|
return (float)((int)arg_list[0] || (int)arg_list[1]);
|
||
|
}
|
||
|
|
||
|
static inline float band_wrapper(float * arg_list) {
|
||
|
return (float)((int)arg_list[0] && (int)arg_list[1]);
|
||
|
}
|
||
|
|
||
|
static inline float bnot_wrapper(float * arg_list) {
|
||
|
return (float)(!(int)arg_list[0]);
|
||
|
}
|
||
|
|
||
|
static inline float if_wrapper(float * arg_list) {
|
||
|
|
||
|
if ((int)arg_list[0] == 0)
|
||
|
return arg_list[2];
|
||
|
return arg_list[1];
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float rand_wrapper(float * arg_list) {
|
||
|
float l=1;
|
||
|
|
||
|
// printf("RAND ARG:(%d)\n", (int)arg_list[0]);
|
||
|
if ((int)arg_list[0] > 0)
|
||
|
l = (float) RandomNumberGenerators::uniformInteger((int)arg_list[0]);
|
||
|
|
||
|
return l;
|
||
|
}
|
||
|
|
||
|
static inline float equal_wrapper(float * arg_list) {
|
||
|
return (arg_list[0] == arg_list[1]);
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float above_wrapper(float * arg_list) {
|
||
|
|
||
|
return (arg_list[0] > arg_list[1]);
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float below_wrapper(float * arg_list) {
|
||
|
|
||
|
return (arg_list[0] < arg_list[1]);
|
||
|
}
|
||
|
|
||
|
static float sin_wrapper(float * arg_list) {
|
||
|
|
||
|
assert(arg_list);
|
||
|
//return .5;
|
||
|
float d = sinf(*arg_list);
|
||
|
return d;
|
||
|
//return (sin (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float cos_wrapper(float * arg_list) {
|
||
|
return (cos (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float tan_wrapper(float * arg_list) {
|
||
|
return (tan(arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float asin_wrapper(float * arg_list) {
|
||
|
return (asin (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float acos_wrapper(float * arg_list) {
|
||
|
return (acos (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float atan_wrapper(float * arg_list) {
|
||
|
return (atan (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float atan2_wrapper(float * arg_list) {
|
||
|
return (atan2 (arg_list[0], arg_list[1]));
|
||
|
}
|
||
|
|
||
|
static inline float pow_wrapper(float * arg_list) {
|
||
|
return (pow (arg_list[0], arg_list[1]));
|
||
|
}
|
||
|
|
||
|
static inline float exp_wrapper(float * arg_list) {
|
||
|
return (exp(arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float abs_wrapper(float * arg_list) {
|
||
|
return (fabs(arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float log_wrapper(float* arg_list) {
|
||
|
return (log (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float log10_wrapper(float * arg_list) {
|
||
|
return (log10 (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
static inline float sqrt_wrapper(float * arg_list) {
|
||
|
return (sqrt (arg_list[0]));
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float nchoosek_wrapper(float * arg_list) {
|
||
|
unsigned long cnm = 1UL;
|
||
|
int i, f;
|
||
|
int n, m;
|
||
|
|
||
|
n = (int)arg_list[0];
|
||
|
m = (int)arg_list[1];
|
||
|
|
||
|
if (m*2 >n) m = n-m;
|
||
|
for (i=1 ; i <= m; n--, i++)
|
||
|
{
|
||
|
if ((f=n) % i == 0)
|
||
|
f /= i;
|
||
|
else cnm /= i;
|
||
|
cnm *= f;
|
||
|
}
|
||
|
return (float)cnm;
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline float fact_wrapper(float * arg_list) {
|
||
|
|
||
|
|
||
|
int result = 1;
|
||
|
|
||
|
int n = (int)arg_list[0];
|
||
|
|
||
|
while (n > 1) {
|
||
|
result = result * n;
|
||
|
n--;
|
||
|
}
|
||
|
return (float)result;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#include <map>
|
||
|
class BuiltinFuncs {
|
||
|
|
||
|
public:
|
||
|
|
||
|
static int init_builtin_func_db();
|
||
|
static int destroy_builtin_func_db();
|
||
|
static int load_all_builtin_func();
|
||
|
static int load_builtin_func( const std::string & name, float (*func_ptr)(float*), int num_args );
|
||
|
|
||
|
static int insert_func( Func *func );
|
||
|
static int remove_func( Func *func );
|
||
|
static Func *find_func( const std::string & name );
|
||
|
private:
|
||
|
static std::map<std::string, Func*> builtin_func_tree;
|
||
|
};
|
||
|
|
||
|
#endif
|