@react-native-oh-tpl/react-native-gesture-handler 2.12.6-1 → 2.12.6-2

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.
Files changed (79) hide show
  1. package/harmony/gesture_handler/LICENSE +21 -0
  2. package/harmony/gesture_handler/OAT.xml +44 -0
  3. package/harmony/gesture_handler/README.OpenSource +11 -0
  4. package/harmony/gesture_handler/README.md +1 -0
  5. package/harmony/gesture_handler/build-profile.json5 +7 -7
  6. package/harmony/gesture_handler/hvigorfile.ts +2 -2
  7. package/harmony/gesture_handler/index.ets +2 -2
  8. package/harmony/gesture_handler/oh-package.json5 +13 -11
  9. package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +8 -8
  10. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +33 -33
  11. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +14 -14
  12. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentDescriptor.h +60 -60
  13. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.cpp +17 -17
  14. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.h +11 -11
  15. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentDescriptor.h +60 -60
  16. package/harmony/gesture_handler/src/main/ets/CircularBuffer.ts +42 -42
  17. package/harmony/gesture_handler/src/main/ets/Event.ts +67 -67
  18. package/harmony/gesture_handler/src/main/ets/EventDispatcher.ts +37 -37
  19. package/harmony/gesture_handler/src/main/ets/GestureHandler.ts +663 -663
  20. package/harmony/gesture_handler/src/main/ets/GestureHandlerArkUIAdapter.ets +201 -201
  21. package/harmony/gesture_handler/src/main/ets/GestureHandlerFactory.ts +44 -44
  22. package/harmony/gesture_handler/src/main/ets/GestureHandlerOrchestrator.ts +280 -280
  23. package/harmony/gesture_handler/src/main/ets/GestureHandlerPackage.ts +22 -22
  24. package/harmony/gesture_handler/src/main/ets/GestureHandlerRegistry.ts +27 -27
  25. package/harmony/gesture_handler/src/main/ets/InteractionManager.ts +108 -108
  26. package/harmony/gesture_handler/src/main/ets/LeastSquareSolver.ts +182 -182
  27. package/harmony/gesture_handler/src/main/ets/NativeViewGestureHandler.ts +114 -114
  28. package/harmony/gesture_handler/src/main/ets/OutgoingEvent.ts +33 -33
  29. package/harmony/gesture_handler/src/main/ets/PanGestureHandler.ts +327 -327
  30. package/harmony/gesture_handler/src/main/ets/PointerTracker.ts +239 -239
  31. package/harmony/gesture_handler/src/main/ets/RNGHError.ts +4 -4
  32. package/harmony/gesture_handler/src/main/ets/RNGHLogger.ts +28 -28
  33. package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandler.ets +57 -57
  34. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerButton.ets +36 -36
  35. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerModule.ts +125 -125
  36. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerRootView.ets +56 -55
  37. package/harmony/gesture_handler/src/main/ets/RNOHScrollLocker.ts +10 -10
  38. package/harmony/gesture_handler/src/main/ets/State.ts +46 -46
  39. package/harmony/gesture_handler/src/main/ets/TapGestureHandler.ts +205 -205
  40. package/harmony/gesture_handler/src/main/ets/Vector2D.ts +36 -36
  41. package/harmony/gesture_handler/src/main/ets/VelocityTracker.ts +98 -98
  42. package/harmony/gesture_handler/src/main/ets/View.ts +70 -70
  43. package/harmony/gesture_handler/src/main/ets/ViewRegistry.ts +42 -42
  44. package/harmony/gesture_handler/src/main/ets/pages/Index.ets +16 -16
  45. package/harmony/gesture_handler/src/main/ets/webviewability/WebviewAbility.ts +41 -41
  46. package/harmony/gesture_handler/src/main/module.json5 +6 -6
  47. package/harmony/gesture_handler/src/main/resources/base/element/color.json +7 -7
  48. package/harmony/gesture_handler/src/main/resources/base/element/string.json +15 -15
  49. package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +5 -5
  50. package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +15 -15
  51. package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +15 -15
  52. package/harmony/gesture_handler.har +0 -0
  53. package/lib/commonjs/components/touchables/GenericTouchable.js +9 -9
  54. package/lib/commonjs/components/touchables/TouchableOpacity.js +2 -2
  55. package/lib/commonjs/handlers/createNativeWrapper.js +6 -6
  56. package/lib/commonjs/handlers/gestures/GestureDetector.js +3 -3
  57. package/lib/module/components/touchables/GenericTouchable.js +9 -9
  58. package/lib/module/components/touchables/TouchableOpacity.js +2 -2
  59. package/lib/module/handlers/createNativeWrapper.js +6 -6
  60. package/lib/module/handlers/gestures/GestureDetector.js +3 -3
  61. package/package.json +70 -70
  62. package/src/RNGestureHandlerModule.ts +6 -6
  63. package/src/components/GestureButtons.tsx +334 -334
  64. package/src/components/GestureHandlerButton.tsx +5 -5
  65. package/src/components/GestureHandlerRootView.tsx +34 -34
  66. package/src/components/RNGestureHandlerButton.tsx +23 -23
  67. package/src/components/touchables/GenericTouchable.tsx +301 -301
  68. package/src/components/touchables/TouchableOpacity.tsx +76 -76
  69. package/src/components/touchables/TouchableWithoutFeedback.tsx +14 -14
  70. package/src/components/touchables/index.ts +7 -7
  71. package/src/handlers/NativeViewGestureHandler.ts +55 -55
  72. package/src/handlers/PanGestureHandler.ts +327 -327
  73. package/src/handlers/TapGestureHandler.ts +95 -95
  74. package/src/handlers/createHandler.tsx +535 -535
  75. package/src/handlers/createNativeWrapper.tsx +81 -81
  76. package/src/handlers/gestureHandlerCommon.ts +15 -15
  77. package/src/handlers/gestures/GestureDetector.tsx +823 -823
  78. package/src/index.ts +172 -172
  79. package/src/init.ts +18 -18
