builtin_funcs.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * builtin_funcs.c:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: 8c6cb5767d1b12cc6c242b5c8fccba87c039528d $
  6.  *
  7.  * Authors: Cyril Deguet <asmax@videolan.org>
  8.  *          code from projectM http://xmms-projectm.sourceforge.net
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #include <math.h>
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. /* Values to optimize the sigmoid function */
  28. #define R  32767   
  29. #define RR 65534   
  30.  
  31. static inline double int_wrapper(double * arg_list) {
  32.   return floor(arg_list[0]);
  33. }
  34. static inline double sqr_wrapper(double * arg_list) {
  35. return pow(2, arg_list[0]);
  36. }
  37. static inline double sign_wrapper(double * arg_list) {
  38. return -arg_list[0];
  39. }
  40. static inline double min_wrapper(double * arg_list) {
  41. if (arg_list[0] > arg_list[1])
  42. return arg_list[1];
  43. return arg_list[0];
  44. }
  45. static inline double max_wrapper(double * arg_list) {
  46. if (arg_list[0] > arg_list[1])
  47.   return arg_list[0];
  48. return arg_list[1];
  49. }
  50. /* consult your AI book */
  51. static inline double sigmoid_wrapper(double * arg_list) {
  52.   return (RR / (1 + exp( -(((double)(arg_list[0])) * arg_list[1]) / R) - R));
  53. }
  54. static inline double bor_wrapper(double * arg_list) {
  55. return (double)((int)arg_list[0] || (int)arg_list[1]);
  56. }
  57. static inline double band_wrapper(double * arg_list) {
  58. return (double)((int)arg_list[0] && (int)arg_list[1]);
  59. }
  60. static inline double bnot_wrapper(double * arg_list) {
  61. return (double)(!(int)arg_list[0]);
  62. }
  63. static inline double if_wrapper(double * arg_list) {
  64. if ((int)arg_list[0] == 0)
  65. return arg_list[2];
  66. return arg_list[1];
  67. }
  68. static inline double rand_wrapper(double * arg_list) {
  69.   double l;
  70.   //  printf("RAND ARG:(%d)n", (int)arg_list[0]);
  71.   l = (double)((rand()) % ((int)arg_list[0]));
  72.   //printf("VAL: %fn", l);
  73.   return l;
  74. }
  75. static inline double equal_wrapper(double * arg_list) {
  76. return (arg_list[0] == arg_list[1]);
  77. }
  78. static inline double above_wrapper(double * arg_list) {
  79. return (arg_list[0] > arg_list[1]);
  80. }
  81. static inline double below_wrapper(double * arg_list) {
  82. return (arg_list[0] < arg_list[1]);
  83. }
  84. static inline double sin_wrapper(double * arg_list) {
  85. return (sin (arg_list[0]));
  86. }
  87. static inline double cos_wrapper(double * arg_list) {
  88. return (cos (arg_list[0]));
  89. }
  90. static inline double tan_wrapper(double * arg_list) {
  91. return (tan(arg_list[0]));
  92. }
  93. static inline double asin_wrapper(double * arg_list) {
  94. return (asin (arg_list[0]));
  95. }
  96. static inline double acos_wrapper(double * arg_list) {
  97. return (acos (arg_list[0]));
  98. }
  99. static inline double atan_wrapper(double * arg_list) {
  100. return (atan (arg_list[0]));
  101. }
  102. static inline double atan2_wrapper(double * arg_list) {
  103.   return (atan2 (arg_list[0], arg_list[1]));
  104. }
  105. static inline double pow_wrapper(double * arg_list) {
  106.   return (pow (arg_list[0], arg_list[1]));
  107. }
  108. static inline double exp_wrapper(double * arg_list) {
  109.   return (exp(arg_list[0]));
  110. }
  111. static inline double abs_wrapper(double * arg_list) {
  112.   return (fabs(arg_list[0]));
  113. }
  114. static inline double log_wrapper(double *arg_list) {
  115.   return (log (arg_list[0]));
  116. }
  117. static inline double log10_wrapper(double * arg_list) {
  118.   return (log10 (arg_list[0]));
  119. }
  120. static inline double sqrt_wrapper(double * arg_list) {
  121.   return (sqrt (arg_list[0]));
  122. }
  123. static inline double nchoosek_wrapper(double * arg_list) {
  124.       unsigned long cnm = 1UL;
  125.       int i, f;
  126.       int n, m;
  127.       n = (int)arg_list[0];
  128.       m = (int)arg_list[1];
  129.       if (m*2 >n) m = n-m;
  130.       for (i=1 ; i <= m; n--, i++)
  131.       {
  132.             if ((f=n) % i == 0)
  133.                   f   /= i;
  134.             else  cnm /= i;
  135.             cnm *= f;
  136.       }
  137.       return (double)cnm;
  138. }
  139. static inline double fact_wrapper(double * arg_list) {
  140.   int result = 1;
  141.   
  142.   int n = (int)arg_list[0];
  143.   
  144.   while (n > 1) {
  145.     result = result * n;
  146.     n--;
  147.   }
  148.   return (double)result;
  149. }