Skip to content

Commit 2eb18f4

Browse files
committed
linalg: scaled(#1233)
1 parent a4fff7c commit 2eb18f4

File tree

6 files changed

+265
-2
lines changed

6 files changed

+265
-2
lines changed

reference/linalg.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ BLAS互換アルゴリズムは、演算対象データの次元数や計算オ
3232
| 名前 | 説明 | 対応バージョン |
3333
|------|------|----------------|
3434
| [`layout_blas_packed`](linalg/layout_blas_packed.md) | 行列要素のBLAS互換パックレイアウトに対応する[レイアウトマッピングポリシー](mdspan/LayoutMappingPolicy.md) (class template) | C++26 |
35-
| [`scaled_accessor`](linalg/scaled_accessor.md.nolink) | `scaled`関数用の[アクセサポリシー](mdspan/AccessorPolicy.md) (class template) | C++26 |
36-
| [`scaled`](linalg/scaled.md.nolink) | 要素値をスカラ倍した読み取り専用`std::mdspan`を作る (function template) | C++26 |
35+
| [`scaled_accessor`](linalg/scaled_accessor.md) | `scaled`関数用の[アクセサポリシー](mdspan/AccessorPolicy.md) (class template) | C++26 |
36+
| [`scaled`](linalg/scaled.md) | 要素値をスカラー倍した読み取り専用`std::mdspan`を作る (function template) | C++26 |
3737
| [`conjugated_accessor`](linalg/conjugated_accessor.md.nolink) | `conjugated`関数用の[アクセサポリシー](mdspan/AccessorPolicy.md) (class template) | C++26 |
3838
| [`conjugated`](linalg/conjugated.md.nolink) | 読み取り専用の複素共役ビュー`std::mdspan`を作る (function template) | C++26 |
3939
| [`layout_transpose`](linalg/layout_transpose.md) | `transposed`関数用の[レイアウトマッピングポリシー](mdspan/LayoutMappingPolicy.md) (class template) | C++26 |

reference/linalg/scaled.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# scaled
2+
* linalg[meta header]
3+
* function template[meta id-type]
4+
* std::linalg[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
template<class ScalingFactor,
9+
class ElementType, class Extents, class Layout, class Accessor>
10+
constexpr auto scaled(ScalingFactor alpha, mdspan<ElementType, Extents, Layout, Accessor> x);
11+
```
12+
* Extents[link /reference/mdspan/extents.md]
13+
* Layout[link /reference/mdspan/LayoutMappingPolicy.md]
14+
* Accessor[link /reference/mdspan/AccessorPolicy.md]
15+
* mdspan[link /reference/mdspan/mdspan.md]
16+
17+
## 概要
18+
多次元配列ビュー[`std::mdspan`](/reference/mdspan/mdspan.md)に対して、要素値がスカラー倍された新しい多次元配列ビューを作る。
19+
20+
本操作により`mdspan`参照先メモリブロックが書き換えられることはなく、戻り値`mdspan`を介した要素アクセス時にスケーリング係数の乗算が行われる。
21+
22+
23+
## 戻り値
24+
説明用の型`SA`を[`scaled_accessor`](scaled_accessor.md)`<ScalingFactor, Accessor>`として、次の値を返す。
25+
26+
```cpp
27+
mdspan<typename SA::element_type, Extents, Layout, SA>(
28+
x.data_handle(), x.mapping(), SA(alpha, x.accessor()))
29+
```
30+
* mdspan[link /reference/mdspan/mdspan.md]
31+
* Extents[link /reference/mdspan/extents.md]
32+
* Layout[link /reference/mdspan/LayoutMappingPolicy.md]
33+
34+
35+
##
36+
```cpp example
37+
#include <cassert>
38+
#include <linalg>
39+
#include <mdspan>
40+
41+
int main()
42+
{
43+
int arr[] = {1, 2, 3, 4};
44+
std::mdspan vec0{arr, std::extents<size_t, 4>{}};
45+
// 1 2 3 4
46+
47+
auto vec1 = std::linalg::scaled(2, vec0);
48+
// 2 4 6 8
49+
assert(vec1[0] == 2);
50+
51+
// linalg::scaled適用後のmdspan要素は読み取り専用となため、
52+
// 例えば vec1[0] == 42; はコンパイルエラーを引き起こす。
53+
}
54+
```
55+
* std::linalg::scaled[color ff0000]
56+
57+
### 出力
58+
```
59+
```
60+
61+
62+
## バージョン
63+
### 言語
64+
- C++26
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): ??
68+
- [GCC](/implementation.md#gcc): ??
69+
- [ICC](/implementation.md#icc): ??
70+
- [Visual C++](/implementation.md#visual_cpp): ??
71+
72+
73+
## 関連項目
74+
- [`mdspan`](/reference/mdspan/mdspan.md)
75+
76+
77+
## 参照
78+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
79+
- [P1674R2: Evolving a Standard C++ Linear Algebra Library from the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1674r2.html)
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# scaled_accessor
2+
* linalg[meta header]
3+
* class template[meta id-type]
4+
* std::linalg[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::linalg {
9+
template<class ScalingFactor, class NestedAccessor>
10+
class scaled_accessor;
11+
}
12+
```
13+
* NestedAccessor[link /reference/mdspan/AccessorPolicy.md]
14+
15+
## 概要
16+
`scaled_accessor`は、多次元配列ビュー[`mdspan`](/reference/mdspan/mdspan.md)の全要素をスカラー倍した多次元配列ビューを表現する[アクセサポリシー](/reference/mdspan/AccessorPolicy.md)クラスである。
17+
18+
`scaled_accessor`クラステンプレートは、要素スカラー倍操作[`scaled`](scaled.md)の戻り値型として利用される。
19+
戻り値`mdspad`の要素型は読み取り専用となる。
20+
21+
### 説明専用メンバ
22+
`scaled_accessor`クラステンプレートは、下記の説明専用メンバ変数を保持する。
23+
24+
- `scaling-factor` : `ScalingFactor`型のスケーリング係数
25+
- `nested-accessor` : `NestedAccessor`型の入れ子アクセサポリシー
26+
27+
28+
## 適格要件
29+
- `element_type`が適格な型であること
30+
- [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)`<reference> == true`
31+
- [`is_reference_v`](/reference/type_traits/is_reference.md)`<element_type> == false`
32+
- `ScalingFactor`が[`semiregular`](/reference/concepts/semiregular.md)のモデルであること
33+
- `NestedAccessor`が[アクセサポリシー](/reference/mdspan/AccessorPolicy.md)要件を満たす
34+
35+
36+
## メンバ関数
37+
38+
| 名前 | 説明 | 対応バージョン |
39+
|------|------|----------------|
40+
| [`(constructor)`](scaled_accessor/op_constructor.md) | コンストラクタ | C++26 |
41+
| `(destructor)` | デストラクタ | C++26 |
42+
| [`access`](scaled_accessor/access.md) | 指定オフセット位置にある要素へアクセスする | C++26 |
43+
| [`offset`](scaled_accessor/offset.md) | 指定オフセット位置のハンドルを取得する | C++26 |
44+
| `scaling_factor` | スケーリング係数`scaling-factor`を取得する | C++26 |
45+
| `nested_accessor` | 入れ子アクセサポリシー`nested-accessor`を取得する | C++26 |
46+
47+
48+
## メンバ型
49+
50+
| 名前 | 説明 | 対応バージョン |
51+
|------|------|----------------|
52+
| `element_type` | [`add_const_t`](/reference/type_traits/add_const.md)`<decltype(declval<ScalingFactor>() * declval<NestedAccessor::element_type>())>` | C++26 |
53+
| `reference` | [`remove_const_t`](/reference/type_traits/remove_const.md)`<element_type>` | C++26 |
54+
| `data_handle_type` | `NestedAccessor::data_handle_type` | C++26 |
55+
| `offset_policy` | `scaled_accessor<ScalingFactor, NestedAccessor::offset_policy>` | C++26 |
56+
57+
58+
## バージョン
59+
### 言語
60+
- C++26
61+
62+
### 処理系
63+
- [Clang](/implementation.md#clang): ??
64+
- [GCC](/implementation.md#gcc): ??
65+
- [ICC](/implementation.md#icc): ??
66+
- [Visual C++](/implementation.md#visual_cpp): ??
67+
68+
69+
## 関連項目
70+
- [`mdspan`](/reference/mdspan/mdspan.md)
71+
- [`scaled`](scaled.md)
72+
73+
74+
## 参照
75+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
76+
- [P1674R2: Evolving a Standard C++ Linear Algebra Library from the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1674r2.html)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# acccess
2+
* linalg[meta header]
3+
* function[meta id-type]
4+
* std::linalg[meta namespace]
5+
* scaled_accessor[meta class]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr reference access(data_handle_type p, size_t i) const;
10+
```
11+
12+
## 概要
13+
指定オフセット位置にある要素へアクセスする。
14+
15+
16+
## 戻り値
17+
`scaling_factor() * NestedAccessor::element_type(nested-accessor.access(p, i))`
18+
19+
20+
## バージョン
21+
### 言語
22+
- C++26
23+
24+
### 処理系
25+
- [Clang](/implementation.md#clang): ??
26+
- [GCC](/implementation.md#gcc): ??
27+
- [ICC](/implementation.md#icc): ??
28+
- [Visual C++](/implementation.md#visual_cpp): ??
29+
30+
31+
## 参照
32+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# offset
2+
* linalg[meta header]
3+
* function[meta id-type]
4+
* std::linalg[meta namespace]
5+
* scaled_accessor[meta class]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const;
10+
```
11+
12+
## 概要
13+
指定オフセット位置のハンドルを取得する。
14+
15+
16+
## 戻り値
17+
`nested-accessor.offset(p, i)`
18+
19+
20+
## バージョン
21+
### 言語
22+
- C++26
23+
24+
### 処理系
25+
- [Clang](/implementation.md#clang): ??
26+
- [GCC](/implementation.md#gcc): ??
27+
- [ICC](/implementation.md#icc): ??
28+
- [Visual C++](/implementation.md#visual_cpp): ??
29+
30+
31+
## 参照
32+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# コンストラクタ
2+
* linalg[meta header]
3+
* function[meta id-type]
4+
* std::linalg[meta namespace]
5+
* scaled_accessor[meta class]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr scaled_accessor() = default; // (1)
10+
11+
template<class OtherNestedAccessor>
12+
explicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>)
13+
constexpr scaled_accessor(const scaled_accessor<ScalingFactor, OtherNestedAccessor>& other); // (2)
14+
15+
constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a); // (3)
16+
```
17+
* is_convertible_v[link /reference/type_traits/is_convertible.md]
18+
* NestedAccessor[link /reference/mdspan/AccessorPolicy.md]
19+
* OtherNestedAccessor[link /reference/mdspan/AccessorPolicy.md]
20+
21+
## 概要
22+
- (1) : デフォルトコンストラクタ
23+
- (2) : 他`scaled_accessor`からの変換コンストラクタ
24+
- (3) : `ScalingFactor`と`NestedAccessor`から構築
25+
26+
27+
## 効果
28+
- (2) : `scaling-factor`を`other.scaling_factor()`で、`nested-accessor`を`other.nested_accessor()`で直接非リスト初期化する。
29+
- (3) : `scaling-factor`を`s`で、`nested-accessor`を`a`で直接非リスト初期化する。
30+
31+
32+
## バージョン
33+
### 言語
34+
- C++26
35+
36+
### 処理系
37+
- [Clang](/implementation.md#clang): ??
38+
- [GCC](/implementation.md#gcc): ??
39+
- [ICC](/implementation.md#icc): ??
40+
- [Visual C++](/implementation.md#visual_cpp): ??
41+
42+
43+
## 参照
44+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)

0 commit comments

Comments
 (0)