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