Skip to content

Commit 300f467

Browse files
committed
linalg: layout_* 個別メンバ(#1233)
1 parent dd9230e commit 300f467

File tree

15 files changed

+666
-24
lines changed

15 files changed

+666
-24
lines changed

reference/linalg.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,14 @@ BLAS互換アルゴリズムは、演算対象データの次元数や計算オ
103103

104104
| 名前 | 説明 | 対応バージョン |
105105
|------|------|----------------|
106-
| [`column_major_t`](column_major_t.md.nolink) | 列優先(colmun-major)順序を表現するためのタグ型 (class) | C++26 |
107-
| [`column_major`](column_major_t.md.nolink) | 列優先(colmun-major)順序を表現するためのタグ値 (variable) | C++26 |
108-
| [`row_major_t`](row_major_t.md.nolink) | 行優先(row-major)順序を表現するためのタグ型 (class) | C++26 |
109-
| [`row_major`](row_major_t.md.nolink) | 行優先(row-major)順序を表現するためのタグ値 (variable) | C++26 |
110-
| [`upper_triangle_t`](upper_triangle_t.md.nolink) | 上三角行列を表現するためのタグ型 (class) | C++26 |
111-
| [`upper_triangle`](upper_triangle_t.md.nolink) | 上三角行列を表現するためのタグ値 (variable) | C++26 |
112-
| [`lower_triangle_t`](lower_triangle_t.md.nolink) | 下三角行列を表現するためのタグ型 (class) | C++26 |
113-
| [`lower_triangle`](lower_triangle_t.md.nolink) | 下三角行列を表現するためのタグ値 (variable) | C++26 |
106+
| [`column_major_t`](linalg/column_major_t.md) | 列優先(column-major)順序を表現するためのタグ型 (class) | C++26 |
107+
| [`column_major`](linalg/column_major_t.md) | 列優先(column-major)順序を表現するためのタグ値 (variable) | C++26 |
108+
| [`row_major_t`](linalg/row_major_t.md) | 行優先(row-major)順序を表現するためのタグ型 (class) | C++26 |
109+
| [`row_major`](linalg/row_major_t.md) | 行優先(row-major)順序を表現するためのタグ値 (variable) | C++26 |
110+
| [`upper_triangle_t`](linalg/upper_triangle_t.md.nolink) | 上三角行列を表現するためのタグ型 (class) | C++26 |
111+
| [`upper_triangle`](linalg/upper_triangle_t.md.nolink) | 上三角行列を表現するためのタグ値 (variable) | C++26 |
112+
| [`lower_triangle_t`](linalg/lower_triangle_t.md.nolink) | 下三角行列を表現するためのタグ型 (class) | C++26 |
113+
| [`lower_triangle`](linalg/lower_triangle_t.md.nolink) | 下三角行列を表現するためのタグ値 (variable) | C++26 |
114114
| `implicit_unit_diagonal_t` | implicit unit diagonalを表現するためのタグ型 (class) | C++26 |
115115
| `implicit_unit_diagonal` | implicit unit diagonalを表現するためのタグ値 (variable) | C++26 |
116116
| `explicit_diagonal_t` | explicit diagonalを表現するためのタグ型 (class) | C++26 |

reference/linalg/column_major_t.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# column_major_t
2+
* linalg[meta header]
3+
* class[meta id-type]
4+
* std::linalg[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::linalg {
9+
struct column_major_t { explicit column_major_t() = default; };
10+
11+
inline constexpr column_major_t column_major{};
12+
}
13+
```
14+
15+
## 概要
16+
`column_major_t`は、[`layout_blas_packed`](layout_blas_packed.md)を指定した多次元配列ビュー[`mdspan`](/reference/mdspan/mdspan.md)において、要素の格納順が列優先(column-major)であることを指示するためのタグ型である。
17+
18+
`column_major_t`型の定数`column_major`が提供される。
19+
20+
21+
## バージョン
22+
### 言語
23+
- C++26
24+
25+
### 処理系
26+
- [Clang](/implementation.md#clang): ??
27+
- [GCC](/implementation.md#gcc): ??
28+
- [ICC](/implementation.md#icc): ??
29+
- [Visual C++](/implementation.md#visual_cpp): ??
30+
31+
32+
## 関連項目
33+
- [`mdspan`](/reference/mdspan/mdspan.md)
34+
- [`layout_blas_packed`](layout_blas_packed.md)
35+
36+
37+
## 参照
38+
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)

reference/linalg/layout_blas_packed.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ namespace std::linalg {
1515
`layout_blas_packed`は、多次元配列ビュー[`mdspan`](/reference/mdspan/mdspan.md)を用いた正方行列(square matrix)に対して、BLASにおけるパックレイアウトと互換性のある行列要素メモリ配置を表現する[レイアウトマッピングポリシー](/reference/mdspan/LayoutMappingPolicy.md)クラスである。
1616
1717
- `Triangle` : 指定する行列要素の種別を、上三角[`upper_triangle_t`](upper_triangle_t.md.nolink)または下三角[`lower_triangle_t`](lower_triangle_t.md.nolink)から指定する。
18-
- `StorageOrder` : 行列要素の格納順を、列優先[`column_major_t`](column_major_t.md.nolink)または行優先[`row_major_t`](row_major_t.md.nolink)から指定する。
18+
- `StorageOrder` : 行列要素の格納順を、列優先[`column_major_t`](column_major_t.md)または行優先[`row_major_t`](row_major_t.md)から指定する。
1919
20-
`layout_blas_packed`を用いて、BLASの Symmetric Packed (SP), Hermitian Packed (HP), Triangular Packed (TP) 行列レイアウトを表現できる
20+
`layout_blas_packed`を用いて、BLASの Symmetric Packed (SP), Hermitian Packed (HP), Triangular Packed (TP) で利用される行列レイアウトを表現できる
2121
2222
2323
## 適格要件
2424
- `Triangle`は[`upper_triangle_t`](upper_triangle_t.md.nolink)または[`lower_triangle_t`](lower_triangle_t.md.nolink)のいずれか
25-
- `StorageOrder`は[`column_major_t`](column_major_t.md.nolink)または[`row_major_t`](row_major_t.md.nolink)のいずれか
25+
- `StorageOrder`は[`column_major_t`](column_major_t.md)または[`row_major_t`](row_major_t.md)のいずれか
2626
2727
2828
## メンバ型
@@ -31,7 +31,7 @@ namespace std::linalg {
3131
|------|------|----------------|
3232
| `triangle_type` | `Triangle` | C++26 |
3333
| `storage_order_type` | `StorageOrder` | C++26 |
34-
| [`mapping`](layout_blas_packed/mapping.md) | レイアウトマッピング | C++26 |
34+
| [`mapping`](layout_blas_packed/mapping.md) | レイアウトマッピング (class template) | C++26 |
3535
3636
3737
## 例
@@ -87,8 +87,8 @@ int main()
8787
```
8888
* linalg::layout_blas_packed[color ff0000]
8989
* linalg::lower_triangle_t[link lower_triangle_t.md.nolink]
90-
* linalg::column_major_t[link column_major_t.md.nolink]
91-
* linalg::row_major_t[link row_major_t.md.nolink]
90+
* linalg::column_major_t[link column_major_t.md]
91+
* linalg::row_major_t[link row_major_t.md]
9292
* mat.extent[link /reference/mdspan/mdspan/extent.md]
9393
* std::print[link /reference/print/print.md]
9494
* std::println[link /reference/print/println.md]

reference/linalg/layout_blas_packed/mapping.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace std::linalg {
4444
4545
| 名前 | 説明 | 対応バージョン |
4646
|------|------|----------------|
47-
| [`(constructor)`](mapping/op_constructor.md.nolink) | コンストラクタ | C++26 |
47+
| [`(constructor)`](mapping/op_constructor.md) | コンストラクタ | C++26 |
4848
| `(destructor)` | デストラクタ | C++26 |
4949
| `operator=` | コピー代入演算子 | C++26 |
5050
@@ -53,8 +53,8 @@ namespace std::linalg {
5353
| 名前 | 説明 | 対応バージョン |
5454
|------|------|----------------|
5555
| `extents` | 多次元配列のサイズ`extents_`を取得する | C++26 |
56-
| [`required_span_size`](mapping/required_span_size.md.nolink) | 要素アクセス範囲を取得する | C++26 |
57-
| [`operator()`](mapping/op_call.md.nolink) | 多次元配列インデクスから要素位置へ変換する | C++26 |
56+
| [`required_span_size`](mapping/required_span_size.md) | 要素アクセス範囲を取得する | C++26 |
57+
| [`operator()`](mapping/op_call.md) | 多次元配列インデクスから要素位置へ変換する | C++26 |
5858
| `stride` | 行列サイズ1x1ならば`1` | C++26 |
5959
| `is_unique` | 行列サイズ1x1ならば`true` | C++26 |
6060
| `is_exhaustive` | `true`を返す | C++26 |
@@ -67,7 +67,7 @@ namespace std::linalg {
6767
|------|------|----------------|
6868
| `is_always_unique` | 行または列の静的要素数が1ならば`true` | C++26 |
6969
| `is_always_exhaustive` | `true`を返す | C++26 |
70-
| `is_always_strided` | `is_always_unique();` | C++26 |
70+
| `is_always_strided` | `is_always_unique()` | C++26 |
7171
7272
7373
## メンバ型
@@ -86,8 +86,8 @@ namespace std::linalg {
8686
8787
| 名前 | 説明 | 対応バージョン |
8888
|------|------|----------------|
89-
| [`operator==`](mapping/op_equal.md.nolink) | 等値比較 | C++26 |
90-
| [`operator!=`](mapping/op_equal.md.nolink) | 非等値比較 (`==`により使用可能) | C++26 |
89+
| [`operator==`](mapping/op_equal.md) | 等値比較 | C++26 |
90+
| [`operator!=`](mapping/op_equal.md) | 非等値比較 (`==`により使用可能) | C++26 |
9191
9292
9393
## 例
@@ -120,8 +120,6 @@ int main()
120120
```
121121
* linalg::layout_blas_packed[color ff0000]
122122
* LayoutPacked::mapping[color ff0000]
123-
* linalg::upper_triangle_t[link upper_triangle_t.md.nolink]
124-
* linalg::row_major_t[link row_major_t.md.nolink]
125123
* mat.extent[link /reference/mdspan/mdspan/extent.md]
126124
* std::print[link /reference/print/print.md]
127125
* std::println[link /reference/print/println.md]
@@ -151,4 +149,3 @@ int main()
151149

152150
## 参照
153151
- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html)
154-
- [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: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# operator()
2+
* linalg[meta header]
3+
* function template[meta id-type]
4+
* std::linalg[meta namespace]
5+
* layout_blas_packed::mapping[meta class]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
template<class Index0, class Index1>
10+
constexpr index_type operator() (Index0 ind0, Index1 ind1) const noexcept;
11+
```
12+
13+
## 概要
14+
2次元インデクス値`ind0, ind1`に対応する要素位置を求める。
15+
16+
17+
## テンプレートパラメータ制約
18+
- [`is_convertible_v`](/reference/type_traits/is_convertible.md)`<Index0, index_type> == true`
19+
- [`is_convertible_v`](/reference/type_traits/is_convertible.md)`<Index1, index_type> == true`
20+
- [`is_nothrow_convertible_v`](/reference/type_traits/is_nothrow_convertible.md)`<index_type, Index0> == true`
21+
- [`is_nothrow_convertible_v`](/reference/type_traits/is_nothrow_convertible.md)`<index_type, Index1> == true`
22+
23+
24+
## 事前条件
25+
`i`を[`extents_type::index-cast`](/reference/mdspan/extents/index-cast.md)`(ind0)`、`j`を[`extents_type::index-cast`](/reference/mdspan/extents/index-cast.md)`(ind1)`としたとき、2次元インデクス値`i, j`は多次元配列サイズ`extents_`における有効なインデクスであること。
26+
27+
28+
## 戻り値
29+
`N`を[`extetns_.extent`](/reference/mdspan/extents/extent.md)`(0)`としたとき
30+
- `i > j`ならば`(*this)(j, i)`、そうでなければ
31+
- 下記いずれの条件を満たすならば`i + j * (j + 1)/2`、そうでなければ
32+
- [`is_same_v`](/reference/type_traits/is_same.md)`<StorageOrder, column_major_t> &&` [`is_same_v`](/reference/type_traits/is_same.md)`<Triangle, upper_triangle_t>`が`true`または
33+
- [`is_same_v`](/reference/type_traits/is_same.md)`<StorageOrder, row_major_t> &&` [`is_same_v`](/reference/type_traits/is_same.md)`<Triangle, lower_triangle_t>`が`true`
34+
- `j + N * i - i * (i + 1)/2`
35+
36+
37+
## 例外
38+
投げない
39+
40+
41+
## 例
42+
```cpp example
43+
#include <cassert>
44+
#include <mdspan>
45+
#include <linalg>
46+
namespace linalg = std::linalg;
47+
48+
int main()
49+
{
50+
using Ext3x3 = std::extents<size_t, 3, 3>;
51+
linalg::layout_blas_packed<linalg::lower_triangle_t, linalg::column_major_t>::mapping<Ext3x3> map;
52+
// 0 1 2
53+
// 1 3 4
54+
// 2 4 5
55+
assert(map(0, 0) == 0);
56+
assert(map(0, 1) == 1);
57+
assert(map(2, 1) == 4);
58+
}
59+
```
60+
* mapping[color ff0000]
61+
* linalg::layout_blas_packed[link ../../layout_blas_packed.md]
62+
63+
64+
### 出力
65+
```
66+
```
67+
68+
69+
## バージョン
70+
### 言語
71+
- C++26
72+
73+
### 処理系
74+
- [Clang](/implementation.md#clang): ??
75+
- [GCC](/implementation.md#gcc): ??
76+
- [ICC](/implementation.md#icc): ??
77+
- [Visual C++](/implementation.md#visual_cpp): ??
78+
79+
80+
## 参照
81+
- [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: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# コンストラクタ
2+
* linalg[meta header]
3+
* function[meta id-type]
4+
* std::linalg[meta namespace]
5+
* layout_blas_packed::mapping[meta class]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr mapping() noexcept = default; // (1)
10+
11+
constexpr mapping(const mapping&) noexcept = default; // (2)
12+
13+
constexpr mapping(const extents_type&) noexcept; // (3)
14+
15+
template<class OtherExtents>
16+
constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
17+
mapping(const mapping<OtherExtents>& other) noexcept; // (4)
18+
```
19+
20+
## 概要
21+
- (1) : デフォルトコンストラクタ
22+
- (2) : コピーコンストラクタ
23+
- (3) : [`extents`](/reference/mdspan/extents.md)からの変換コンストラクタ
24+
- (4) : 他`mapping`からの変換コンストラクタ
25+
26+
27+
## テンプレートパラメータ制約
28+
- (4) : [`is_convertible_v`](/reference/type_traits/is_convertible.md)`<extents_type, OtherExtents>`
29+
30+
31+
## 事前条件
32+
- (3) :
33+
- Nを`e.extent(0)`としたとき、N * (N + 1)を`index_type`型で表現できること。
34+
- `e.extent(0) == e.extent(1)`
35+
- (4) :
36+
- Nを`other.extents().extent(0)`としたとき、N * (N + 1)を`index_type`型で表現できること。
37+
38+
39+
## 効果
40+
- (3) : `e`を用いて`extents_`を直接非リスト初期化する。
41+
- (4) : `other.extetns()`を用いて`extents_`を直接非リスト初期化する。
42+
43+
44+
## 例外
45+
投げない
46+
47+
48+
## explicitになる条件
49+
- (4) : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)`<OtherExtents, extents_type>`
50+
51+
52+
## 例
53+
```cpp example
54+
#include <cassert>
55+
#include <mdspan>
56+
#include <linalg>
57+
namespace linalg = std::linalg;
58+
59+
using LayoutPacked = linalg::layout_blas_packed<linalg::lower_triangle_t, linalg::column_major_t>
60+
using Ext3x3 = std::extents<size_t, 3, 3>;
61+
using ExtNxN = std::dextents<size_t, 2>;
62+
63+
int main()
64+
{
65+
// (1) : デフォルトコンストラクタ
66+
{
67+
LayoutPacked::mapping<Ext3x3> map1;
68+
assert(map1.required_span_size() == 6);
69+
}
70+
// (2) : コピーコンストラクタ
71+
{
72+
LayoutPacked::mapping<Ext3x3> map2_a;
73+
LayoutPacked::mapping<Ext3x3> map2_b = map2_a;
74+
assert(map2_a == map2_b);
75+
}
76+
// (3) : extentsからの変換コンストラクタ
77+
{
78+
ExtNxN ext{3, 3};
79+
LayoutPacked::mapping<ExtNxN> map3 = ext;
80+
assert(map3.extents() == ext);
81+
}
82+
// (4) : 他mappingからの変換コンストラクタ
83+
{
84+
LayoutPacked::mapping<Ext3x3> map4_a;
85+
LayoutPacked::mapping<ExtNxN> map4_b = map4_a;
86+
assert(map4_a == map4_b);
87+
}
88+
}
89+
```
90+
* mapping[color ff0000]
91+
* linalg::layout_blas_packed[link ../../layout_blas_packed.md]
92+
93+
94+
### 出力
95+
```
96+
```
97+
98+
99+
## バージョン
100+
### 言語
101+
- C++26
102+
103+
### 処理系
104+
- [Clang](/implementation.md#clang): ??
105+
- [GCC](/implementation.md#gcc): ??
106+
- [ICC](/implementation.md#icc): ??
107+
- [Visual C++](/implementation.md#visual_cpp): ??
108+
109+
110+
## 参照
111+
- [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)