Guest User

Untitled

a guest
Oct 16th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.03 KB | None | 0 0
  1. //// Complex2 - core
  2. my.Complex2 = my.Complex2 || function(xxyy, ll2) {
  3. var self; self = this;
  4. if(!(self instanceof my.Complex2)) {return new my.Complex2(xxyy, ll2);}
  5. if(ll2) {
  6. if(typeof ll2 === 'number') {xxyy = [my.Array2(xxyy, ll2), my.Array2(xxyy, ll2)];}
  7. }
  8. self[0] = xxyy[0]; self[1] = xxyy[1];
  9. my.ooEach(
  10. 2,
  11. function(ii) {
  12. if(!self[ii]) {
  13. self[ii] = my.Array2(self[ii ^ 1]);
  14. self[ii].arr = new window.Float64Array(self[ii].arr.length);
  15. }
  16. }
  17. );
  18. };
  19. my.Complex2.iter0 = function(self, ll2) {
  20. var ii1, ii2, ll1, out, stride1, stride2, xx, yy; if(self === undefined) {return;}
  21. if(typeof self === 'function') {return self;}
  22. //// OPTIMIZATION - single element array
  23. if(self[0].ll1 <= 1 && self[0].ll2 <= 1) {
  24. self = [self[0][self[0].offset], self[1][self[1].offset]];
  25. }
  26. if(Array.isArray(self)) {return function() {return self;};}
  27. out = [null, null]; xx = self[0].arr; yy = self[1].arr; self = self[0];
  28. //// OPTIMIZATION - repeat single col * ll2
  29. if(self.ll2 <= 1 && 1 < ll2) {
  30. stride1 = self.stride1; ii1 = self.offset; ii2 = -1;
  31. return function() {
  32. ii2 += 1; if(ii2 >= ll2) {ii1 += stride1; ii2 = 0;}
  33. out[0] = xx[ii1]; out[1] = yy[ii1]; return out;
  34. };
  35. }
  36. stride1 = self.stride1; ll1 = self.offset + self.ll1 * stride1; ii1 = self.offset;
  37. stride2 = self.stride2; ll2 = self.offset + self.ll2 * stride2; ii2 = self.offset - stride2;
  38. //// OPTIMIZATION - repeat single row * ll1
  39. if(self.ll1 <= 1) {
  40. return function() {
  41. ii2 += stride2; if(ii2 >= ll2) {ii2 = ii1;}
  42. out[0] = xx[ii2]; out[1] = yy[ii2]; return out;
  43. };
  44. }
  45. //// OPTIMIZATION - one dimensional
  46. if(self.is1D()) {
  47. stride2 = self.is1D(); ii2 = self.offset - stride2;
  48. return function() {ii2 += stride2; out[0] = xx[ii2]; out[1] = yy[ii2]; return out;};
  49. }
  50. //// default case
  51. return function() {
  52. ii2 += stride2; if(ii2 >= ll2) {ii1 += stride1; ii2 = ii1; ll2 += stride1;}
  53. out[0] = xx[ii2]; out[1] = yy[ii2]; return out;
  54. };
  55. };
  56. my.Complex2.prototype.conjugate = function() {this[0].neg(); return this;};
  57. my.Complex2.prototype.fft = function(mode) {
  58. var aa, cc, ee, ee0, ii, ii1, ii2, jj, jj2, kk, ll1, ll2, mm, nn, nn1, nn2, offset,
  59. self, ss, stride1, stride2, tt1, tt2, xx, yy;
  60. self = this[0]; ll1 = self.ll1; ll2 = self.ll2; offset = self.offset;
  61. stride1 = self.stride1; stride2 = self.stride2; xx = this[0].arr; yy = this[1].arr;
  62. //// inplace bit-reverse
  63. jj = 0; nn = ll2 * stride2; nn2 = nn >> 1;
  64. for (ii = stride2; ii < nn - stride2; ii += stride2) {
  65. nn1 = nn2; while (jj >= nn1) {jj -= nn1; nn1 >>= 1;} jj += nn1;
  66. if (ii < jj) {
  67. ii2 = ii + offset; jj2 = jj + offset;
  68. for(ii1 = 0; ii1 < ll1; ii1 += 1) {
  69. tt1 = xx[ii2]; xx[ii2] = xx[jj2]; xx[jj2] = tt1;
  70. tt1 = yy[ii2]; yy[ii2] = yy[jj2]; yy[jj2] = tt1;
  71. ii2 += stride1; jj2 += stride1;
  72. }
  73. }
  74. }
  75. //// inplace fft
  76. ee0 = -6.283185307179586; if(mode === 'reverse') {ee0 = -ee0; this.mul(1 / ll2);}
  77. for(mm = 0; (1 << mm) < ll2; mm += 1) {;} nn1 = 0; nn2 = stride2;
  78. for (ii = 0; ii < mm; ii += 1) {
  79. nn1 = nn2; nn2 <<= 1; ee = ee0 * (stride2 / nn2); aa = 0.0;
  80. for (jj = 0; jj < nn1; jj += stride2) {
  81. cc = Math.cos(aa); ss = Math.sin(aa); aa += ee;
  82. for (kk = jj; kk < nn; kk += nn2) {
  83. ii2 = kk + offset; jj2 = kk + nn1 + offset;
  84. for(ii1 = 0; ii1 < ll1; ii1 += 1) {
  85. tt1 = cc * xx[jj2] - ss * yy[jj2]; tt2 = ss * xx[jj2] + cc * yy[jj2];
  86. xx[jj2] = xx[ii2] - tt1; yy[jj2] = yy[ii2] - tt2; xx[ii2] += tt1; yy[ii2] += tt2;
  87. ii2 += stride1; jj2 += stride1;
  88. }
  89. }
  90. }
  91. }
  92. return this;
  93. };
  94. my.Complex2.prototype.get = function(ii1, ii2) {
  95. if(arguments.length <= 1) {return my.Complex2([this[0].get(ii1), this[1].get(ii1)]);}
  96. return [this[0].get(ii1, ii2), this[1].get(ii1, ii2)];
  97. };
  98. my.Complex2.prototype.jsonStringify = function(mode) {
  99. var out; out = [this[0].jsonStringify('checkOnly'), this[1].jsonStringify('checkOnly')];
  100. return mode === 'checkOnly' ? out : my.jsonStringify(out);
  101. };
  102. my.Complex2.prototype.length = 2;
  103. my.Complex2.prototype.set = function(ii1, ii2, oo) {
  104. var xx, yy; xx = arguments[arguments.length - 1]; yy = xx[1]; xx = xx[0];
  105. switch(arguments.length) {
  106. case 1: this[0].set(xx); this[1].set(yy); break;
  107. case 2: this[0].set(ii1, xx); this[1].set(ii1, yy); break;
  108. default: this[0].set(ii1, ii2, xx); this[1].set(ii1, ii2, yy);
  109. }
  110. return this;
  111. };
  112. my.Complex2.prototype._each = function(aa, bb) {
  113. var aaNext, aaXx, aaYy, bbNext, bbXx, bbYy,
  114. ii1, ii2, ll1, ll2, self, stride1, stride2, tmp, xx, xx2, yy, yy2; self = this[0];
  115. aaNext = my.Complex2.iter0(aa, this[0].ll2); bbNext = my.Complex2.iter0(aa, this[0].ll2);
  116. xx = this[0].arr; yy = this[1].arr;
  117. //// OPTIMIZATION - one dimensional
  118. if(self.is1D()) {
  119. stride2 = self.is1D(); ll2 = self.offset + self.ll1 * self.ll2 * stride2;
  120. for(ii2 = self.offset; ii2 < ll2; ii2 += stride2) {
  121. xx2 = xx[ii2]; yy2 = yy[ii2]; this();
  122. }
  123. return this;
  124. }
  125. stride1 = self.stride1; ll1 = self.offset + self.ll1 * stride1;
  126. stride2 = self.stride2; ll2 = self.offset + self.ll2 * stride2;
  127. for(ii1 = self.offset; ii1 < ll1; ii1 += stride1) {
  128. for(ii2 = ii1; ii2 < ll2; ii2 += stride2) {
  129. xx2 = xx[ii2]; yy2 = yy[ii2]; this();
  130. }
  131. ll2 += stride1;
  132. }
  133. return this;
  134. };
  135. my.Complex2.prototype._reduce = function(aa, bb) {
  136. var aaNext, bbNext, ii1, ii2, ll1, ll2, self, stride1, tmp, xx, yy; self = this[0];
  137. stride1 = self.stride1;
  138. ll1 = self.offset + self.ll1 * stride1;
  139. ll2 = Math.max(aa[0].ll2 || 0, (bb && bb[0] && bb[0].ll2) || 0);
  140. aaNext = my.Complex2.iter0(aa, ll2); bbNext = my.Complex2.iter0(bb, ll2);
  141. xx = this[0].arr; yy = this[1].arr;
  142. for(ii1 = self.offset; ii1 < ll1; ii1 += stride1) {
  143. xx[ii1] = 0; for(ii2 = 0; ii2 < ll2; ii2 += 1) {this();}
  144. }
  145. return this;
  146. };
  147.  
  148. ## Complex2 - extra
  149. ## op
  150. my.ooEach();:
  151. {},:
  152. 'abs': 'xx[ii2] = Math.sqrt(xx2 * xx2 + yy2 * yy2); yy[ii2] = 0;',
  153. 'abs2': 'xx[ii2] = xx2 * xx2 + yy2 * yy2; yy[ii2] = 0;',
  154. 'add': 'aa = aaNext(); xx[ii2] += aa[0]; yy[ii2] += aa[1];',
  155. 'div':
  156. 'aa = aaNext(); tmp = 1 / (aa[0] * aa[0] + aa[1] * aa[1]);' +
  157. 'xx[ii2] = tmp * (yy2 * aa[1] + xx2 * aa[0]);' +
  158. 'yy[ii2] = tmp * (yy2 * aa[0] - xx2 * aa[1]);',
  159. 'exp':
  160. 'xx2 = Math.exp(xx2); xx[ii2] = xx2 * Math.cos(yy2); yy[ii2] = xx2 * Math.sin(yy2);',
  161. 'inv':
  162. 'yy[ii2] = 1 / (xx2 * xx2 + yy2 * yy2);' +
  163. 'xx[ii2] *= yy[ii2]; yy[ii2] *= -yy2;',
  164. 'mul':
  165. 'aa = aaNext();' +
  166. 'xx[ii2] = xx2 * aa[0] - yy2 * aa[1]; yy[ii2] = xx2 * aa[1] + yy2 * aa[0];',
  167. 'sqd': 'xx[ii2] = xx2 * xx2 - yy2 * yy2; yy[ii2] = 2 * xx2 * yy2;',
  168. 'sub': 'aa = aaNext(); xx[ii2] -= aa[0]; yy[ii2] -= aa[1];'
  169. function(vv, kk) {}:
  170. my.SOURCE_EXTRA +=
  171. 'my.Complex2.prototype.' + kk + 'C = ' +
  172. my.Complex2.prototype._each.toString().replace(r'/this\(\);/g', vv) + ';\n';
  173. ## reduce
  174. my.ooEach();:
  175. {},:
  176. 'dot': [],:
  177. '0', '0',
  178. 'aa = aaNext(); bb = bbNext();' +
  179. 'xx[ii2] += aa[0] * bb[0] - aa[1] * bb[1]; yy[ii2] += aa[0] * bb[1] + aa[1] * bb[0];'
  180. 'max2': [],:
  181. '-Infinity', '-1',
  182. 'aa = aaNext(); tmp = aa[0] * aa[0] + aa[1] * aa[1];' +
  183. 'if(tmp > xx[ii1]) {xx[ii1] = tmp; yy[ii1] = ii2;}'
  184. 'min2': [],:
  185. 'Infinity', '-1',
  186. 'aa = aaNext(); tmp = aa[0] * aa[0] + aa[1] * aa[1];' +
  187. 'if(tmp < xx[ii1]) {xx[ii1] = tmp; yy[ii1] = ii2;}'
  188. 'sum2': [],:
  189. '0', '0',
  190. 'aa = aaNext(); xx[ii2] += aa[0] * aa[0]; yy[ii2] += aa[1] * aa[1];'
  191. function(vv, kk) {}:
  192. my.SOURCE_EXTRA +=
  193. 'my.Complex2.prototype.' + kk + 'C = ' +
  194. my.Complex2.prototype._reduce.toString()
  195. .replace('xx[ii1] = 0', 'xx[ii1] = ' + vv[0] + '; yy[ii1] = ' + vv[1])
  196. .replace('this();', vv[2]) + ';\n';
  197.  
  198. ## Complex2 - extra
  199. ## default inherit
  200. my.ooEach();:
  201. Object.keys(my.Array2.prototype).sort(),
  202. function(kk) {}:
  203. my.closure();:
  204. [kk],
  205. function(kk) {}:
  206. my.Complex2.prototype[kk] = my.Complex2.prototype[kk] || function() {};:
  207. this[0][kk].apply(this[0], arguments);
  208. this[1][kk].apply(this[1], arguments); return this;
  209. ## new
  210. my.ooEach();:
  211. ['concat', 'copy', 'mean', 'sink', 'slice'],
  212. function(kk) {}:
  213. my.closure();:
  214. [kk],
  215. function(kk) {}:
  216. my.Complex2.prototype[kk] = function() {};:
  217. return my.Complex2();:
  218. [this[0][kk].apply(this[0], arguments), this[1][kk].apply(this[1], arguments)]
  219. ## 0
  220. my.ooEach();:
  221. ['is1D', 'isContiguous', 'isTransposed'],
  222. function(kk) {}:
  223. my.closure();:
  224. [kk],
  225. function(kk) {}:
  226. my.Complex2.prototype[kk] = function() {};:
  227. return this[0][kk].apply(this[0], arguments);
Add Comment
Please, Sign In to add comment