1 // Copyright (c) 2015-2016, Massachusetts Institute of Technology
2 // Copyright (c) 2016-2017 Sandia Corporation
3 
4 // This file is part of the Compressed Continuous Computation (C3) Library
5 // Author: Alex A. Gorodetsky
6 // Contact: alex@alexgorodetsky.com
7 
8 // All rights reserved.
9 
10 // Redistribution and use in source and binary forms, with or without modification,
11 // are permitted provided that the following conditions are met:
12 
13 // 1. Redistributions of source code must retain the above copyright notice,
14 //    this list of conditions and the following disclaimer.
15 
16 // 2. Redistributions in binary form must reproduce the above copyright notice,
17 //    this list of conditions and the following disclaimer in the documentation
18 //    and/or other materials provided with the distribution.
19 
20 // 3. Neither the name of the copyright holder nor the names of its contributors
21 //    may be used to endorse or promote products derived from this software
22 //    without specific prior written permission.
23 
24 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 
35 //Code
36 
37 
38 
39 
40 // first function
41 
42 #include "testfunctions.h"
43 #include <assert.h>
44 #include <math.h>
45 
46 #ifndef M_PI
47 #define M_PI 3.14159265358979323846264338327
48 #endif
49 
Sin3xTx2(size_t N,const double * x,double * out,void * args)50 int Sin3xTx2(size_t N, const double * x, double * out, void * args)
51 {
52     for (size_t ii = 0; ii < N; ii++ ){
53         out[ii] = pow(x[ii],2)+1.0*sin(3.0 * x[ii]);
54     }
55     if (args != NULL){
56         int * count = args;
57         *count += N;
58     }
59     return 0;
60 }
61 
funcderiv(double x,void * args)62 double funcderiv(double x, void * args){
63     assert ( args == NULL );
64     return 3.0 * cos(3.0 * x) + 2.0 * x;
65 }
66 
funcdderiv(double x,void * args)67 double funcdderiv(double x, void * args){
68     assert ( args == NULL );
69     return -9.0 * sin(3.0 * x) + 2.0;
70 }
71 
gaussbump(size_t N,const double * x,double * out,void * args)72 int gaussbump(size_t N, const double * x, double * out, void * args)
73 {
74     for (size_t ii = 0; ii < N; ii++ ){
75         /* out[ii] = pow(x[ii],2)+1.0*sin(3.0 * x[ii]); */
76         out[ii] = exp(-pow(x[ii],2)/0.1);
77     }
78     if (args != NULL){
79         int * count = args;
80         *count += N;
81     }
82     return 0;
83 }
84 
gaussbump_deriv(size_t N,const double * x,double * out,void * args)85 int gaussbump_deriv(size_t N, const double * x, double * out, void * args)
86 {
87     for (size_t ii = 0; ii < N; ii++ ){
88         out[ii] = exp(-pow(x[ii],2)/0.1) * (-2.0/0.1 * x[ii]);
89     }
90     if (args != NULL){
91         int * count = args;
92         *count += N;
93     }
94     return 0;
95 }
96 
gaussbump_dderiv(size_t N,const double * x,double * out,void * args)97 int gaussbump_dderiv(size_t N, const double * x, double * out, void * args)
98 {
99     for (size_t ii = 0; ii < N; ii++ ){
100         out[ii] = exp(-pow(x[ii],2)/0.1) * (400 * x[ii] * x[ii] - 20);
101 
102     }
103     if (args != NULL){
104         int * count = args;
105         *count += N;
106     }
107     return 0;
108 }
109 
gaussbump2(size_t N,const double * x,double * out,void * args)110 int gaussbump2(size_t N, const double * x, double * out, void * args)
111 {
112     for (size_t ii = 0; ii < N; ii++ ){
113         /* out[ii] = pow(x[ii],2)+1.0*sin(3.0 * x[ii]); */
114         out[ii] = exp(-0.5*pow(x[ii],2))/pow(M_PI,0.25);
115     }
116     if (args != NULL){
117         int * count = args;
118         *count += N;
119     }
120     return 0;
121 }
122 
gaussbump2dd(size_t N,const double * x,double * out,void * args)123 int gaussbump2dd(size_t N, const double * x, double * out, void * args)
124 {
125     (void) args;
126     for (size_t ii = 0; ii < N; ii++){
127         out[ii] = (pow(x[ii],2)-1.0)*exp(-0.5*pow(x[ii],2))/pow(M_PI,0.25);
128     }
129     return 0;
130 }
131 
sin_lift(size_t N,const double * x,double * out,void * args)132 int sin_lift(size_t N, const double * x, double * out, void * args)
133 {
134     (void)(args);
135     for (size_t ii = 0; ii < N; ii++){
136         /* out[ii] = 2.0 + sin(x[ii]); */
137         out[ii] = 1.0 - cos(x[ii]);
138         /* out[ii] = sin(x[ii]); */
139     }
140     return 0;
141 }
142 
sin_liftdd(size_t N,const double * x,double * out,void * args)143 int sin_liftdd(size_t N, const double * x, double * out, void * args)
144 {
145     (void)(args);
146     for (size_t ii = 0; ii < N; ii++){
147         /* out[ii] =  -sin(x[ii]); */
148         out[ii] =  -cos(x[ii]);
149     }
150     return 0;
151 }
152 
153 // second function
powX2(size_t N,const double * x,double * out,void * args)154 int powX2(size_t N, const double * x, double * out, void * args)
155 {
156     (void)(args);
157     for (size_t ii = 0; ii < N; ii++){
158         out[ii] = pow(x[ii],2);
159     }
160     return 0;
161 }
162 
163 // third function
TwoPowX3(size_t N,const double * x,double * out,void * args)164 int TwoPowX3(size_t N, const double * x, double * out, void * args)
165 {
166     (void)(args);
167     for (size_t ii = 0; ii < N; ii++){
168         out[ii] = 2.0 * pow(x[ii],3.0);
169     }
170     return 0;
171 }
172 
173 // 6th function
polyroots(size_t N,const double * x,double * out,void * args)174 int polyroots(size_t N, const double * x, double * out, void * args)
175 {
176     (void)(args);
177     for (size_t ii = 0; ii < N; ii++){
178         out[ii] = (x[ii] - 2.0) * (x[ii] - 1.0) * x[ii] *
179                   (x[ii] + 3.0) * (x[ii] - 1.0);
180         /* out[ii] = (x[ii] - 0.2) * (x[ii] - 0.1) * x[ii] * */
181         /*           (x[ii] + 0.2) * (x[ii] - 0.1); */
182     }
183     return 0;
184 }
185 
186 // 7th function
maxminpoly(size_t N,const double * x,double * out,void * args)187 int maxminpoly(size_t N, const double * x, double * out, void * args)
188 {
189     (void)(args);
190     for (size_t ii = 0; ii < N; ii++){
191         out[ii] = sin(3.14159 * x[ii]);
192     }
193     return 0;
194 }
195 
196 
x3minusx(size_t N,const double * x,double * out,void * args)197 int x3minusx(size_t N, const double * x, double * out, void * args)
198 {
199     (void)(args);
200     for (size_t ii = 0; ii < N; ii++){
201         out[ii] = 3*x[ii]*x[ii]*x[ii] - x[ii];
202     }
203     return 0;
204 }
205 
x3minusxd(double x,void * args)206 double x3minusxd(double x, void * args)
207 {
208     (void)(args);
209     return 9.0*x*x - 1.0;
210 }
211 
x3minusxdd(double x,void * args)212 double x3minusxdd(double x, void * args)
213 {
214     (void)(args);
215     return 18.0*x;
216 }
217