TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
MathFunctions.cpp
Go to the documentation of this file.
1// copyright (c) 2004 by Christos Dimitrakakis <dimitrak@idiap.ch>
2
3/***************************************************************************
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 ***************************************************************************/
11
12#include <learning/MathFunctions.h>
13#include <cmath>
14#include <cassert>
15
23
24int ArgMin (int n, real* x)
25{
26 real min = x[0];
27 int arg_min = 0;
28 for (int i=1; i<n; i++) {
29 if (min>x[i]) {
30 min = x[i];
31 arg_min = i;
32 }
33 }
34 return arg_min;
35}
36int ArgMax (int n, real* x)
37{
38 real max = x[0];
39 int arg_max = 0;
40 for (int i=1; i<n; i++) {
41 if (max<x[i]) {
42 max = x[i];
43 arg_max = i;
44 }
45 }
46 return arg_max;
47}
48
49void SoftMax (int n, real* Q, real* p, real beta)
50{
51 real sum = 0.0;
52 int i;
53 for (i=0; i<n; i++) {
54 p[i] = (real) exp (beta * Q[i]);
55 sum += p[i];
56 }
57 sum = 1.0f/sum;
58 for (i=0; i<n; i++) {
59 p[i] *= sum;
60 }
61}
62
63void SoftMin (int n, real* Q, real* p, real beta)
64{
65 real sum = 0.0f;
66 int i;
67 for (i=0; i<n; i++) {
68 p[i] = (real) exp (-beta * Q[i]);
69 sum += p[i];
70 }
71 sum = 1.0f/sum;
72 for (i=0; i<n; i++) {
73 p[i] *= sum;
74 }
75}
76
77
118{
119 real t = f2-f1;
120 real gamma;
121
122 assert(c>0);
123 assert(lambda>=0 && lambda<=1);
124
125 if (1-lambda/c <= t) {
126 gamma = t - (1-lambda)*(1-lambda) / (2*c);
127 } else if (t>=-lambda/c) {
128 gamma = lambda * t + t*t*c/2;
129 } else {
130 gamma = - lambda * lambda / (2*c);
131 }
132 return f1 + gamma;
133}
134
135
148{
149 assert(p>0);
150 return (real) pow(pow(f1,p)+pow(f2,p),1/p);
151}
152
160void Normalise (real* src, real* dst, int n_elements)
161{
162 real sum = 0.0f;
163 int i;
164 for (i=0; i<n_elements; i++) {
165 sum += src[i];
166 }
167 if (sum==0) {
168 for (i=0; i<n_elements; i++) {
169 dst[i] = src[i];
170 }
171 return;
172 }
173 assert(sum>0);
174 for (i=0; i<n_elements; i++) {
175 dst[i] = src[i]/sum;
176 }
177}
178
179real SquareNorm (real* a, real* b, int n)
180{
181 real sum = 0;
182 for (int i=0; i<n; i++) {
183 real d = (*a++) - (*b++);
184 sum += d*d;
185 }
186 return sum;
187}
188
190{
191 real sum = 0;
192 for (int i=0; i<n; i++) {
193 real d = (*a++) - (*b++);
194 sum += d*d;
195 }
196 return (real) sqrt(sum);
197}
198
199real LNorm (real* a, real* b, int n, real p)
200{
201 real sum = 0;
202 for (int i=0; i<n; i++) {
203 real d = (*a++) - (*b++);
204 sum += (real) pow(d,p);
205 }
206 return (real) pow((double)sum,1.0/p);
207}
208
209real Sum (real* a, int n)
210{
211 real sum = 0;
212 for (int i=0; i<n; i++) {
213 sum += *a++;
214 }
215 return sum;
216}
Scalar min(Scalar x, Scalar y)
Definition Basic.h:49
Scalar max(Scalar x, Scalar y)
Definition Basic.h:50
static Point p[4]
Definition Convex.cpp:54
int ArgMin(int n, real *x)
real SmoothMaxGamma(real f1, real f2, real lambda, real c)
Approximate max (f1,f2) via a gamma function.
real Sum(real *a, int n)
real LNorm(real *a, real *b, int n, real p)
void SoftMax(int n, real *Q, real *p, real beta)
void Normalise(real *src, real *dst, int n_elements)
Normalise a vector to a destination vector (low level)
void SoftMin(int n, real *Q, real *p, real beta)
int ArgMax(int n, real *x)
real SquareNorm(real *a, real *b, int n)
real SmoothMaxPNorm(real f1, real f2, real p)
Approximate max (f1,f2) via a power function.
real EuclideanNorm(real *a, real *b, int n)
float real
Definition real.h:13