|
42 | 42 | void black_scholes(double* price,
|
43 | 43 | double* strike,
|
44 | 44 | double* t,
|
45 |
| - double* mrs, |
46 |
| - double* vol_vol_twos, |
47 |
| - double* quarters, |
48 |
| - double* ones, |
49 |
| - double* halfs, |
| 45 | + const double rate, |
| 46 | + const double vol, |
50 | 47 | double* call,
|
51 | 48 | double* put,
|
52 | 49 | const size_t size)
|
53 | 50 | {
|
| 51 | + const size_t ndim = 1; |
| 52 | + const size_t scalar_size = 1; |
| 53 | + |
| 54 | + double* mr = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
| 55 | + mr[0] = -rate; |
| 56 | + |
| 57 | + double* vol_vol_two = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
| 58 | + vol_vol_two[0] = vol * vol * 2; |
| 59 | + |
| 60 | + double* quarter = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
| 61 | + quarter[0] = 0.25; |
| 62 | + |
| 63 | + double* one = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
| 64 | + one[0] = 1.; |
| 65 | + |
| 66 | + double* half = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
| 67 | + half[0] = 0.5; |
| 68 | + |
54 | 69 | double* P = price;
|
55 | 70 | double* S = strike;
|
56 | 71 | double* T = t;
|
57 | 72 |
|
58 |
| - double* PdivS = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
59 |
| - dpnp_divide_c<double, double, double>(P, S, PdivS, size); // P / S |
| 73 | + double* p_div_s = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
| 74 | + // p_div_s = P / S |
| 75 | + dpnp_divide_c<double, double, double>(p_div_s, P, size, &size, ndim, S, size, &size, ndim, NULL); |
60 | 76 | double* a = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
61 |
| - dpnp_log_c<double, double>(PdivS, a, size); // np.log(P / S) |
62 |
| - dpnp_memory_free_c(PdivS); |
| 77 | + dpnp_log_c<double, double>(p_div_s, a, size); // a = np.log(p_div_s) |
| 78 | + dpnp_memory_free_c(p_div_s); |
63 | 79 |
|
64 | 80 | double* b = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
65 |
| - dpnp_multiply_c<double, double, double>(T, mrs, b, size); // T * mrs |
66 |
| - |
| 81 | + // b = T * mr |
| 82 | + dpnp_multiply_c<double, double, double>(b, T, size, &size, ndim, mr, scalar_size, &scalar_size, ndim, NULL); |
| 83 | + dpnp_memory_free_c(mr); |
67 | 84 | double* z = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
68 |
| - dpnp_multiply_c<double, double, double>(T, vol_vol_twos, z, size); // T * vol_vol_twos |
| 85 | + // z = T * vol_vol_twos |
| 86 | + dpnp_multiply_c<double, double, double>(z, |
| 87 | + T, size, &size, ndim, |
| 88 | + vol_vol_two, scalar_size, &scalar_size, ndim, |
| 89 | + NULL); |
| 90 | + dpnp_memory_free_c(vol_vol_two); |
69 | 91 |
|
70 | 92 | double* c = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
71 |
| - dpnp_multiply_c<double, double, double>(quarters, z, c, size); // quarters * z |
| 93 | + // c = quarters * z |
| 94 | + dpnp_multiply_c<double, double, double>(c, quarter, scalar_size, &scalar_size, ndim, z, size, &size, ndim, NULL); |
| 95 | + dpnp_memory_free_c(quarter); |
72 | 96 |
|
73 | 97 | double* sqrt_z = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
74 |
| - dpnp_sqrt_c<double, double>(z, sqrt_z, size); // np.sqrt(z) |
| 98 | + dpnp_sqrt_c<double, double>(z, sqrt_z, size); // sqrt_z = np.sqrt(z) |
75 | 99 | dpnp_memory_free_c(z);
|
76 | 100 | double* y = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
77 |
| - dpnp_divide_c<double, double, double>(ones, sqrt_z, y, size); // ones/np.sqrt(z) |
| 101 | + // y = ones / np.sqrt(z) |
| 102 | + dpnp_divide_c<double, double, double>(y, one, scalar_size, &scalar_size, ndim, sqrt_z, size, &size, ndim, NULL); |
78 | 103 | dpnp_memory_free_c(sqrt_z);
|
| 104 | + dpnp_memory_free_c(one); |
79 | 105 |
|
80 | 106 | double* a_sub_b = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
81 |
| - dpnp_subtract_c<double, double, double>(a, b, a_sub_b, size); // a - b |
| 107 | + // a_sub_b = a - b |
| 108 | + dpnp_subtract_c<double, double, double>(a_sub_b, a, size, &size, ndim, b, size, &size, ndim, NULL); |
82 | 109 | dpnp_memory_free_c(a);
|
83 | 110 | double* a_sub_b_add_c = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
84 |
| - dpnp_add_c<double, double, double>(a_sub_b, c, a_sub_b_add_c, size); // a - b + c |
| 111 | + // a_sub_b_add_c = a_sub_b + c |
| 112 | + dpnp_add_c<double, double, double>(a_sub_b_add_c, a_sub_b, size, &size, ndim, c, size, &size, ndim, NULL); |
85 | 113 | double* w1 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
86 |
| - dpnp_multiply_c<double, double, double>(a_sub_b_add_c, y, w1, size); // (a - b + c) * y |
| 114 | + // w1 = a_sub_b_add_c * y |
| 115 | + dpnp_multiply_c<double, double, double>(w1, a_sub_b_add_c, size, &size, ndim, y, size, &size, ndim, NULL); |
87 | 116 | dpnp_memory_free_c(a_sub_b_add_c);
|
88 | 117 |
|
89 | 118 | double* a_sub_b_sub_c = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
90 |
| - dpnp_subtract_c<double, double, double>(a_sub_b, c, a_sub_b_sub_c, size); // a - b - c |
| 119 | + // a_sub_b_sub_c = a_sub_b - c |
| 120 | + dpnp_subtract_c<double, double, double>(a_sub_b_sub_c, a_sub_b, size, &size, ndim, c, size, &size, ndim, NULL); |
91 | 121 | dpnp_memory_free_c(a_sub_b);
|
92 | 122 | dpnp_memory_free_c(c);
|
93 | 123 | double* w2 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
94 |
| - dpnp_multiply_c<double, double, double>(a_sub_b_sub_c, y, w2, size); // (a - b - c) * y |
| 124 | + // w2 = a_sub_b_sub_c * y |
| 125 | + dpnp_multiply_c<double, double, double>(w2, a_sub_b_sub_c, size, &size, ndim, y, size, &size, ndim, NULL); |
95 | 126 | dpnp_memory_free_c(a_sub_b_sub_c);
|
96 | 127 | dpnp_memory_free_c(y);
|
97 | 128 |
|
98 | 129 | double* erf_w1 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
99 |
| - dpnp_erf_c<double>(w1, erf_w1, size); // np.erf(w1) |
| 130 | + dpnp_erf_c<double>(w1, erf_w1, size); // erf_w1 = np.erf(w1) |
100 | 131 | dpnp_memory_free_c(w1);
|
101 | 132 | double* halfs_mul_erf_w1 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
102 |
| - dpnp_multiply_c<double, double, double>(halfs, erf_w1, halfs_mul_erf_w1, size); // halfs * np.erf(w1) |
| 133 | + // halfs_mul_erf_w1 = halfs * erf_w1 |
| 134 | + dpnp_multiply_c<double, double, double>(halfs_mul_erf_w1, |
| 135 | + half, scalar_size, &scalar_size, ndim, |
| 136 | + erf_w1, size, &size, ndim, |
| 137 | + NULL); |
103 | 138 | dpnp_memory_free_c(erf_w1);
|
104 | 139 | double* d1 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
105 |
| - dpnp_add_c<double, double, double>(halfs, halfs_mul_erf_w1, d1, size); // halfs + halfs * np.erf(w1) |
| 140 | + // d1 = halfs + halfs_mul_erf_w1 |
| 141 | + dpnp_add_c<double, double, double>(d1, |
| 142 | + half, scalar_size, &scalar_size, ndim, |
| 143 | + halfs_mul_erf_w1, size, &size, ndim, |
| 144 | + NULL); |
106 | 145 | dpnp_memory_free_c(halfs_mul_erf_w1);
|
107 | 146 |
|
108 | 147 | double* erf_w2 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
109 |
| - dpnp_erf_c<double>(w2, erf_w2, size); // np.erf(w2) |
| 148 | + dpnp_erf_c<double>(w2, erf_w2, size); // erf_w2 = np.erf(w2) |
110 | 149 | dpnp_memory_free_c(w2);
|
111 | 150 | double* halfs_mul_erf_w2 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
112 |
| - dpnp_multiply_c<double, double, double>(halfs, erf_w2, halfs_mul_erf_w2, size); // halfs * np.erf(w2) |
| 151 | + // halfs_mul_erf_w2 = halfs * erf_w2 |
| 152 | + dpnp_multiply_c<double, double, double>(halfs_mul_erf_w2, |
| 153 | + half, scalar_size, &scalar_size, ndim, |
| 154 | + erf_w2, size, &size, ndim, |
| 155 | + NULL); |
113 | 156 | dpnp_memory_free_c(erf_w2);
|
114 | 157 | double* d2 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
115 |
| - dpnp_add_c<double, double, double>(halfs, halfs_mul_erf_w2, d2, size); // halfs + halfs * np.erf(w2) |
| 158 | + // d2 = halfs + halfs_mul_erf_w2 |
| 159 | + dpnp_add_c<double, double, double>(d2, |
| 160 | + half, scalar_size, &scalar_size, ndim, |
| 161 | + halfs_mul_erf_w2, size, &size, ndim, |
| 162 | + NULL); |
116 | 163 | dpnp_memory_free_c(halfs_mul_erf_w2);
|
| 164 | + dpnp_memory_free_c(half); |
117 | 165 |
|
118 | 166 | double* exp_b = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
119 |
| - dpnp_exp_c<double, double>(b, exp_b, size); // np.exp(b) |
| 167 | + dpnp_exp_c<double, double>(b, exp_b, size); // exp_b = np.exp(b) |
120 | 168 | double* Se = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
121 |
| - dpnp_multiply_c<double, double, double>(exp_b, S, Se, size); // np.exp(b) * S |
| 169 | + // Se = exp_b * S |
| 170 | + dpnp_multiply_c<double, double, double>(Se, exp_b, size, &size, ndim, S, size, &size, ndim, NULL); |
122 | 171 | dpnp_memory_free_c(exp_b);
|
123 | 172 | dpnp_memory_free_c(b);
|
124 | 173 |
|
125 |
| - double* Pmul_d1 = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
126 |
| - dpnp_multiply_c<double, double, double>(P, d1, Pmul_d1, size); // P * d1 |
| 174 | + double* P_mul_d1 = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
| 175 | + // P_mul_d1 = P * d1 |
| 176 | + dpnp_multiply_c<double, double, double>(P_mul_d1, P, size, &size, ndim, d1, size, &size, ndim, NULL); |
127 | 177 | dpnp_memory_free_c(d1);
|
128 | 178 | double* Se_mul_d2 = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
129 |
| - dpnp_multiply_c<double, double, double>(Se, d2, Se_mul_d2, size); // Se * d2 |
| 179 | + // Se_mul_d2 = Se * d2 |
| 180 | + dpnp_multiply_c<double, double, double>(Se_mul_d2, Se, size, &size, ndim, d2, size, &size, ndim, NULL); |
130 | 181 | dpnp_memory_free_c(d2);
|
131 | 182 | double* r = (double*)dpnp_memory_alloc_c(size * sizeof(double));
|
132 |
| - dpnp_subtract_c<double, double, double>(Pmul_d1, Se_mul_d2, r, size); // P * d1 - Se * d2 |
| 183 | + // r = P_mul_d1 - Se_mul_d2 |
| 184 | + dpnp_subtract_c<double, double, double>(r, P_mul_d1, size, &size, ndim, Se_mul_d2, size, &size, ndim, NULL); |
133 | 185 | dpnp_memory_free_c(Se_mul_d2);
|
134 |
| - dpnp_memory_free_c(Pmul_d1); |
| 186 | + dpnp_memory_free_c(P_mul_d1); |
135 | 187 |
|
136 | 188 | dpnp_copyto_c<double, double>(call, r, size); // call[:] = r
|
137 |
| - double* r_subP = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
138 |
| - dpnp_subtract_c<double, double, double>(r, P, r_subP, size); // r - P |
| 189 | + double* r_sub_P = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
| 190 | + // r_sub_P = r - P |
| 191 | + dpnp_subtract_c<double, double, double>(r_sub_P, r, size, &size, ndim, P, size, &size, ndim, NULL); |
139 | 192 | dpnp_memory_free_c(r);
|
140 |
| - double* r_subPaddSe = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
141 |
| - dpnp_add_c<double, double, double>(r_subP, Se, r_subPaddSe, size); // r - P + Se |
142 |
| - dpnp_memory_free_c(r_subP); |
| 193 | + double* r_sub_P_add_Se = (double*)dpnp_memory_alloc_c(size * sizeof(double)); |
| 194 | + // r_sub_P_add_Se = r_sub_P + Se |
| 195 | + dpnp_add_c<double, double, double>(r_sub_P_add_Se, r_sub_P, size, &size, ndim, Se, size, &size, ndim, NULL); |
| 196 | + dpnp_memory_free_c(r_sub_P); |
143 | 197 | dpnp_memory_free_c(Se);
|
144 |
| - dpnp_copyto_c<double, double>(put, r_subPaddSe, size); // put[:] = r - P + Se |
145 |
| - dpnp_memory_free_c(r_subPaddSe); |
| 198 | + dpnp_copyto_c<double, double>(put, r_sub_P_add_Se, size); // put[:] = r_sub_P_add_Se |
| 199 | + dpnp_memory_free_c(r_sub_P_add_Se); |
146 | 200 | }
|
147 | 201 |
|
148 | 202 | int main(int, char**)
|
@@ -174,64 +228,30 @@ int main(int, char**)
|
174 | 228 | double* mone = (double*)dpnp_memory_alloc_c(1 * sizeof(double));
|
175 | 229 | mone[0] = -1.;
|
176 | 230 |
|
177 |
| - double* mr = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
178 |
| - mr[0] = -RISK_FREE; |
179 |
| - |
180 |
| - double* vol_vol_two = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
181 |
| - vol_vol_two[0] = VOLATILITY * VOLATILITY * 2.; |
182 |
| - |
183 |
| - double* quarter = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
184 |
| - quarter[0] = 0.25; |
185 |
| - |
186 |
| - double* one = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
187 |
| - one[0] = 1.; |
188 |
| - |
189 |
| - double* half = (double*)dpnp_memory_alloc_c(1 * sizeof(double)); |
190 |
| - half[0] = 0.5; |
191 |
| - |
192 | 231 | double* call = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double));
|
193 | 232 | double* put = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double));
|
194 |
| - double* mrs = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double)); |
195 |
| - double* vol_vol_twos = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double)); |
196 |
| - double* quarters = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double)); |
197 |
| - double* ones = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double)); |
198 |
| - double* halfs = (double*)dpnp_memory_alloc_c(SIZE * sizeof(double)); |
199 |
| - |
200 |
| - dpnp_full_c<double>(zero, call, SIZE); // np.full(SIZE, 0., dtype=DTYPE) |
201 |
| - dpnp_full_c<double>(mone, put, SIZE); // np.full(SIZE, -1., dtype=DTYPE) |
202 |
| - dpnp_full_c<double>(mr, mrs, SIZE); // np.full(SIZE, -RISK_FREE, dtype=DTYPE) |
203 |
| - dpnp_full_c<double>(vol_vol_two, vol_vol_twos, SIZE); // np.full(SIZE, VOLATILITY * VOLATILITY * 2., dtype=DTYPE) |
204 |
| - dpnp_full_c<double>(quarter, quarters, SIZE); // np.full(SIZE, 0.25, dtype=DTYPE) |
205 |
| - dpnp_full_c<double>(one, ones, SIZE); // np.full(SIZE, 1., dtype=DTYPE) |
206 |
| - dpnp_full_c<double>(half, halfs, SIZE); // np.full(SIZE, 0.5, dtype=DTYPE) |
207 | 233 |
|
208 |
| - dpnp_memory_free_c(half); |
209 |
| - dpnp_memory_free_c(one); |
210 |
| - dpnp_memory_free_c(quarter); |
211 |
| - dpnp_memory_free_c(vol_vol_two); |
212 |
| - dpnp_memory_free_c(mr); |
| 234 | + dpnp_full_c<double>(zero, call, SIZE); // np.full(SIZE, 0., dtype=DTYPE) |
| 235 | + dpnp_full_c<double>(mone, put, SIZE); // np.full(SIZE, -1., dtype=DTYPE) |
| 236 | + |
213 | 237 | dpnp_memory_free_c(mone);
|
214 | 238 | dpnp_memory_free_c(zero);
|
215 | 239 |
|
216 |
| - black_scholes(price, strike, t, mrs, vol_vol_twos, quarters, ones, halfs, call, put, SIZE); |
| 240 | + black_scholes(price, strike, t, RISK_FREE, VOLATILITY, call, put, SIZE); |
217 | 241 |
|
218 |
| - std::cout << std::endl; |
| 242 | + std::cout << "call: "; |
219 | 243 | for (size_t i = 0; i < 10; ++i)
|
220 | 244 | {
|
221 | 245 | std::cout << call[i] << ", ";
|
222 | 246 | }
|
223 |
| - std::cout << std::endl; |
| 247 | + std::cout << "..." << std::endl; |
| 248 | + std::cout << "put: "; |
224 | 249 | for (size_t i = 0; i < 10; ++i)
|
225 | 250 | {
|
226 | 251 | std::cout << put[i] << ", ";
|
227 | 252 | }
|
228 |
| - std::cout << std::endl; |
| 253 | + std::cout << "..." << std::endl; |
229 | 254 |
|
230 |
| - dpnp_memory_free_c(halfs); |
231 |
| - dpnp_memory_free_c(ones); |
232 |
| - dpnp_memory_free_c(quarters); |
233 |
| - dpnp_memory_free_c(vol_vol_twos); |
234 |
| - dpnp_memory_free_c(mrs); |
235 | 255 | dpnp_memory_free_c(put);
|
236 | 256 | dpnp_memory_free_c(call);
|
237 | 257 |
|
|
0 commit comments