This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
[linalg.scaled.intro]
# 29 Numerics library [[numerics]](./#numerics)
## 29.9 Basic linear algebra algorithms [[linalg]](linalg#scaled.intro)
### 29.9.8 Scaled in-place transformation [[linalg.scaled]](linalg.scaled#intro)
#### 29.9.8.1 Introduction [linalg.scaled.intro]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12572)
The scaled function
takes a value alpha and an mdspan x, and
returns a new read-only mdspan that represents
the elementwise product of alpha with each element of x[.](#1.sentence-1)
[*Example [1](#example-1)*: using Vec = mdspan<double, dextents<size_t, 1>>;
// z = alpha * x + yvoid z_equals_alpha_times_x_plus_y(double alpha, Vec x, Vec y, Vec z) { add(scaled(alpha, x), y, z);}// z = alpha * x + beta * yvoid z_equals_alpha_times_x_plus_beta_times_y(double alpha, Vec x, double beta, Vec y, Vec z) { add(scaled(alpha, x), scaled(beta, y), z);} — *end example*]

View File

@@ -0,0 +1,45 @@
[linalg.scaled.scaled]
# 29 Numerics library [[numerics]](./#numerics)
## 29.9 Basic linear algebra algorithms [[linalg]](linalg#scaled.scaled)
### 29.9.8 Scaled in-place transformation [[linalg.scaled]](linalg.scaled#scaled)
#### 29.9.8.3 Function template scaled [linalg.scaled.scaled]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12712)
The scaled function template takes
a scaling factor alpha and
an mdspan x, and
returns a new read-only mdspan with the same domain as x,
that represents the elementwise product of alpha with each element of x[.](#1.sentence-1)
[🔗](#lib:scaled)
` template<class ScalingFactor,
class ElementType, class Extents, class Layout, class Accessor>
constexpr auto scaled(ScalingFactor alpha, mdspan<ElementType, Extents, Layout, Accessor> x);
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12728)
Let SA be scaled_accessor<ScalingFactor, Accessor>[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12731)
*Returns*: mdspan<typename SA::element_type, Extents, Layout, SA>(x.data_handle(), x.mapping(),
SA(alpha, x.accessor()))
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12739)
[*Example [1](#example-1)*: void test_scaled(mdspan<double, extents<int, 10>> x){auto x_scaled = scaled(5.0, x); for (int i = 0; i < x.extent(0); ++i) { assert(x_scaled[i] == 5.0 * x[i]); }} — *end example*]

View File

@@ -0,0 +1,115 @@
[linalg.scaled.scaledaccessor]
# 29 Numerics library [[numerics]](./#numerics)
## 29.9 Basic linear algebra algorithms [[linalg]](linalg#scaled.scaledaccessor)
### 29.9.8 Scaled in-place transformation [[linalg.scaled]](linalg.scaled#scaledaccessor)
#### 29.9.8.2 Class template scaled_accessor [linalg.scaled.scaledaccessor]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12596)
The class template scaled_accessor is an mdspan accessor policy
which upon access produces scaled elements[.](#1.sentence-1)
It is part of the implementation of scaled ([[linalg.scaled.scaled]](linalg.scaled.scaled "29.9.8.3Function template scaled"))[.](#1.sentence-2)
namespace std::linalg {template<class ScalingFactor, class NestedAccessor>class [scaled_accessor](#lib:scaled_accessor "29.9.8.2Class template scaled_­accessor[linalg.scaled.scaledaccessor]") {public:using element_type = add_const_t<decltype(declval<ScalingFactor>() * declval<NestedAccessor::element_type>())>; using reference = remove_const_t<element_type>; using data_handle_type = NestedAccessor::data_handle_type; using offset_policy = scaled_accessor<ScalingFactor, NestedAccessor::offset_policy>; constexpr scaled_accessor() = default; template<class OtherNestedAccessor>explicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>)constexpr scaled_accessor(const scaled_accessor<ScalingFactor,
OtherNestedAccessor>& other); constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a); constexpr reference access(data_handle_type p, size_t i) const; constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const; constexpr const ScalingFactor& scaling_factor() const noexcept { return *scaling-factor*; }constexpr const NestedAccessor& nested_accessor() const noexcept { return *nested-accessor*; }private: ScalingFactor *scaling-factor*{}; // *exposition only* NestedAccessor *nested-accessor*{}; // *exposition only*};}
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12631)
*Mandates*:
- [(2.1)](#2.1)
element_type is valid and denotes a type,
- [(2.2)](#2.2)
is_copy_constructible_v<reference> is true,
- [(2.3)](#2.3)
is_reference_v<element_type> is false,
- [(2.4)](#2.4)
ScalingFactor models [semiregular](concepts.object#concept:semiregular "18.6Object concepts[concepts.object]"), and
- [(2.5)](#2.5)
NestedAccessor meets the accessor policy requirements ([[mdspan.accessor.reqmts]](mdspan.accessor.reqmts "23.7.3.5.2Requirements"))[.](#2.sentence-1)
[🔗](#lib:scaled_accessor,constructor)
`template<class OtherNestedAccessor>
explicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>)
constexpr scaled_accessor(const scaled_accessor<ScalingFactor, OtherNestedAccessor>& other);
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12654)
*Constraints*: is_constructible_v<NestedAccessor, const OtherNestedAccessor&> is true[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12658)
*Effects*:
- [(4.1)](#4.1)
Direct-non-list-initializes *scaling-factor* with other.scaling_factor(), and
- [(4.2)](#4.2)
direct-non-list-initializes *nested-accessor* with other.nested_accessor()[.](#4.sentence-1)
[🔗](#lib:scaled_accessor,constructor_)
`constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a);
`
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12676)
*Effects*:
- [(5.1)](#5.1)
Direct-non-list-initializes *scaling-factor* with s, and
- [(5.2)](#5.2)
direct-non-list-initializes *nested-accessor* with a[.](#5.sentence-1)
[🔗](#lib:scaled_accessor,access)
`constexpr reference access(data_handle_type p, size_t i) const;
`
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12692)
*Returns*: scaling_factor() * NestedAccessor::element_type(*nested-accessor*.access(p, i))
[🔗](#lib:scaled_accessor,offset)
`constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const;
`
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12705)
*Returns*: *nested-accessor*.offset(p, i)