|
Glas :
Re: [glas] value_type |
>Currently all types that are a model of the NumericValue concept can be
>used as a value_type of a matrix. Do you think this is too restrictive?
>And if yes, what exactly is too restrictive for your case ?
>(the doc for the NumericValue concept is attached)
In order to use matrix multiplication one only needs the underlying type to be a semiring, ie. no assumption need be made about whether the underlying type has a subtraction or division. Examples of semirings without subtraction or division that are widely used in many algorithms are the set {true,flase} with the boolean operations and the set R\union\infty with the operations max() and + (see Cormen, Leiserson, Rivest).
--
Dan Piponi
Glas: NumericValue concept
NumericValue concept
Description
This is the concept for numerical data types used as values in vectors
and matrices.
Currently, the concept contains all operations on values.
This could easily be split up into for example,
AdditiveNumericValue, MultiplicativeNumericValue,
FunctionNumericValue, PrintNumericValue, etc.
Refinement of
DefaultConstructible
Assignable
Associated types
Notation
X |
A type that is a model of NumericValue |
abs_value_traits<X>::type |
Type of modulus or absolute value of type X |
x,y |
Objects of type X |
z |
Object of type convertible to X |
Definitions
Valid expressions
Name |
Expression |
Type requirements |
Return type |
Constructor |
X(z) |
|
X |
Zero member |
zero<X>() |
|
X |
One member |
one<X>() |
|
X |
Addition |
x + y |
|
X |
Addition |
x += y |
|
X |
Negation |
- x |
|
X |
Subtraction |
x - y |
|
X |
Subtraction |
x -= y |
|
X |
Multiplication |
x * y |
|
X |
Multiplication |
x *= y |
|
X |
Division |
x / y |
|
X |
Division |
x /= y |
|
X |
Modulus |
abs(x) |
|
abs_value_traits<X>::type |
Square of modulus |
abs_square(x) |
|
abs_value_traits<X>::type |
Sum of the absolute value of real and imaginary parts |
scalar_abs_sum(x) |
|
abs_value_traits<X>::type |
Maximum of the absolute value of real and imaginary parts |
scalar_abs_max(x) |
|
abs_value_traits<X>::type |
Conjugate |
conj(x) |
|
X |
Expression semantics
Name |
Expression |
Precondition |
Semantics |
Postcondition |
Constructor |
X(z) |
|
|
|
Zero member |
zero<X>() |
|
The zero member is such that a + zero<X>() == a. |
|
One member |
one<X>() |
|
The one member is such that a * one<X>() == a. |
|
Addition |
x + y |
|
|
|
Addition |
x += y |
|
Is equivalent to x = x + y |
|
Negation |
- x |
|
|
|
Subtraction |
x - y |
|
|
|
Subtraction |
x -= y |
|
Is equivalent to x = x - y |
|
Multiplication |
x * y |
|
|
|
Multiplication |
x *= y |
|
Is equivalent to x = x * y |
|
Division |
x / y |
y != zero<X>() |
|
|
Division |
x /= y |
y != zero<X>() |
Is equivalent to x = x / y |
|
Modulus |
abs(x) |
|
|
|
Square of modulus |
abs_square(x) |
|
|
|
Sum of the absolute value of real and imaginary parts |
scalar_abs_sum(x) |
|
|
|
Maximum of the absolute value of real and imaginary parts |
scalar_abs_max(x) |
|
|
|
Conjugate |
conj(x) |
|
|
|
Complexity guarantees
Invariants
- zero<X>() - x == -x
- x - x == zero<X>()
- x / x == one<X>() for x!=zero<X>()
- conj(conj(x)) == x
- x * conj(x) == X(abs_square(x))
Models
- float
- double
- std::complex< float >
- std::complex< double >
Notes