@@ -1,109 +1,109 @@
1
- import { GestureHandler, Handler, GestureConfig as Config } from "./GestureHandler"
2
-
3
- export class InteractionManager {
4
- private readonly waitForRelations: Map<number, number[]> = new Map()
5
- private readonly simultaneousRelations: Map<number, number[]> = new Map()
6
-
7
- public configureInteractions(handler: GestureHandler, config: Config) {
8
- this.dropRelationsForHandlerWithTag(handler.getTag());
9
-
10
- if (config.waitFor) {
11
- const waitFor: number[] = [];
12
- config.waitFor.forEach((otherHandler: Handler): void => {
13
- // New API reference
14
- if (typeof otherHandler === 'number') {
15
- waitFor.push(otherHandler);
16
- } else {
17
- // Old API reference
18
- waitFor.push(otherHandler.handlerTag);
19
- }
20
- });
21
-
22
- this.waitForRelations.set(handler.getTag(), waitFor);
23
- }
24
-
25
- if (config.simultaneousHandlers) {
26
- const simultaneousHandlers: number[] = [];
27
- config.simultaneousHandlers.forEach((otherHandler: Handler): void => {
28
- if (typeof otherHandler === 'number') {
29
- simultaneousHandlers.push(otherHandler);
30
- } else {
31
- simultaneousHandlers.push(otherHandler.handlerTag);
32
- }
33
- });
34
-
35
- this.simultaneousRelations.set(handler.getTag(), simultaneousHandlers);
36
- }
37
- }
38
-
39
- public shouldWaitForHandlerFailure(
40
- handler: GestureHandler,
41
- otherHandler: GestureHandler
42
- ): boolean {
43
- const waitFor: number[] | undefined = this.waitForRelations.get(
44
- handler.getTag()
45
- );
46
- if (!waitFor) {
47
- return false;
48
- }
49
-
50
- let shouldWait = false;
51
-
52
- waitFor.forEach((tag: number): void => {
53
- if (tag === otherHandler.getTag()) {
54
- shouldWait = true;
55
- return; //Returns from callback
56
- }
57
- });
58
-
59
- return shouldWait;
60
- }
61
-
62
- public shouldRecognizeSimultaneously(
63
- handler: GestureHandler,
64
- otherHandler: GestureHandler
65
- ): boolean {
66
- const simultaneousHandlers: number[] | undefined =
67
- this.simultaneousRelations.get(handler.getTag());
68
- if (!simultaneousHandlers) {
69
- return false;
70
- }
71
-
72
- let shouldRecognizeSimultaneously = false;
73
-
74
- simultaneousHandlers.forEach((tag: number): void => {
75
- if (tag === otherHandler.getTag()) {
76
- shouldRecognizeSimultaneously = true;
77
- return;
78
- }
79
- });
80
-
81
- return shouldRecognizeSimultaneously;
82
- }
83
-
84
- public shouldRequireHandlerToWaitForFailure(
85
- _handler: GestureHandler,
86
- _otherHandler: GestureHandler
87
- ): boolean {
88
- //TODO: Implement logic
89
- return false;
90
- }
91
-
92
- public shouldHandlerBeCancelledBy(
93
- _handler: GestureHandler,
94
- _otherHandler: GestureHandler
95
- ): boolean {
96
- //TODO: Implement logic
97
- return false;
98
- }
99
-
100
- public dropRelationsForHandlerWithTag(handlerTag: number): void {
101
- this.waitForRelations.delete(handlerTag);
102
- this.simultaneousRelations.delete(handlerTag);
103
- }
104
-
105
- public reset() {
106
- this.waitForRelations.clear();
107
- this.simultaneousRelations.clear();
108
- }
1
+ import { GestureHandler, Handler, GestureConfig as Config } from "./GestureHandler"
2
+
3
+ export class InteractionManager {
4
+ private readonly waitForRelations: Map<number, number[]> = new Map()
5
+ private readonly simultaneousRelations: Map<number, number[]> = new Map()
6
+
7
+ public configureInteractions(handler: GestureHandler, config: Config) {
8
+ this.dropRelationsForHandlerWithTag(handler.getTag());
9
+
10
+ if (config.waitFor) {
11
+ const waitFor: number[] = [];
12
+ config.waitFor.forEach((otherHandler: Handler): void => {
13
+ // New API reference
14
+ if (typeof otherHandler === 'number') {
15
+ waitFor.push(otherHandler);
16
+ } else {
17
+ // Old API reference
18
+ waitFor.push(otherHandler.handlerTag);
19
+ }
20
+ });
21
+
22
+ this.waitForRelations.set(handler.getTag(), waitFor);
23
+ }
24
+
25
+ if (config.simultaneousHandlers) {
26
+ const simultaneousHandlers: number[] = [];
27
+ config.simultaneousHandlers.forEach((otherHandler: Handler): void => {
28
+ if (typeof otherHandler === 'number') {
29
+ simultaneousHandlers.push(otherHandler);
30
+ } else {
31
+ simultaneousHandlers.push(otherHandler.handlerTag);
32
+ }
33
+ });
34
+
35
+ this.simultaneousRelations.set(handler.getTag(), simultaneousHandlers);
36
+ }
37
+ }
38
+
39
+ public shouldWaitForHandlerFailure(
40
+ handler: GestureHandler,
41
+ otherHandler: GestureHandler
42
+ ): boolean {
43
+ const waitFor: number[] | undefined = this.waitForRelations.get(
44
+ handler.getTag()
45
+ );
46
+ if (!waitFor) {
47
+ return false;
48
+ }
49
+
50
+ let shouldWait = false;
51
+
52
+ waitFor.forEach((tag: number): void => {
53
+ if (tag === otherHandler.getTag()) {
54
+ shouldWait = true;
55
+ return; //Returns from callback
56
+ }
57
+ });
58
+
59
+ return shouldWait;
60
+ }
61
+
62
+ public shouldRecognizeSimultaneously(
63
+ handler: GestureHandler,
64
+ otherHandler: GestureHandler
65
+ ): boolean {
66
+ const simultaneousHandlers: number[] | undefined =
67
+ this.simultaneousRelations.get(handler.getTag());
68
+ if (!simultaneousHandlers) {
69
+ return false;
70
+ }
71
+
72
+ let shouldRecognizeSimultaneously = false;
73
+
74
+ simultaneousHandlers.forEach((tag: number): void => {
75
+ if (tag === otherHandler.getTag()) {
76
+ shouldRecognizeSimultaneously = true;
77
+ return;
78
+ }
79
+ });
80
+
81
+ return shouldRecognizeSimultaneously;
82
+ }
83
+
84
+ public shouldRequireHandlerToWaitForFailure(
85
+ _handler: GestureHandler,
86
+ _otherHandler: GestureHandler
87
+ ): boolean {
88
+ //TODO: Implement logic
89
+ return false;
90
+ }
91
+
92
+ public shouldHandlerBeCancelledBy(
93
+ _handler: GestureHandler,
94
+ _otherHandler: GestureHandler
95
+ ): boolean {
96
+ //TODO: Implement logic
97
+ return false;
98
+ }
99
+
100
+ public dropRelationsForHandlerWithTag(handlerTag: number): void {
101
+ this.waitForRelations.delete(handlerTag);
102
+ this.simultaneousRelations.delete(handlerTag);
103
+ }
104
+
105
+ public reset() {
106
+ this.waitForRelations.clear();
107
+ this.simultaneousRelations.clear();
108
+ }
109
109
  }
@@ -1,182 +1,182 @@
1
- // Implementation taken from Flutter's LeastSquareSolver
2
- // https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/gestures/lsq_solver.dart
3
-
4
- class Vector {
5
- private offset: number;
6
- private length: number;
7
- private elements: number[];
8
-
9
- constructor(length: number) {
10
- this.offset = 0;
11
- this.length = length;
12
- this.elements = new Array<number>(length);
13
- }
14
-
15
- public static fromVOL(
16
- values: number[],
17
- offset: number,
18
- length: number
19
- ): Vector {
20
- const result = new Vector(0);
21
-
22
- result.offset = offset;
23
- result.length = length;
24
- result.elements = values;
25
-
26
- return result;
27
- }
28
-
29
- public get(index: number): number {
30
- return this.elements[this.offset + index];
31
- }
32
-
33
- public set(index: number, value: number): void {
34
- this.elements[this.offset + index] = value;
35
- }
36
-
37
- public dot(other: Vector): number {
38
- let result = 0;
39
- for (let i = 0; i < this.length; i++) {
40
- result += this.get(i) * other.get(i);
41
- }
42
- return result;
43
- }
44
-
45
- public norm() {
46
- return Math.sqrt(this.dot(this));
47
- }
48
- }
49
-
50
- class Matrix {
51
- private columns: number;
52
- private elements: number[];
53
-
54
- constructor(rows: number, columns: number) {
55
- this.columns = columns;
56
- this.elements = new Array<number>(rows * columns);
57
- }
58
-
59
- public get(row: number, column: number): number {
60
- return this.elements[row * this.columns + column];
61
- }
62
-
63
- public set(row: number, column: number, value: number): void {
64
- this.elements[row * this.columns + column] = value;
65
- }
66
-
67
- public getRow(row: number): Vector {
68
- return Vector.fromVOL(this.elements, row * this.columns, this.columns);
69
- }
70
- }
71
-
72
- /// An nth degree polynomial fit to a dataset.
73
- class PolynomialFit {
74
- /// The polynomial coefficients of the fit.
75
- ///
76
- /// For each `i`, the element `coefficients[i]` is the coefficient of
77
- /// the `i`-th power of the variable.
78
- public coefficients: number[];
79
-
80
- /// Creates a polynomial fit of the given degree.
81
- ///
82
- /// There are n + 1 coefficients in a fit of degree n.
83
- constructor(degree: number) {
84
- this.coefficients = new Array<number>(degree + 1);
85
- }
86
- }
87
-
88
- const precisionErrorTolerance = 1e-10;
89
-
90
- /// Uses the least-squares algorithm to fit a polynomial to a set of data.
91
- export class LeastSquareSolver {
92
- /// The x-coordinates of each data point.
93
- private x: number[];
94
- /// The y-coordinates of each data point.
95
- private y: number[];
96
- /// The weight to use for each data point.
97
- private w: number[];
98
-
99
- /// Creates a least-squares solver.
100
- ///
101
- /// The [x], [y], and [w] arguments must not be null.
102
- constructor(x: number[], y: number[], w: number[]) {
103
- this.x = x;
104
- this.y = y;
105
- this.w = w;
106
- }
107
-
108
- /// Fits a polynomial of the given degree to the data points.
109
- ///
110
- /// When there is not enough data to fit a curve null is returned.
111
- public solve(degree: number): PolynomialFit | null {
112
- if (degree > this.x.length) {
113
- // Not enough data to fit a curve.
114
- return null;
115
- }
116
-
117
- const result = new PolynomialFit(degree);
118
-
119
- // Shorthands for the purpose of notation equivalence to original C++ code.
120
- const m = this.x.length;
121
- const n = degree + 1;
122
-
123
- // Expand the X vector to a matrix A, pre-multiplied by the weights.
124
- const a = new Matrix(n, m);
125
- for (let h = 0; h < m; h++) {
126
- a.set(0, h, this.w[h]);
127
-
128
- for (let i = 1; i < n; i++) {
129
- a.set(i, h, a.get(i - 1, h) * this.x[h]);
130
- }
131
- }
132
-
133
- // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
134
-
135
- // Orthonormal basis, column-major ordVectorer.
136
- const q = new Matrix(n, m);
137
- // Upper triangular matrix, row-major order.
138
- const r = new Matrix(n, m);
139
-
140
- for (let j = 0; j < n; j += 1) {
141
- for (let h = 0; h < m; h += 1) {
142
- q.set(j, h, a.get(j, h));
143
- }
144
- for (let i = 0; i < j; i += 1) {
145
- const dot = q.getRow(j).dot(q.getRow(i));
146
- for (let h = 0; h < m; h += 1) {
147
- q.set(j, h, q.get(j, h) - dot * q.get(i, h));
148
- }
149
- }
150
-
151
- const norm = q.getRow(j).norm();
152
- if (norm < precisionErrorTolerance) {
153
- // Vectors are linearly dependent or zero so no solution.
154
- return null;
155
- }
156
-
157
- const inverseNorm = 1.0 / norm;
158
- for (let h = 0; h < m; h += 1) {
159
- q.set(j, h, q.get(j, h) * inverseNorm);
160
- }
161
- for (let i = 0; i < n; i += 1) {
162
- r.set(j, i, i < j ? 0.0 : q.getRow(j).dot(a.getRow(i)));
163
- }
164
- }
165
-
166
- // Solve R B = Qt W Y to find B. This is easy because R is upper triangular.
167
- // We just work from bottom-right to top-left calculating B's coefficients.
168
- const wy = new Vector(m);
169
- for (let h = 0; h < m; h += 1) {
170
- wy.set(h, this.y[h] * this.w[h]);
171
- }
172
- for (let i = n - 1; i >= 0; i -= 1) {
173
- result.coefficients[i] = q.getRow(i).dot(wy);
174
- for (let j = n - 1; j > i; j -= 1) {
175
- result.coefficients[i] -= r.get(i, j) * result.coefficients[j];
176
- }
177
- result.coefficients[i] /= r.get(i, i);
178
- }
179
-
180
- return result;
181
- }
182
- }
1
+ // Implementation taken from Flutter's LeastSquareSolver
2
+ // https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/gestures/lsq_solver.dart
3
+
4
+ class Vector {
5
+ private offset: number;
6
+ private length: number;
7
+ private elements: number[];
8
+
9
+ constructor(length: number) {
10
+ this.offset = 0;
11
+ this.length = length;
12
+ this.elements = new Array<number>(length);
13
+ }
14
+
15
+ public static fromVOL(
16
+ values: number[],
17
+ offset: number,
18
+ length: number
19
+ ): Vector {
20
+ const result = new Vector(0);
21
+
22
+ result.offset = offset;
23
+ result.length = length;
24
+ result.elements = values;
25
+
26
+ return result;
27
+ }
28
+
29
+ public get(index: number): number {
30
+ return this.elements[this.offset + index];
31
+ }
32
+
33
+ public set(index: number, value: number): void {
34
+ this.elements[this.offset + index] = value;
35
+ }
36
+
37
+ public dot(other: Vector): number {
38
+ let result = 0;
39
+ for (let i = 0; i < this.length; i++) {
40
+ result += this.get(i) * other.get(i);
41
+ }
42
+ return result;
43
+ }
44
+
45
+ public norm() {
46
+ return Math.sqrt(this.dot(this));
47
+ }
48
+ }
49
+
50
+ class Matrix {
51
+ private columns: number;
52
+ private elements: number[];
53
+
54
+ constructor(rows: number, columns: number) {
55
+ this.columns = columns;
56
+ this.elements = new Array<number>(rows * columns);
57
+ }
58
+
59
+ public get(row: number, column: number): number {
60
+ return this.elements[row * this.columns + column];
61
+ }
62
+
63
+ public set(row: number, column: number, value: number): void {
64
+ this.elements[row * this.columns + column] = value;
65
+ }
66
+
67
+ public getRow(row: number): Vector {
68
+ return Vector.fromVOL(this.elements, row * this.columns, this.columns);
69
+ }
70
+ }
71
+
72
+ /// An nth degree polynomial fit to a dataset.
73
+ class PolynomialFit {
74
+ /// The polynomial coefficients of the fit.
75
+ ///
76
+ /// For each `i`, the element `coefficients[i]` is the coefficient of
77
+ /// the `i`-th power of the variable.
78
+ public coefficients: number[];
79
+
80
+ /// Creates a polynomial fit of the given degree.
81
+ ///
82
+ /// There are n + 1 coefficients in a fit of degree n.
83
+ constructor(degree: number) {
84
+ this.coefficients = new Array<number>(degree + 1);
85
+ }
86
+ }
87
+
88
+ const precisionErrorTolerance = 1e-10;
89
+
90
+ /// Uses the least-squares algorithm to fit a polynomial to a set of data.
91
+ export class LeastSquareSolver {
92
+ /// The x-coordinates of each data point.
93
+ private x: number[];
94
+ /// The y-coordinates of each data point.
95
+ private y: number[];
96
+ /// The weight to use for each data point.
97
+ private w: number[];
98
+
99
+ /// Creates a least-squares solver.
100
+ ///
101
+ /// The [x], [y], and [w] arguments must not be null.
102
+ constructor(x: number[], y: number[], w: number[]) {
103
+ this.x = x;
104
+ this.y = y;
105
+ this.w = w;
106
+ }
107
+
108
+ /// Fits a polynomial of the given degree to the data points.
109
+ ///
110
+ /// When there is not enough data to fit a curve null is returned.
111
+ public solve(degree: number): PolynomialFit | null {
112
+ if (degree > this.x.length) {
113
+ // Not enough data to fit a curve.
114
+ return null;
115
+ }
116
+
117
+ const result = new PolynomialFit(degree);
118
+
119
+ // Shorthands for the purpose of notation equivalence to original C++ code.
120
+ const m = this.x.length;
121
+ const n = degree + 1;
122
+
123
+ // Expand the X vector to a matrix A, pre-multiplied by the weights.
124
+ const a = new Matrix(n, m);
125
+ for (let h = 0; h < m; h++) {
126
+ a.set(0, h, this.w[h]);
127
+
128
+ for (let i = 1; i < n; i++) {
129
+ a.set(i, h, a.get(i - 1, h) * this.x[h]);
130
+ }
131
+ }
132
+
133
+ // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
134
+
135
+ // Orthonormal basis, column-major ordVectorer.
136
+ const q = new Matrix(n, m);
137
+ // Upper triangular matrix, row-major order.
138
+ const r = new Matrix(n, m);
139
+
140
+ for (let j = 0; j < n; j += 1) {
141
+ for (let h = 0; h < m; h += 1) {
142
+ q.set(j, h, a.get(j, h));
143
+ }
144
+ for (let i = 0; i < j; i += 1) {
145
+ const dot = q.getRow(j).dot(q.getRow(i));
146
+ for (let h = 0; h < m; h += 1) {
147
+ q.set(j, h, q.get(j, h) - dot * q.get(i, h));
148
+ }
149
+ }
150
+
151
+ const norm = q.getRow(j).norm();
152
+ if (norm < precisionErrorTolerance) {
153
+ // Vectors are linearly dependent or zero so no solution.
154
+ return null;
155
+ }
156
+
157
+ const inverseNorm = 1.0 / norm;
158
+ for (let h = 0; h < m; h += 1) {
159
+ q.set(j, h, q.get(j, h) * inverseNorm);
160
+ }
161
+ for (let i = 0; i < n; i += 1) {
162
+ r.set(j, i, i < j ? 0.0 : q.getRow(j).dot(a.getRow(i)));
163
+ }
164
+ }
165
+
166
+ // Solve R B = Qt W Y to find B. This is easy because R is upper triangular.
167
+ // We just work from bottom-right to top-left calculating B's coefficients.
168
+ const wy = new Vector(m);
169
+ for (let h = 0; h < m; h += 1) {
170
+ wy.set(h, this.y[h] * this.w[h]);
171
+ }
172
+ for (let i = n - 1; i >= 0; i -= 1) {
173
+ result.coefficients[i] = q.getRow(i).dot(wy);
174
+ for (let j = n - 1; j > i; j -= 1) {
175
+ result.coefficients[i] -= r.get(i, j) * result.coefficients[j];
176
+ }
177
+ result.coefficients[i] /= r.get(i, i);
178
+ }
179
+
180
+ return result;
181
+ }
182
+ }