File indexing completed on 2024-05-12 03:47:53

0001 /*
0002     File                 : nsl_sf_kernel.c
0003     Project              : LabPlot
0004     Description          : NSL special kernel functions
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2016 Stefan Gerlach <stefan.gerlach@uni.kn>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "nsl_sf_kernel.h"
0011 #include <gsl/gsl_math.h>
0012 #include <gsl/gsl_randist.h> /* Gaussian and Cauchy */
0013 #include <math.h>
0014 #include <stdlib.h>
0015 
0016 /* kernel on [-1,1] */
0017 
0018 double nsl_sf_kernel_uniform(double u) {
0019     if (fabs(u) <= 1.0)
0020         return 0.5;
0021     return 0.0;
0022 }
0023 
0024 double nsl_sf_kernel_triangular(double u) {
0025     if (fabs(u) <= 1.0)
0026         return 1.0 - fabs(u);
0027     return 0.0;
0028 }
0029 
0030 double nsl_sf_kernel_parabolic(double u) {
0031     if (fabs(u) <= 1.0)
0032         return 3. / 4. * (1.0 - gsl_pow_2(u));
0033     return 0.0;
0034 }
0035 
0036 double nsl_sf_kernel_quartic(double u) {
0037     if (fabs(u) <= 1.0)
0038         return 15. / 16. * gsl_pow_2(1.0 - gsl_pow_2(u));
0039     return 0.0;
0040 }
0041 
0042 double nsl_sf_kernel_triweight(double u) {
0043     if (fabs(u) <= 1.0)
0044         return 35. / 32. * gsl_pow_3(1.0 - gsl_pow_2(u));
0045     return 0.0;
0046 }
0047 
0048 double nsl_sf_kernel_tricube(double u) {
0049     if (fabs(u) <= 1.0)
0050         return 70. / 81. * gsl_pow_3(1.0 - gsl_pow_3(fabs(u)));
0051     return 0.0;
0052 }
0053 
0054 double nsl_sf_kernel_cosine(double u) {
0055     if (fabs(u) <= 1.0)
0056         return M_PI_4 * cos(M_PI_2 * u);
0057     return 0.0;
0058 }
0059 
0060 double nsl_sf_kernel_semicircle(double u) {
0061     if (fabs(u) < 1.0)
0062         return M_2_PI * sqrt(1 - gsl_pow_2(u));
0063     return 0.0;
0064 }
0065 
0066 /* kernel on (-inf,inf) */
0067 double nsl_sf_kernel_gaussian(double u) {
0068     return gsl_ran_gaussian_pdf(u, 1.0);
0069 }
0070 
0071 double nsl_sf_kernel_cauchy(double u) {
0072     return gsl_ran_cauchy_pdf(u, 1.0);
0073 }
0074 
0075 double nsl_sf_kernel_logistic(double u) {
0076     return gsl_ran_logistic_pdf(u, 1.0);
0077 }
0078 
0079 double nsl_sf_kernel_picard(double u) {
0080     return 0.5 * exp(-fabs(u));
0081 }
0082 
0083 double nsl_sf_kernel_sigmoid(double u) {
0084     return M_1_PI / cosh(u);
0085 }
0086 
0087 double nsl_sf_kernel_silverman(double u) {
0088     return 1.0 / 2.0 * exp(-fabs(u) / M_SQRT2) * sin(fabs(u) / M_SQRT2 + M_PI_4);
0089 }