[linalg.algs.reqs]

# 29 Numerics library [[numerics]](./#numerics)

## 29.9 Basic linear algebra algorithms [[linalg]](linalg#algs.reqs)

### 29.9.12 Algorithm requirements based on template parameter name [linalg.algs.reqs]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L13321)

Throughout[[linalg.algs.blas1]](linalg.algs.blas1 "29.9.13 BLAS 1 algorithms"), [[linalg.algs.blas2]](linalg.algs.blas2 "29.9.14 BLAS 2 algorithms"), and [[linalg.algs.blas3]](linalg.algs.blas3 "29.9.15 BLAS 3 algorithms"),
where the template parameters are not constrained,
the names of template parameters are used to express the following constraints[.](#1.sentence-1)

- [(1.1)](#1.1)

  is_execution_policy<ExecutionPolicy>​::​value is true ([[execpol.type]](execpol.type "26.3.6.2 Execution policy type trait"))[.](#1.1.sentence-1)

- [(1.2)](#1.2)

  Real is any type such that complex<Real> is
specified ([[complex.numbers.general]](complex.numbers.general "29.4.1 General"))[.](#1.2.sentence-1)

- [(1.3)](#1.3)

  Triangle is either upper_triangle_t or lower_triangle_t[.](#1.3.sentence-1)

- [(1.4)](#1.4)

  DiagonalStorage is
either implicit_unit_diagonal_t or explicit_diagonal_t[.](#1.4.sentence-1)

[*Note [1](#note-1)*:

Function templates that have a template parameter named ExecutionPolicy are parallel algorithms ([[algorithms.parallel.defns]](algorithms.parallel.defns "26.3.1 Preamble"))[.](#1.sentence-2)

â *end note*]
