TBTK
Need a break? Support the development by playing Polarity Puzzles
ArrayAlgorithms.h
Go to the documentation of this file.
1 /* Copyright 2020 Kristofer Björnson
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
23 #ifndef COM_DAFER45_TBTK_MATH_ARRAY_ALGORITHMS
24 #define COM_DAFER45_TBTK_MATH_ARRAY_ALGORITHMS
25 
26 #include "TBTK/Array.h"
27 
28 #include <cmath>
29 
30 namespace TBTK{
31 namespace Math{
32 
33 template<typename DataType>
35 public:
41  static Array<DataType> sin(const Array<DataType> &array);
42 
48  static Array<DataType> cos(const Array<DataType> &array);
49 
55  static Array<DataType> tan(const Array<DataType> &array);
56 
62  static Array<DataType> asin(const Array<DataType> &array);
63 
69  static Array<DataType> acos(const Array<DataType> &array);
70 
76  static Array<DataType> atan(const Array<DataType> &array);
77 
83  static Array<DataType> sinh(const Array<DataType> &array);
84 
90  static Array<DataType> cosh(const Array<DataType> &array);
91 
97  static Array<DataType> tanh(const Array<DataType> &array);
98 
104  static Array<DataType> asinh(const Array<DataType> &array);
105 
111  static Array<DataType> acosh(const Array<DataType> &array);
112 
118  static Array<DataType> atanh(const Array<DataType> &array);
119 
125  static Array<DataType> log(const Array<DataType> &array);
126 
132  static Array<DataType> log2(const Array<DataType> &array);
133 
139  static Array<DataType> log10(const Array<DataType> &array);
140 
147  static Array<DataType> pow(
148  const Array<DataType> &array,
149  double exponent
150  );
151 
157  static Array<DataType> exp(const Array<DataType> &array);
158 
164  template<typename T = DataType>
165  static typename std::enable_if<
166  !std::is_same<T, std::complex<double>>::value,
168  >::type abs(const Array<DataType> &array);
169 
175  template<typename T = DataType>
176  static typename std::enable_if<
177  std::is_same<T, std::complex<double>>::value,
179  >::type abs(const Array<DataType> &array);
180 
187  template<typename T = DataType>
188  static typename std::enable_if<
189  std::is_same<T, std::complex<double>>::value,
191  >::type arg(const Array<std::complex<double>> &array);
192 
199  template<typename T = DataType>
200  static typename std::enable_if<
201  std::is_same<T, std::complex<double>>::value,
203  >::type real(const Array<std::complex<double>> &array);
204 
211  template<typename T = DataType>
212  static typename std::enable_if<
213  std::is_same<T, std::complex<double>>::value,
215  >::type imag(const Array<std::complex<double>> &array);
216 
222  template<typename T = DataType>
223  static typename std::enable_if<
224  std::is_same<T, std::complex<double>>::value,
226  >::type conj(const Array<DataType> &array);
227 
233  static Array<DataType> sqrt(const Array<DataType> &array);
234 
240  static DataType max(const Array<DataType> &array);
241 
247  static DataType min(const Array<DataType> &array);
248 private:
249 };
250 
251 template<typename DataType>
254  CArray<DataType> &resultData = result.getData();
255  const CArray<DataType> &arrayData = array.getData();
256 
257  for(unsigned int n = 0; n < array.getSize(); n++)
258  resultData[n] = std::sin(arrayData[n]);
259 
260  return result;
261 }
262 
263 template<typename DataType>
266  CArray<DataType> &resultData = result.getData();
267  const CArray<DataType> &arrayData = array.getData();
268 
269  for(unsigned int n = 0; n < array.getSize(); n++)
270  resultData[n] = std::cos(arrayData[n]);
271 
272  return result;
273 }
274 
275 template<typename DataType>
278  CArray<DataType> &resultData = result.getData();
279  const CArray<DataType> &arrayData = array.getData();
280 
281  for(unsigned int n = 0; n < array.getSize(); n++)
282  resultData[n] = std::tan(arrayData[n]);
283 
284  return result;
285 }
286 
287 template<typename DataType>
289  const Array<DataType> &array
290 ){
292  CArray<DataType> &resultData = result.getData();
293  const CArray<DataType> &arrayData = array.getData();
294 
295  for(unsigned int n = 0; n < array.getSize(); n++)
296  resultData[n] = std::asin(arrayData[n]);
297 
298  return result;
299 }
300 
301 template<typename DataType>
304  CArray<DataType> &resultData = result.getData();
305  const CArray<DataType> &arrayData = array.getData();
306 
307  for(unsigned int n = 0; n < array.getSize(); n++)
308  resultData[n] = std::acos(arrayData[n]);
309 
310  return result;
311 }
312 
313 template<typename DataType>
316  CArray<DataType> &resultData = result.getData();
317  const CArray<DataType> &arrayData = array.getData();
318 
319  for(unsigned int n = 0; n < array.getSize(); n++)
320  resultData[n] = std::atan(arrayData[n]);
321 
322  return result;
323 }
324 
325 template<typename DataType>
328  CArray<DataType> &resultData = result.getData();
329  const CArray<DataType> &arrayData = array.getData();
330 
331  for(unsigned int n = 0; n < array.getSize(); n++)
332  resultData[n] = std::sinh(arrayData[n]);
333 
334  return result;
335 }
336 
337 template<typename DataType>
340  CArray<DataType> &resultData = result.getData();
341  const CArray<DataType> &arrayData = array.getData();
342 
343  for(unsigned int n = 0; n < array.getSize(); n++)
344  resultData[n] = std::cosh(arrayData[n]);
345 
346  return result;
347 }
348 
349 template<typename DataType>
352  CArray<DataType> &resultData = result.getData();
353  const CArray<DataType> &arrayData = array.getData();
354 
355  for(unsigned int n = 0; n < array.getSize(); n++)
356  resultData[n] = std::tanh(arrayData[n]);
357 
358  return result;
359 }
360 
361 template<typename DataType>
364  CArray<DataType> &resultData = result.getData();
365  const CArray<DataType> &arrayData = array.getData();
366 
367  for(unsigned int n = 0; n < array.getSize(); n++)
368  resultData[n] = std::asinh(arrayData[n]);
369 
370  return result;
371 }
372 
373 template<typename DataType>
376  CArray<DataType> &resultData = result.getData();
377  const CArray<DataType> &arrayData = array.getData();
378 
379  for(unsigned int n = 0; n < array.getSize(); n++)
380  resultData[n] = std::acosh(arrayData[n]);
381 
382  return result;
383 }
384 
385 template<typename DataType>
388  CArray<DataType> &resultData = result.getData();
389  const CArray<DataType> &arrayData = array.getData();
390 
391  for(unsigned int n = 0; n < array.getSize(); n++)
392  resultData[n] = std::atanh(arrayData[n]);
393 
394  return result;
395 }
396 
397 template<typename DataType>
400  CArray<DataType> &resultData = result.getData();
401  const CArray<DataType> &arrayData = array.getData();
402 
403  for(unsigned int n = 0; n < array.getSize(); n++)
404  resultData[n] = std::log(arrayData[n]);
405 
406  return result;
407 }
408 
409 template<typename DataType>
412  CArray<DataType> &resultData = result.getData();
413  const CArray<DataType> &arrayData = array.getData();
414 
415  for(unsigned int n = 0; n < array.getSize(); n++)
416  resultData[n] = std::log2(arrayData[n]);
417 
418  return result;
419 }
420 
421 template<typename DataType>
424  CArray<DataType> &resultData = result.getData();
425  const CArray<DataType> &arrayData = array.getData();
426 
427  for(unsigned int n = 0; n < array.getSize(); n++)
428  resultData[n] = std::log10(arrayData[n]);
429 
430  return result;
431 }
432 
433 template<typename DataType>
435  const Array<DataType> &array,
436  double exponent
437 ){
439  CArray<DataType> &resultData = result.getData();
440  const CArray<DataType> &arrayData = array.getData();
441 
442  for(unsigned int n = 0; n < array.getSize(); n++)
443  resultData[n] = std::pow(arrayData[n], exponent);
444 
445  return result;
446 }
447 
448 template<typename DataType>
451  CArray<DataType> &resultData = result.getData();
452  const CArray<DataType> &arrayData = array.getData();
453 
454  for(unsigned int n = 0; n < array.getSize(); n++)
455  resultData[n] = std::exp(arrayData[n]);
456 
457  return result;
458 }
459 
460 template<typename DataType>
461 template<typename T>
462 typename std::enable_if<
463  !std::is_same<T, std::complex<double>>::value,
465 >::type ArrayAlgorithms<DataType>::abs(const Array<DataType> &array){
467  CArray<DataType> &resultData = result.getData();
468  const CArray<DataType> &arrayData = array.getData();
469 
470  for(unsigned int n = 0; n < array.getSize(); n++)
471  resultData[n] = std::abs(arrayData[n]);
472 
473  return result;
474 }
475 
476 template<typename DataType>
477 template<typename T>
478 typename std::enable_if<
479  std::is_same<T, std::complex<double>>::value,
481 >::type ArrayAlgorithms<DataType>::abs(const Array<DataType> &array){
483  CArray<double> &resultData = result.getData();
484  const CArray<DataType> &arrayData = array.getData();
485 
486  for(unsigned int n = 0; n < array.getSize(); n++)
487  resultData[n] = std::abs(arrayData[n]);
488 
489  return result;
490 }
491 
492 template<typename DataType>
493 template<typename T>
494 typename std::enable_if<
495  std::is_same<T, std::complex<double>>::value,
497 >::type ArrayAlgorithms<DataType>::arg(const Array<std::complex<double>> &array){
499  CArray<double> &resultData = result.getData();
500  const CArray<std::complex<double>> &arrayData = array.getData();
501 
502  for(unsigned int n = 0; n < array.getSize(); n++)
503  resultData[n] = std::arg(arrayData[n]);
504 
505  return result;
506 }
507 
508 template<typename DataType>
509 template<typename T>
510 typename std::enable_if<
511  std::is_same<T, std::complex<double>>::value,
513 >::type ArrayAlgorithms<DataType>::real(const Array<std::complex<double>> &array){
515  CArray<double> &resultData = result.getData();
516  const CArray<std::complex<double>> &arrayData = array.getData();
517 
518  for(unsigned int n = 0; n < array.getSize(); n++)
519  resultData[n] = std::real(arrayData[n]);
520 
521  return result;
522 }
523 
524 template<typename DataType>
525 template<typename T>
526 typename std::enable_if<
527  std::is_same<T, std::complex<double>>::value,
529 >::type ArrayAlgorithms<DataType>::imag(const Array<std::complex<double>> &array){
531  CArray<double> &resultData = result.getData();
532  const CArray<std::complex<double>> &arrayData = array.getData();
533 
534  for(unsigned int n = 0; n < array.getSize(); n++)
535  resultData[n] = std::imag(arrayData[n]);
536 
537  return result;
538 }
539 
540 template<typename DataType>
541 template<typename T>
542 typename std::enable_if<
543  std::is_same<T, std::complex<double>>::value,
547  CArray<DataType> &resultData = result.getData();
548  const CArray<DataType> &arrayData = array.getData();
549 
550  for(unsigned int n = 0; n < array.getSize(); n++)
551  resultData[n] = std::conj(arrayData[n]);
552 
553  return result;
554 }
555 
556 template<typename DataType>
559  CArray<DataType> &resultData = result.getData();
560  const CArray<DataType> &arrayData = array.getData();
561 
562  for(unsigned int n = 0; n < array.getSize(); n++)
563  resultData[n] = std::sqrt(arrayData[n]);
564 
565  return result;
566 }
567 
568 template<typename DataType>
570  const CArray<DataType> &arrayData = array.getData();
571  DataType maximum = arrayData[0];
572  for(unsigned int n = 1; n < array.getSize(); n++)
573  if(maximum < arrayData[n])
574  maximum = arrayData[n];
575 
576  return maximum;
577 }
578 
579 template<typename DataType>
581  const CArray<DataType> &arrayData = array.getData();
582  DataType minimum = arrayData[0];
583  for(unsigned int n = 1; n < array.getSize(); n++)
584  if(minimum > arrayData[n])
585  minimum = arrayData[n];
586 
587  return minimum;
588 }
589 
595 template<typename DataType>
597  return ArrayAlgorithms<DataType>::sin(array);
598 }
599 
605 template<typename DataType>
607  return ArrayAlgorithms<DataType>::cos(array);
608 }
609 
615 template<typename DataType>
617  return ArrayAlgorithms<DataType>::tan(array);
618 }
619 
625 template<typename DataType>
627  return ArrayAlgorithms<DataType>::asin(array);
628 }
629 
635 template<typename DataType>
637  return ArrayAlgorithms<DataType>::acos(array);
638 }
639 
645 template<typename DataType>
647  return ArrayAlgorithms<DataType>::atan(array);
648 }
649 
655 template<typename DataType>
657  return ArrayAlgorithms<DataType>::sinh(array);
658 }
659 
665 template<typename DataType>
667  return ArrayAlgorithms<DataType>::cosh(array);
668 }
669 
675 template<typename DataType>
677  return ArrayAlgorithms<DataType>::tanh(array);
678 }
679 
685 template<typename DataType>
687  return ArrayAlgorithms<DataType>::asinh(array);
688 }
689 
695 template<typename DataType>
697  return ArrayAlgorithms<DataType>::acosh(array);
698 }
699 
705 template<typename DataType>
707  return ArrayAlgorithms<DataType>::atanh(array);
708 }
709 
715 template<typename DataType>
717  return ArrayAlgorithms<DataType>::log(array);
718 }
719 
725 template<typename DataType>
727  return ArrayAlgorithms<DataType>::log2(array);
728 }
729 
735 template<typename DataType>
737  return ArrayAlgorithms<DataType>::log10(array);
738 }
739 
746 template<typename DataType>
747 Array<DataType> pow(const Array<DataType> &array, double exponent){
748  return ArrayAlgorithms<DataType>::pow(array, exponent);
749 }
750 
756 template<typename DataType>
758  return ArrayAlgorithms<DataType>::exp(array);
759 }
760 
766 template<typename DataType>
767 typename std::enable_if<
768  !std::is_same<DataType, std::complex<double>>::value,
770 >::type abs(const Array<DataType> &array){
771  return ArrayAlgorithms<DataType>::abs(array);
772 }
773 
779 template<typename DataType>
780 typename std::enable_if<
781  std::is_same<DataType, std::complex<double>>::value,
783 >::type abs(const Array<DataType> &array){
784  return ArrayAlgorithms<DataType>::abs(array);
785 }
786 
792 inline Array<double> arg(const Array<std::complex<double>> &array){
794 }
795 
802 inline Array<double> real(const Array<std::complex<double>> &array){
804 }
805 
812 inline Array<double> imag(const Array<std::complex<double>> &array){
814 }
815 
821 inline Array<std::complex<double>> conj(const Array<std::complex<double>> &array){
823 }
824 
830 template<typename DataType>
832  return ArrayAlgorithms<DataType>::sqrt(array);
833 }
834 
840 template<typename DataType>
841 DataType max(const Array<DataType> &array){
842  return ArrayAlgorithms<DataType>::max(array);
843 }
844 
850 template<typename DataType>
851 DataType min(const Array<DataType> &array){
852  return ArrayAlgorithms<DataType>::min(array);
853 }
854 
855 }; //End of namespace Math
856 }; //End of namespace TBTK
857 
858 #endif
static Array< DataType > sinh(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:326
Definition: ArrayAlgorithms.h:34
static std::enable_if< !std::is_same< T, std::complex< double > >::value, Array< DataType > >::type abs(const Array< DataType > &array)
static Array< DataType > acos(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:302
static Array< DataType > cos(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:264
static Array< DataType > exp(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:449
static Array< DataType > cosh(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:338
CArray< DataType > & getData()
Definition: Array.h:1281
static DataType max(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:569
static Array< DataType > log10(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:422
static Array< DataType > tan(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:276
const std::vector< unsigned int > & getRanges() const
Definition: Array.h:1228
Multi-dimensional array.
static Array< DataType > log2(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:410
static Array< DataType > asin(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:288
Multi-dimensional array.
Definition: Array.h:98
unsigned int getSize() const
Definition: Array.h:1291
static std::enable_if< std::is_same< T, std::complex< double > >::value, Array< double > >::type arg(const Array< std::complex< double >> &array)
static std::enable_if< std::is_same< T, std::complex< double > >::value, Array< DataType > >::type conj(const Array< DataType > &array)
static Array< DataType > sin(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:252
static Array< DataType > atanh(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:386
Container for a C style array.
Definition: CArray.h:44
Definition: Boolean.h:32
static Array< DataType > acosh(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:374
static Array< DataType > pow(const Array< DataType > &array, double exponent)
Definition: ArrayAlgorithms.h:434
static Array< DataType > sqrt(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:557
static Array create(const std::vector< unsigned int > &ranges)
Definition: Array.h:585
static DataType min(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:580
static Array< DataType > asinh(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:362
static Array< DataType > atan(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:314
static std::enable_if< std::is_same< T, std::complex< double > >::value, Array< double > >::type imag(const Array< std::complex< double >> &array)
static Array< DataType > tanh(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:350
static Array< DataType > log(const Array< DataType > &array)
Definition: ArrayAlgorithms.h:398
static std::enable_if< std::is_same< T, std::complex< double > >::value, Array< double > >::type real(const Array< std::complex< double >> &array)