Main boby of One-sided Jacobi Method.
| 586 | |
| 587 | // Main boby of One-sided Jacobi Method. |
| 588 | StatusOr<std::vector<XlaOp>> WhileLoopFn( |
| 589 | absl::Span<const XlaOp> initial_values, // |
| 590 | int matrix_dimension, // |
| 591 | int max_sweep_updates, // |
| 592 | absl::string_view name, // |
| 593 | XlaBuilder* builder) { |
| 594 | auto while_cond_fn = [&](absl::Span<const XlaOp> values, |
| 595 | XlaBuilder* cond_builder) -> StatusOr<XlaOp> { |
| 596 | auto k = values[0]; |
| 597 | auto max_sweeps = ScalarLike(k, max_sweep_updates); |
| 598 | auto sweep_update_cond = Gt(max_sweeps, k); |
| 599 | |
| 600 | TF_ASSIGN_OR_RETURN(auto tolerance_comparison, |
| 601 | ComputeToleranceComparison(values[3], values[4])); |
| 602 | auto tolerance_cond = ReduceAll( |
| 603 | tolerance_comparison, xla::ConstantR0<bool>(cond_builder, false), |
| 604 | CreateScalarOrComputation(PRED, cond_builder)); |
| 605 | |
| 606 | return And(sweep_update_cond, tolerance_cond); |
| 607 | }; |
| 608 | |
| 609 | auto while_body_fn = |
| 610 | [&](absl::Span<const XlaOp> values, |
| 611 | XlaBuilder* body_builder) -> StatusOr<std::vector<XlaOp>> { |
| 612 | auto while_cond_fn_inner = |
| 613 | [&](absl::Span<const XlaOp> values_inner, |
| 614 | XlaBuilder* inner_cond_builder) -> StatusOr<XlaOp> { |
| 615 | auto p = values_inner[0]; |
| 616 | return Lt(p, ScalarLike(p, matrix_dimension - 1)); |
| 617 | }; |
| 618 | |
| 619 | auto while_body_fn_inner = |
| 620 | [&](absl::Span<const XlaOp> values_inner, |
| 621 | XlaBuilder* inner_body_builder) -> StatusOr<std::vector<XlaOp>> { |
| 622 | auto while_cond_fn_innermost = |
| 623 | [&](absl::Span<const XlaOp> values_innermost, |
| 624 | XlaBuilder* innermost_cond_builder) -> StatusOr<XlaOp> { |
| 625 | auto q = values_innermost[1]; |
| 626 | return Lt(q, ScalarLike(q, matrix_dimension)); |
| 627 | }; |
| 628 | auto while_body_fn_innermost = |
| 629 | [&](absl::Span<const XlaOp> values_innermost, |
| 630 | XlaBuilder* innermost_body_builder) |
| 631 | -> StatusOr<std::vector<XlaOp>> { |
| 632 | auto p = values_innermost[0]; |
| 633 | auto q = values_innermost[1]; |
| 634 | |
| 635 | SVDResult onesided_jacobi_update; |
| 636 | onesided_jacobi_update.u = values_innermost[2]; |
| 637 | onesided_jacobi_update.v = values_innermost[3]; |
| 638 | onesided_jacobi_update.d = values_innermost[4]; |
| 639 | |
| 640 | auto eps = values_innermost[5]; |
| 641 | |
| 642 | TF_ASSIGN_OR_RETURN( |
| 643 | onesided_jacobi_update, |
| 644 | OneSidedJacobiUpdate(onesided_jacobi_update, p, q, eps)); |
| 645 |
no test coverage detected