@digitaldefiance/node-accelerate 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -351,14 +351,589 @@ function rms(a) {
351
351
  return accelerate.rms(a);
352
352
  }
353
353
 
354
+ /**
355
+ * Variance of vector elements
356
+ * @param {Float64Array} a - Input vector
357
+ * @returns {number} Variance
358
+ */
359
+ function variance(a) {
360
+ return accelerate.variance(a);
361
+ }
362
+
363
+ /**
364
+ * Standard deviation of vector elements
365
+ * @param {Float64Array} a - Input vector
366
+ * @returns {number} Standard deviation
367
+ */
368
+ function stddev(a) {
369
+ return accelerate.stddev(a);
370
+ }
371
+
372
+ /**
373
+ * Min and max of vector elements
374
+ * @param {Float64Array} a - Input vector
375
+ * @returns {{min: number, max: number}} Object with min and max
376
+ */
377
+ function minmax(a) {
378
+ return accelerate.minmax(a);
379
+ }
380
+
381
+ /**
382
+ * Vector sine: b = sin(a)
383
+ * @param {Float64Array} a - Input vector
384
+ * @param {Float64Array} b - Output vector
385
+ * @returns {Float64Array} b
386
+ */
387
+ function vsin(a, b) {
388
+ return accelerate.vsin(a, b);
389
+ }
390
+
391
+ /**
392
+ * Vector cosine: b = cos(a)
393
+ * @param {Float64Array} a - Input vector
394
+ * @param {Float64Array} b - Output vector
395
+ * @returns {Float64Array} b
396
+ */
397
+ function vcos(a, b) {
398
+ return accelerate.vcos(a, b);
399
+ }
400
+
401
+ /**
402
+ * Vector tangent: b = tan(a)
403
+ * @param {Float64Array} a - Input vector
404
+ * @param {Float64Array} b - Output vector
405
+ * @returns {Float64Array} b
406
+ */
407
+ function vtan(a, b) {
408
+ return accelerate.vtan(a, b);
409
+ }
410
+
411
+ /**
412
+ * Vector exponential: b = exp(a)
413
+ * @param {Float64Array} a - Input vector
414
+ * @param {Float64Array} b - Output vector
415
+ * @returns {Float64Array} b
416
+ */
417
+ function vexp(a, b) {
418
+ return accelerate.vexp(a, b);
419
+ }
420
+
421
+ /**
422
+ * Vector natural logarithm: b = log(a)
423
+ * @param {Float64Array} a - Input vector
424
+ * @param {Float64Array} b - Output vector
425
+ * @returns {Float64Array} b
426
+ */
427
+ function vlog(a, b) {
428
+ return accelerate.vlog(a, b);
429
+ }
430
+
431
+ /**
432
+ * Vector base-10 logarithm: b = log10(a)
433
+ * @param {Float64Array} a - Input vector
434
+ * @param {Float64Array} b - Output vector
435
+ * @returns {Float64Array} b
436
+ */
437
+ function vlog10(a, b) {
438
+ return accelerate.vlog10(a, b);
439
+ }
440
+
441
+ /**
442
+ * Vector power: c = a^b (element-wise)
443
+ * @param {Float64Array} a - Base vector
444
+ * @param {Float64Array} b - Exponent vector
445
+ * @param {Float64Array} c - Output vector
446
+ * @returns {Float64Array} c
447
+ */
448
+ function vpow(a, b, c) {
449
+ return accelerate.vpow(a, b, c);
450
+ }
451
+
452
+ /**
453
+ * Vector clip: b = clip(a, min, max)
454
+ * @param {Float64Array} a - Input vector
455
+ * @param {Float64Array} b - Output vector
456
+ * @param {number} min - Minimum value
457
+ * @param {number} max - Maximum value
458
+ * @returns {Float64Array} b
459
+ */
460
+ function vclip(a, b, min, max) {
461
+ return accelerate.vclip(a, b, min, max);
462
+ }
463
+
464
+ /**
465
+ * Vector threshold: b = a where a > threshold, else 0
466
+ * @param {Float64Array} a - Input vector
467
+ * @param {Float64Array} b - Output vector
468
+ * @param {number} threshold - Threshold value
469
+ * @returns {Float64Array} b
470
+ */
471
+ function vthreshold(a, b, threshold) {
472
+ return accelerate.vthreshold(a, b, threshold);
473
+ }
474
+
475
+ /**
476
+ * Convolution: result = signal * kernel
477
+ * @param {Float64Array} signal - Input signal
478
+ * @param {Float64Array} kernel - Convolution kernel
479
+ * @param {Float64Array} result - Output (length = signal.length - kernel.length + 1)
480
+ * @returns {Float64Array} result
481
+ */
482
+ function conv(signal, kernel, result) {
483
+ return accelerate.conv(signal, kernel, result);
484
+ }
485
+
486
+ /**
487
+ * Cross-correlation: result = correlate(a, b)
488
+ * @param {Float64Array} a - First signal
489
+ * @param {Float64Array} b - Second signal
490
+ * @param {Float64Array} result - Output (length = a.length + b.length - 1)
491
+ * @returns {Float64Array} result
492
+ */
493
+ function xcorr(a, b, result) {
494
+ return accelerate.xcorr(a, b, result);
495
+ }
496
+
497
+ /**
498
+ * Generate Hamming window
499
+ * @param {number} length - Window length
500
+ * @returns {Float64Array} Window coefficients
501
+ */
502
+ function hamming(length) {
503
+ return accelerate.hamming(length);
504
+ }
505
+
506
+ /**
507
+ * Generate Hanning window
508
+ * @param {number} length - Window length
509
+ * @returns {Float64Array} Window coefficients
510
+ */
511
+ function hanning(length) {
512
+ return accelerate.hanning(length);
513
+ }
514
+
515
+ /**
516
+ * Generate Blackman window
517
+ * @param {number} length - Window length
518
+ * @returns {Float64Array} Window coefficients
519
+ */
520
+ function blackman(length) {
521
+ return accelerate.blackman(length);
522
+ }
523
+
524
+ /**
525
+ * Matrix transpose: B = A^T
526
+ * @param {Float64Array} A - Input matrix (rows × cols, row-major)
527
+ * @param {Float64Array} B - Output matrix (cols × rows, row-major)
528
+ * @param {number} rows - Number of rows in A
529
+ * @param {number} cols - Number of columns in A
530
+ * @returns {Float64Array} B
531
+ */
532
+ function transpose(A, B, rows, cols) {
533
+ return accelerate.transpose(A, B, rows, cols);
534
+ }
535
+
536
+ /**
537
+ * Inverse Fast Fourier Transform
538
+ * @param {Float64Array} real - Real part of frequency domain
539
+ * @param {Float64Array} imag - Imaginary part of frequency domain
540
+ * @returns {Float64Array} Time domain signal
541
+ */
542
+ function ifft(real, imag) {
543
+ if (!(real instanceof Float64Array) || !(imag instanceof Float64Array)) {
544
+ throw new TypeError('Arguments must be Float64Arrays');
545
+ }
546
+ if (real.length !== imag.length) {
547
+ throw new RangeError('Real and imaginary arrays must have same length');
548
+ }
549
+
550
+ return accelerate.ifft(real, imag);
551
+ }
552
+
553
+ /**
554
+ * Linear interpolation
555
+ * @param {Float64Array} x - X coordinates of data points
556
+ * @param {Float64Array} y - Y coordinates of data points
557
+ * @param {Float64Array} xi - X coordinates to interpolate at
558
+ * @param {Float64Array} yi - Output interpolated Y values
559
+ * @returns {Float64Array} yi
560
+ */
561
+ function interp1d(x, y, xi, yi) {
562
+ return accelerate.interp1d(x, y, xi, yi);
563
+ }
564
+
565
+ /**
566
+ * Vector reverse: b = reverse(a)
567
+ * @param {Float64Array} a - Input vector
568
+ * @param {Float64Array} b - Output vector
569
+ * @returns {Float64Array} b
570
+ */
571
+ function vreverse(a, b) {
572
+ return accelerate.vreverse(a, b);
573
+ }
574
+
575
+ /**
576
+ * Vector negate: b = -a
577
+ * @param {Float64Array} a - Input vector
578
+ * @param {Float64Array} b - Output vector
579
+ * @returns {Float64Array} b
580
+ */
581
+ function vneg(a, b) {
582
+ return accelerate.vneg(a, b);
583
+ }
584
+
585
+ /**
586
+ * Sum of squares: sum(a[i]^2)
587
+ * @param {Float64Array} a - Input vector
588
+ * @returns {number} Sum of squares
589
+ */
590
+ function sumOfSquares(a) {
591
+ return accelerate.sumOfSquares(a);
592
+ }
593
+
594
+ /**
595
+ * Mean magnitude: mean(|a[i]|)
596
+ * @param {Float64Array} a - Input vector
597
+ * @returns {number} Mean magnitude
598
+ */
599
+ function meanMagnitude(a) {
600
+ return accelerate.meanMagnitude(a);
601
+ }
602
+
603
+ /**
604
+ * Mean square: mean(a[i]^2)
605
+ * @param {Float64Array} a - Input vector
606
+ * @returns {number} Mean square
607
+ */
608
+ function meanSquare(a) {
609
+ return accelerate.meanSquare(a);
610
+ }
611
+
612
+ // ============================================================================
613
+ // ADDITIONAL BLAS OPERATIONS
614
+ // ============================================================================
615
+
616
+ /**
617
+ * Vector copy: y = x
618
+ * @param {Float64Array} x - Source vector
619
+ * @param {Float64Array} y - Destination vector
620
+ * @returns {Float64Array} y
621
+ */
622
+ function copy(x, y) {
623
+ return accelerate.copy(x, y);
624
+ }
625
+
626
+ /**
627
+ * Vector swap: exchange x and y
628
+ * @param {Float64Array} x - First vector
629
+ * @param {Float64Array} y - Second vector
630
+ * @returns {Float64Array} x
631
+ */
632
+ function swap(x, y) {
633
+ return accelerate.swap(x, y);
634
+ }
635
+
636
+ /**
637
+ * Vector norm (L2 norm / Euclidean length): ||x||
638
+ * @param {Float64Array} x - Input vector
639
+ * @returns {number} L2 norm
640
+ */
641
+ function norm(x) {
642
+ return accelerate.norm(x);
643
+ }
644
+
645
+ /**
646
+ * Sum of absolute values: sum(|x[i]|)
647
+ * @param {Float64Array} x - Input vector
648
+ * @returns {number} Sum of absolute values
649
+ */
650
+ function abssum(x) {
651
+ return accelerate.abssum(x);
652
+ }
653
+
654
+ /**
655
+ * Index of maximum absolute value
656
+ * @param {Float64Array} x - Input vector
657
+ * @returns {number} Index of element with maximum absolute value
658
+ */
659
+ function maxAbsIndex(x) {
660
+ return accelerate.maxAbsIndex(x);
661
+ }
662
+
663
+ /**
664
+ * Apply Givens rotation
665
+ * @param {Float64Array} x - First vector
666
+ * @param {Float64Array} y - Second vector
667
+ * @param {number} c - Cosine of rotation angle
668
+ * @param {number} s - Sine of rotation angle
669
+ * @returns {Float64Array} x
670
+ */
671
+ function rot(x, y, c, s) {
672
+ return accelerate.rot(x, y, c, s);
673
+ }
674
+
675
+ // ============================================================================
676
+ // ADDITIONAL vDSP OPERATIONS
677
+ // ============================================================================
678
+
679
+ /**
680
+ * Fill vector with scalar value
681
+ * @param {number} scalar - Value to fill with
682
+ * @param {Float64Array} vec - Output vector
683
+ * @returns {Float64Array} vec
684
+ */
685
+ function vfill(scalar, vec) {
686
+ return accelerate.vfill(scalar, vec);
687
+ }
688
+
689
+ /**
690
+ * Generate linear ramp: vec[i] = start + i * step
691
+ * @param {number} start - Starting value
692
+ * @param {number} step - Step size
693
+ * @param {Float64Array} vec - Output vector
694
+ * @returns {Float64Array} vec
695
+ */
696
+ function vramp(start, step, vec) {
697
+ return accelerate.vramp(start, step, vec);
698
+ }
699
+
700
+ /**
701
+ * Add scalar to vector: c = a + scalar
702
+ * @param {Float64Array} a - Input vector
703
+ * @param {number} scalar - Scalar to add
704
+ * @param {Float64Array} c - Output vector
705
+ * @returns {Float64Array} c
706
+ */
707
+ function vaddScalar(a, scalar, c) {
708
+ return accelerate.vaddScalar(a, scalar, c);
709
+ }
710
+
711
+ /**
712
+ * Multiply and add: d = (a * b) + c
713
+ * @param {Float64Array} a - First vector
714
+ * @param {Float64Array} b - Second vector
715
+ * @param {Float64Array} c - Third vector
716
+ * @param {Float64Array} d - Output vector
717
+ * @returns {Float64Array} d
718
+ */
719
+ function vma(a, b, c, d) {
720
+ return accelerate.vma(a, b, c, d);
721
+ }
722
+
723
+ /**
724
+ * Multiply and scalar add: d = (a * b) + c (scalar)
725
+ * @param {Float64Array} a - First vector
726
+ * @param {Float64Array} b - Second vector
727
+ * @param {number} c - Scalar to add
728
+ * @param {Float64Array} d - Output vector
729
+ * @returns {Float64Array} d
730
+ */
731
+ function vmsa(a, b, c, d) {
732
+ return accelerate.vmsa(a, b, c, d);
733
+ }
734
+
735
+ /**
736
+ * Linear interpolation between vectors: c = a + t * (b - a)
737
+ * @param {Float64Array} a - Start vector
738
+ * @param {Float64Array} b - End vector
739
+ * @param {number} t - Interpolation parameter (0 to 1)
740
+ * @param {Float64Array} c - Output vector
741
+ * @returns {Float64Array} c
742
+ */
743
+ function vlerp(a, b, t, c) {
744
+ return accelerate.vlerp(a, b, t, c);
745
+ }
746
+
747
+ /**
748
+ * Clear vector (set to zero)
749
+ * @param {Float64Array} vec - Vector to clear
750
+ * @returns {Float64Array} vec
751
+ */
752
+ function vclear(vec) {
753
+ return accelerate.vclear(vec);
754
+ }
755
+
756
+ /**
757
+ * Limit vector values (saturate): c = limit(a, low, high)
758
+ * @param {Float64Array} a - Input vector
759
+ * @param {number} low - Lower limit
760
+ * @param {number} high - Upper limit
761
+ * @param {Float64Array} c - Output vector
762
+ * @returns {Float64Array} c
763
+ */
764
+ function vlimit(a, low, high, c) {
765
+ return accelerate.vlimit(a, low, high, c);
766
+ }
767
+
768
+ /**
769
+ * Maximum magnitude in vector: max(|a[i]|)
770
+ * @param {Float64Array} a - Input vector
771
+ * @returns {number} Maximum magnitude
772
+ */
773
+ function maxMagnitude(a) {
774
+ return accelerate.maxMagnitude(a);
775
+ }
776
+
777
+ /**
778
+ * Minimum magnitude in vector: min(|a[i]|)
779
+ * @param {Float64Array} a - Input vector
780
+ * @returns {number} Minimum magnitude
781
+ */
782
+ function minMagnitude(a) {
783
+ return accelerate.minMagnitude(a);
784
+ }
785
+
786
+ // ============================================================================
787
+ // MORE MATH FUNCTIONS
788
+ // ============================================================================
789
+
790
+ /**
791
+ * Reciprocal: b = 1/a
792
+ * @param {Float64Array} a - Input vector
793
+ * @param {Float64Array} b - Output vector
794
+ * @returns {Float64Array} b
795
+ */
796
+ function vreciprocal(a, b) {
797
+ return accelerate.vreciprocal(a, b);
798
+ }
799
+
800
+ /**
801
+ * Inverse square root: b = 1/sqrt(a)
802
+ * @param {Float64Array} a - Input vector
803
+ * @param {Float64Array} b - Output vector
804
+ * @returns {Float64Array} b
805
+ */
806
+ function vrsqrt(a, b) {
807
+ return accelerate.vrsqrt(a, b);
808
+ }
809
+
810
+ /**
811
+ * Hyperbolic sine: b = sinh(a)
812
+ * @param {Float64Array} a - Input vector
813
+ * @param {Float64Array} b - Output vector
814
+ * @returns {Float64Array} b
815
+ */
816
+ function vsinh(a, b) {
817
+ return accelerate.vsinh(a, b);
818
+ }
819
+
820
+ /**
821
+ * Hyperbolic cosine: b = cosh(a)
822
+ * @param {Float64Array} a - Input vector
823
+ * @param {Float64Array} b - Output vector
824
+ * @returns {Float64Array} b
825
+ */
826
+ function vcosh(a, b) {
827
+ return accelerate.vcosh(a, b);
828
+ }
829
+
830
+ /**
831
+ * Hyperbolic tangent: b = tanh(a)
832
+ * @param {Float64Array} a - Input vector
833
+ * @param {Float64Array} b - Output vector
834
+ * @returns {Float64Array} b
835
+ */
836
+ function vtanh(a, b) {
837
+ return accelerate.vtanh(a, b);
838
+ }
839
+
840
+ /**
841
+ * Inverse sine: b = asin(a)
842
+ * @param {Float64Array} a - Input vector
843
+ * @param {Float64Array} b - Output vector
844
+ * @returns {Float64Array} b
845
+ */
846
+ function vasin(a, b) {
847
+ return accelerate.vasin(a, b);
848
+ }
849
+
850
+ /**
851
+ * Inverse cosine: b = acos(a)
852
+ * @param {Float64Array} a - Input vector
853
+ * @param {Float64Array} b - Output vector
854
+ * @returns {Float64Array} b
855
+ */
856
+ function vacos(a, b) {
857
+ return accelerate.vacos(a, b);
858
+ }
859
+
860
+ /**
861
+ * Inverse tangent: b = atan(a)
862
+ * @param {Float64Array} a - Input vector
863
+ * @param {Float64Array} b - Output vector
864
+ * @returns {Float64Array} b
865
+ */
866
+ function vatan(a, b) {
867
+ return accelerate.vatan(a, b);
868
+ }
869
+
870
+ /**
871
+ * Two-argument inverse tangent: c = atan2(a, b)
872
+ * @param {Float64Array} a - Y coordinates
873
+ * @param {Float64Array} b - X coordinates
874
+ * @param {Float64Array} c - Output vector (angles)
875
+ * @returns {Float64Array} c
876
+ */
877
+ function vatan2(a, b, c) {
878
+ return accelerate.vatan2(a, b, c);
879
+ }
880
+
881
+ /**
882
+ * Ceiling: b = ceil(a)
883
+ * @param {Float64Array} a - Input vector
884
+ * @param {Float64Array} b - Output vector
885
+ * @returns {Float64Array} b
886
+ */
887
+ function vceil(a, b) {
888
+ return accelerate.vceil(a, b);
889
+ }
890
+
891
+ /**
892
+ * Floor: b = floor(a)
893
+ * @param {Float64Array} a - Input vector
894
+ * @param {Float64Array} b - Output vector
895
+ * @returns {Float64Array} b
896
+ */
897
+ function vfloor(a, b) {
898
+ return accelerate.vfloor(a, b);
899
+ }
900
+
901
+ /**
902
+ * Truncate (round toward zero): b = trunc(a)
903
+ * @param {Float64Array} a - Input vector
904
+ * @param {Float64Array} b - Output vector
905
+ * @returns {Float64Array} b
906
+ */
907
+ function vtrunc(a, b) {
908
+ return accelerate.vtrunc(a, b);
909
+ }
910
+
911
+ /**
912
+ * Copy sign: c = copysign(a, b) - magnitude of a with sign of b
913
+ * @param {Float64Array} a - Magnitude source
914
+ * @param {Float64Array} b - Sign source
915
+ * @param {Float64Array} c - Output vector
916
+ * @returns {Float64Array} c
917
+ */
918
+ function vcopysign(a, b, c) {
919
+ return accelerate.vcopysign(a, b, c);
920
+ }
921
+
354
922
  module.exports = {
355
923
  // Matrix operations
356
924
  matmul,
357
925
  matmulFloat,
358
926
  matvec,
927
+ transpose,
359
928
 
360
929
  // BLAS operations
361
930
  axpy,
931
+ copy,
932
+ swap,
933
+ norm,
934
+ abssum,
935
+ maxAbsIndex,
936
+ rot,
362
937
 
363
938
  // Vector arithmetic
364
939
  dot,
@@ -367,25 +942,86 @@ module.exports = {
367
942
  vmul,
368
943
  vdiv,
369
944
  vscale,
945
+ vneg,
946
+ vaddScalar,
947
+ vma,
948
+ vmsa,
370
949
 
371
950
  // Vector functions
372
951
  vabs,
373
952
  vsquare,
374
953
  vsqrt,
375
954
  normalize,
955
+ vreverse,
956
+ vfill,
957
+ vramp,
958
+ vlerp,
959
+ vclear,
960
+ vlimit,
961
+
962
+ // Trigonometric
963
+ vsin,
964
+ vcos,
965
+ vtan,
966
+ vasin,
967
+ vacos,
968
+ vatan,
969
+ vatan2,
970
+
971
+ // Hyperbolic
972
+ vsinh,
973
+ vcosh,
974
+ vtanh,
975
+
976
+ // Exponential/Logarithmic
977
+ vexp,
978
+ vlog,
979
+ vlog10,
980
+ vpow,
981
+ vreciprocal,
982
+ vrsqrt,
983
+
984
+ // Rounding
985
+ vceil,
986
+ vfloor,
987
+ vtrunc,
988
+ vcopysign,
989
+
990
+ // Clipping/Thresholding
991
+ vclip,
992
+ vthreshold,
376
993
 
377
994
  // Reductions
378
995
  sum,
379
996
  mean,
380
997
  max,
381
998
  min,
999
+ minmax,
382
1000
  rms,
1001
+ variance,
1002
+ stddev,
1003
+ sumOfSquares,
1004
+ meanMagnitude,
1005
+ meanSquare,
1006
+ maxMagnitude,
1007
+ minMagnitude,
383
1008
 
384
1009
  // Distance metrics
385
1010
  euclidean,
386
1011
 
387
1012
  // Signal processing
388
1013
  fft,
1014
+ ifft,
1015
+ conv,
1016
+ xcorr,
1017
+
1018
+ // Window functions
1019
+ hamming,
1020
+ hanning,
1021
+ blackman,
1022
+
1023
+ // Interpolation
1024
+ interp1d,
389
1025
 
390
1026
  // Raw native bindings (for advanced use)
391
1027
  _native: accelerate
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@digitaldefiance/node-accelerate",
3
- "version": "1.0.6",
4
- "description": "High-performance Apple Accelerate framework bindings for Node.js - 283x faster matrix operations on Apple Silicon",
3
+ "version": "2.0.0",
4
+ "description": "High-performance Apple Accelerate framework bindings for Node.js - 80+ optimized functions including BLAS, vDSP, and vForce",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "scripts": {
@@ -9,7 +9,8 @@
9
9
  "install": "node-gyp rebuild",
10
10
  "build": "node-gyp rebuild",
11
11
  "test": "node test.js",
12
- "benchmark": "node benchmark.js",
12
+ "benchmark": "node benchmark-comprehensive.js",
13
+ "benchmark:simple": "node benchmark.js",
13
14
  "compare": "node compare.js",
14
15
  "prepublishOnly": "npm test",
15
16
  "publish:public": "npm publish --access public"
@@ -27,6 +28,14 @@
27
28
  "matrix",
28
29
  "vector",
29
30
  "fft",
31
+ "ifft",
32
+ "convolution",
33
+ "correlation",
34
+ "trigonometry",
35
+ "statistics",
36
+ "signal-processing",
37
+ "window-functions",
38
+ "interpolation",
30
39
  "performance",
31
40
  "native",
32
41
  "addon",
@@ -65,6 +74,7 @@
65
74
  "index.js",
66
75
  "index.d.ts",
67
76
  "README.md",
77
+ "examples/",
68
78
  "LICENSE",
69
79
  "scripts/"
70
80
  ]