108 *
109 * @param species species of desired vector
110 * @return a zero vector of given species
111 */
112 @ForceInline
113 @SuppressWarnings("unchecked")
114 public static DoubleVector zero(VectorSpecies<Double> species) {
115 return VectorIntrinsics.broadcastCoerced((Class<DoubleVector>) species.boxType(), double.class, species.length(),
116 Double.doubleToLongBits(0.0f), species,
117 ((bits, s) -> ((DoubleSpecies)s).op(i -> Double.longBitsToDouble((long)bits))));
118 }
119
120 /**
121 * Loads a vector from a byte array starting at an offset.
122 * <p>
123 * Bytes are composed into primitive lane elements according to the
124 * native byte order of the underlying platform
125 * <p>
126 * This method behaves as if it returns the result of calling the
127 * byte buffer, offset, and mask accepting
128 * {@link #fromByteBuffer(VectorSpecies<Double>, ByteBuffer, int, VectorMask) method} as follows:
129 * <pre>{@code
130 * return this.fromByteBuffer(ByteBuffer.wrap(a), i, this.maskAllTrue());
131 * }</pre>
132 *
133 * @param species species of desired vector
134 * @param a the byte array
135 * @param ix the offset into the array
136 * @return a vector loaded from a byte array
137 * @throws IndexOutOfBoundsException if {@code i < 0} or
138 * {@code i > a.length - (this.length() * this.elementSize() / Byte.SIZE)}
139 */
140 @ForceInline
141 @SuppressWarnings("unchecked")
142 public static DoubleVector fromByteArray(VectorSpecies<Double> species, byte[] a, int ix) {
143 Objects.requireNonNull(a);
144 ix = VectorIntrinsics.checkIndex(ix, a.length, species.bitSize() / Byte.SIZE);
145 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
146 a, ((long) ix) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
147 a, ix, species,
148 (c, idx, s) -> {
149 ByteBuffer bbc = ByteBuffer.wrap(c, idx, a.length - idx).order(ByteOrder.nativeOrder());
150 DoubleBuffer tb = bbc.asDoubleBuffer();
151 return ((DoubleSpecies)s).op(i -> tb.get());
152 });
153 }
154
155 /**
156 * Loads a vector from a byte array starting at an offset and using a
157 * mask.
158 * <p>
159 * Bytes are composed into primitive lane elements according to the
160 * native byte order of the underlying platform.
161 * <p>
162 * This method behaves as if it returns the result of calling the
163 * byte buffer, offset, and mask accepting
164 * {@link #fromByteBuffer(VectorSpecies<Double>, ByteBuffer, int, VectorMask) method} as follows:
165 * <pre>{@code
166 * return this.fromByteBuffer(ByteBuffer.wrap(a), i, m);
167 * }</pre>
168 *
169 * @param species species of desired vector
170 * @param a the byte array
171 * @param ix the offset into the array
172 * @param m the mask
173 * @return a vector loaded from a byte array
174 * @throws IndexOutOfBoundsException if {@code i < 0} or
175 * {@code i > a.length - (this.length() * this.elementSize() / Byte.SIZE)}
176 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
177 * or {@code > a.length},
178 * for any vector lane index {@code N} where the mask at lane {@code N}
179 * is set
180 * {@code i >= a.length - (N * this.elementSize() / Byte.SIZE)}
181 */
182 @ForceInline
183 public static DoubleVector fromByteArray(VectorSpecies<Double> species, byte[] a, int ix, VectorMask<Double> m) {
184 return zero(species).blend(fromByteArray(species, a, ix), m);
185 }
186
187 /**
188 * Loads a vector from an array starting at offset.
189 * <p>
190 * For each vector lane, where {@code N} is the vector lane index, the
191 * array element at index {@code i + N} is placed into the
192 * resulting vector at lane index {@code N}.
193 *
194 * @param species species of desired vector
195 * @param a the array
196 * @param i the offset into the array
197 * @return the vector loaded from an array
198 * @throws IndexOutOfBoundsException if {@code i < 0}, or
199 * {@code i > a.length - this.length()}
200 */
201 @ForceInline
202 @SuppressWarnings("unchecked")
203 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int i){
204 Objects.requireNonNull(a);
205 i = VectorIntrinsics.checkIndex(i, a.length, species.length());
206 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
207 a, (((long) i) << ARRAY_SHIFT) + Unsafe.ARRAY_DOUBLE_BASE_OFFSET,
208 a, i, species,
209 (c, idx, s) -> ((DoubleSpecies)s).op(n -> c[idx + n]));
210 }
211
212
213 /**
214 * Loads a vector from an array starting at offset and using a mask.
215 * <p>
216 * For each vector lane, where {@code N} is the vector lane index,
217 * if the mask lane at index {@code N} is set then the array element at
218 * index {@code i + N} is placed into the resulting vector at lane index
219 * {@code N}, otherwise the default element value is placed into the
220 * resulting vector at lane index {@code N}.
221 *
222 * @param species species of desired vector
223 * @param a the array
224 * @param i the offset into the array
225 * @param m the mask
226 * @return the vector loaded from an array
227 * @throws IndexOutOfBoundsException if {@code i < 0}, or
228 * for any vector lane index {@code N} where the mask at lane {@code N}
229 * is set {@code i > a.length - N}
230 */
231 @ForceInline
232 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int i, VectorMask<Double> m) {
233 return zero(species).blend(fromArray(species, a, i), m);
234 }
235
236 /**
237 * Loads a vector from an array using indexes obtained from an index
238 * map.
239 * <p>
240 * For each vector lane, where {@code N} is the vector lane index, the
241 * array element at index {@code i + indexMap[j + N]} is placed into the
242 * resulting vector at lane index {@code N}.
243 *
244 * @param species species of desired vector
245 * @param a the array
246 * @param i the offset into the array, may be negative if relative
247 * indexes in the index map compensate to produce a value within the
248 * array bounds
249 * @param indexMap the index map
250 * @param j the offset into the index map
251 * @return the vector loaded from an array
252 * @throws IndexOutOfBoundsException if {@code j < 0}, or
253 * {@code j > indexMap.length - this.length()},
254 * or for any vector lane index {@code N} the result of
255 * {@code i + indexMap[j + N]} is {@code < 0} or {@code >= a.length}
256 */
257 @ForceInline
258 @SuppressWarnings("unchecked")
259 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int i, int[] indexMap, int j) {
260 Objects.requireNonNull(a);
261 Objects.requireNonNull(indexMap);
262
263 if (species.length() == 1) {
264 return DoubleVector.fromArray(species, a, i + indexMap[j]);
265 }
266
267 // Index vector: vix[0:n] = k -> i + indexMap[j + k]
268 IntVector vix = IntVector.fromArray(IntVector.species(species.indexShape()), indexMap, j).add(i);
269
270 vix = VectorIntrinsics.checkIndex(vix, a.length);
271
272 return VectorIntrinsics.loadWithMap((Class<DoubleVector>) species.boxType(), double.class, species.length(),
273 IntVector.species(species.indexShape()).boxType(), a, Unsafe.ARRAY_DOUBLE_BASE_OFFSET, vix,
274 a, i, indexMap, j, species,
275 (double[] c, int idx, int[] iMap, int idy, VectorSpecies<Double> s) ->
276 ((DoubleSpecies)s).op(n -> c[idx + iMap[idy+n]]));
277 }
278
279 /**
280 * Loads a vector from an array using indexes obtained from an index
281 * map and using a mask.
282 * <p>
283 * For each vector lane, where {@code N} is the vector lane index,
284 * if the mask lane at index {@code N} is set then the array element at
285 * index {@code i + indexMap[j + N]} is placed into the resulting vector
286 * at lane index {@code N}.
287 *
288 * @param species species of desired vector
289 * @param a the array
290 * @param i the offset into the array, may be negative if relative
291 * indexes in the index map compensate to produce a value within the
292 * array bounds
293 * @param m the mask
294 * @param indexMap the index map
295 * @param j the offset into the index map
296 * @return the vector loaded from an array
297 * @throws IndexOutOfBoundsException if {@code j < 0}, or
298 * {@code j > indexMap.length - this.length()},
299 * or for any vector lane index {@code N} where the mask at lane
300 * {@code N} is set the result of {@code i + indexMap[j + N]} is
301 * {@code < 0} or {@code >= a.length}
302 */
303 @ForceInline
304 @SuppressWarnings("unchecked")
305 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int i, VectorMask<Double> m, int[] indexMap, int j) {
306 // @@@ This can result in out of bounds errors for unset mask lanes
307 return zero(species).blend(fromArray(species, a, i, indexMap, j), m);
308 }
309
310
311 /**
312 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
313 * offset into the byte buffer.
314 * <p>
315 * Bytes are composed into primitive lane elements according to the
316 * native byte order of the underlying platform.
317 * <p>
318 * This method behaves as if it returns the result of calling the
319 * byte buffer, offset, and mask accepting
320 * {@link #fromByteBuffer(VectorSpecies<Double>, ByteBuffer, int, VectorMask)} method} as follows:
321 * <pre>{@code
322 * return this.fromByteBuffer(b, i, this.maskAllTrue())
323 * }</pre>
324 *
325 * @param species species of desired vector
326 * @param bb the byte buffer
327 * @param ix the offset into the byte buffer
328 * @return a vector loaded from a byte buffer
329 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
330 * or {@code > b.limit()},
331 * or if there are fewer than
332 * {@code this.length() * this.elementSize() / Byte.SIZE} bytes
333 * remaining in the byte buffer from the given offset
334 */
335 @ForceInline
336 @SuppressWarnings("unchecked")
337 public static DoubleVector fromByteBuffer(VectorSpecies<Double> species, ByteBuffer bb, int ix) {
338 if (bb.order() != ByteOrder.nativeOrder()) {
339 throw new IllegalArgumentException();
340 }
341 ix = VectorIntrinsics.checkIndex(ix, bb.limit(), species.bitSize() / Byte.SIZE);
342 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
343 U.getReference(bb, BYTE_BUFFER_HB), U.getLong(bb, BUFFER_ADDRESS) + ix,
344 bb, ix, species,
345 (c, idx, s) -> {
346 ByteBuffer bbc = c.duplicate().position(idx).order(ByteOrder.nativeOrder());
347 DoubleBuffer tb = bbc.asDoubleBuffer();
348 return ((DoubleSpecies)s).op(i -> tb.get());
349 });
350 }
351
352 /**
353 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
354 * offset into the byte buffer and using a mask.
355 * <p>
356 * This method behaves as if the byte buffer is viewed as a primitive
357 * {@link java.nio.Buffer buffer} for the primitive element type,
358 * according to the native byte order of the underlying platform, and
359 * the returned vector is loaded with a mask from a primitive array
360 * obtained from the primitive buffer.
361 * The following pseudocode expresses the behaviour, where
362 * {@coce EBuffer} is the primitive buffer type, {@code e} is the
363 * primitive element type, and {@code ESpecies<S>} is the primitive
364 * species for {@code e}:
365 * <pre>{@code
366 * EBuffer eb = b.duplicate().
367 * order(ByteOrder.nativeOrder()).position(i).
368 * asEBuffer();
369 * e[] es = new e[this.length()];
370 * for (int n = 0; n < t.length; n++) {
371 * if (m.isSet(n))
372 * es[n] = eb.get(n);
373 * }
374 * Vector<E> r = ((ESpecies<S>)this).fromArray(es, 0, m);
375 * }</pre>
376 *
377 * @param species species of desired vector
378 * @param bb the byte buffer
379 * @param ix the offset into the byte buffer
380 * @param m the mask
381 * @return a vector loaded from a byte buffer
382 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
383 * or {@code > b.limit()},
384 * for any vector lane index {@code N} where the mask at lane {@code N}
385 * is set
386 * {@code i >= b.limit() - (N * this.elementSize() / Byte.SIZE)}
387 */
388 @ForceInline
389 public static DoubleVector fromByteBuffer(VectorSpecies<Double> species, ByteBuffer bb, int ix, VectorMask<Double> m) {
390 return zero(species).blend(fromByteBuffer(species, bb, ix), m);
391 }
392
393 /**
394 * Returns a vector where all lane elements are set to the primitive
395 * value {@code e}.
396 *
397 * @param s species of the desired vector
398 * @param e the value
399 * @return a vector of vector where all lane elements are set to
400 * the primitive value {@code e}
401 */
402 @ForceInline
403 @SuppressWarnings("unchecked")
404 public static DoubleVector broadcast(VectorSpecies<Double> s, double e) {
405 return VectorIntrinsics.broadcastCoerced(
406 (Class<DoubleVector>) s.boxType(), double.class, s.length(),
407 Double.doubleToLongBits(e), s,
408 ((bits, sp) -> ((DoubleSpecies)sp).op(i -> Double.longBitsToDouble((long)bits))));
409 }
410
411 /**
412 * Returns a vector where each lane element is set to a given
413 * primitive value.
414 * <p>
415 * For each vector lane, where {@code N} is the vector lane index, the
416 * the primitive value at index {@code N} is placed into the resulting
417 * vector at lane index {@code N}.
418 *
419 * @param s species of the desired vector
420 * @param es the given primitive values
421 * @return a vector where each lane element is set to a given primitive
422 * value
423 * @throws IndexOutOfBoundsException if {@code es.length < this.length()}
424 */
425 @ForceInline
426 @SuppressWarnings("unchecked")
427 public static DoubleVector scalars(VectorSpecies<Double> s, double... es) {
428 Objects.requireNonNull(es);
429 int ix = VectorIntrinsics.checkIndex(0, es.length, s.length());
430 return VectorIntrinsics.load((Class<DoubleVector>) s.boxType(), double.class, s.length(),
431 es, Unsafe.ARRAY_DOUBLE_BASE_OFFSET,
432 es, ix, s,
433 (c, idx, sp) -> ((DoubleSpecies)sp).op(n -> c[idx + n]));
434 }
435
436 /**
437 * Returns a vector where the first lane element is set to the primtive
438 * value {@code e}, all other lane elements are set to the default
439 * value.
440 *
441 * @param s species of the desired vector
442 * @param e the value
443 * @return a vector where the first lane element is set to the primitive
444 * value {@code e}
445 */
446 @ForceInline
447 public static final DoubleVector single(VectorSpecies<Double> s, double e) {
448 return zero(s).with(0, e);
449 }
450
451 /**
452 * Returns a vector where each lane element is set to a randomly
453 * generated primitive value.
454 *
455 * The semantics are equivalent to calling
456 * {@link ThreadLocalRandom#nextDouble()}
457 *
458 * @param s species of the desired vector
459 * @return a vector where each lane elements is set to a randomly
460 * generated primitive value
461 */
462 public static DoubleVector random(VectorSpecies<Double> s) {
463 ThreadLocalRandom r = ThreadLocalRandom.current();
464 return ((DoubleSpecies)s).op(i -> r.nextDouble());
465 }
466
467 // Ops
468
469 @Override
470 public abstract DoubleVector add(Vector<Double> v);
471
472 /**
473 * Adds this vector to the broadcast of an input scalar.
474 * <p>
475 * This is a vector binary operation where the primitive addition operation
476 * ({@code +}) is applied to lane elements.
477 *
478 * @param s the input scalar
479 * @return the result of adding this vector to the broadcast of an input
480 * scalar
481 */
482 public abstract DoubleVector add(double s);
483
484 @Override
485 public abstract DoubleVector add(Vector<Double> v, VectorMask<Double> m);
486
487 /**
488 * Adds this vector to broadcast of an input scalar,
489 * selecting lane elements controlled by a mask.
490 * <p>
491 * This is a vector binary operation where the primitive addition operation
492 * ({@code +}) is applied to lane elements.
493 *
494 * @param s the input scalar
495 * @param m the mask controlling lane selection
496 * @return the result of adding this vector to the broadcast of an input
497 * scalar
498 */
499 public abstract DoubleVector add(double s, VectorMask<Double> m);
500
501 @Override
502 public abstract DoubleVector sub(Vector<Double> v);
503
504 /**
505 * Subtracts the broadcast of an input scalar from this vector.
506 * <p>
507 * This is a vector binary operation where the primitive subtraction
508 * operation ({@code -}) is applied to lane elements.
509 *
510 * @param s the input scalar
511 * @return the result of subtracting the broadcast of an input
512 * scalar from this vector
513 */
514 public abstract DoubleVector sub(double s);
515
516 @Override
517 public abstract DoubleVector sub(Vector<Double> v, VectorMask<Double> m);
518
519 /**
520 * Subtracts the broadcast of an input scalar from this vector, selecting
521 * lane elements controlled by a mask.
522 * <p>
523 * This is a vector binary operation where the primitive subtraction
524 * operation ({@code -}) is applied to lane elements.
525 *
526 * @param s the input scalar
527 * @param m the mask controlling lane selection
528 * @return the result of subtracting the broadcast of an input
529 * scalar from this vector
530 */
531 public abstract DoubleVector sub(double s, VectorMask<Double> m);
532
533 @Override
534 public abstract DoubleVector mul(Vector<Double> v);
535
536 /**
537 * Multiplies this vector with the broadcast of an input scalar.
538 * <p>
539 * This is a vector binary operation where the primitive multiplication
540 * operation ({@code *}) is applied to lane elements.
541 *
542 * @param s the input scalar
543 * @return the result of multiplying this vector with the broadcast of an
544 * input scalar
545 */
546 public abstract DoubleVector mul(double s);
547
548 @Override
549 public abstract DoubleVector mul(Vector<Double> v, VectorMask<Double> m);
550
551 /**
552 * Multiplies this vector with the broadcast of an input scalar, selecting
553 * lane elements controlled by a mask.
554 * <p>
555 * This is a vector binary operation where the primitive multiplication
556 * operation ({@code *}) is applied to lane elements.
557 *
558 * @param s the input scalar
559 * @param m the mask controlling lane selection
560 * @return the result of multiplying this vector with the broadcast of an
561 * input scalar
562 */
563 public abstract DoubleVector mul(double s, VectorMask<Double> m);
564
565 @Override
566 public abstract DoubleVector neg();
567
568 @Override
569 public abstract DoubleVector neg(VectorMask<Double> m);
570
571 @Override
572 public abstract DoubleVector abs();
573
574 @Override
575 public abstract DoubleVector abs(VectorMask<Double> m);
576
577 @Override
578 public abstract DoubleVector min(Vector<Double> v);
579
580 @Override
581 public abstract DoubleVector min(Vector<Double> v, VectorMask<Double> m);
582
583 /**
584 * Returns the minimum of this vector and the broadcast of an input scalar.
585 * <p>
586 * This is a vector binary operation where the operation
587 * {@code (a, b) -> Math.min(a, b)} is applied to lane elements.
588 *
589 * @param s the input scalar
590 * @return the minimum of this vector and the broadcast of an input scalar
591 */
592 public abstract DoubleVector min(double s);
593
594 @Override
595 public abstract DoubleVector max(Vector<Double> v);
596
597 @Override
598 public abstract DoubleVector max(Vector<Double> v, VectorMask<Double> m);
599
600 /**
601 * Returns the maximum of this vector and the broadcast of an input scalar.
602 * <p>
603 * This is a vector binary operation where the operation
604 * {@code (a, b) -> Math.max(a, b)} is applied to lane elements.
605 *
606 * @param s the input scalar
607 * @return the maximum of this vector and the broadcast of an input scalar
608 */
609 public abstract DoubleVector max(double s);
610
611 @Override
612 public abstract VectorMask<Double> equal(Vector<Double> v);
613
614 /**
615 * Tests if this vector is equal to the broadcast of an input scalar.
616 * <p>
617 * This is a vector binary test operation where the primitive equals
618 * operation ({@code ==}) is applied to lane elements.
619 *
620 * @param s the input scalar
621 * @return the result mask of testing if this vector is equal to the
622 * broadcast of an input scalar
623 */
624 public abstract VectorMask<Double> equal(double s);
625
626 @Override
627 public abstract VectorMask<Double> notEqual(Vector<Double> v);
628
629 /**
630 * Tests if this vector is not equal to the broadcast of an input scalar.
631 * <p>
632 * This is a vector binary test operation where the primitive not equals
633 * operation ({@code !=}) is applied to lane elements.
634 *
635 * @param s the input scalar
636 * @return the result mask of testing if this vector is not equal to the
637 * broadcast of an input scalar
638 */
639 public abstract VectorMask<Double> notEqual(double s);
640
641 @Override
642 public abstract VectorMask<Double> lessThan(Vector<Double> v);
643
644 /**
645 * Tests if this vector is less than the broadcast of an input scalar.
646 * <p>
647 * This is a vector binary test operation where the primitive less than
648 * operation ({@code <}) is applied to lane elements.
649 *
650 * @param s the input scalar
651 * @return the mask result of testing if this vector is less than the
652 * broadcast of an input scalar
653 */
654 public abstract VectorMask<Double> lessThan(double s);
655
656 @Override
657 public abstract VectorMask<Double> lessThanEq(Vector<Double> v);
658
659 /**
660 * Tests if this vector is less or equal to the broadcast of an input scalar.
661 * <p>
662 * This is a vector binary test operation where the primitive less than
663 * or equal to operation ({@code <=}) is applied to lane elements.
664 *
665 * @param s the input scalar
666 * @return the mask result of testing if this vector is less than or equal
667 * to the broadcast of an input scalar
668 */
669 public abstract VectorMask<Double> lessThanEq(double s);
670
671 @Override
672 public abstract VectorMask<Double> greaterThan(Vector<Double> v);
673
674 /**
675 * Tests if this vector is greater than the broadcast of an input scalar.
676 * <p>
677 * This is a vector binary test operation where the primitive greater than
678 * operation ({@code >}) is applied to lane elements.
679 *
680 * @param s the input scalar
681 * @return the mask result of testing if this vector is greater than the
682 * broadcast of an input scalar
683 */
684 public abstract VectorMask<Double> greaterThan(double s);
685
686 @Override
687 public abstract VectorMask<Double> greaterThanEq(Vector<Double> v);
688
689 /**
690 * Tests if this vector is greater than or equal to the broadcast of an
691 * input scalar.
692 * <p>
693 * This is a vector binary test operation where the primitive greater than
694 * or equal to operation ({@code >=}) is applied to lane elements.
695 *
696 * @param s the input scalar
697 * @return the mask result of testing if this vector is greater than or
698 * equal to the broadcast of an input scalar
699 */
700 public abstract VectorMask<Double> greaterThanEq(double s);
701
702 @Override
703 public abstract DoubleVector blend(Vector<Double> v, VectorMask<Double> m);
704
705 /**
706 * Blends the lane elements of this vector with those of the broadcast of an
707 * input scalar, selecting lanes controlled by a mask.
708 * <p>
709 * For each lane of the mask, at lane index {@code N}, if the mask lane
710 * is set then the lane element at {@code N} from the input vector is
711 * selected and placed into the resulting vector at {@code N},
712 * otherwise the the lane element at {@code N} from this input vector is
713 * selected and placed into the resulting vector at {@code N}.
714 *
715 * @param s the input scalar
716 * @param m the mask controlling lane selection
717 * @return the result of blending the lane elements of this vector with
718 * those of the broadcast of an input scalar
719 */
720 public abstract DoubleVector blend(double s, VectorMask<Double> m);
721
722 @Override
723 public abstract DoubleVector rearrange(Vector<Double> v,
724 VectorShuffle<Double> s, VectorMask<Double> m);
725
726 @Override
727 public abstract DoubleVector rearrange(VectorShuffle<Double> m);
728
729 @Override
730 public abstract DoubleVector reshape(VectorSpecies<Double> s);
731
732 @Override
733 public abstract DoubleVector rotateEL(int i);
734
735 @Override
736 public abstract DoubleVector rotateER(int i);
737
738 @Override
739 public abstract DoubleVector shiftEL(int i);
740
741 @Override
742 public abstract DoubleVector shiftER(int i);
743
744 /**
745 * Divides this vector by an input vector.
746 * <p>
747 * This is a vector binary operation where the primitive division
748 * operation ({@code /}) is applied to lane elements.
749 *
750 * @param v the input vector
751 * @return the result of dividing this vector by the input vector
752 */
753 public abstract DoubleVector div(Vector<Double> v);
754
755 /**
756 * Divides this vector by the broadcast of an input scalar.
757 * <p>
758 * This is a vector binary operation where the primitive division
759 * operation ({@code /}) is applied to lane elements.
760 *
761 * @param s the input scalar
762 * @return the result of dividing this vector by the broadcast of an input
763 * scalar
764 */
765 public abstract DoubleVector div(double s);
766
767 /**
768 * Divides this vector by an input vector, selecting lane elements
769 * controlled by a mask.
770 * <p>
771 * This is a vector binary operation where the primitive division
772 * operation ({@code /}) is applied to lane elements.
773 *
774 * @param v the input vector
775 * @param m the mask controlling lane selection
776 * @return the result of dividing this vector by the input vector
777 */
778 public abstract DoubleVector div(Vector<Double> v, VectorMask<Double> m);
779
780 /**
781 * Divides this vector by the broadcast of an input scalar, selecting lane
782 * elements controlled by a mask.
783 * <p>
784 * This is a vector binary operation where the primitive division
785 * operation ({@code /}) is applied to lane elements.
786 *
787 * @param s the input scalar
788 * @param m the mask controlling lane selection
789 * @return the result of dividing this vector by the broadcast of an input
790 * scalar
791 */
792 public abstract DoubleVector div(double s, VectorMask<Double> m);
793
794 /**
795 * Calculates the square root of this vector.
796 * <p>
797 * This is a vector unary operation where the {@link Math#sqrt} operation
798 * is applied to lane elements.
799 *
800 * @return the square root of this vector
801 */
802 public abstract DoubleVector sqrt();
803
804 /**
805 * Calculates the square root of this vector, selecting lane elements
806 * controlled by a mask.
807 * <p>
808 * This is a vector unary operation where the {@link Math#sqrt} operation
809 * is applied to lane elements.
810 *
811 * @param m the mask controlling lane selection
812 * @return the square root of this vector
813 */
814 public DoubleVector sqrt(VectorMask<Double> m) {
815 return uOp(m, (i, a) -> (double) Math.sqrt((double) a));
816 }
817
818 /**
819 * Calculates the trigonometric tangent of this vector.
820 * <p>
821 * This is a vector unary operation with same semantic definition as
822 * {@link Math#tan} operation applied to lane elements.
823 * The implementation is not required to return same
824 * results as {@link Math#tan}, but adheres to rounding, monotonicity,
825 * and special case semantics as defined in the {@link Math#tan}
826 * specifications. The computed result will be within 1 ulp of the
827 * exact result.
828 *
829 * @return the tangent of this vector
830 */
831 public DoubleVector tan() {
832 return uOp((i, a) -> (double) Math.tan((double) a));
833 }
834
835 /**
836 * Calculates the trigonometric tangent of this vector, selecting lane
837 * elements controlled by a mask.
838 * <p>
839 * Semantics for rounding, monotonicity, and special cases are
840 * described in {@link DoubleVector#tan}
841 *
842 * @param m the mask controlling lane selection
843 * @return the tangent of this vector
844 */
845 public DoubleVector tan(VectorMask<Double> m) {
846 return uOp(m, (i, a) -> (double) Math.tan((double) a));
847 }
848
849 /**
850 * Calculates the hyperbolic tangent of this vector.
851 * <p>
852 * This is a vector unary operation with same semantic definition as
853 * {@link Math#tanh} operation applied to lane elements.
854 * The implementation is not required to return same
855 * results as {@link Math#tanh}, but adheres to rounding, monotonicity,
856 * and special case semantics as defined in the {@link Math#tanh}
857 * specifications. The computed result will be within 2.5 ulps of the
858 * exact result.
859 *
860 * @return the hyperbolic tangent of this vector
861 */
862 public DoubleVector tanh() {
863 return uOp((i, a) -> (double) Math.tanh((double) a));
864 }
865
866 /**
867 * Calculates the hyperbolic tangent of this vector, selecting lane elements
868 * controlled by a mask.
869 * <p>
870 * Semantics for rounding, monotonicity, and special cases are
871 * described in {@link DoubleVector#tanh}
872 *
873 * @param m the mask controlling lane selection
874 * @return the hyperbolic tangent of this vector
875 */
876 public DoubleVector tanh(VectorMask<Double> m) {
877 return uOp(m, (i, a) -> (double) Math.tanh((double) a));
878 }
879
880 /**
881 * Calculates the trigonometric sine of this vector.
882 * <p>
883 * This is a vector unary operation with same semantic definition as
884 * {@link Math#sin} operation applied to lane elements.
885 * The implementation is not required to return same
886 * results as {@link Math#sin}, but adheres to rounding, monotonicity,
887 * and special case semantics as defined in the {@link Math#sin}
888 * specifications. The computed result will be within 1 ulp of the
889 * exact result.
890 *
891 * @return the sine of this vector
892 */
893 public DoubleVector sin() {
894 return uOp((i, a) -> (double) Math.sin((double) a));
895 }
896
897 /**
898 * Calculates the trigonometric sine of this vector, selecting lane elements
899 * controlled by a mask.
900 * <p>
901 * Semantics for rounding, monotonicity, and special cases are
902 * described in {@link DoubleVector#sin}
903 *
904 * @param m the mask controlling lane selection
905 * @return the sine of this vector
906 */
907 public DoubleVector sin(VectorMask<Double> m) {
908 return uOp(m, (i, a) -> (double) Math.sin((double) a));
909 }
910
911 /**
912 * Calculates the hyperbolic sine of this vector.
913 * <p>
914 * This is a vector unary operation with same semantic definition as
915 * {@link Math#sinh} operation applied to lane elements.
916 * The implementation is not required to return same
917 * results as {@link Math#sinh}, but adheres to rounding, monotonicity,
918 * and special case semantics as defined in the {@link Math#sinh}
919 * specifications. The computed result will be within 2.5 ulps of the
920 * exact result.
921 *
922 * @return the hyperbolic sine of this vector
923 */
924 public DoubleVector sinh() {
925 return uOp((i, a) -> (double) Math.sinh((double) a));
926 }
927
928 /**
929 * Calculates the hyperbolic sine of this vector, selecting lane elements
930 * controlled by a mask.
931 * <p>
932 * Semantics for rounding, monotonicity, and special cases are
933 * described in {@link DoubleVector#sinh}
934 *
935 * @param m the mask controlling lane selection
936 * @return the hyperbolic sine of this vector
937 */
938 public DoubleVector sinh(VectorMask<Double> m) {
939 return uOp(m, (i, a) -> (double) Math.sinh((double) a));
940 }
941
942 /**
943 * Calculates the trigonometric cosine of this vector.
944 * <p>
945 * This is a vector unary operation with same semantic definition as
946 * {@link Math#cos} operation applied to lane elements.
947 * The implementation is not required to return same
948 * results as {@link Math#cos}, but adheres to rounding, monotonicity,
949 * and special case semantics as defined in the {@link Math#cos}
950 * specifications. The computed result will be within 1 ulp of the
951 * exact result.
952 *
953 * @return the cosine of this vector
954 */
955 public DoubleVector cos() {
956 return uOp((i, a) -> (double) Math.cos((double) a));
957 }
958
959 /**
960 * Calculates the trigonometric cosine of this vector, selecting lane
961 * elements controlled by a mask.
962 * <p>
963 * Semantics for rounding, monotonicity, and special cases are
964 * described in {@link DoubleVector#cos}
965 *
966 * @param m the mask controlling lane selection
967 * @return the cosine of this vector
968 */
969 public DoubleVector cos(VectorMask<Double> m) {
970 return uOp(m, (i, a) -> (double) Math.cos((double) a));
971 }
972
973 /**
974 * Calculates the hyperbolic cosine of this vector.
975 * <p>
976 * This is a vector unary operation with same semantic definition as
977 * {@link Math#cosh} operation applied to lane elements.
978 * The implementation is not required to return same
979 * results as {@link Math#cosh}, but adheres to rounding, monotonicity,
980 * and special case semantics as defined in the {@link Math#cosh}
981 * specifications. The computed result will be within 2.5 ulps of the
982 * exact result.
983 *
984 * @return the hyperbolic cosine of this vector
985 */
986 public DoubleVector cosh() {
987 return uOp((i, a) -> (double) Math.cosh((double) a));
988 }
989
990 /**
991 * Calculates the hyperbolic cosine of this vector, selecting lane elements
992 * controlled by a mask.
993 * <p>
994 * Semantics for rounding, monotonicity, and special cases are
995 * described in {@link DoubleVector#cosh}
996 *
997 * @param m the mask controlling lane selection
998 * @return the hyperbolic cosine of this vector
999 */
1000 public DoubleVector cosh(VectorMask<Double> m) {
1001 return uOp(m, (i, a) -> (double) Math.cosh((double) a));
1002 }
1003
1004 /**
1005 * Calculates the arc sine of this vector.
1006 * <p>
1007 * This is a vector unary operation with same semantic definition as
1008 * {@link Math#asin} operation applied to lane elements.
1009 * The implementation is not required to return same
1010 * results as {@link Math#asin}, but adheres to rounding, monotonicity,
1011 * and special case semantics as defined in the {@link Math#asin}
1012 * specifications. The computed result will be within 1 ulp of the
1013 * exact result.
1014 *
1015 * @return the arc sine of this vector
1016 */
1017 public DoubleVector asin() {
1018 return uOp((i, a) -> (double) Math.asin((double) a));
1019 }
1020
1021 /**
1022 * Calculates the arc sine of this vector, selecting lane elements
1023 * controlled by a mask.
1024 * <p>
1025 * Semantics for rounding, monotonicity, and special cases are
1026 * described in {@link DoubleVector#asin}
1027 *
1028 * @param m the mask controlling lane selection
1029 * @return the arc sine of this vector
1030 */
1031 public DoubleVector asin(VectorMask<Double> m) {
1032 return uOp(m, (i, a) -> (double) Math.asin((double) a));
1033 }
1034
1035 /**
1036 * Calculates the arc cosine of this vector.
1037 * <p>
1038 * This is a vector unary operation with same semantic definition as
1039 * {@link Math#acos} operation applied to lane elements.
1040 * The implementation is not required to return same
1041 * results as {@link Math#acos}, but adheres to rounding, monotonicity,
1042 * and special case semantics as defined in the {@link Math#acos}
1043 * specifications. The computed result will be within 1 ulp of the
1044 * exact result.
1045 *
1046 * @return the arc cosine of this vector
1047 */
1048 public DoubleVector acos() {
1049 return uOp((i, a) -> (double) Math.acos((double) a));
1050 }
1051
1052 /**
1053 * Calculates the arc cosine of this vector, selecting lane elements
1054 * controlled by a mask.
1055 * <p>
1056 * Semantics for rounding, monotonicity, and special cases are
1057 * described in {@link DoubleVector#acos}
1058 *
1059 * @param m the mask controlling lane selection
1060 * @return the arc cosine of this vector
1061 */
1062 public DoubleVector acos(VectorMask<Double> m) {
1063 return uOp(m, (i, a) -> (double) Math.acos((double) a));
1064 }
1065
1066 /**
1067 * Calculates the arc tangent of this vector.
1068 * <p>
1069 * This is a vector unary operation with same semantic definition as
1070 * {@link Math#atan} operation applied to lane elements.
1071 * The implementation is not required to return same
1072 * results as {@link Math#atan}, but adheres to rounding, monotonicity,
1073 * and special case semantics as defined in the {@link Math#atan}
1074 * specifications. The computed result will be within 1 ulp of the
1075 * exact result.
1076 *
1077 * @return the arc tangent of this vector
1078 */
1079 public DoubleVector atan() {
1080 return uOp((i, a) -> (double) Math.atan((double) a));
1081 }
1082
1083 /**
1084 * Calculates the arc tangent of this vector, selecting lane elements
1085 * controlled by a mask.
1086 * <p>
1087 * Semantics for rounding, monotonicity, and special cases are
1088 * described in {@link DoubleVector#atan}
1089 *
1090 * @param m the mask controlling lane selection
1091 * @return the arc tangent of this vector
1092 */
1093 public DoubleVector atan(VectorMask<Double> m) {
1094 return uOp(m, (i, a) -> (double) Math.atan((double) a));
1095 }
1096
1097 /**
1098 * Calculates the arc tangent of this vector divided by an input vector.
1099 * <p>
1100 * This is a vector binary operation with same semantic definition as
1101 * {@link Math#atan2} operation applied to lane elements.
1102 * The implementation is not required to return same
1103 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1104 * and special case semantics as defined in the {@link Math#atan2}
1105 * specifications. The computed result will be within 2 ulps of the
1106 * exact result.
1107 *
1108 * @param v the input vector
1109 * @return the arc tangent of this vector divided by the input vector
1110 */
1111 public DoubleVector atan2(Vector<Double> v) {
1112 return bOp(v, (i, a, b) -> (double) Math.atan2((double) a, (double) b));
1113 }
1114
1115 /**
1116 * Calculates the arc tangent of this vector divided by the broadcast of an
1117 * an input scalar.
1118 * <p>
1119 * This is a vector binary operation with same semantic definition as
1120 * {@link Math#atan2} operation applied to lane elements.
1121 * The implementation is not required to return same
1122 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1123 * and special case semantics as defined in the {@link Math#atan2}
1124 * specifications. The computed result will be within 1 ulp of the
1125 * exact result.
1126 *
1127 * @param s the input scalar
1128 * @return the arc tangent of this vector over the input vector
1129 */
1130 public abstract DoubleVector atan2(double s);
1131
1132 /**
1133 * Calculates the arc tangent of this vector divided by an input vector,
1134 * selecting lane elements controlled by a mask.
1135 * <p>
1136 * Semantics for rounding, monotonicity, and special cases are
1137 * described in {@link DoubleVector#atan2}
1138 *
1139 * @param v the input vector
1140 * @param m the mask controlling lane selection
1143 public DoubleVector atan2(Vector<Double> v, VectorMask<Double> m) {
1144 return bOp(v, m, (i, a, b) -> (double) Math.atan2((double) a, (double) b));
1145 }
1146
1147 /**
1148 * Calculates the arc tangent of this vector divided by the broadcast of an
1149 * an input scalar, selecting lane elements controlled by a mask.
1150 * <p>
1151 * Semantics for rounding, monotonicity, and special cases are
1152 * described in {@link DoubleVector#atan2}
1153 *
1154 * @param s the input scalar
1155 * @param m the mask controlling lane selection
1156 * @return the arc tangent of this vector over the input vector
1157 */
1158 public abstract DoubleVector atan2(double s, VectorMask<Double> m);
1159
1160 /**
1161 * Calculates the cube root of this vector.
1162 * <p>
1163 * This is a vector unary operation with same semantic definition as
1164 * {@link Math#cbrt} operation applied to lane elements.
1165 * The implementation is not required to return same
1166 * results as {@link Math#cbrt}, but adheres to rounding, monotonicity,
1167 * and special case semantics as defined in the {@link Math#cbrt}
1168 * specifications. The computed result will be within 1 ulp of the
1169 * exact result.
1170 *
1171 * @return the cube root of this vector
1172 */
1173 public DoubleVector cbrt() {
1174 return uOp((i, a) -> (double) Math.cbrt((double) a));
1175 }
1176
1177 /**
1178 * Calculates the cube root of this vector, selecting lane elements
1179 * controlled by a mask.
1180 * <p>
1181 * Semantics for rounding, monotonicity, and special cases are
1182 * described in {@link DoubleVector#cbrt}
1183 *
1184 * @param m the mask controlling lane selection
1185 * @return the cube root of this vector
1186 */
1187 public DoubleVector cbrt(VectorMask<Double> m) {
1188 return uOp(m, (i, a) -> (double) Math.cbrt((double) a));
1189 }
1190
1191 /**
1192 * Calculates the natural logarithm of this vector.
1193 * <p>
1194 * This is a vector unary operation with same semantic definition as
1195 * {@link Math#log} operation applied to lane elements.
1196 * The implementation is not required to return same
1197 * results as {@link Math#log}, but adheres to rounding, monotonicity,
1198 * and special case semantics as defined in the {@link Math#log}
1199 * specifications. The computed result will be within 1 ulp of the
1200 * exact result.
1201 *
1202 * @return the natural logarithm of this vector
1203 */
1204 public DoubleVector log() {
1205 return uOp((i, a) -> (double) Math.log((double) a));
1206 }
1207
1208 /**
1209 * Calculates the natural logarithm of this vector, selecting lane elements
1210 * controlled by a mask.
1211 * <p>
1212 * Semantics for rounding, monotonicity, and special cases are
1213 * described in {@link DoubleVector#log}
1214 *
1215 * @param m the mask controlling lane selection
1216 * @return the natural logarithm of this vector
1217 */
1218 public DoubleVector log(VectorMask<Double> m) {
1219 return uOp(m, (i, a) -> (double) Math.log((double) a));
1220 }
1221
1222 /**
1223 * Calculates the base 10 logarithm of this vector.
1224 * <p>
1225 * This is a vector unary operation with same semantic definition as
1226 * {@link Math#log10} operation applied to lane elements.
1227 * The implementation is not required to return same
1228 * results as {@link Math#log10}, but adheres to rounding, monotonicity,
1229 * and special case semantics as defined in the {@link Math#log10}
1230 * specifications. The computed result will be within 1 ulp of the
1231 * exact result.
1232 *
1233 * @return the base 10 logarithm of this vector
1234 */
1235 public DoubleVector log10() {
1236 return uOp((i, a) -> (double) Math.log10((double) a));
1237 }
1238
1239 /**
1240 * Calculates the base 10 logarithm of this vector, selecting lane elements
1241 * controlled by a mask.
1242 * <p>
1243 * Semantics for rounding, monotonicity, and special cases are
1244 * described in {@link DoubleVector#log10}
1245 *
1246 * @param m the mask controlling lane selection
1247 * @return the base 10 logarithm of this vector
1248 */
1249 public DoubleVector log10(VectorMask<Double> m) {
1250 return uOp(m, (i, a) -> (double) Math.log10((double) a));
1251 }
1252
1253 /**
1254 * Calculates the natural logarithm of the sum of this vector and the
1255 * broadcast of {@code 1}.
1256 * <p>
1257 * This is a vector unary operation with same semantic definition as
1258 * {@link Math#log1p} operation applied to lane elements.
1259 * The implementation is not required to return same
1260 * results as {@link Math#log1p}, but adheres to rounding, monotonicity,
1261 * and special case semantics as defined in the {@link Math#log1p}
1262 * specifications. The computed result will be within 1 ulp of the
1263 * exact result.
1264 *
1265 * @return the natural logarithm of the sum of this vector and the broadcast
1266 * of {@code 1}
1267 */
1268 public DoubleVector log1p() {
1269 return uOp((i, a) -> (double) Math.log1p((double) a));
1270 }
1271
1272 /**
1273 * Calculates the natural logarithm of the sum of this vector and the
1274 * broadcast of {@code 1}, selecting lane elements controlled by a mask.
1275 * <p>
1276 * Semantics for rounding, monotonicity, and special cases are
1277 * described in {@link DoubleVector#log1p}
1278 *
1279 * @param m the mask controlling lane selection
1280 * @return the natural logarithm of the sum of this vector and the broadcast
1281 * of {@code 1}
1282 */
1283 public DoubleVector log1p(VectorMask<Double> m) {
1284 return uOp(m, (i, a) -> (double) Math.log1p((double) a));
1285 }
1286
1287 /**
1288 * Calculates this vector raised to the power of an input vector.
1289 * <p>
1290 * This is a vector binary operation with same semantic definition as
1291 * {@link Math#pow} operation applied to lane elements.
1292 * The implementation is not required to return same
1293 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1294 * and special case semantics as defined in the {@link Math#pow}
1295 * specifications. The computed result will be within 1 ulp of the
1296 * exact result.
1297 *
1298 * @param v the input vector
1299 * @return this vector raised to the power of an input vector
1300 */
1301 public DoubleVector pow(Vector<Double> v) {
1302 return bOp(v, (i, a, b) -> (double) Math.pow((double) a, (double) b));
1303 }
1304
1305 /**
1306 * Calculates this vector raised to the power of the broadcast of an input
1307 * scalar.
1308 * <p>
1309 * This is a vector binary operation with same semantic definition as
1310 * {@link Math#pow} operation applied to lane elements.
1311 * The implementation is not required to return same
1312 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1313 * and special case semantics as defined in the {@link Math#pow}
1314 * specifications. The computed result will be within 1 ulp of the
1315 * exact result.
1316 *
1317 * @param s the input scalar
1318 * @return this vector raised to the power of the broadcast of an input
1319 * scalar.
1320 */
1321 public abstract DoubleVector pow(double s);
1322
1323 /**
1324 * Calculates this vector raised to the power of an input vector, selecting
1325 * lane elements controlled by a mask.
1326 * <p>
1327 * Semantics for rounding, monotonicity, and special cases are
1328 * described in {@link DoubleVector#pow}
1329 *
1330 * @param v the input vector
1336 }
1337
1338 /**
1339 * Calculates this vector raised to the power of the broadcast of an input
1340 * scalar, selecting lane elements controlled by a mask.
1341 * <p>
1342 * Semantics for rounding, monotonicity, and special cases are
1343 * described in {@link DoubleVector#pow}
1344 *
1345 * @param s the input scalar
1346 * @param m the mask controlling lane selection
1347 * @return this vector raised to the power of the broadcast of an input
1348 * scalar.
1349 */
1350 public abstract DoubleVector pow(double s, VectorMask<Double> m);
1351
1352 /**
1353 * Calculates the broadcast of Euler's number {@code e} raised to the power
1354 * of this vector.
1355 * <p>
1356 * This is a vector unary operation with same semantic definition as
1357 * {@link Math#exp} operation applied to lane elements.
1358 * The implementation is not required to return same
1359 * results as {@link Math#exp}, but adheres to rounding, monotonicity,
1360 * and special case semantics as defined in the {@link Math#exp}
1361 * specifications. The computed result will be within 1 ulp of the
1362 * exact result.
1363 *
1364 * @return the broadcast of Euler's number {@code e} raised to the power of
1365 * this vector
1366 */
1367 public DoubleVector exp() {
1368 return uOp((i, a) -> (double) Math.exp((double) a));
1369 }
1370
1371 /**
1372 * Calculates the broadcast of Euler's number {@code e} raised to the power
1373 * of this vector, selecting lane elements controlled by a mask.
1374 * <p>
1375 * Semantics for rounding, monotonicity, and special cases are
1376 * described in {@link DoubleVector#exp}
1377 *
1378 * @param m the mask controlling lane selection
1379 * @return the broadcast of Euler's number {@code e} raised to the power of
1380 * this vector
1381 */
1382 public DoubleVector exp(VectorMask<Double> m) {
1383 return uOp(m, (i, a) -> (double) Math.exp((double) a));
1384 }
1385
1386 /**
1387 * Calculates the broadcast of Euler's number {@code e} raised to the power
1388 * of this vector minus the broadcast of {@code -1}.
1389 * More specifically as if the following (ignoring any differences in
1390 * numerical accuracy):
1391 * <pre>{@code
1392 * this.exp().sub(this.species().broadcast(1))
1393 * }</pre>
1394 * <p>
1395 * This is a vector unary operation with same semantic definition as
1396 * {@link Math#expm1} operation applied to lane elements.
1397 * The implementation is not required to return same
1398 * results as {@link Math#expm1}, but adheres to rounding, monotonicity,
1399 * and special case semantics as defined in the {@link Math#expm1}
1400 * specifications. The computed result will be within 1 ulp of the
1401 * exact result.
1402 *
1403 * @return the broadcast of Euler's number {@code e} raised to the power of
1404 * this vector minus the broadcast of {@code -1}
1405 */
1406 public DoubleVector expm1() {
1407 return uOp((i, a) -> (double) Math.expm1((double) a));
1408 }
1409
1410 /**
1411 * Calculates the broadcast of Euler's number {@code e} raised to the power
1412 * of this vector minus the broadcast of {@code -1}, selecting lane elements
1413 * controlled by a mask
1414 * More specifically as if the following (ignoring any differences in
1415 * numerical accuracy):
1416 * <pre>{@code
1417 * this.exp(m).sub(this.species().broadcast(1), m)
1418 * }</pre>
1419 * <p>
1420 * Semantics for rounding, monotonicity, and special cases are
1421 * described in {@link DoubleVector#expm1}
1422 *
1423 * @param m the mask controlling lane selection
1424 * @return the broadcast of Euler's number {@code e} raised to the power of
1425 * this vector minus the broadcast of {@code -1}
1426 */
1427 public DoubleVector expm1(VectorMask<Double> m) {
1428 return uOp(m, (i, a) -> (double) Math.expm1((double) a));
1429 }
1430
1431 /**
1432 * Calculates the product of this vector and a first input vector summed
1433 * with a second input vector.
1434 * More specifically as if the following (ignoring any differences in
1435 * numerical accuracy):
1436 * <pre>{@code
1437 * this.mul(v1).add(v2)
1438 * }</pre>
1439 * <p>
1440 * This is a vector ternary operation where the {@link Math#fma} operation
1441 * is applied to lane elements.
1442 *
1443 * @param v1 the first input vector
1444 * @param v2 the second input vector
1445 * @return the product of this vector and the first input vector summed with
1446 * the second input vector
1447 */
1448 public abstract DoubleVector fma(Vector<Double> v1, Vector<Double> v2);
1449
1450 /**
1451 * Calculates the product of this vector and the broadcast of a first input
1452 * scalar summed with the broadcast of a second input scalar.
1453 * More specifically as if the following:
1454 * <pre>{@code
1455 * this.fma(this.species().broadcast(s1), this.species().broadcast(s2))
1456 * }</pre>
1457 * <p>
1458 * This is a vector ternary operation where the {@link Math#fma} operation
1459 * is applied to lane elements.
1460 *
1461 * @param s1 the first input scalar
1462 * @param s2 the second input scalar
1463 * @return the product of this vector and the broadcast of a first input
1464 * scalar summed with the broadcast of a second input scalar
1465 */
1466 public abstract DoubleVector fma(double s1, double s2);
1467
1468 /**
1469 * Calculates the product of this vector and a first input vector summed
1470 * with a second input vector, selecting lane elements controlled by a mask.
1471 * More specifically as if the following (ignoring any differences in
1472 * numerical accuracy):
1473 * <pre>{@code
1474 * this.mul(v1, m).add(v2, m)
1475 * }</pre>
1476 * <p>
1477 * This is a vector ternary operation where the {@link Math#fma} operation
1478 * is applied to lane elements.
1479 *
1480 * @param v1 the first input vector
1481 * @param v2 the second input vector
1482 * @param m the mask controlling lane selection
1483 * @return the product of this vector and the first input vector summed with
1484 * the second input vector
1485 */
1486 public DoubleVector fma(Vector<Double> v1, Vector<Double> v2, VectorMask<Double> m) {
1487 return tOp(v1, v2, m, (i, a, b, c) -> Math.fma(a, b, c));
1488 }
1489
1490 /**
1491 * Calculates the product of this vector and the broadcast of a first input
1492 * scalar summed with the broadcast of a second input scalar, selecting lane
1493 * elements controlled by a mask
1494 * More specifically as if the following:
1495 * <pre>{@code
1496 * this.fma(this.species().broadcast(s1), this.species().broadcast(s2), m)
1497 * }</pre>
1498 * <p>
1499 * This is a vector ternary operation where the {@link Math#fma} operation
1500 * is applied to lane elements.
1501 *
1502 * @param s1 the first input scalar
1503 * @param s2 the second input scalar
1504 * @param m the mask controlling lane selection
1505 * @return the product of this vector and the broadcast of a first input
1506 * scalar summed with the broadcast of a second input scalar
1507 */
1508 public abstract DoubleVector fma(double s1, double s2, VectorMask<Double> m);
1509
1510 /**
1511 * Calculates square root of the sum of the squares of this vector and an
1512 * input vector.
1513 * More specifically as if the following (ignoring any differences in
1514 * numerical accuracy):
1515 * <pre>{@code
1516 * this.mul(this).add(v.mul(v)).sqrt()
1517 * }</pre>
1518 * <p>
1519 * This is a vector binary operation with same semantic definition as
1520 * {@link Math#hypot} operation applied to lane elements.
1521 * The implementation is not required to return same
1522 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1523 * and special case semantics as defined in the {@link Math#hypot}
1524 * specifications. The computed result will be within 1 ulp of the
1525 * exact result.
1526 *
1527 * @param v the input vector
1528 * @return square root of the sum of the squares of this vector and an input
1529 * vector
1530 */
1531 public DoubleVector hypot(Vector<Double> v) {
1532 return bOp(v, (i, a, b) -> (double) Math.hypot((double) a, (double) b));
1533 }
1534
1535 /**
1536 * Calculates square root of the sum of the squares of this vector and the
1537 * broadcast of an input scalar.
1538 * More specifically as if the following (ignoring any differences in
1539 * numerical accuracy):
1540 * <pre>{@code
1541 * this.mul(this).add(this.species().broadcast(v * v)).sqrt()
1542 * }</pre>
1543 * <p>
1544 * This is a vector binary operation with same semantic definition as
1545 * {@link Math#hypot} operation applied to lane elements.
1546 * The implementation is not required to return same
1547 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1548 * and special case semantics as defined in the {@link Math#hypot}
1549 * specifications. The computed result will be within 1 ulp of the
1550 * exact result.
1551 *
1552 * @param s the input scalar
1553 * @return square root of the sum of the squares of this vector and the
1554 * broadcast of an input scalar
1555 */
1556 public abstract DoubleVector hypot(double s);
1557
1558 /**
1559 * Calculates square root of the sum of the squares of this vector and an
1560 * input vector, selecting lane elements controlled by a mask.
1561 * More specifically as if the following (ignoring any differences in
1562 * numerical accuracy):
1563 * <pre>{@code
1564 * this.mul(this, m).add(v.mul(v), m).sqrt(m)
1565 * }</pre>
1566 * <p>
1567 * Semantics for rounding, monotonicity, and special cases are
1568 * described in {@link DoubleVector#hypot}
1569 *
1570 * @param v the input vector
1571 * @param m the mask controlling lane selection
1572 * @return square root of the sum of the squares of this vector and an input
1573 * vector
1574 */
1575 public DoubleVector hypot(Vector<Double> v, VectorMask<Double> m) {
1576 return bOp(v, m, (i, a, b) -> (double) Math.hypot((double) a, (double) b));
1577 }
1578
1579 /**
1580 * Calculates square root of the sum of the squares of this vector and the
1581 * broadcast of an input scalar, selecting lane elements controlled by a
1582 * mask.
1583 * More specifically as if the following (ignoring any differences in
1584 * numerical accuracy):
1585 * <pre>{@code
1586 * this.mul(this, m).add(this.species().broadcast(v * v), m).sqrt(m)
1587 * }</pre>
1588 * <p>
1589 * Semantics for rounding, monotonicity, and special cases are
1590 * described in {@link DoubleVector#hypot}
1591 *
1592 * @param s the input scalar
1593 * @param m the mask controlling lane selection
1594 * @return square root of the sum of the squares of this vector and the
1595 * broadcast of an input scalar
1596 */
1597 public abstract DoubleVector hypot(double s, VectorMask<Double> m);
1598
1599
1600 @Override
1601 public abstract void intoByteArray(byte[] a, int ix);
1602
1603 @Override
1604 public abstract void intoByteArray(byte[] a, int ix, VectorMask<Double> m);
1605
1606 @Override
1607 public abstract void intoByteBuffer(ByteBuffer bb, int ix);
1608
1609 @Override
1610 public abstract void intoByteBuffer(ByteBuffer bb, int ix, VectorMask<Double> m);
1611
1612
1613 // Type specific horizontal reductions
1614 /**
1615 * Adds all lane elements of this vector.
1616 * <p>
1617 * This is a vector reduction operation where the addition
1618 * operation ({@code +}) is applied to lane elements,
1619 * and the identity value is {@code 0.0}.
1620 *
1621 * <p>The value of a floating-point sum is a function both of the input values as well
1622 * as the order of addition operations. The order of addition operations of this method
1623 * is intentionally not defined to allow for JVM to generate optimal machine
1624 * code for the underlying platform at runtime. If the platform supports a vector
1625 * instruction to add all values in the vector, or if there is some other efficient machine
1626 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1627 * the default implementation of adding vectors sequentially from left to right is used.
1628 * For this reason, the output of this method may vary for the same input values.
1629 *
1630 * @return the addition of all the lane elements of this vector
1631 */
1632 public abstract double addAll();
1633
1634 /**
1635 * Adds all lane elements of this vector, selecting lane elements
1636 * controlled by a mask.
1637 * <p>
1638 * This is a vector reduction operation where the addition
1639 * operation ({@code +}) is applied to lane elements,
1640 * and the identity value is {@code 0.0}.
1641 *
1642 * <p>The value of a floating-point sum is a function both of the input values as well
1643 * as the order of addition operations. The order of addition operations of this method
1644 * is intentionally not defined to allow for JVM to generate optimal machine
1645 * code for the underlying platform at runtime. If the platform supports a vector
1646 * instruction to add all values in the vector, or if there is some other efficient machine
1647 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1648 * the default implementation of adding vectors sequentially from left to right is used.
1649 * For this reason, the output of this method may vary on the same input values.
1650 *
1651 * @param m the mask controlling lane selection
1652 * @return the addition of the selected lane elements of this vector
1653 */
1654 public abstract double addAll(VectorMask<Double> m);
1655
1656 /**
1657 * Multiplies all lane elements of this vector.
1658 * <p>
1659 * This is a vector reduction operation where the
1660 * multiplication operation ({@code *}) is applied to lane elements,
1661 * and the identity value is {@code 1.0}.
1662 *
1663 * <p>The order of multiplication operations of this method
1664 * is intentionally not defined to allow for JVM to generate optimal machine
1665 * code for the underlying platform at runtime. If the platform supports a vector
1666 * instruction to multiply all values in the vector, or if there is some other efficient machine
1667 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1668 * the default implementation of multiplying vectors sequentially from left to right is used.
1669 * For this reason, the output of this method may vary on the same input values.
1670 *
1671 * @return the multiplication of all the lane elements of this vector
1672 */
1673 public abstract double mulAll();
1674
1675 /**
1676 * Multiplies all lane elements of this vector, selecting lane elements
1677 * controlled by a mask.
1678 * <p>
1679 * This is a vector reduction operation where the
1680 * multiplication operation ({@code *}) is applied to lane elements,
1681 * and the identity value is {@code 1.0}.
1682 *
1683 * <p>The order of multiplication operations of this method
1684 * is intentionally not defined to allow for JVM to generate optimal machine
1685 * code for the underlying platform at runtime. If the platform supports a vector
1686 * instruction to multiply all values in the vector, or if there is some other efficient machine
1687 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1688 * the default implementation of multiplying vectors sequentially from left to right is used.
1689 * For this reason, the output of this method may vary on the same input values.
1690 *
1691 * @param m the mask controlling lane selection
1692 * @return the multiplication of all the lane elements of this vector
1693 */
1694 public abstract double mulAll(VectorMask<Double> m);
1695
1696 /**
1697 * Returns the minimum lane element of this vector.
1698 * <p>
1699 * This is an associative vector reduction operation where the operation
1700 * {@code (a, b) -> Math.min(a, b)} is applied to lane elements,
1701 * and the identity value is
1702 * {@link Double#POSITIVE_INFINITY}.
1703 *
1704 * @return the minimum lane element of this vector
1705 */
1706 public abstract double minAll();
1707
1708 /**
1709 * Returns the minimum lane element of this vector, selecting lane elements
1710 * controlled by a mask.
1711 * <p>
1712 * This is an associative vector reduction operation where the operation
1713 * {@code (a, b) -> Math.min(a, b)} is applied to lane elements,
1714 * and the identity value is
1715 * {@link Double#POSITIVE_INFINITY}.
1716 *
1717 * @param m the mask controlling lane selection
1718 * @return the minimum lane element of this vector
1719 */
1720 public abstract double minAll(VectorMask<Double> m);
1721
1722 /**
1723 * Returns the maximum lane element of this vector.
1724 * <p>
1725 * This is an associative vector reduction operation where the operation
1726 * {@code (a, b) -> Math.max(a, b)} is applied to lane elements,
1727 * and the identity value is
1728 * {@link Double#NEGATIVE_INFINITY}.
1729 *
1730 * @return the maximum lane element of this vector
1731 */
1732 public abstract double maxAll();
1733
1734 /**
1735 * Returns the maximum lane element of this vector, selecting lane elements
1736 * controlled by a mask.
1737 * <p>
1738 * This is an associative vector reduction operation where the operation
1739 * {@code (a, b) -> Math.max(a, b)} is applied to lane elements,
1740 * and the identity value is
1741 * {@link Double#NEGATIVE_INFINITY}.
1742 *
1743 * @param m the mask controlling lane selection
1744 * @return the maximum lane element of this vector
1745 */
1746 public abstract double maxAll(VectorMask<Double> m);
1747
1748
1749 // Type specific accessors
1750
1751 /**
1752 * Gets the lane element at lane index {@code i}
1753 *
1754 * @param i the lane index
1755 * @return the lane element at lane index {@code i}
1756 * @throws IllegalArgumentException if the index is is out of range
1757 * ({@code < 0 || >= length()})
1758 */
1759 public abstract double get(int i);
1760
1761 /**
1762 * Replaces the lane element of this vector at lane index {@code i} with
1763 * value {@code e}.
1764 * <p>
1765 * This is a cross-lane operation and behaves as if it returns the result
1766 * of blending this vector with an input vector that is the result of
1767 * broadcasting {@code e} and a mask that has only one lane set at lane
1768 * index {@code i}.
1769 *
1770 * @param i the lane index of the lane element to be replaced
1771 * @param e the value to be placed
1772 * @return the result of replacing the lane element of this vector at lane
1773 * index {@code i} with value {@code e}.
1774 * @throws IllegalArgumentException if the index is is out of range
1775 * ({@code < 0 || >= length()})
1776 */
1777 public abstract DoubleVector with(int i, double e);
1778
1779 // Type specific extractors
1786 * <pre>{@code
1787 * double[] a = new double[this.length()];
1788 * this.intoArray(a, 0);
1789 * return a;
1790 * }</pre>
1791 *
1792 * @return an array containing the the lane elements of this vector
1793 */
1794 @ForceInline
1795 public final double[] toArray() {
1796 double[] a = new double[species().length()];
1797 intoArray(a, 0);
1798 return a;
1799 }
1800
1801 /**
1802 * Stores this vector into an array starting at offset.
1803 * <p>
1804 * For each vector lane, where {@code N} is the vector lane index,
1805 * the lane element at index {@code N} is stored into the array at index
1806 * {@code i + N}.
1807 *
1808 * @param a the array
1809 * @param i the offset into the array
1810 * @throws IndexOutOfBoundsException if {@code i < 0}, or
1811 * {@code i > a.length - this.length()}
1812 */
1813 public abstract void intoArray(double[] a, int i);
1814
1815 /**
1816 * Stores this vector into an array starting at offset and using a mask.
1817 * <p>
1818 * For each vector lane, where {@code N} is the vector lane index,
1819 * if the mask lane at index {@code N} is set then the lane element at
1820 * index {@code N} is stored into the array index {@code i + N}.
1821 *
1822 * @param a the array
1823 * @param i the offset into the array
1824 * @param m the mask
1825 * @throws IndexOutOfBoundsException if {@code i < 0}, or
1826 * for any vector lane index {@code N} where the mask at lane {@code N}
1827 * is set {@code i >= a.length - N}
1828 */
1829 public abstract void intoArray(double[] a, int i, VectorMask<Double> m);
1830
1831 /**
1832 * Stores this vector into an array using indexes obtained from an index
1833 * map.
1834 * <p>
1835 * For each vector lane, where {@code N} is the vector lane index, the
1836 * lane element at index {@code N} is stored into the array at index
1837 * {@code i + indexMap[j + N]}.
1838 *
1839 * @param a the array
1840 * @param i the offset into the array, may be negative if relative
1841 * indexes in the index map compensate to produce a value within the
1842 * array bounds
1843 * @param indexMap the index map
1844 * @param j the offset into the index map
1845 * @throws IndexOutOfBoundsException if {@code j < 0}, or
1846 * {@code j > indexMap.length - this.length()},
1847 * or for any vector lane index {@code N} the result of
1848 * {@code i + indexMap[j + N]} is {@code < 0} or {@code >= a.length}
1849 */
1850 public abstract void intoArray(double[] a, int i, int[] indexMap, int j);
1851
1852 /**
1853 * Stores this vector into an array using indexes obtained from an index
1854 * map and using a mask.
1855 * <p>
1856 * For each vector lane, where {@code N} is the vector lane index,
1857 * if the mask lane at index {@code N} is set then the lane element at
1858 * index {@code N} is stored into the array at index
1859 * {@code i + indexMap[j + N]}.
1860 *
1861 * @param a the array
1862 * @param i the offset into the array, may be negative if relative
1863 * indexes in the index map compensate to produce a value within the
1864 * array bounds
1865 * @param m the mask
1866 * @param indexMap the index map
1867 * @param j the offset into the index map
1868 * @throws IndexOutOfBoundsException if {@code j < 0}, or
1869 * {@code j > indexMap.length - this.length()},
1870 * or for any vector lane index {@code N} where the mask at lane
1871 * {@code N} is set the result of {@code i + indexMap[j + N]} is
1872 * {@code < 0} or {@code >= a.length}
1873 */
1874 public abstract void intoArray(double[] a, int i, VectorMask<Double> m, int[] indexMap, int j);
1875 // Species
1876
1877 @Override
1878 public abstract VectorSpecies<Double> species();
1879
1880 /**
1881 * Class representing {@link DoubleVector}'s of the same {@link VectorShape VectorShape}.
1882 */
1883 static final class DoubleSpecies extends AbstractSpecies<Double> {
1884 final Function<double[], DoubleVector> vectorFactory;
1885
1886 private DoubleSpecies(VectorShape shape,
1887 Class<?> boxType,
1888 Class<?> maskType,
1889 Function<double[], DoubleVector> vectorFactory,
1890 Function<boolean[], VectorMask<Double>> maskFactory,
1891 Function<IntUnaryOperator, VectorShuffle<Double>> shuffleFromArrayFactory,
1892 fShuffleFromArray<Double> shuffleFromOpFactory) {
1893 super(shape, double.class, Double.SIZE, boxType, maskType, maskFactory,
1894 shuffleFromArrayFactory, shuffleFromOpFactory);
1895 this.vectorFactory = vectorFactory;
1896 }
|
108 *
109 * @param species species of desired vector
110 * @return a zero vector of given species
111 */
112 @ForceInline
113 @SuppressWarnings("unchecked")
114 public static DoubleVector zero(VectorSpecies<Double> species) {
115 return VectorIntrinsics.broadcastCoerced((Class<DoubleVector>) species.boxType(), double.class, species.length(),
116 Double.doubleToLongBits(0.0f), species,
117 ((bits, s) -> ((DoubleSpecies)s).op(i -> Double.longBitsToDouble((long)bits))));
118 }
119
120 /**
121 * Loads a vector from a byte array starting at an offset.
122 * <p>
123 * Bytes are composed into primitive lane elements according to the
124 * native byte order of the underlying platform
125 * <p>
126 * This method behaves as if it returns the result of calling the
127 * byte buffer, offset, and mask accepting
128 * {@link #fromByteBuffer(VectorSpecies, ByteBuffer, int, VectorMask) method} as follows:
129 * <pre>{@code
130 * return fromByteBuffer(species, ByteBuffer.wrap(a), offset, VectorMask.allTrue());
131 * }</pre>
132 *
133 * @param species species of desired vector
134 * @param a the byte array
135 * @param offset the offset into the array
136 * @return a vector loaded from a byte array
137 * @throws IndexOutOfBoundsException if {@code i < 0} or
138 * {@code offset > a.length - (species.length() * species.elementSize() / Byte.SIZE)}
139 */
140 @ForceInline
141 @SuppressWarnings("unchecked")
142 public static DoubleVector fromByteArray(VectorSpecies<Double> species, byte[] a, int offset) {
143 Objects.requireNonNull(a);
144 offset = VectorIntrinsics.checkIndex(offset, a.length, species.bitSize() / Byte.SIZE);
145 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
146 a, ((long) offset) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
147 a, offset, species,
148 (c, idx, s) -> {
149 ByteBuffer bbc = ByteBuffer.wrap(c, idx, a.length - idx).order(ByteOrder.nativeOrder());
150 DoubleBuffer tb = bbc.asDoubleBuffer();
151 return ((DoubleSpecies)s).op(i -> tb.get());
152 });
153 }
154
155 /**
156 * Loads a vector from a byte array starting at an offset and using a
157 * mask.
158 * <p>
159 * Bytes are composed into primitive lane elements according to the
160 * native byte order of the underlying platform.
161 * <p>
162 * This method behaves as if it returns the result of calling the
163 * byte buffer, offset, and mask accepting
164 * {@link #fromByteBuffer(VectorSpecies, ByteBuffer, int, VectorMask) method} as follows:
165 * <pre>{@code
166 * return fromByteBuffer(species, ByteBuffer.wrap(a), offset, m);
167 * }</pre>
168 *
169 * @param species species of desired vector
170 * @param a the byte array
171 * @param offset the offset into the array
172 * @param m the mask
173 * @return a vector loaded from a byte array
174 * @throws IndexOutOfBoundsException if {@code offset < 0} or
175 * for any vector lane index {@code N} where the mask at lane {@code N}
176 * is set
177 * {@code offset >= a.length - (N * species.elementSize() / Byte.SIZE)}
178 */
179 @ForceInline
180 public static DoubleVector fromByteArray(VectorSpecies<Double> species, byte[] a, int offset, VectorMask<Double> m) {
181 return zero(species).blend(fromByteArray(species, a, offset), m);
182 }
183
184 /**
185 * Loads a vector from an array starting at offset.
186 * <p>
187 * For each vector lane, where {@code N} is the vector lane index, the
188 * array element at index {@code offset + N} is placed into the
189 * resulting vector at lane index {@code N}.
190 *
191 * @param species species of desired vector
192 * @param a the array
193 * @param offset the offset into the array
194 * @return the vector loaded from an array
195 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
196 * {@code offset > a.length - species.length()}
197 */
198 @ForceInline
199 @SuppressWarnings("unchecked")
200 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int offset){
201 Objects.requireNonNull(a);
202 offset = VectorIntrinsics.checkIndex(offset, a.length, species.length());
203 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
204 a, (((long) offset) << ARRAY_SHIFT) + Unsafe.ARRAY_DOUBLE_BASE_OFFSET,
205 a, offset, species,
206 (c, idx, s) -> ((DoubleSpecies)s).op(n -> c[idx + n]));
207 }
208
209
210 /**
211 * Loads a vector from an array starting at offset and using a mask.
212 * <p>
213 * For each vector lane, where {@code N} is the vector lane index,
214 * if the mask lane at index {@code N} is set then the array element at
215 * index {@code offset + N} is placed into the resulting vector at lane index
216 * {@code N}, otherwise the default element value is placed into the
217 * resulting vector at lane index {@code N}.
218 *
219 * @param species species of desired vector
220 * @param a the array
221 * @param offset the offset into the array
222 * @param m the mask
223 * @return the vector loaded from an array
224 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
225 * for any vector lane index {@code N} where the mask at lane {@code N}
226 * is set {@code offset > a.length - N}
227 */
228 @ForceInline
229 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int offset, VectorMask<Double> m) {
230 return zero(species).blend(fromArray(species, a, offset), m);
231 }
232
233 /**
234 * Loads a vector from an array using indexes obtained from an index
235 * map.
236 * <p>
237 * For each vector lane, where {@code N} is the vector lane index, the
238 * array element at index {@code a_offset + indexMap[i_offset + N]} is placed into the
239 * resulting vector at lane index {@code N}.
240 *
241 * @param species species of desired vector
242 * @param a the array
243 * @param a_offset the offset into the array, may be negative if relative
244 * indexes in the index map compensate to produce a value within the
245 * array bounds
246 * @param indexMap the index map
247 * @param i_offset the offset into the index map
248 * @return the vector loaded from an array
249 * @throws IndexOutOfBoundsException if {@code i_offset < 0}, or
250 * {@code i_offset > indexMap.length - species.length()},
251 * or for any vector lane index {@code N} the result of
252 * {@code a_offset + indexMap[i_offset + N]} is {@code < 0} or {@code >= a.length}
253 */
254 @ForceInline
255 @SuppressWarnings("unchecked")
256 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int a_offset, int[] indexMap, int i_offset) {
257 Objects.requireNonNull(a);
258 Objects.requireNonNull(indexMap);
259
260 if (species.length() == 1) {
261 return DoubleVector.fromArray(species, a, a_offset + indexMap[i_offset]);
262 }
263
264 // Index vector: vix[0:n] = k -> a_offset + indexMap[i_offset + k]
265 IntVector vix = IntVector.fromArray(IntVector.species(species.indexShape()), indexMap, i_offset).add(a_offset);
266
267 vix = VectorIntrinsics.checkIndex(vix, a.length);
268
269 return VectorIntrinsics.loadWithMap((Class<DoubleVector>) species.boxType(), double.class, species.length(),
270 IntVector.species(species.indexShape()).boxType(), a, Unsafe.ARRAY_DOUBLE_BASE_OFFSET, vix,
271 a, a_offset, indexMap, i_offset, species,
272 (double[] c, int idx, int[] iMap, int idy, VectorSpecies<Double> s) ->
273 ((DoubleSpecies)s).op(n -> c[idx + iMap[idy+n]]));
274 }
275
276 /**
277 * Loads a vector from an array using indexes obtained from an index
278 * map and using a mask.
279 * <p>
280 * For each vector lane, where {@code N} is the vector lane index,
281 * if the mask lane at index {@code N} is set then the array element at
282 * index {@code a_offset + indexMap[i_offset + N]} is placed into the resulting vector
283 * at lane index {@code N}.
284 *
285 * @param species species of desired vector
286 * @param a the array
287 * @param a_offset the offset into the array, may be negative if relative
288 * indexes in the index map compensate to produce a value within the
289 * array bounds
290 * @param m the mask
291 * @param indexMap the index map
292 * @param i_offset the offset into the index map
293 * @return the vector loaded from an array
294 * @throws IndexOutOfBoundsException if {@code i_offset < 0}, or
295 * {@code i_offset > indexMap.length - species.length()},
296 * or for any vector lane index {@code N} where the mask at lane
297 * {@code N} is set the result of {@code a_offset + indexMap[i_offset + N]} is
298 * {@code < 0} or {@code >= a.length}
299 */
300 @ForceInline
301 @SuppressWarnings("unchecked")
302 public static DoubleVector fromArray(VectorSpecies<Double> species, double[] a, int a_offset, VectorMask<Double> m, int[] indexMap, int i_offset) {
303 // @@@ This can result in out of bounds errors for unset mask lanes
304 return zero(species).blend(fromArray(species, a, a_offset, indexMap, i_offset), m);
305 }
306
307
308 /**
309 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
310 * offset into the byte buffer.
311 * <p>
312 * Bytes are composed into primitive lane elements according to the
313 * native byte order of the underlying platform.
314 * <p>
315 * This method behaves as if it returns the result of calling the
316 * byte buffer, offset, and mask accepting
317 * {@link #fromByteBuffer(VectorSpecies, ByteBuffer, int, VectorMask)} method} as follows:
318 * <pre>{@code
319 * return fromByteBuffer(b, offset, VectorMask.allTrue())
320 * }</pre>
321 *
322 * @param species species of desired vector
323 * @param bb the byte buffer
324 * @param offset the offset into the byte buffer
325 * @return a vector loaded from a byte buffer
326 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
327 * or {@code > b.limit()},
328 * or if there are fewer than
329 * {@code species.length() * species.elementSize() / Byte.SIZE} bytes
330 * remaining in the byte buffer from the given offset
331 */
332 @ForceInline
333 @SuppressWarnings("unchecked")
334 public static DoubleVector fromByteBuffer(VectorSpecies<Double> species, ByteBuffer bb, int offset) {
335 if (bb.order() != ByteOrder.nativeOrder()) {
336 throw new IllegalArgumentException();
337 }
338 offset = VectorIntrinsics.checkIndex(offset, bb.limit(), species.bitSize() / Byte.SIZE);
339 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
340 U.getReference(bb, BYTE_BUFFER_HB), U.getLong(bb, BUFFER_ADDRESS) + offset,
341 bb, offset, species,
342 (c, idx, s) -> {
343 ByteBuffer bbc = c.duplicate().position(idx).order(ByteOrder.nativeOrder());
344 DoubleBuffer tb = bbc.asDoubleBuffer();
345 return ((DoubleSpecies)s).op(i -> tb.get());
346 });
347 }
348
349 /**
350 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
351 * offset into the byte buffer and using a mask.
352 * <p>
353 * This method behaves as if the byte buffer is viewed as a primitive
354 * {@link java.nio.Buffer buffer} for the primitive element type,
355 * according to the native byte order of the underlying platform, and
356 * the returned vector is loaded with a mask from a primitive array
357 * obtained from the primitive buffer.
358 * The following pseudocode expresses the behaviour, where
359 * {@code EBuffer} is the primitive buffer type, {@code e} is the
360 * primitive element type, and {@code ESpecies} is the primitive
361 * species for {@code e}:
362 * <pre>{@code
363 * EBuffer eb = b.duplicate().
364 * order(ByteOrder.nativeOrder()).position(offset).
365 * asEBuffer();
366 * e[] es = new e[species.length()];
367 * for (int n = 0; n < t.length; n++) {
368 * if (m.isSet(n))
369 * es[n] = eb.get(n);
370 * }
371 * EVector r = EVector.fromArray(es, 0, m);
372 * }</pre>
373 *
374 * @param species species of desired vector
375 * @param bb the byte buffer
376 * @param offset the offset into the byte buffer
377 * @param m the mask
378 * @return a vector loaded from a byte buffer
379 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
380 * or {@code > b.limit()},
381 * for any vector lane index {@code N} where the mask at lane {@code N}
382 * is set
383 * {@code offset >= b.limit() - (N * species.elementSize() / Byte.SIZE)}
384 */
385 @ForceInline
386 public static DoubleVector fromByteBuffer(VectorSpecies<Double> species, ByteBuffer bb, int offset, VectorMask<Double> m) {
387 return zero(species).blend(fromByteBuffer(species, bb, offset), m);
388 }
389
390 /**
391 * Returns a vector where all lane elements are set to the primitive
392 * value {@code e}.
393 *
394 * @param species species of the desired vector
395 * @param e the value
396 * @return a vector of vector where all lane elements are set to
397 * the primitive value {@code e}
398 */
399 @ForceInline
400 @SuppressWarnings("unchecked")
401 public static DoubleVector broadcast(VectorSpecies<Double> species, double e) {
402 return VectorIntrinsics.broadcastCoerced(
403 (Class<DoubleVector>) species.boxType(), double.class, species.length(),
404 Double.doubleToLongBits(e), species,
405 ((bits, sp) -> ((DoubleSpecies)sp).op(i -> Double.longBitsToDouble((long)bits))));
406 }
407
408 /**
409 * Returns a vector where each lane element is set to given
410 * primitive values.
411 * <p>
412 * For each vector lane, where {@code N} is the vector lane index, the
413 * the primitive value at index {@code N} is placed into the resulting
414 * vector at lane index {@code N}.
415 *
416 * @param species species of the desired vector
417 * @param es the given primitive values
418 * @return a vector where each lane element is set to given primitive
419 * values
420 * @throws IndexOutOfBoundsException if {@code es.length < species.length()}
421 */
422 @ForceInline
423 @SuppressWarnings("unchecked")
424 public static DoubleVector scalars(VectorSpecies<Double> species, double... es) {
425 Objects.requireNonNull(es);
426 int ix = VectorIntrinsics.checkIndex(0, es.length, species.length());
427 return VectorIntrinsics.load((Class<DoubleVector>) species.boxType(), double.class, species.length(),
428 es, Unsafe.ARRAY_DOUBLE_BASE_OFFSET,
429 es, ix, species,
430 (c, idx, sp) -> ((DoubleSpecies)sp).op(n -> c[idx + n]));
431 }
432
433 /**
434 * Returns a vector where the first lane element is set to the primtive
435 * value {@code e}, all other lane elements are set to the default
436 * value.
437 *
438 * @param species species of the desired vector
439 * @param e the value
440 * @return a vector where the first lane element is set to the primitive
441 * value {@code e}
442 */
443 @ForceInline
444 public static final DoubleVector single(VectorSpecies<Double> species, double e) {
445 return zero(species).with(0, e);
446 }
447
448 /**
449 * Returns a vector where each lane element is set to a randomly
450 * generated primitive value.
451 *
452 * The semantics are equivalent to calling
453 * {@link ThreadLocalRandom#nextDouble()}
454 *
455 * @param species species of the desired vector
456 * @return a vector where each lane elements is set to a randomly
457 * generated primitive value
458 */
459 public static DoubleVector random(VectorSpecies<Double> species) {
460 ThreadLocalRandom r = ThreadLocalRandom.current();
461 return ((DoubleSpecies)species).op(i -> r.nextDouble());
462 }
463
464 // Ops
465
466 /**
467 * {@inheritDoc}
468 */
469 @Override
470 public abstract DoubleVector add(Vector<Double> v);
471
472 /**
473 * Adds this vector to the broadcast of an input scalar.
474 * <p>
475 * This is a lane-wise binary operation which applies the primitive addition operation
476 * ({@code +}) to each lane.
477 *
478 * @param s the input scalar
479 * @return the result of adding this vector to the broadcast of an input
480 * scalar
481 */
482 public abstract DoubleVector add(double s);
483
484 /**
485 * {@inheritDoc}
486 */
487 @Override
488 public abstract DoubleVector add(Vector<Double> v, VectorMask<Double> m);
489
490 /**
491 * Adds this vector to broadcast of an input scalar,
492 * selecting lane elements controlled by a mask.
493 * <p>
494 * This is a lane-wise binary operation which applies the primitive addition operation
495 * ({@code +}) to each lane.
496 *
497 * @param s the input scalar
498 * @param m the mask controlling lane selection
499 * @return the result of adding this vector to the broadcast of an input
500 * scalar
501 */
502 public abstract DoubleVector add(double s, VectorMask<Double> m);
503
504 /**
505 * {@inheritDoc}
506 */
507 @Override
508 public abstract DoubleVector sub(Vector<Double> v);
509
510 /**
511 * Subtracts the broadcast of an input scalar from this vector.
512 * <p>
513 * This is a lane-wise binary operation which applies the primitive subtraction
514 * operation ({@code -}) to each lane.
515 *
516 * @param s the input scalar
517 * @return the result of subtracting the broadcast of an input
518 * scalar from this vector
519 */
520 public abstract DoubleVector sub(double s);
521
522 /**
523 * {@inheritDoc}
524 */
525 @Override
526 public abstract DoubleVector sub(Vector<Double> v, VectorMask<Double> m);
527
528 /**
529 * Subtracts the broadcast of an input scalar from this vector, selecting
530 * lane elements controlled by a mask.
531 * <p>
532 * This is a lane-wise binary operation which applies the primitive subtraction
533 * operation ({@code -}) to each lane.
534 *
535 * @param s the input scalar
536 * @param m the mask controlling lane selection
537 * @return the result of subtracting the broadcast of an input
538 * scalar from this vector
539 */
540 public abstract DoubleVector sub(double s, VectorMask<Double> m);
541
542 /**
543 * {@inheritDoc}
544 */
545 @Override
546 public abstract DoubleVector mul(Vector<Double> v);
547
548 /**
549 * Multiplies this vector with the broadcast of an input scalar.
550 * <p>
551 * This is a lane-wise binary operation which applies the primitive multiplication
552 * operation ({@code *}) to each lane.
553 *
554 * @param s the input scalar
555 * @return the result of multiplying this vector with the broadcast of an
556 * input scalar
557 */
558 public abstract DoubleVector mul(double s);
559
560 /**
561 * {@inheritDoc}
562 */
563 @Override
564 public abstract DoubleVector mul(Vector<Double> v, VectorMask<Double> m);
565
566 /**
567 * Multiplies this vector with the broadcast of an input scalar, selecting
568 * lane elements controlled by a mask.
569 * <p>
570 * This is a lane-wise binary operation which applies the primitive multiplication
571 * operation ({@code *}) to each lane.
572 *
573 * @param s the input scalar
574 * @param m the mask controlling lane selection
575 * @return the result of multiplying this vector with the broadcast of an
576 * input scalar
577 */
578 public abstract DoubleVector mul(double s, VectorMask<Double> m);
579
580 /**
581 * {@inheritDoc}
582 */
583 @Override
584 public abstract DoubleVector neg();
585
586 /**
587 * {@inheritDoc}
588 */
589 @Override
590 public abstract DoubleVector neg(VectorMask<Double> m);
591
592 /**
593 * {@inheritDoc}
594 */
595 @Override
596 public abstract DoubleVector abs();
597
598 /**
599 * {@inheritDoc}
600 */
601 @Override
602 public abstract DoubleVector abs(VectorMask<Double> m);
603
604 /**
605 * {@inheritDoc}
606 */
607 @Override
608 public abstract DoubleVector min(Vector<Double> v);
609
610 /**
611 * {@inheritDoc}
612 */
613 @Override
614 public abstract DoubleVector min(Vector<Double> v, VectorMask<Double> m);
615
616 /**
617 * Returns the minimum of this vector and the broadcast of an input scalar.
618 * <p>
619 * This is a lane-wise binary operation which applies the operation
620 * {@code (a, b) -> Math.min(a, b)} to each lane.
621 *
622 * @param s the input scalar
623 * @return the minimum of this vector and the broadcast of an input scalar
624 */
625 public abstract DoubleVector min(double s);
626
627 /**
628 * {@inheritDoc}
629 */
630 @Override
631 public abstract DoubleVector max(Vector<Double> v);
632
633 /**
634 * {@inheritDoc}
635 */
636 @Override
637 public abstract DoubleVector max(Vector<Double> v, VectorMask<Double> m);
638
639 /**
640 * Returns the maximum of this vector and the broadcast of an input scalar.
641 * <p>
642 * This is a lane-wise binary operation which applies the operation
643 * {@code (a, b) -> Math.max(a, b)} to each lane.
644 *
645 * @param s the input scalar
646 * @return the maximum of this vector and the broadcast of an input scalar
647 */
648 public abstract DoubleVector max(double s);
649
650 /**
651 * {@inheritDoc}
652 */
653 @Override
654 public abstract VectorMask<Double> equal(Vector<Double> v);
655
656 /**
657 * Tests if this vector is equal to the broadcast of an input scalar.
658 * <p>
659 * This is a lane-wise binary test operation which applies the primitive equals
660 * operation ({@code ==}) each lane.
661 *
662 * @param s the input scalar
663 * @return the result mask of testing if this vector is equal to the
664 * broadcast of an input scalar
665 */
666 public abstract VectorMask<Double> equal(double s);
667
668 /**
669 * {@inheritDoc}
670 */
671 @Override
672 public abstract VectorMask<Double> notEqual(Vector<Double> v);
673
674 /**
675 * Tests if this vector is not equal to the broadcast of an input scalar.
676 * <p>
677 * This is a lane-wise binary test operation which applies the primitive not equals
678 * operation ({@code !=}) to each lane.
679 *
680 * @param s the input scalar
681 * @return the result mask of testing if this vector is not equal to the
682 * broadcast of an input scalar
683 */
684 public abstract VectorMask<Double> notEqual(double s);
685
686 /**
687 * {@inheritDoc}
688 */
689 @Override
690 public abstract VectorMask<Double> lessThan(Vector<Double> v);
691
692 /**
693 * Tests if this vector is less than the broadcast of an input scalar.
694 * <p>
695 * This is a lane-wise binary test operation which applies the primitive less than
696 * operation ({@code <}) to each lane.
697 *
698 * @param s the input scalar
699 * @return the mask result of testing if this vector is less than the
700 * broadcast of an input scalar
701 */
702 public abstract VectorMask<Double> lessThan(double s);
703
704 /**
705 * {@inheritDoc}
706 */
707 @Override
708 public abstract VectorMask<Double> lessThanEq(Vector<Double> v);
709
710 /**
711 * Tests if this vector is less or equal to the broadcast of an input scalar.
712 * <p>
713 * This is a lane-wise binary test operation which applies the primitive less than
714 * or equal to operation ({@code <=}) to each lane.
715 *
716 * @param s the input scalar
717 * @return the mask result of testing if this vector is less than or equal
718 * to the broadcast of an input scalar
719 */
720 public abstract VectorMask<Double> lessThanEq(double s);
721
722 /**
723 * {@inheritDoc}
724 */
725 @Override
726 public abstract VectorMask<Double> greaterThan(Vector<Double> v);
727
728 /**
729 * Tests if this vector is greater than the broadcast of an input scalar.
730 * <p>
731 * This is a lane-wise binary test operation which applies the primitive greater than
732 * operation ({@code >}) to each lane.
733 *
734 * @param s the input scalar
735 * @return the mask result of testing if this vector is greater than the
736 * broadcast of an input scalar
737 */
738 public abstract VectorMask<Double> greaterThan(double s);
739
740 /**
741 * {@inheritDoc}
742 */
743 @Override
744 public abstract VectorMask<Double> greaterThanEq(Vector<Double> v);
745
746 /**
747 * Tests if this vector is greater than or equal to the broadcast of an
748 * input scalar.
749 * <p>
750 * This is a lane-wise binary test operation which applies the primitive greater than
751 * or equal to operation ({@code >=}) to each lane.
752 *
753 * @param s the input scalar
754 * @return the mask result of testing if this vector is greater than or
755 * equal to the broadcast of an input scalar
756 */
757 public abstract VectorMask<Double> greaterThanEq(double s);
758
759 /**
760 * {@inheritDoc}
761 */
762 @Override
763 public abstract DoubleVector blend(Vector<Double> v, VectorMask<Double> m);
764
765 /**
766 * Blends the lane elements of this vector with those of the broadcast of an
767 * input scalar, selecting lanes controlled by a mask.
768 * <p>
769 * For each lane of the mask, at lane index {@code N}, if the mask lane
770 * is set then the lane element at {@code N} from the input vector is
771 * selected and placed into the resulting vector at {@code N},
772 * otherwise the the lane element at {@code N} from this input vector is
773 * selected and placed into the resulting vector at {@code N}.
774 *
775 * @param s the input scalar
776 * @param m the mask controlling lane selection
777 * @return the result of blending the lane elements of this vector with
778 * those of the broadcast of an input scalar
779 */
780 public abstract DoubleVector blend(double s, VectorMask<Double> m);
781
782 /**
783 * {@inheritDoc}
784 */
785 @Override
786 public abstract DoubleVector rearrange(Vector<Double> v,
787 VectorShuffle<Double> s, VectorMask<Double> m);
788
789 /**
790 * {@inheritDoc}
791 */
792 @Override
793 public abstract DoubleVector rearrange(VectorShuffle<Double> m);
794
795 /**
796 * {@inheritDoc}
797 */
798 @Override
799 public abstract DoubleVector reshape(VectorSpecies<Double> s);
800
801 /**
802 * {@inheritDoc}
803 */
804 @Override
805 public abstract DoubleVector rotateEL(int i);
806
807 /**
808 * {@inheritDoc}
809 */
810 @Override
811 public abstract DoubleVector rotateER(int i);
812
813 /**
814 * {@inheritDoc}
815 */
816 @Override
817 public abstract DoubleVector shiftEL(int i);
818
819 /**
820 * {@inheritDoc}
821 */
822 @Override
823 public abstract DoubleVector shiftER(int i);
824
825 /**
826 * Divides this vector by an input vector.
827 * <p>
828 * This is a lane-wise binary operation which applies the primitive division
829 * operation ({@code /}) to each lane.
830 *
831 * @param v the input vector
832 * @return the result of dividing this vector by the input vector
833 */
834 public abstract DoubleVector div(Vector<Double> v);
835
836 /**
837 * Divides this vector by the broadcast of an input scalar.
838 * <p>
839 * This is a lane-wise binary operation which applies the primitive division
840 * operation ({@code /}) to each lane.
841 *
842 * @param s the input scalar
843 * @return the result of dividing this vector by the broadcast of an input
844 * scalar
845 */
846 public abstract DoubleVector div(double s);
847
848 /**
849 * Divides this vector by an input vector, selecting lane elements
850 * controlled by a mask.
851 * <p>
852 * This is a lane-wise binary operation which applies the primitive division
853 * operation ({@code /}) to each lane.
854 *
855 * @param v the input vector
856 * @param m the mask controlling lane selection
857 * @return the result of dividing this vector by the input vector
858 */
859 public abstract DoubleVector div(Vector<Double> v, VectorMask<Double> m);
860
861 /**
862 * Divides this vector by the broadcast of an input scalar, selecting lane
863 * elements controlled by a mask.
864 * <p>
865 * This is a lane-wise binary operation which applies the primitive division
866 * operation ({@code /}) to each lane.
867 *
868 * @param s the input scalar
869 * @param m the mask controlling lane selection
870 * @return the result of dividing this vector by the broadcast of an input
871 * scalar
872 */
873 public abstract DoubleVector div(double s, VectorMask<Double> m);
874
875 /**
876 * Calculates the square root of this vector.
877 * <p>
878 * This is a lane-wise unary operation which applies the {@link Math#sqrt} operation
879 * to each lane.
880 *
881 * @return the square root of this vector
882 */
883 public abstract DoubleVector sqrt();
884
885 /**
886 * Calculates the square root of this vector, selecting lane elements
887 * controlled by a mask.
888 * <p>
889 * This is a lane-wise unary operation which applies the {@link Math#sqrt} operation
890 * to each lane.
891 *
892 * @param m the mask controlling lane selection
893 * @return the square root of this vector
894 */
895 public DoubleVector sqrt(VectorMask<Double> m) {
896 return uOp(m, (i, a) -> (double) Math.sqrt((double) a));
897 }
898
899 /**
900 * Calculates the trigonometric tangent of this vector.
901 * <p>
902 * This is a lane-wise unary operation with same semantic definition as
903 * {@link Math#tan} operation applied to each lane.
904 * The implementation is not required to return same
905 * results as {@link Math#tan}, but adheres to rounding, monotonicity,
906 * and special case semantics as defined in the {@link Math#tan}
907 * specifications. The computed result will be within 1 ulp of the
908 * exact result.
909 *
910 * @return the tangent of this vector
911 */
912 public DoubleVector tan() {
913 return uOp((i, a) -> (double) Math.tan((double) a));
914 }
915
916 /**
917 * Calculates the trigonometric tangent of this vector, selecting lane
918 * elements controlled by a mask.
919 * <p>
920 * Semantics for rounding, monotonicity, and special cases are
921 * described in {@link DoubleVector#tan}
922 *
923 * @param m the mask controlling lane selection
924 * @return the tangent of this vector
925 */
926 public DoubleVector tan(VectorMask<Double> m) {
927 return uOp(m, (i, a) -> (double) Math.tan((double) a));
928 }
929
930 /**
931 * Calculates the hyperbolic tangent of this vector.
932 * <p>
933 * This is a lane-wise unary operation with same semantic definition as
934 * {@link Math#tanh} operation applied to each lane.
935 * The implementation is not required to return same
936 * results as {@link Math#tanh}, but adheres to rounding, monotonicity,
937 * and special case semantics as defined in the {@link Math#tanh}
938 * specifications. The computed result will be within 2.5 ulps of the
939 * exact result.
940 *
941 * @return the hyperbolic tangent of this vector
942 */
943 public DoubleVector tanh() {
944 return uOp((i, a) -> (double) Math.tanh((double) a));
945 }
946
947 /**
948 * Calculates the hyperbolic tangent of this vector, selecting lane elements
949 * controlled by a mask.
950 * <p>
951 * Semantics for rounding, monotonicity, and special cases are
952 * described in {@link DoubleVector#tanh}
953 *
954 * @param m the mask controlling lane selection
955 * @return the hyperbolic tangent of this vector
956 */
957 public DoubleVector tanh(VectorMask<Double> m) {
958 return uOp(m, (i, a) -> (double) Math.tanh((double) a));
959 }
960
961 /**
962 * Calculates the trigonometric sine of this vector.
963 * <p>
964 * This is a lane-wise unary operation with same semantic definition as
965 * {@link Math#sin} operation applied to each lane.
966 * The implementation is not required to return same
967 * results as {@link Math#sin}, but adheres to rounding, monotonicity,
968 * and special case semantics as defined in the {@link Math#sin}
969 * specifications. The computed result will be within 1 ulp of the
970 * exact result.
971 *
972 * @return the sine of this vector
973 */
974 public DoubleVector sin() {
975 return uOp((i, a) -> (double) Math.sin((double) a));
976 }
977
978 /**
979 * Calculates the trigonometric sine of this vector, selecting lane elements
980 * controlled by a mask.
981 * <p>
982 * Semantics for rounding, monotonicity, and special cases are
983 * described in {@link DoubleVector#sin}
984 *
985 * @param m the mask controlling lane selection
986 * @return the sine of this vector
987 */
988 public DoubleVector sin(VectorMask<Double> m) {
989 return uOp(m, (i, a) -> (double) Math.sin((double) a));
990 }
991
992 /**
993 * Calculates the hyperbolic sine of this vector.
994 * <p>
995 * This is a lane-wise unary operation with same semantic definition as
996 * {@link Math#sinh} operation applied to each lane.
997 * The implementation is not required to return same
998 * results as {@link Math#sinh}, but adheres to rounding, monotonicity,
999 * and special case semantics as defined in the {@link Math#sinh}
1000 * specifications. The computed result will be within 2.5 ulps of the
1001 * exact result.
1002 *
1003 * @return the hyperbolic sine of this vector
1004 */
1005 public DoubleVector sinh() {
1006 return uOp((i, a) -> (double) Math.sinh((double) a));
1007 }
1008
1009 /**
1010 * Calculates the hyperbolic sine of this vector, selecting lane elements
1011 * controlled by a mask.
1012 * <p>
1013 * Semantics for rounding, monotonicity, and special cases are
1014 * described in {@link DoubleVector#sinh}
1015 *
1016 * @param m the mask controlling lane selection
1017 * @return the hyperbolic sine of this vector
1018 */
1019 public DoubleVector sinh(VectorMask<Double> m) {
1020 return uOp(m, (i, a) -> (double) Math.sinh((double) a));
1021 }
1022
1023 /**
1024 * Calculates the trigonometric cosine of this vector.
1025 * <p>
1026 * This is a lane-wise unary operation with same semantic definition as
1027 * {@link Math#cos} operation applied to each lane.
1028 * The implementation is not required to return same
1029 * results as {@link Math#cos}, but adheres to rounding, monotonicity,
1030 * and special case semantics as defined in the {@link Math#cos}
1031 * specifications. The computed result will be within 1 ulp of the
1032 * exact result.
1033 *
1034 * @return the cosine of this vector
1035 */
1036 public DoubleVector cos() {
1037 return uOp((i, a) -> (double) Math.cos((double) a));
1038 }
1039
1040 /**
1041 * Calculates the trigonometric cosine of this vector, selecting lane
1042 * elements controlled by a mask.
1043 * <p>
1044 * Semantics for rounding, monotonicity, and special cases are
1045 * described in {@link DoubleVector#cos}
1046 *
1047 * @param m the mask controlling lane selection
1048 * @return the cosine of this vector
1049 */
1050 public DoubleVector cos(VectorMask<Double> m) {
1051 return uOp(m, (i, a) -> (double) Math.cos((double) a));
1052 }
1053
1054 /**
1055 * Calculates the hyperbolic cosine of this vector.
1056 * <p>
1057 * This is a lane-wise unary operation with same semantic definition as
1058 * {@link Math#cosh} operation applied to each lane.
1059 * The implementation is not required to return same
1060 * results as {@link Math#cosh}, but adheres to rounding, monotonicity,
1061 * and special case semantics as defined in the {@link Math#cosh}
1062 * specifications. The computed result will be within 2.5 ulps of the
1063 * exact result.
1064 *
1065 * @return the hyperbolic cosine of this vector
1066 */
1067 public DoubleVector cosh() {
1068 return uOp((i, a) -> (double) Math.cosh((double) a));
1069 }
1070
1071 /**
1072 * Calculates the hyperbolic cosine of this vector, selecting lane elements
1073 * controlled by a mask.
1074 * <p>
1075 * Semantics for rounding, monotonicity, and special cases are
1076 * described in {@link DoubleVector#cosh}
1077 *
1078 * @param m the mask controlling lane selection
1079 * @return the hyperbolic cosine of this vector
1080 */
1081 public DoubleVector cosh(VectorMask<Double> m) {
1082 return uOp(m, (i, a) -> (double) Math.cosh((double) a));
1083 }
1084
1085 /**
1086 * Calculates the arc sine of this vector.
1087 * <p>
1088 * This is a lane-wise unary operation with same semantic definition as
1089 * {@link Math#asin} operation applied to each lane.
1090 * The implementation is not required to return same
1091 * results as {@link Math#asin}, but adheres to rounding, monotonicity,
1092 * and special case semantics as defined in the {@link Math#asin}
1093 * specifications. The computed result will be within 1 ulp of the
1094 * exact result.
1095 *
1096 * @return the arc sine of this vector
1097 */
1098 public DoubleVector asin() {
1099 return uOp((i, a) -> (double) Math.asin((double) a));
1100 }
1101
1102 /**
1103 * Calculates the arc sine of this vector, selecting lane elements
1104 * controlled by a mask.
1105 * <p>
1106 * Semantics for rounding, monotonicity, and special cases are
1107 * described in {@link DoubleVector#asin}
1108 *
1109 * @param m the mask controlling lane selection
1110 * @return the arc sine of this vector
1111 */
1112 public DoubleVector asin(VectorMask<Double> m) {
1113 return uOp(m, (i, a) -> (double) Math.asin((double) a));
1114 }
1115
1116 /**
1117 * Calculates the arc cosine of this vector.
1118 * <p>
1119 * This is a lane-wise unary operation with same semantic definition as
1120 * {@link Math#acos} operation applied to each lane.
1121 * The implementation is not required to return same
1122 * results as {@link Math#acos}, but adheres to rounding, monotonicity,
1123 * and special case semantics as defined in the {@link Math#acos}
1124 * specifications. The computed result will be within 1 ulp of the
1125 * exact result.
1126 *
1127 * @return the arc cosine of this vector
1128 */
1129 public DoubleVector acos() {
1130 return uOp((i, a) -> (double) Math.acos((double) a));
1131 }
1132
1133 /**
1134 * Calculates the arc cosine of this vector, selecting lane elements
1135 * controlled by a mask.
1136 * <p>
1137 * Semantics for rounding, monotonicity, and special cases are
1138 * described in {@link DoubleVector#acos}
1139 *
1140 * @param m the mask controlling lane selection
1141 * @return the arc cosine of this vector
1142 */
1143 public DoubleVector acos(VectorMask<Double> m) {
1144 return uOp(m, (i, a) -> (double) Math.acos((double) a));
1145 }
1146
1147 /**
1148 * Calculates the arc tangent of this vector.
1149 * <p>
1150 * This is a lane-wise unary operation with same semantic definition as
1151 * {@link Math#atan} operation applied to each lane.
1152 * The implementation is not required to return same
1153 * results as {@link Math#atan}, but adheres to rounding, monotonicity,
1154 * and special case semantics as defined in the {@link Math#atan}
1155 * specifications. The computed result will be within 1 ulp of the
1156 * exact result.
1157 *
1158 * @return the arc tangent of this vector
1159 */
1160 public DoubleVector atan() {
1161 return uOp((i, a) -> (double) Math.atan((double) a));
1162 }
1163
1164 /**
1165 * Calculates the arc tangent of this vector, selecting lane elements
1166 * controlled by a mask.
1167 * <p>
1168 * Semantics for rounding, monotonicity, and special cases are
1169 * described in {@link DoubleVector#atan}
1170 *
1171 * @param m the mask controlling lane selection
1172 * @return the arc tangent of this vector
1173 */
1174 public DoubleVector atan(VectorMask<Double> m) {
1175 return uOp(m, (i, a) -> (double) Math.atan((double) a));
1176 }
1177
1178 /**
1179 * Calculates the arc tangent of this vector divided by an input vector.
1180 * <p>
1181 * This is a lane-wise binary operation with same semantic definition as
1182 * {@link Math#atan2} operation applied to each lane.
1183 * The implementation is not required to return same
1184 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1185 * and special case semantics as defined in the {@link Math#atan2}
1186 * specifications. The computed result will be within 2 ulps of the
1187 * exact result.
1188 *
1189 * @param v the input vector
1190 * @return the arc tangent of this vector divided by the input vector
1191 */
1192 public DoubleVector atan2(Vector<Double> v) {
1193 return bOp(v, (i, a, b) -> (double) Math.atan2((double) a, (double) b));
1194 }
1195
1196 /**
1197 * Calculates the arc tangent of this vector divided by the broadcast of an
1198 * an input scalar.
1199 * <p>
1200 * This is a lane-wise binary operation with same semantic definition as
1201 * {@link Math#atan2} operation applied to each lane.
1202 * The implementation is not required to return same
1203 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1204 * and special case semantics as defined in the {@link Math#atan2}
1205 * specifications. The computed result will be within 1 ulp of the
1206 * exact result.
1207 *
1208 * @param s the input scalar
1209 * @return the arc tangent of this vector over the input vector
1210 */
1211 public abstract DoubleVector atan2(double s);
1212
1213 /**
1214 * Calculates the arc tangent of this vector divided by an input vector,
1215 * selecting lane elements controlled by a mask.
1216 * <p>
1217 * Semantics for rounding, monotonicity, and special cases are
1218 * described in {@link DoubleVector#atan2}
1219 *
1220 * @param v the input vector
1221 * @param m the mask controlling lane selection
1224 public DoubleVector atan2(Vector<Double> v, VectorMask<Double> m) {
1225 return bOp(v, m, (i, a, b) -> (double) Math.atan2((double) a, (double) b));
1226 }
1227
1228 /**
1229 * Calculates the arc tangent of this vector divided by the broadcast of an
1230 * an input scalar, selecting lane elements controlled by a mask.
1231 * <p>
1232 * Semantics for rounding, monotonicity, and special cases are
1233 * described in {@link DoubleVector#atan2}
1234 *
1235 * @param s the input scalar
1236 * @param m the mask controlling lane selection
1237 * @return the arc tangent of this vector over the input vector
1238 */
1239 public abstract DoubleVector atan2(double s, VectorMask<Double> m);
1240
1241 /**
1242 * Calculates the cube root of this vector.
1243 * <p>
1244 * This is a lane-wise unary operation with same semantic definition as
1245 * {@link Math#cbrt} operation applied to each lane.
1246 * The implementation is not required to return same
1247 * results as {@link Math#cbrt}, but adheres to rounding, monotonicity,
1248 * and special case semantics as defined in the {@link Math#cbrt}
1249 * specifications. The computed result will be within 1 ulp of the
1250 * exact result.
1251 *
1252 * @return the cube root of this vector
1253 */
1254 public DoubleVector cbrt() {
1255 return uOp((i, a) -> (double) Math.cbrt((double) a));
1256 }
1257
1258 /**
1259 * Calculates the cube root of this vector, selecting lane elements
1260 * controlled by a mask.
1261 * <p>
1262 * Semantics for rounding, monotonicity, and special cases are
1263 * described in {@link DoubleVector#cbrt}
1264 *
1265 * @param m the mask controlling lane selection
1266 * @return the cube root of this vector
1267 */
1268 public DoubleVector cbrt(VectorMask<Double> m) {
1269 return uOp(m, (i, a) -> (double) Math.cbrt((double) a));
1270 }
1271
1272 /**
1273 * Calculates the natural logarithm of this vector.
1274 * <p>
1275 * This is a lane-wise unary operation with same semantic definition as
1276 * {@link Math#log} operation applied to each lane.
1277 * The implementation is not required to return same
1278 * results as {@link Math#log}, but adheres to rounding, monotonicity,
1279 * and special case semantics as defined in the {@link Math#log}
1280 * specifications. The computed result will be within 1 ulp of the
1281 * exact result.
1282 *
1283 * @return the natural logarithm of this vector
1284 */
1285 public DoubleVector log() {
1286 return uOp((i, a) -> (double) Math.log((double) a));
1287 }
1288
1289 /**
1290 * Calculates the natural logarithm of this vector, selecting lane elements
1291 * controlled by a mask.
1292 * <p>
1293 * Semantics for rounding, monotonicity, and special cases are
1294 * described in {@link DoubleVector#log}
1295 *
1296 * @param m the mask controlling lane selection
1297 * @return the natural logarithm of this vector
1298 */
1299 public DoubleVector log(VectorMask<Double> m) {
1300 return uOp(m, (i, a) -> (double) Math.log((double) a));
1301 }
1302
1303 /**
1304 * Calculates the base 10 logarithm of this vector.
1305 * <p>
1306 * This is a lane-wise unary operation with same semantic definition as
1307 * {@link Math#log10} operation applied to each lane.
1308 * The implementation is not required to return same
1309 * results as {@link Math#log10}, but adheres to rounding, monotonicity,
1310 * and special case semantics as defined in the {@link Math#log10}
1311 * specifications. The computed result will be within 1 ulp of the
1312 * exact result.
1313 *
1314 * @return the base 10 logarithm of this vector
1315 */
1316 public DoubleVector log10() {
1317 return uOp((i, a) -> (double) Math.log10((double) a));
1318 }
1319
1320 /**
1321 * Calculates the base 10 logarithm of this vector, selecting lane elements
1322 * controlled by a mask.
1323 * <p>
1324 * Semantics for rounding, monotonicity, and special cases are
1325 * described in {@link DoubleVector#log10}
1326 *
1327 * @param m the mask controlling lane selection
1328 * @return the base 10 logarithm of this vector
1329 */
1330 public DoubleVector log10(VectorMask<Double> m) {
1331 return uOp(m, (i, a) -> (double) Math.log10((double) a));
1332 }
1333
1334 /**
1335 * Calculates the natural logarithm of the sum of this vector and the
1336 * broadcast of {@code 1}.
1337 * <p>
1338 * This is a lane-wise unary operation with same semantic definition as
1339 * {@link Math#log1p} operation applied to each lane.
1340 * The implementation is not required to return same
1341 * results as {@link Math#log1p}, but adheres to rounding, monotonicity,
1342 * and special case semantics as defined in the {@link Math#log1p}
1343 * specifications. The computed result will be within 1 ulp of the
1344 * exact result.
1345 *
1346 * @return the natural logarithm of the sum of this vector and the broadcast
1347 * of {@code 1}
1348 */
1349 public DoubleVector log1p() {
1350 return uOp((i, a) -> (double) Math.log1p((double) a));
1351 }
1352
1353 /**
1354 * Calculates the natural logarithm of the sum of this vector and the
1355 * broadcast of {@code 1}, selecting lane elements controlled by a mask.
1356 * <p>
1357 * Semantics for rounding, monotonicity, and special cases are
1358 * described in {@link DoubleVector#log1p}
1359 *
1360 * @param m the mask controlling lane selection
1361 * @return the natural logarithm of the sum of this vector and the broadcast
1362 * of {@code 1}
1363 */
1364 public DoubleVector log1p(VectorMask<Double> m) {
1365 return uOp(m, (i, a) -> (double) Math.log1p((double) a));
1366 }
1367
1368 /**
1369 * Calculates this vector raised to the power of an input vector.
1370 * <p>
1371 * This is a lane-wise binary operation with same semantic definition as
1372 * {@link Math#pow} operation applied to each lane.
1373 * The implementation is not required to return same
1374 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1375 * and special case semantics as defined in the {@link Math#pow}
1376 * specifications. The computed result will be within 1 ulp of the
1377 * exact result.
1378 *
1379 * @param v the input vector
1380 * @return this vector raised to the power of an input vector
1381 */
1382 public DoubleVector pow(Vector<Double> v) {
1383 return bOp(v, (i, a, b) -> (double) Math.pow((double) a, (double) b));
1384 }
1385
1386 /**
1387 * Calculates this vector raised to the power of the broadcast of an input
1388 * scalar.
1389 * <p>
1390 * This is a lane-wise binary operation with same semantic definition as
1391 * {@link Math#pow} operation applied to each lane.
1392 * The implementation is not required to return same
1393 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1394 * and special case semantics as defined in the {@link Math#pow}
1395 * specifications. The computed result will be within 1 ulp of the
1396 * exact result.
1397 *
1398 * @param s the input scalar
1399 * @return this vector raised to the power of the broadcast of an input
1400 * scalar.
1401 */
1402 public abstract DoubleVector pow(double s);
1403
1404 /**
1405 * Calculates this vector raised to the power of an input vector, selecting
1406 * lane elements controlled by a mask.
1407 * <p>
1408 * Semantics for rounding, monotonicity, and special cases are
1409 * described in {@link DoubleVector#pow}
1410 *
1411 * @param v the input vector
1417 }
1418
1419 /**
1420 * Calculates this vector raised to the power of the broadcast of an input
1421 * scalar, selecting lane elements controlled by a mask.
1422 * <p>
1423 * Semantics for rounding, monotonicity, and special cases are
1424 * described in {@link DoubleVector#pow}
1425 *
1426 * @param s the input scalar
1427 * @param m the mask controlling lane selection
1428 * @return this vector raised to the power of the broadcast of an input
1429 * scalar.
1430 */
1431 public abstract DoubleVector pow(double s, VectorMask<Double> m);
1432
1433 /**
1434 * Calculates the broadcast of Euler's number {@code e} raised to the power
1435 * of this vector.
1436 * <p>
1437 * This is a lane-wise unary operation with same semantic definition as
1438 * {@link Math#exp} operation applied to each lane.
1439 * The implementation is not required to return same
1440 * results as {@link Math#exp}, but adheres to rounding, monotonicity,
1441 * and special case semantics as defined in the {@link Math#exp}
1442 * specifications. The computed result will be within 1 ulp of the
1443 * exact result.
1444 *
1445 * @return the broadcast of Euler's number {@code e} raised to the power of
1446 * this vector
1447 */
1448 public DoubleVector exp() {
1449 return uOp((i, a) -> (double) Math.exp((double) a));
1450 }
1451
1452 /**
1453 * Calculates the broadcast of Euler's number {@code e} raised to the power
1454 * of this vector, selecting lane elements controlled by a mask.
1455 * <p>
1456 * Semantics for rounding, monotonicity, and special cases are
1457 * described in {@link DoubleVector#exp}
1458 *
1459 * @param m the mask controlling lane selection
1460 * @return the broadcast of Euler's number {@code e} raised to the power of
1461 * this vector
1462 */
1463 public DoubleVector exp(VectorMask<Double> m) {
1464 return uOp(m, (i, a) -> (double) Math.exp((double) a));
1465 }
1466
1467 /**
1468 * Calculates the broadcast of Euler's number {@code e} raised to the power
1469 * of this vector minus the broadcast of {@code -1}.
1470 * More specifically as if the following (ignoring any differences in
1471 * numerical accuracy):
1472 * <pre>{@code
1473 * this.exp().sub(EVector.broadcast(this.species(), 1))
1474 * }</pre>
1475 * <p>
1476 * This is a lane-wise unary operation with same semantic definition as
1477 * {@link Math#expm1} operation applied to each lane.
1478 * The implementation is not required to return same
1479 * results as {@link Math#expm1}, but adheres to rounding, monotonicity,
1480 * and special case semantics as defined in the {@link Math#expm1}
1481 * specifications. The computed result will be within 1 ulp of the
1482 * exact result.
1483 *
1484 * @return the broadcast of Euler's number {@code e} raised to the power of
1485 * this vector minus the broadcast of {@code -1}
1486 */
1487 public DoubleVector expm1() {
1488 return uOp((i, a) -> (double) Math.expm1((double) a));
1489 }
1490
1491 /**
1492 * Calculates the broadcast of Euler's number {@code e} raised to the power
1493 * of this vector minus the broadcast of {@code -1}, selecting lane elements
1494 * controlled by a mask
1495 * More specifically as if the following (ignoring any differences in
1496 * numerical accuracy):
1497 * <pre>{@code
1498 * this.exp(m).sub(EVector.broadcast(this.species(), 1), m)
1499 * }</pre>
1500 * <p>
1501 * Semantics for rounding, monotonicity, and special cases are
1502 * described in {@link DoubleVector#expm1}
1503 *
1504 * @param m the mask controlling lane selection
1505 * @return the broadcast of Euler's number {@code e} raised to the power of
1506 * this vector minus the broadcast of {@code -1}
1507 */
1508 public DoubleVector expm1(VectorMask<Double> m) {
1509 return uOp(m, (i, a) -> (double) Math.expm1((double) a));
1510 }
1511
1512 /**
1513 * Calculates the product of this vector and a first input vector summed
1514 * with a second input vector.
1515 * More specifically as if the following (ignoring any differences in
1516 * numerical accuracy):
1517 * <pre>{@code
1518 * this.mul(v1).add(v2)
1519 * }</pre>
1520 * <p>
1521 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1522 * to each lane.
1523 *
1524 * @param v1 the first input vector
1525 * @param v2 the second input vector
1526 * @return the product of this vector and the first input vector summed with
1527 * the second input vector
1528 */
1529 public abstract DoubleVector fma(Vector<Double> v1, Vector<Double> v2);
1530
1531 /**
1532 * Calculates the product of this vector and the broadcast of a first input
1533 * scalar summed with the broadcast of a second input scalar.
1534 * More specifically as if the following:
1535 * <pre>{@code
1536 * this.fma(EVector.broadcast(this.species(), s1), EVector.broadcast(this.species(), s2))
1537 * }</pre>
1538 * <p>
1539 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1540 * to each lane.
1541 *
1542 * @param s1 the first input scalar
1543 * @param s2 the second input scalar
1544 * @return the product of this vector and the broadcast of a first input
1545 * scalar summed with the broadcast of a second input scalar
1546 */
1547 public abstract DoubleVector fma(double s1, double s2);
1548
1549 /**
1550 * Calculates the product of this vector and a first input vector summed
1551 * with a second input vector, selecting lane elements controlled by a mask.
1552 * More specifically as if the following (ignoring any differences in
1553 * numerical accuracy):
1554 * <pre>{@code
1555 * this.mul(v1, m).add(v2, m)
1556 * }</pre>
1557 * <p>
1558 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1559 * to each lane.
1560 *
1561 * @param v1 the first input vector
1562 * @param v2 the second input vector
1563 * @param m the mask controlling lane selection
1564 * @return the product of this vector and the first input vector summed with
1565 * the second input vector
1566 */
1567 public DoubleVector fma(Vector<Double> v1, Vector<Double> v2, VectorMask<Double> m) {
1568 return tOp(v1, v2, m, (i, a, b, c) -> Math.fma(a, b, c));
1569 }
1570
1571 /**
1572 * Calculates the product of this vector and the broadcast of a first input
1573 * scalar summed with the broadcast of a second input scalar, selecting lane
1574 * elements controlled by a mask
1575 * More specifically as if the following:
1576 * <pre>{@code
1577 * this.fma(EVector.broadcast(this.species(), s1), EVector.broadcast(this.species(), s2), m)
1578 * }</pre>
1579 * <p>
1580 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1581 * to each lane.
1582 *
1583 * @param s1 the first input scalar
1584 * @param s2 the second input scalar
1585 * @param m the mask controlling lane selection
1586 * @return the product of this vector and the broadcast of a first input
1587 * scalar summed with the broadcast of a second input scalar
1588 */
1589 public abstract DoubleVector fma(double s1, double s2, VectorMask<Double> m);
1590
1591 /**
1592 * Calculates square root of the sum of the squares of this vector and an
1593 * input vector.
1594 * More specifically as if the following (ignoring any differences in
1595 * numerical accuracy):
1596 * <pre>{@code
1597 * this.mul(this).add(v.mul(v)).sqrt()
1598 * }</pre>
1599 * <p>
1600 * This is a lane-wise binary operation with same semantic definition as
1601 * {@link Math#hypot} operation applied to each lane.
1602 * The implementation is not required to return same
1603 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1604 * and special case semantics as defined in the {@link Math#hypot}
1605 * specifications. The computed result will be within 1 ulp of the
1606 * exact result.
1607 *
1608 * @param v the input vector
1609 * @return square root of the sum of the squares of this vector and an input
1610 * vector
1611 */
1612 public DoubleVector hypot(Vector<Double> v) {
1613 return bOp(v, (i, a, b) -> (double) Math.hypot((double) a, (double) b));
1614 }
1615
1616 /**
1617 * Calculates square root of the sum of the squares of this vector and the
1618 * broadcast of an input scalar.
1619 * More specifically as if the following (ignoring any differences in
1620 * numerical accuracy):
1621 * <pre>{@code
1622 * this.mul(this).add(EVector.broadcast(this.species(), s * s)).sqrt()
1623 * }</pre>
1624 * <p>
1625 * This is a lane-wise binary operation with same semantic definition as
1626 * {@link Math#hypot} operation applied to each.
1627 * The implementation is not required to return same
1628 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1629 * and special case semantics as defined in the {@link Math#hypot}
1630 * specifications. The computed result will be within 1 ulp of the
1631 * exact result.
1632 *
1633 * @param s the input scalar
1634 * @return square root of the sum of the squares of this vector and the
1635 * broadcast of an input scalar
1636 */
1637 public abstract DoubleVector hypot(double s);
1638
1639 /**
1640 * Calculates square root of the sum of the squares of this vector and an
1641 * input vector, selecting lane elements controlled by a mask.
1642 * More specifically as if the following (ignoring any differences in
1643 * numerical accuracy):
1644 * <pre>{@code
1645 * this.mul(this, m).add(v.mul(v), m).sqrt(m)
1646 * }</pre>
1647 * <p>
1648 * Semantics for rounding, monotonicity, and special cases are
1649 * described in {@link DoubleVector#hypot}
1650 *
1651 * @param v the input vector
1652 * @param m the mask controlling lane selection
1653 * @return square root of the sum of the squares of this vector and an input
1654 * vector
1655 */
1656 public DoubleVector hypot(Vector<Double> v, VectorMask<Double> m) {
1657 return bOp(v, m, (i, a, b) -> (double) Math.hypot((double) a, (double) b));
1658 }
1659
1660 /**
1661 * Calculates square root of the sum of the squares of this vector and the
1662 * broadcast of an input scalar, selecting lane elements controlled by a
1663 * mask.
1664 * More specifically as if the following (ignoring any differences in
1665 * numerical accuracy):
1666 * <pre>{@code
1667 * this.mul(this, m).add(EVector.broadcast(this.species(), s * s), m).sqrt(m)
1668 * }</pre>
1669 * <p>
1670 * Semantics for rounding, monotonicity, and special cases are
1671 * described in {@link DoubleVector#hypot}
1672 *
1673 * @param s the input scalar
1674 * @param m the mask controlling lane selection
1675 * @return square root of the sum of the squares of this vector and the
1676 * broadcast of an input scalar
1677 */
1678 public abstract DoubleVector hypot(double s, VectorMask<Double> m);
1679
1680
1681 /**
1682 * {@inheritDoc}
1683 */
1684 @Override
1685 public abstract void intoByteArray(byte[] a, int ix);
1686
1687 /**
1688 * {@inheritDoc}
1689 */
1690 @Override
1691 public abstract void intoByteArray(byte[] a, int ix, VectorMask<Double> m);
1692
1693 /**
1694 * {@inheritDoc}
1695 */
1696 @Override
1697 public abstract void intoByteBuffer(ByteBuffer bb, int ix);
1698
1699 /**
1700 * {@inheritDoc}
1701 */
1702 @Override
1703 public abstract void intoByteBuffer(ByteBuffer bb, int ix, VectorMask<Double> m);
1704
1705
1706 // Type specific horizontal reductions
1707 /**
1708 * Adds all lane elements of this vector.
1709 * <p>
1710 * This is a cross-lane reduction operation which applies the addition
1711 * operation ({@code +}) to lane elements,
1712 * and the identity value is {@code 0.0}.
1713 *
1714 * <p>The value of a floating-point sum is a function both of the input values as well
1715 * as the order of addition operations. The order of addition operations of this method
1716 * is intentionally not defined to allow for JVM to generate optimal machine
1717 * code for the underlying platform at runtime. If the platform supports a vector
1718 * instruction to add all values in the vector, or if there is some other efficient machine
1719 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1720 * the default implementation of adding vectors sequentially from left to right is used.
1721 * For this reason, the output of this method may vary for the same input values.
1722 *
1723 * @return the addition of all the lane elements of this vector
1724 */
1725 public abstract double addAll();
1726
1727 /**
1728 * Adds all lane elements of this vector, selecting lane elements
1729 * controlled by a mask.
1730 * <p>
1731 * This is a cross-lane reduction operation which applies the addition
1732 * operation ({@code +}) to lane elements,
1733 * and the identity value is {@code 0.0}.
1734 *
1735 * <p>The value of a floating-point sum is a function both of the input values as well
1736 * as the order of addition operations. The order of addition operations of this method
1737 * is intentionally not defined to allow for JVM to generate optimal machine
1738 * code for the underlying platform at runtime. If the platform supports a vector
1739 * instruction to add all values in the vector, or if there is some other efficient machine
1740 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1741 * the default implementation of adding vectors sequentially from left to right is used.
1742 * For this reason, the output of this method may vary on the same input values.
1743 *
1744 * @param m the mask controlling lane selection
1745 * @return the addition of the selected lane elements of this vector
1746 */
1747 public abstract double addAll(VectorMask<Double> m);
1748
1749 /**
1750 * Multiplies all lane elements of this vector.
1751 * <p>
1752 * This is a cross-lane reduction operation which applies the
1753 * multiplication operation ({@code *}) to lane elements,
1754 * and the identity value is {@code 1.0}.
1755 *
1756 * <p>The order of multiplication operations of this method
1757 * is intentionally not defined to allow for JVM to generate optimal machine
1758 * code for the underlying platform at runtime. If the platform supports a vector
1759 * instruction to multiply all values in the vector, or if there is some other efficient machine
1760 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1761 * the default implementation of multiplying vectors sequentially from left to right is used.
1762 * For this reason, the output of this method may vary on the same input values.
1763 *
1764 * @return the multiplication of all the lane elements of this vector
1765 */
1766 public abstract double mulAll();
1767
1768 /**
1769 * Multiplies all lane elements of this vector, selecting lane elements
1770 * controlled by a mask.
1771 * <p>
1772 * This is a cross-lane reduction operation which applies the
1773 * multiplication operation ({@code *}) to lane elements,
1774 * and the identity value is {@code 1.0}.
1775 *
1776 * <p>The order of multiplication operations of this method
1777 * is intentionally not defined to allow for JVM to generate optimal machine
1778 * code for the underlying platform at runtime. If the platform supports a vector
1779 * instruction to multiply all values in the vector, or if there is some other efficient machine
1780 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1781 * the default implementation of multiplying vectors sequentially from left to right is used.
1782 * For this reason, the output of this method may vary on the same input values.
1783 *
1784 * @param m the mask controlling lane selection
1785 * @return the multiplication of all the lane elements of this vector
1786 */
1787 public abstract double mulAll(VectorMask<Double> m);
1788
1789 /**
1790 * Returns the minimum lane element of this vector.
1791 * <p>
1792 * This is an associative cross-lane reduction operation which applies the operation
1793 * {@code (a, b) -> Math.min(a, b)} to lane elements,
1794 * and the identity value is
1795 * {@link Double#POSITIVE_INFINITY}.
1796 *
1797 * @return the minimum lane element of this vector
1798 */
1799 public abstract double minAll();
1800
1801 /**
1802 * Returns the minimum lane element of this vector, selecting lane elements
1803 * controlled by a mask.
1804 * <p>
1805 * This is an associative cross-lane reduction operation which applies the operation
1806 * {@code (a, b) -> Math.min(a, b)} to lane elements,
1807 * and the identity value is
1808 * {@link Double#POSITIVE_INFINITY}.
1809 *
1810 * @param m the mask controlling lane selection
1811 * @return the minimum lane element of this vector
1812 */
1813 public abstract double minAll(VectorMask<Double> m);
1814
1815 /**
1816 * Returns the maximum lane element of this vector.
1817 * <p>
1818 * This is an associative cross-lane reduction operation which applies the operation
1819 * {@code (a, b) -> Math.max(a, b)} to lane elements,
1820 * and the identity value is
1821 * {@link Double#NEGATIVE_INFINITY}.
1822 *
1823 * @return the maximum lane element of this vector
1824 */
1825 public abstract double maxAll();
1826
1827 /**
1828 * Returns the maximum lane element of this vector, selecting lane elements
1829 * controlled by a mask.
1830 * <p>
1831 * This is an associative cross-lane reduction operation which applies the operation
1832 * {@code (a, b) -> Math.max(a, b)} to lane elements,
1833 * and the identity value is
1834 * {@link Double#NEGATIVE_INFINITY}.
1835 *
1836 * @param m the mask controlling lane selection
1837 * @return the maximum lane element of this vector
1838 */
1839 public abstract double maxAll(VectorMask<Double> m);
1840
1841
1842 // Type specific accessors
1843
1844 /**
1845 * Gets the lane element at lane index {@code i}
1846 *
1847 * @param i the lane index
1848 * @return the lane element at lane index {@code i}
1849 * @throws IllegalArgumentException if the index is is out of range
1850 * ({@code < 0 || >= length()})
1851 */
1852 public abstract double lane(int i);
1853
1854 /**
1855 * Replaces the lane element of this vector at lane index {@code i} with
1856 * value {@code e}.
1857 * <p>
1858 * This is a cross-lane operation and behaves as if it returns the result
1859 * of blending this vector with an input vector that is the result of
1860 * broadcasting {@code e} and a mask that has only one lane set at lane
1861 * index {@code i}.
1862 *
1863 * @param i the lane index of the lane element to be replaced
1864 * @param e the value to be placed
1865 * @return the result of replacing the lane element of this vector at lane
1866 * index {@code i} with value {@code e}.
1867 * @throws IllegalArgumentException if the index is is out of range
1868 * ({@code < 0 || >= length()})
1869 */
1870 public abstract DoubleVector with(int i, double e);
1871
1872 // Type specific extractors
1879 * <pre>{@code
1880 * double[] a = new double[this.length()];
1881 * this.intoArray(a, 0);
1882 * return a;
1883 * }</pre>
1884 *
1885 * @return an array containing the the lane elements of this vector
1886 */
1887 @ForceInline
1888 public final double[] toArray() {
1889 double[] a = new double[species().length()];
1890 intoArray(a, 0);
1891 return a;
1892 }
1893
1894 /**
1895 * Stores this vector into an array starting at offset.
1896 * <p>
1897 * For each vector lane, where {@code N} is the vector lane index,
1898 * the lane element at index {@code N} is stored into the array at index
1899 * {@code offset + N}.
1900 *
1901 * @param a the array
1902 * @param offset the offset into the array
1903 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
1904 * {@code offset > a.length - this.length()}
1905 */
1906 public abstract void intoArray(double[] a, int offset);
1907
1908 /**
1909 * Stores this vector into an array starting at offset and using a mask.
1910 * <p>
1911 * For each vector lane, where {@code N} is the vector lane index,
1912 * if the mask lane at index {@code N} is set then the lane element at
1913 * index {@code N} is stored into the array index {@code offset + N}.
1914 *
1915 * @param a the array
1916 * @param offset the offset into the array
1917 * @param m the mask
1918 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
1919 * for any vector lane index {@code N} where the mask at lane {@code N}
1920 * is set {@code offset >= a.length - N}
1921 */
1922 public abstract void intoArray(double[] a, int offset, VectorMask<Double> m);
1923
1924 /**
1925 * Stores this vector into an array using indexes obtained from an index
1926 * map.
1927 * <p>
1928 * For each vector lane, where {@code N} is the vector lane index, the
1929 * lane element at index {@code N} is stored into the array at index
1930 * {@code a_offset + indexMap[i_offset + N]}.
1931 *
1932 * @param a the array
1933 * @param a_offset the offset into the array, may be negative if relative
1934 * indexes in the index map compensate to produce a value within the
1935 * array bounds
1936 * @param indexMap the index map
1937 * @param i_offset the offset into the index map
1938 * @throws IndexOutOfBoundsException if {@code i_offset < 0}, or
1939 * {@code i_offset > indexMap.length - this.length()},
1940 * or for any vector lane index {@code N} the result of
1941 * {@code a_offset + indexMap[i_offset + N]} is {@code < 0} or {@code >= a.length}
1942 */
1943 public abstract void intoArray(double[] a, int a_offset, int[] indexMap, int i_offset);
1944
1945 /**
1946 * Stores this vector into an array using indexes obtained from an index
1947 * map and using a mask.
1948 * <p>
1949 * For each vector lane, where {@code N} is the vector lane index,
1950 * if the mask lane at index {@code N} is set then the lane element at
1951 * index {@code N} is stored into the array at index
1952 * {@code a_offset + indexMap[i_offset + N]}.
1953 *
1954 * @param a the array
1955 * @param a_offset the offset into the array, may be negative if relative
1956 * indexes in the index map compensate to produce a value within the
1957 * array bounds
1958 * @param m the mask
1959 * @param indexMap the index map
1960 * @param i_offset the offset into the index map
1961 * @throws IndexOutOfBoundsException if {@code j < 0}, or
1962 * {@code i_offset > indexMap.length - this.length()},
1963 * or for any vector lane index {@code N} where the mask at lane
1964 * {@code N} is set the result of {@code a_offset + indexMap[i_offset + N]} is
1965 * {@code < 0} or {@code >= a.length}
1966 */
1967 public abstract void intoArray(double[] a, int a_offset, VectorMask<Double> m, int[] indexMap, int i_offset);
1968 // Species
1969
1970 /**
1971 * {@inheritDoc}
1972 */
1973 @Override
1974 public abstract VectorSpecies<Double> species();
1975
1976 /**
1977 * Class representing {@link DoubleVector}'s of the same {@link VectorShape VectorShape}.
1978 */
1979 static final class DoubleSpecies extends AbstractSpecies<Double> {
1980 final Function<double[], DoubleVector> vectorFactory;
1981
1982 private DoubleSpecies(VectorShape shape,
1983 Class<?> boxType,
1984 Class<?> maskType,
1985 Function<double[], DoubleVector> vectorFactory,
1986 Function<boolean[], VectorMask<Double>> maskFactory,
1987 Function<IntUnaryOperator, VectorShuffle<Double>> shuffleFromArrayFactory,
1988 fShuffleFromArray<Double> shuffleFromOpFactory) {
1989 super(shape, double.class, Double.SIZE, boxType, maskType, maskFactory,
1990 shuffleFromArrayFactory, shuffleFromOpFactory);
1991 this.vectorFactory = vectorFactory;
1992 }
|