Skip to content

P3050R2: LEWG review 2024-08-27 and 2024-09-03 #471

Description

@mhoemmen

LEWG review of P3050R2

LEWG started reviewing P3050R2 (Fix C++26 by optimizing linalg::conjugated for noncomplex value types) on 2024-08-27 but didn't finish.

Summary of LEWG's 2024-08-27 discussion

Definition of a (non)complex number type

P3050 follows [linalg], specifically conj-if-needed(E), which is defined as

  1. ADL-found conj(E) if type of E is not an arithmetic type, else
  2. E.

conj already is not ADL-findable for double, etc., which is what we want anyway.

Custom real types and conj

What happens if a user defines conj for their custom real type?

Results will be mathematically correct if user defined it mathematically correctly.

  • Best case: return type same as input type: custom_real conj(const custom_real&)

    • Avoids mixed-type computations if all matrices and vectors are custom_real
  • Worst case: user imitates std::conj by defining custom_complex<custom_real> conj(custom_real)

    • Code may fail to compile if user did not define the right mixed arithmetic operators and/or implicit conversions (but that's the user's fault; they did ask for conjugate_transposed(A))

    • Users are already outside the space of typical std::linalg optimizations. Best they can expect is std::execution::par_unseq.

    • Users may have custom linear algebra algorithms and may use them with std::linalg::conjugated and/or std::linalg::conjugate_transposed, though.

Consider a follow-on proposal to deprecate and replace std::conj

I am not bothered if users write a custom real number type and they define ADL-findable conj to return the custom complex of their real type because that’s weird.... The existing behavior of the Standard is broken. Anyone who works with complex numbers hates this.

  • Consider a follow-on proposal to deprecate std::conj and define a new std::conjugate more rationally

  • Should this wait for language support for customization points?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions