Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
pydensecrf
Commits
da2c1226
Commit
da2c1226
authored
Nov 13, 2015
by
lucasb-eyer
Browse files
Initial import of code.
parent
3ae01ffb
Changes
177
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
6100 additions
and
0 deletions
+6100
-0
densecrf/include/Eigen/src/Core/Block.h
densecrf/include/Eigen/src/Core/Block.h
+357
-0
densecrf/include/Eigen/src/Core/BooleanRedux.h
densecrf/include/Eigen/src/Core/BooleanRedux.h
+138
-0
densecrf/include/Eigen/src/Core/CMakeLists.txt
densecrf/include/Eigen/src/Core/CMakeLists.txt
+10
-0
densecrf/include/Eigen/src/Core/CommaInitializer.h
densecrf/include/Eigen/src/Core/CommaInitializer.h
+141
-0
densecrf/include/Eigen/src/Core/CwiseBinaryOp.h
densecrf/include/Eigen/src/Core/CwiseBinaryOp.h
+229
-0
densecrf/include/Eigen/src/Core/CwiseNullaryOp.h
densecrf/include/Eigen/src/Core/CwiseNullaryOp.h
+864
-0
densecrf/include/Eigen/src/Core/CwiseUnaryOp.h
densecrf/include/Eigen/src/Core/CwiseUnaryOp.h
+126
-0
densecrf/include/Eigen/src/Core/CwiseUnaryView.h
densecrf/include/Eigen/src/Core/CwiseUnaryView.h
+136
-0
densecrf/include/Eigen/src/Core/DenseBase.h
densecrf/include/Eigen/src/Core/DenseBase.h
+533
-0
densecrf/include/Eigen/src/Core/DenseCoeffsBase.h
densecrf/include/Eigen/src/Core/DenseCoeffsBase.h
+754
-0
densecrf/include/Eigen/src/Core/DenseStorage.h
densecrf/include/Eigen/src/Core/DenseStorage.h
+314
-0
densecrf/include/Eigen/src/Core/Diagonal.h
densecrf/include/Eigen/src/Core/Diagonal.h
+236
-0
densecrf/include/Eigen/src/Core/DiagonalMatrix.h
densecrf/include/Eigen/src/Core/DiagonalMatrix.h
+307
-0
densecrf/include/Eigen/src/Core/DiagonalProduct.h
densecrf/include/Eigen/src/Core/DiagonalProduct.h
+123
-0
densecrf/include/Eigen/src/Core/Dot.h
densecrf/include/Eigen/src/Core/Dot.h
+261
-0
densecrf/include/Eigen/src/Core/EigenBase.h
densecrf/include/Eigen/src/Core/EigenBase.h
+160
-0
densecrf/include/Eigen/src/Core/Flagged.h
densecrf/include/Eigen/src/Core/Flagged.h
+140
-0
densecrf/include/Eigen/src/Core/ForceAlignedAccess.h
densecrf/include/Eigen/src/Core/ForceAlignedAccess.h
+146
-0
densecrf/include/Eigen/src/Core/Functors.h
densecrf/include/Eigen/src/Core/Functors.h
+975
-0
densecrf/include/Eigen/src/Core/Fuzzy.h
densecrf/include/Eigen/src/Core/Fuzzy.h
+150
-0
No files found.
Too many changes to show.
To preserve performance only
177 of 177+
files are displayed.
Plain diff
Email patch
densecrf/include/Eigen/src/Core/Block.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_BLOCK_H
#define EIGEN_BLOCK_H
namespace
Eigen
{
/** \class Block
* \ingroup Core_Module
*
* \brief Expression of a fixed-size or dynamic-size block
*
* \param XprType the type of the expression in which we are taking a block
* \param BlockRows the number of rows of the block we are taking at compile time (optional)
* \param BlockCols the number of columns of the block we are taking at compile time (optional)
* \param _DirectAccessStatus \internal used for partial specialization
*
* This class represents an expression of either a fixed-size or dynamic-size block. It is the return
* type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block<int,int>(Index,Index) and
* most of the time this is the only way it is used.
*
* However, if you want to directly maniputate block expressions,
* for instance if you want to write a function returning such an expression, you
* will need to use this class.
*
* Here is an example illustrating the dynamic case:
* \include class_Block.cpp
* Output: \verbinclude class_Block.out
*
* \note Even though this expression has dynamic size, in the case where \a XprType
* has fixed size, this expression inherits a fixed maximal size which means that evaluating
* it does not cause a dynamic memory allocation.
*
* Here is an example illustrating the fixed-size case:
* \include class_FixedBlock.cpp
* Output: \verbinclude class_FixedBlock.out
*
* \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock
*/
namespace
internal
{
template
<
typename
XprType
,
int
BlockRows
,
int
BlockCols
,
bool
InnerPanel
,
bool
HasDirectAccess
>
struct
traits
<
Block
<
XprType
,
BlockRows
,
BlockCols
,
InnerPanel
,
HasDirectAccess
>
>
:
traits
<
XprType
>
{
typedef
typename
traits
<
XprType
>::
Scalar
Scalar
;
typedef
typename
traits
<
XprType
>::
StorageKind
StorageKind
;
typedef
typename
traits
<
XprType
>::
XprKind
XprKind
;
typedef
typename
nested
<
XprType
>::
type
XprTypeNested
;
typedef
typename
remove_reference
<
XprTypeNested
>::
type
_XprTypeNested
;
enum
{
MatrixRows
=
traits
<
XprType
>::
RowsAtCompileTime
,
MatrixCols
=
traits
<
XprType
>::
ColsAtCompileTime
,
RowsAtCompileTime
=
MatrixRows
==
0
?
0
:
BlockRows
,
ColsAtCompileTime
=
MatrixCols
==
0
?
0
:
BlockCols
,
MaxRowsAtCompileTime
=
BlockRows
==
0
?
0
:
RowsAtCompileTime
!=
Dynamic
?
int
(
RowsAtCompileTime
)
:
int
(
traits
<
XprType
>::
MaxRowsAtCompileTime
),
MaxColsAtCompileTime
=
BlockCols
==
0
?
0
:
ColsAtCompileTime
!=
Dynamic
?
int
(
ColsAtCompileTime
)
:
int
(
traits
<
XprType
>::
MaxColsAtCompileTime
),
XprTypeIsRowMajor
=
(
int
(
traits
<
XprType
>::
Flags
)
&
RowMajorBit
)
!=
0
,
IsRowMajor
=
(
MaxRowsAtCompileTime
==
1
&&
MaxColsAtCompileTime
!=
1
)
?
1
:
(
MaxColsAtCompileTime
==
1
&&
MaxRowsAtCompileTime
!=
1
)
?
0
:
XprTypeIsRowMajor
,
HasSameStorageOrderAsXprType
=
(
IsRowMajor
==
XprTypeIsRowMajor
),
InnerSize
=
IsRowMajor
?
int
(
ColsAtCompileTime
)
:
int
(
RowsAtCompileTime
),
InnerStrideAtCompileTime
=
HasSameStorageOrderAsXprType
?
int
(
inner_stride_at_compile_time
<
XprType
>::
ret
)
:
int
(
outer_stride_at_compile_time
<
XprType
>::
ret
),
OuterStrideAtCompileTime
=
HasSameStorageOrderAsXprType
?
int
(
outer_stride_at_compile_time
<
XprType
>::
ret
)
:
int
(
inner_stride_at_compile_time
<
XprType
>::
ret
),
MaskPacketAccessBit
=
(
InnerSize
==
Dynamic
||
(
InnerSize
%
packet_traits
<
Scalar
>::
size
)
==
0
)
&&
(
InnerStrideAtCompileTime
==
1
)
?
PacketAccessBit
:
0
,
MaskAlignedBit
=
(
InnerPanel
&&
(
OuterStrideAtCompileTime
!=
Dynamic
)
&&
(((
OuterStrideAtCompileTime
*
int
(
sizeof
(
Scalar
)))
%
16
)
==
0
))
?
AlignedBit
:
0
,
FlagsLinearAccessBit
=
(
RowsAtCompileTime
==
1
||
ColsAtCompileTime
==
1
)
?
LinearAccessBit
:
0
,
FlagsLvalueBit
=
is_lvalue
<
XprType
>::
value
?
LvalueBit
:
0
,
FlagsRowMajorBit
=
IsRowMajor
?
RowMajorBit
:
0
,
Flags0
=
traits
<
XprType
>::
Flags
&
(
(
HereditaryBits
&
~
RowMajorBit
)
|
DirectAccessBit
|
MaskPacketAccessBit
|
MaskAlignedBit
),
Flags
=
Flags0
|
FlagsLinearAccessBit
|
FlagsLvalueBit
|
FlagsRowMajorBit
};
};
}
template
<
typename
XprType
,
int
BlockRows
,
int
BlockCols
,
bool
InnerPanel
,
bool
HasDirectAccess
>
class
Block
:
public
internal
::
dense_xpr_base
<
Block
<
XprType
,
BlockRows
,
BlockCols
,
InnerPanel
,
HasDirectAccess
>
>::
type
{
public:
typedef
typename
internal
::
dense_xpr_base
<
Block
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Block
)
class
InnerIterator
;
/** Column or Row constructor
*/
inline
Block
(
XprType
&
xpr
,
Index
i
)
:
m_xpr
(
xpr
),
// It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime,
// and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1,
// all other cases are invalid.
// The case a 1x1 matrix seems ambiguous, but the result is the same anyway.
m_startRow
(
(
BlockRows
==
1
)
&&
(
BlockCols
==
XprType
::
ColsAtCompileTime
)
?
i
:
0
),
m_startCol
(
(
BlockRows
==
XprType
::
RowsAtCompileTime
)
&&
(
BlockCols
==
1
)
?
i
:
0
),
m_blockRows
(
BlockRows
==
1
?
1
:
xpr
.
rows
()),
m_blockCols
(
BlockCols
==
1
?
1
:
xpr
.
cols
())
{
eigen_assert
(
(
i
>=
0
)
&&
(
((
BlockRows
==
1
)
&&
(
BlockCols
==
XprType
::
ColsAtCompileTime
)
&&
i
<
xpr
.
rows
())
||
((
BlockRows
==
XprType
::
RowsAtCompileTime
)
&&
(
BlockCols
==
1
)
&&
i
<
xpr
.
cols
())));
}
/** Fixed-size constructor
*/
inline
Block
(
XprType
&
xpr
,
Index
startRow
,
Index
startCol
)
:
m_xpr
(
xpr
),
m_startRow
(
startRow
),
m_startCol
(
startCol
),
m_blockRows
(
BlockRows
),
m_blockCols
(
BlockCols
)
{
EIGEN_STATIC_ASSERT
(
RowsAtCompileTime
!=
Dynamic
&&
ColsAtCompileTime
!=
Dynamic
,
THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE
)
eigen_assert
(
startRow
>=
0
&&
BlockRows
>=
1
&&
startRow
+
BlockRows
<=
xpr
.
rows
()
&&
startCol
>=
0
&&
BlockCols
>=
1
&&
startCol
+
BlockCols
<=
xpr
.
cols
());
}
/** Dynamic-size constructor
*/
inline
Block
(
XprType
&
xpr
,
Index
startRow
,
Index
startCol
,
Index
blockRows
,
Index
blockCols
)
:
m_xpr
(
xpr
),
m_startRow
(
startRow
),
m_startCol
(
startCol
),
m_blockRows
(
blockRows
),
m_blockCols
(
blockCols
)
{
eigen_assert
((
RowsAtCompileTime
==
Dynamic
||
RowsAtCompileTime
==
blockRows
)
&&
(
ColsAtCompileTime
==
Dynamic
||
ColsAtCompileTime
==
blockCols
));
eigen_assert
(
startRow
>=
0
&&
blockRows
>=
0
&&
startRow
+
blockRows
<=
xpr
.
rows
()
&&
startCol
>=
0
&&
blockCols
>=
0
&&
startCol
+
blockCols
<=
xpr
.
cols
());
}
EIGEN_INHERIT_ASSIGNMENT_OPERATORS
(
Block
)
inline
Index
rows
()
const
{
return
m_blockRows
.
value
();
}
inline
Index
cols
()
const
{
return
m_blockCols
.
value
();
}
inline
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
{
EIGEN_STATIC_ASSERT_LVALUE
(
XprType
)
return
m_xpr
.
const_cast_derived
()
.
coeffRef
(
row
+
m_startRow
.
value
(),
col
+
m_startCol
.
value
());
}
inline
const
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
const
{
return
m_xpr
.
derived
()
.
coeffRef
(
row
+
m_startRow
.
value
(),
col
+
m_startCol
.
value
());
}
EIGEN_STRONG_INLINE
const
CoeffReturnType
coeff
(
Index
row
,
Index
col
)
const
{
return
m_xpr
.
coeff
(
row
+
m_startRow
.
value
(),
col
+
m_startCol
.
value
());
}
inline
Scalar
&
coeffRef
(
Index
index
)
{
EIGEN_STATIC_ASSERT_LVALUE
(
XprType
)
return
m_xpr
.
const_cast_derived
()
.
coeffRef
(
m_startRow
.
value
()
+
(
RowsAtCompileTime
==
1
?
0
:
index
),
m_startCol
.
value
()
+
(
RowsAtCompileTime
==
1
?
index
:
0
));
}
inline
const
Scalar
&
coeffRef
(
Index
index
)
const
{
return
m_xpr
.
const_cast_derived
()
.
coeffRef
(
m_startRow
.
value
()
+
(
RowsAtCompileTime
==
1
?
0
:
index
),
m_startCol
.
value
()
+
(
RowsAtCompileTime
==
1
?
index
:
0
));
}
inline
const
CoeffReturnType
coeff
(
Index
index
)
const
{
return
m_xpr
.
coeff
(
m_startRow
.
value
()
+
(
RowsAtCompileTime
==
1
?
0
:
index
),
m_startCol
.
value
()
+
(
RowsAtCompileTime
==
1
?
index
:
0
));
}
template
<
int
LoadMode
>
inline
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
return
m_xpr
.
template
packet
<
Unaligned
>
(
row
+
m_startRow
.
value
(),
col
+
m_startCol
.
value
());
}
template
<
int
LoadMode
>
inline
void
writePacket
(
Index
row
,
Index
col
,
const
PacketScalar
&
x
)
{
m_xpr
.
const_cast_derived
().
template
writePacket
<
Unaligned
>
(
row
+
m_startRow
.
value
(),
col
+
m_startCol
.
value
(),
x
);
}
template
<
int
LoadMode
>
inline
PacketScalar
packet
(
Index
index
)
const
{
return
m_xpr
.
template
packet
<
Unaligned
>
(
m_startRow
.
value
()
+
(
RowsAtCompileTime
==
1
?
0
:
index
),
m_startCol
.
value
()
+
(
RowsAtCompileTime
==
1
?
index
:
0
));
}
template
<
int
LoadMode
>
inline
void
writePacket
(
Index
index
,
const
PacketScalar
&
x
)
{
m_xpr
.
const_cast_derived
().
template
writePacket
<
Unaligned
>
(
m_startRow
.
value
()
+
(
RowsAtCompileTime
==
1
?
0
:
index
),
m_startCol
.
value
()
+
(
RowsAtCompileTime
==
1
?
index
:
0
),
x
);
}
#ifdef EIGEN_PARSED_BY_DOXYGEN
/** \sa MapBase::data() */
inline
const
Scalar
*
data
()
const
;
inline
Index
innerStride
()
const
;
inline
Index
outerStride
()
const
;
#endif
const
typename
internal
::
remove_all
<
typename
XprType
::
Nested
>::
type
&
nestedExpression
()
const
{
return
m_xpr
;
}
Index
startRow
()
const
{
return
m_startRow
.
value
();
}
Index
startCol
()
const
{
return
m_startCol
.
value
();
}
protected:
const
typename
XprType
::
Nested
m_xpr
;
const
internal
::
variable_if_dynamic
<
Index
,
XprType
::
RowsAtCompileTime
==
1
?
0
:
Dynamic
>
m_startRow
;
const
internal
::
variable_if_dynamic
<
Index
,
XprType
::
ColsAtCompileTime
==
1
?
0
:
Dynamic
>
m_startCol
;
const
internal
::
variable_if_dynamic
<
Index
,
RowsAtCompileTime
>
m_blockRows
;
const
internal
::
variable_if_dynamic
<
Index
,
ColsAtCompileTime
>
m_blockCols
;
};
/** \internal */
template
<
typename
XprType
,
int
BlockRows
,
int
BlockCols
,
bool
InnerPanel
>
class
Block
<
XprType
,
BlockRows
,
BlockCols
,
InnerPanel
,
true
>
:
public
MapBase
<
Block
<
XprType
,
BlockRows
,
BlockCols
,
InnerPanel
,
true
>
>
{
public:
typedef
MapBase
<
Block
>
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Block
)
EIGEN_INHERIT_ASSIGNMENT_OPERATORS
(
Block
)
/** Column or Row constructor
*/
inline
Block
(
XprType
&
xpr
,
Index
i
)
:
Base
(
internal
::
const_cast_ptr
(
&
xpr
.
coeffRef
(
(
BlockRows
==
1
)
&&
(
BlockCols
==
XprType
::
ColsAtCompileTime
)
?
i
:
0
,
(
BlockRows
==
XprType
::
RowsAtCompileTime
)
&&
(
BlockCols
==
1
)
?
i
:
0
)),
BlockRows
==
1
?
1
:
xpr
.
rows
(),
BlockCols
==
1
?
1
:
xpr
.
cols
()),
m_xpr
(
xpr
)
{
eigen_assert
(
(
i
>=
0
)
&&
(
((
BlockRows
==
1
)
&&
(
BlockCols
==
XprType
::
ColsAtCompileTime
)
&&
i
<
xpr
.
rows
())
||
((
BlockRows
==
XprType
::
RowsAtCompileTime
)
&&
(
BlockCols
==
1
)
&&
i
<
xpr
.
cols
())));
init
();
}
/** Fixed-size constructor
*/
inline
Block
(
XprType
&
xpr
,
Index
startRow
,
Index
startCol
)
:
Base
(
internal
::
const_cast_ptr
(
&
xpr
.
coeffRef
(
startRow
,
startCol
))),
m_xpr
(
xpr
)
{
eigen_assert
(
startRow
>=
0
&&
BlockRows
>=
1
&&
startRow
+
BlockRows
<=
xpr
.
rows
()
&&
startCol
>=
0
&&
BlockCols
>=
1
&&
startCol
+
BlockCols
<=
xpr
.
cols
());
init
();
}
/** Dynamic-size constructor
*/
inline
Block
(
XprType
&
xpr
,
Index
startRow
,
Index
startCol
,
Index
blockRows
,
Index
blockCols
)
:
Base
(
internal
::
const_cast_ptr
(
&
xpr
.
coeffRef
(
startRow
,
startCol
)),
blockRows
,
blockCols
),
m_xpr
(
xpr
)
{
eigen_assert
((
RowsAtCompileTime
==
Dynamic
||
RowsAtCompileTime
==
blockRows
)
&&
(
ColsAtCompileTime
==
Dynamic
||
ColsAtCompileTime
==
blockCols
));
eigen_assert
(
startRow
>=
0
&&
blockRows
>=
0
&&
startRow
+
blockRows
<=
xpr
.
rows
()
&&
startCol
>=
0
&&
blockCols
>=
0
&&
startCol
+
blockCols
<=
xpr
.
cols
());
init
();
}
const
typename
internal
::
remove_all
<
typename
XprType
::
Nested
>::
type
&
nestedExpression
()
const
{
return
m_xpr
;
}
/** \sa MapBase::innerStride() */
inline
Index
innerStride
()
const
{
return
internal
::
traits
<
Block
>::
HasSameStorageOrderAsXprType
?
m_xpr
.
innerStride
()
:
m_xpr
.
outerStride
();
}
/** \sa MapBase::outerStride() */
inline
Index
outerStride
()
const
{
return
m_outerStride
;
}
#ifndef __SUNPRO_CC
// FIXME sunstudio is not friendly with the above friend...
// META-FIXME there is no 'friend' keyword around here. Is this obsolete?
protected:
#endif
#ifndef EIGEN_PARSED_BY_DOXYGEN
/** \internal used by allowAligned() */
inline
Block
(
XprType
&
xpr
,
const
Scalar
*
data
,
Index
blockRows
,
Index
blockCols
)
:
Base
(
data
,
blockRows
,
blockCols
),
m_xpr
(
xpr
)
{
init
();
}
#endif
protected:
void
init
()
{
m_outerStride
=
internal
::
traits
<
Block
>::
HasSameStorageOrderAsXprType
?
m_xpr
.
outerStride
()
:
m_xpr
.
innerStride
();
}
typename
XprType
::
Nested
m_xpr
;
Index
m_outerStride
;
};
}
// end namespace Eigen
#endif // EIGEN_BLOCK_H
densecrf/include/Eigen/src/Core/BooleanRedux.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_ALLANDANY_H
#define EIGEN_ALLANDANY_H
namespace
Eigen
{
namespace
internal
{
template
<
typename
Derived
,
int
UnrollCount
>
struct
all_unroller
{
enum
{
col
=
(
UnrollCount
-
1
)
/
Derived
::
RowsAtCompileTime
,
row
=
(
UnrollCount
-
1
)
%
Derived
::
RowsAtCompileTime
};
static
inline
bool
run
(
const
Derived
&
mat
)
{
return
all_unroller
<
Derived
,
UnrollCount
-
1
>::
run
(
mat
)
&&
mat
.
coeff
(
row
,
col
);
}
};
template
<
typename
Derived
>
struct
all_unroller
<
Derived
,
1
>
{
static
inline
bool
run
(
const
Derived
&
mat
)
{
return
mat
.
coeff
(
0
,
0
);
}
};
template
<
typename
Derived
>
struct
all_unroller
<
Derived
,
Dynamic
>
{
static
inline
bool
run
(
const
Derived
&
)
{
return
false
;
}
};
template
<
typename
Derived
,
int
UnrollCount
>
struct
any_unroller
{
enum
{
col
=
(
UnrollCount
-
1
)
/
Derived
::
RowsAtCompileTime
,
row
=
(
UnrollCount
-
1
)
%
Derived
::
RowsAtCompileTime
};
static
inline
bool
run
(
const
Derived
&
mat
)
{
return
any_unroller
<
Derived
,
UnrollCount
-
1
>::
run
(
mat
)
||
mat
.
coeff
(
row
,
col
);
}
};
template
<
typename
Derived
>
struct
any_unroller
<
Derived
,
1
>
{
static
inline
bool
run
(
const
Derived
&
mat
)
{
return
mat
.
coeff
(
0
,
0
);
}
};
template
<
typename
Derived
>
struct
any_unroller
<
Derived
,
Dynamic
>
{
static
inline
bool
run
(
const
Derived
&
)
{
return
false
;
}
};
}
// end namespace internal
/** \returns true if all coefficients are true
*
* Example: \include MatrixBase_all.cpp
* Output: \verbinclude MatrixBase_all.out
*
* \sa any(), Cwise::operator<()
*/
template
<
typename
Derived
>
inline
bool
DenseBase
<
Derived
>::
all
()
const
{
enum
{
unroll
=
SizeAtCompileTime
!=
Dynamic
&&
CoeffReadCost
!=
Dynamic
&&
NumTraits
<
Scalar
>::
AddCost
!=
Dynamic
&&
SizeAtCompileTime
*
(
CoeffReadCost
+
NumTraits
<
Scalar
>::
AddCost
)
<=
EIGEN_UNROLLING_LIMIT
};
if
(
unroll
)
return
internal
::
all_unroller
<
Derived
,
unroll
?
int
(
SizeAtCompileTime
)
:
Dynamic
>::
run
(
derived
());
else
{
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
for
(
Index
i
=
0
;
i
<
rows
();
++
i
)
if
(
!
coeff
(
i
,
j
))
return
false
;
return
true
;
}
}
/** \returns true if at least one coefficient is true
*
* \sa all()
*/
template
<
typename
Derived
>
inline
bool
DenseBase
<
Derived
>::
any
()
const
{
enum
{
unroll
=
SizeAtCompileTime
!=
Dynamic
&&
CoeffReadCost
!=
Dynamic
&&
NumTraits
<
Scalar
>::
AddCost
!=
Dynamic
&&
SizeAtCompileTime
*
(
CoeffReadCost
+
NumTraits
<
Scalar
>::
AddCost
)
<=
EIGEN_UNROLLING_LIMIT
};
if
(
unroll
)
return
internal
::
any_unroller
<
Derived
,
unroll
?
int
(
SizeAtCompileTime
)
:
Dynamic
>::
run
(
derived
());
else
{
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
for
(
Index
i
=
0
;
i
<
rows
();
++
i
)
if
(
coeff
(
i
,
j
))
return
true
;
return
false
;
}
}
/** \returns the number of coefficients which evaluate to true
*
* \sa all(), any()
*/
template
<
typename
Derived
>
inline
typename
DenseBase
<
Derived
>::
Index
DenseBase
<
Derived
>::
count
()
const
{
return
derived
().
template
cast
<
bool
>().
template
cast
<
Index
>().
sum
();
}
}
// end namespace Eigen
#endif // EIGEN_ALLANDANY_H
densecrf/include/Eigen/src/Core/CMakeLists.txt
0 → 100644
View file @
da2c1226
FILE
(
GLOB Eigen_Core_SRCS
"*.h"
)
INSTALL
(
FILES
${
Eigen_Core_SRCS
}
DESTINATION
${
INCLUDE_INSTALL_DIR
}
/Eigen/src/Core COMPONENT Devel
)
ADD_SUBDIRECTORY
(
products
)
ADD_SUBDIRECTORY
(
util
)
ADD_SUBDIRECTORY
(
arch
)
densecrf/include/Eigen/src/Core/CommaInitializer.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_COMMAINITIALIZER_H
#define EIGEN_COMMAINITIALIZER_H
namespace
Eigen
{
/** \class CommaInitializer
* \ingroup Core_Module
*
* \brief Helper class used by the comma initializer operator
*
* This class is internally used to implement the comma initializer feature. It is
* the return type of MatrixBase::operator<<, and most of the time this is the only
* way it is used.
*
* \sa \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished()
*/
template
<
typename
XprType
>
struct
CommaInitializer
{
typedef
typename
XprType
::
Scalar
Scalar
;
typedef
typename
XprType
::
Index
Index
;
inline
CommaInitializer
(
XprType
&
xpr
,
const
Scalar
&
s
)
:
m_xpr
(
xpr
),
m_row
(
0
),
m_col
(
1
),
m_currentBlockRows
(
1
)
{
m_xpr
.
coeffRef
(
0
,
0
)
=
s
;
}
template
<
typename
OtherDerived
>
inline
CommaInitializer
(
XprType
&
xpr
,
const
DenseBase
<
OtherDerived
>&
other
)
:
m_xpr
(
xpr
),
m_row
(
0
),
m_col
(
other
.
cols
()),
m_currentBlockRows
(
other
.
rows
())
{
m_xpr
.
block
(
0
,
0
,
other
.
rows
(),
other
.
cols
())
=
other
;
}
/* inserts a scalar value in the target matrix */
CommaInitializer
&
operator
,(
const
Scalar
&
s
)
{
if
(
m_col
==
m_xpr
.
cols
())
{
m_row
+=
m_currentBlockRows
;
m_col
=
0
;
m_currentBlockRows
=
1
;
eigen_assert
(
m_row
<
m_xpr
.
rows
()
&&
"Too many rows passed to comma initializer (operator<<)"
);
}
eigen_assert
(
m_col
<
m_xpr
.
cols
()
&&
"Too many coefficients passed to comma initializer (operator<<)"
);
eigen_assert
(
m_currentBlockRows
==
1
);
m_xpr
.
coeffRef
(
m_row
,
m_col
++
)
=
s
;
return
*
this
;
}
/* inserts a matrix expression in the target matrix */
template
<
typename
OtherDerived
>
CommaInitializer
&
operator
,(
const
DenseBase
<
OtherDerived
>&
other
)
{
if
(
other
.
cols
()
==
0
||
other
.
rows
()
==
0
)
return
*
this
;
if
(
m_col
==
m_xpr
.
cols
())
{
m_row
+=
m_currentBlockRows
;
m_col
=
0
;
m_currentBlockRows
=
other
.
rows
();
eigen_assert
(
m_row
+
m_currentBlockRows
<=
m_xpr
.
rows
()
&&
"Too many rows passed to comma initializer (operator<<)"
);
}
eigen_assert
(
m_col
<
m_xpr
.
cols
()
&&
"Too many coefficients passed to comma initializer (operator<<)"
);
eigen_assert
(
m_currentBlockRows
==
other
.
rows
());
if
(
OtherDerived
::
SizeAtCompileTime
!=
Dynamic
)
m_xpr
.
template
block
<
OtherDerived
::
RowsAtCompileTime
!=
Dynamic
?
OtherDerived
::
RowsAtCompileTime
:
1
,
OtherDerived
::
ColsAtCompileTime
!=
Dynamic
?
OtherDerived
::
ColsAtCompileTime
:
1
>
(
m_row
,
m_col
)
=
other
;
else
m_xpr
.
block
(
m_row
,
m_col
,
other
.
rows
(),
other
.
cols
())
=
other
;
m_col
+=
other
.
cols
();
return
*
this
;
}
inline
~
CommaInitializer
()
{
eigen_assert
((
m_row
+
m_currentBlockRows
)
==
m_xpr
.
rows
()
&&
m_col
==
m_xpr
.
cols
()
&&
"Too few coefficients passed to comma initializer (operator<<)"
);
}
/** \returns the built matrix once all its coefficients have been set.
* Calling finished is 100% optional. Its purpose is to write expressions
* like this:
* \code
* quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished());
* \endcode
*/
inline
XprType
&
finished
()
{
return
m_xpr
;
}
XprType
&
m_xpr
;
// target expression
Index
m_row
;
// current row id
Index
m_col
;
// current col id
Index
m_currentBlockRows
;
// current block height
};
/** \anchor MatrixBaseCommaInitRef
* Convenient operator to set the coefficients of a matrix.
*
* The coefficients must be provided in a row major order and exactly match
* the size of the matrix. Otherwise an assertion is raised.
*
* Example: \include MatrixBase_set.cpp
* Output: \verbinclude MatrixBase_set.out
*
* \sa CommaInitializer::finished(), class CommaInitializer
*/
template
<
typename
Derived
>
inline
CommaInitializer
<
Derived
>
DenseBase
<
Derived
>::
operator
<<
(
const
Scalar
&
s
)
{
return
CommaInitializer
<
Derived
>
(
*
static_cast
<
Derived
*>
(
this
),
s
);
}
/** \sa operator<<(const Scalar&) */
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
inline
CommaInitializer
<
Derived
>
DenseBase
<
Derived
>::
operator
<<
(
const
DenseBase
<
OtherDerived
>&
other
)
{
return
CommaInitializer
<
Derived
>
(
*
static_cast
<
Derived
*>
(
this
),
other
);
}
}
// end namespace Eigen
#endif // EIGEN_COMMAINITIALIZER_H
densecrf/include/Eigen/src/Core/CwiseBinaryOp.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_CWISE_BINARY_OP_H
#define EIGEN_CWISE_BINARY_OP_H
namespace
Eigen
{
/** \class CwiseBinaryOp
* \ingroup Core_Module
*
* \brief Generic expression where a coefficient-wise binary operator is applied to two expressions
*
* \param BinaryOp template functor implementing the operator
* \param Lhs the type of the left-hand side
* \param Rhs the type of the right-hand side
*
* This class represents an expression where a coefficient-wise binary operator is applied to two expressions.
* It is the return type of binary operators, by which we mean only those binary operators where
* both the left-hand side and the right-hand side are Eigen expressions.
* For example, the return type of matrix1+matrix2 is a CwiseBinaryOp.
*
* Most of the time, this is the only way that it is used, so you typically don't have to name
* CwiseBinaryOp types explicitly.
*
* \sa MatrixBase::binaryExpr(const MatrixBase<OtherDerived> &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp
*/
namespace
internal
{
template
<
typename
BinaryOp
,
typename
Lhs
,
typename
Rhs
>
struct
traits
<
CwiseBinaryOp
<
BinaryOp
,
Lhs
,
Rhs
>
>
{
// we must not inherit from traits<Lhs> since it has
// the potential to cause problems with MSVC
typedef
typename
remove_all
<
Lhs
>::
type
Ancestor
;
typedef
typename
traits
<
Ancestor
>::
XprKind
XprKind
;
enum
{
RowsAtCompileTime
=
traits
<
Ancestor
>::
RowsAtCompileTime
,
ColsAtCompileTime
=
traits
<
Ancestor
>::
ColsAtCompileTime
,
MaxRowsAtCompileTime
=
traits
<
Ancestor
>::
MaxRowsAtCompileTime
,
MaxColsAtCompileTime
=
traits
<
Ancestor
>::
MaxColsAtCompileTime
};
// even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor),
// we still want to handle the case when the result type is different.
typedef
typename
result_of
<
BinaryOp
(
typename
Lhs
::
Scalar
,
typename
Rhs
::
Scalar
)
>::
type
Scalar
;
typedef
typename
promote_storage_type
<
typename
traits
<
Lhs
>::
StorageKind
,
typename
traits
<
Rhs
>::
StorageKind
>::
ret
StorageKind
;
typedef
typename
promote_index_type
<
typename
traits
<
Lhs
>::
Index
,
typename
traits
<
Rhs
>::
Index
>::
type
Index
;
typedef
typename
Lhs
::
Nested
LhsNested
;
typedef
typename
Rhs
::
Nested
RhsNested
;
typedef
typename
remove_reference
<
LhsNested
>::
type
_LhsNested
;
typedef
typename
remove_reference
<
RhsNested
>::
type
_RhsNested
;
enum
{
LhsCoeffReadCost
=
_LhsNested
::
CoeffReadCost
,
RhsCoeffReadCost
=
_RhsNested
::
CoeffReadCost
,
LhsFlags
=
_LhsNested
::
Flags
,
RhsFlags
=
_RhsNested
::
Flags
,
SameType
=
is_same
<
typename
_LhsNested
::
Scalar
,
typename
_RhsNested
::
Scalar
>::
value
,
StorageOrdersAgree
=
(
int
(
Lhs
::
Flags
)
&
RowMajorBit
)
==
(
int
(
Rhs
::
Flags
)
&
RowMajorBit
),
Flags0
=
(
int
(
LhsFlags
)
|
int
(
RhsFlags
))
&
(
HereditaryBits
|
(
int
(
LhsFlags
)
&
int
(
RhsFlags
)
&
(
AlignedBit
|
(
StorageOrdersAgree
?
LinearAccessBit
:
0
)
|
(
functor_traits
<
BinaryOp
>::
PacketAccess
&&
StorageOrdersAgree
&&
SameType
?
PacketAccessBit
:
0
)
)
)
),
Flags
=
(
Flags0
&
~
RowMajorBit
)
|
(
LhsFlags
&
RowMajorBit
),
CoeffReadCost
=
LhsCoeffReadCost
+
RhsCoeffReadCost
+
functor_traits
<
BinaryOp
>::
Cost
};
};
}
// end namespace internal
// we require Lhs and Rhs to have the same scalar type. Currently there is no example of a binary functor
// that would take two operands of different types. If there were such an example, then this check should be
// moved to the BinaryOp functors, on a per-case basis. This would however require a change in the BinaryOp functors, as
// currently they take only one typename Scalar template parameter.
// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized paths.
// So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user tries to
// add together a float matrix and a double matrix.
#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
EIGEN_STATIC_ASSERT((internal::functor_allows_mixing_real_and_complex<BINOP>::ret \
? int(internal::is_same<typename NumTraits<LHS>::Real, typename NumTraits<RHS>::Real>::value) \
: int(internal::is_same<LHS, RHS>::value)), \
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
template
<
typename
BinaryOp
,
typename
Lhs
,
typename
Rhs
,
typename
StorageKind
>
class
CwiseBinaryOpImpl
;
template
<
typename
BinaryOp
,
typename
Lhs
,
typename
Rhs
>
class
CwiseBinaryOp
:
internal
::
no_assignment_operator
,
public
CwiseBinaryOpImpl
<
BinaryOp
,
Lhs
,
Rhs
,
typename
internal
::
promote_storage_type
<
typename
internal
::
traits
<
Lhs
>::
StorageKind
,
typename
internal
::
traits
<
Rhs
>::
StorageKind
>::
ret
>
{
public:
typedef
typename
CwiseBinaryOpImpl
<
BinaryOp
,
Lhs
,
Rhs
,
typename
internal
::
promote_storage_type
<
typename
internal
::
traits
<
Lhs
>::
StorageKind
,
typename
internal
::
traits
<
Rhs
>::
StorageKind
>::
ret
>::
Base
Base
;
EIGEN_GENERIC_PUBLIC_INTERFACE
(
CwiseBinaryOp
)
typedef
typename
internal
::
nested
<
Lhs
>::
type
LhsNested
;
typedef
typename
internal
::
nested
<
Rhs
>::
type
RhsNested
;
typedef
typename
internal
::
remove_reference
<
LhsNested
>::
type
_LhsNested
;
typedef
typename
internal
::
remove_reference
<
RhsNested
>::
type
_RhsNested
;
EIGEN_STRONG_INLINE
CwiseBinaryOp
(
const
Lhs
&
lhs
,
const
Rhs
&
rhs
,
const
BinaryOp
&
func
=
BinaryOp
())
:
m_lhs
(
lhs
),
m_rhs
(
rhs
),
m_functor
(
func
)
{
EIGEN_CHECK_BINARY_COMPATIBILIY
(
BinaryOp
,
typename
Lhs
::
Scalar
,
typename
Rhs
::
Scalar
);
// require the sizes to match
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE
(
Lhs
,
Rhs
)
eigen_assert
(
lhs
.
rows
()
==
rhs
.
rows
()
&&
lhs
.
cols
()
==
rhs
.
cols
());
}
EIGEN_STRONG_INLINE
Index
rows
()
const
{
// return the fixed size type if available to enable compile time optimizations
if
(
internal
::
traits
<
typename
internal
::
remove_all
<
LhsNested
>::
type
>::
RowsAtCompileTime
==
Dynamic
)
return
m_rhs
.
rows
();
else
return
m_lhs
.
rows
();
}
EIGEN_STRONG_INLINE
Index
cols
()
const
{
// return the fixed size type if available to enable compile time optimizations
if
(
internal
::
traits
<
typename
internal
::
remove_all
<
LhsNested
>::
type
>::
ColsAtCompileTime
==
Dynamic
)
return
m_rhs
.
cols
();
else
return
m_lhs
.
cols
();
}
/** \returns the left hand side nested expression */
const
_LhsNested
&
lhs
()
const
{
return
m_lhs
;
}
/** \returns the right hand side nested expression */
const
_RhsNested
&
rhs
()
const
{
return
m_rhs
;
}
/** \returns the functor representing the binary operation */
const
BinaryOp
&
functor
()
const
{
return
m_functor
;
}
protected:
LhsNested
m_lhs
;
RhsNested
m_rhs
;
const
BinaryOp
m_functor
;
};
template
<
typename
BinaryOp
,
typename
Lhs
,
typename
Rhs
>
class
CwiseBinaryOpImpl
<
BinaryOp
,
Lhs
,
Rhs
,
Dense
>
:
public
internal
::
dense_xpr_base
<
CwiseBinaryOp
<
BinaryOp
,
Lhs
,
Rhs
>
>::
type
{
typedef
CwiseBinaryOp
<
BinaryOp
,
Lhs
,
Rhs
>
Derived
;
public:
typedef
typename
internal
::
dense_xpr_base
<
CwiseBinaryOp
<
BinaryOp
,
Lhs
,
Rhs
>
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Derived
)
EIGEN_STRONG_INLINE
const
Scalar
coeff
(
Index
row
,
Index
col
)
const
{
return
derived
().
functor
()(
derived
().
lhs
().
coeff
(
row
,
col
),
derived
().
rhs
().
coeff
(
row
,
col
));
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
return
derived
().
functor
().
packetOp
(
derived
().
lhs
().
template
packet
<
LoadMode
>(
row
,
col
),
derived
().
rhs
().
template
packet
<
LoadMode
>(
row
,
col
));
}
EIGEN_STRONG_INLINE
const
Scalar
coeff
(
Index
index
)
const
{
return
derived
().
functor
()(
derived
().
lhs
().
coeff
(
index
),
derived
().
rhs
().
coeff
(
index
));
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
index
)
const
{
return
derived
().
functor
().
packetOp
(
derived
().
lhs
().
template
packet
<
LoadMode
>(
index
),
derived
().
rhs
().
template
packet
<
LoadMode
>(
index
));
}
};
/** replaces \c *this by \c *this - \a other.
*
* \returns a reference to \c *this
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
EIGEN_STRONG_INLINE
Derived
&
MatrixBase
<
Derived
>::
operator
-=
(
const
MatrixBase
<
OtherDerived
>
&
other
)
{
SelfCwiseBinaryOp
<
internal
::
scalar_difference_op
<
Scalar
>
,
Derived
,
OtherDerived
>
tmp
(
derived
());
tmp
=
other
.
derived
();
return
derived
();
}
/** replaces \c *this by \c *this + \a other.
*
* \returns a reference to \c *this
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
EIGEN_STRONG_INLINE
Derived
&
MatrixBase
<
Derived
>::
operator
+=
(
const
MatrixBase
<
OtherDerived
>&
other
)
{
SelfCwiseBinaryOp
<
internal
::
scalar_sum_op
<
Scalar
>
,
Derived
,
OtherDerived
>
tmp
(
derived
());
tmp
=
other
.
derived
();
return
derived
();
}
}
// end namespace Eigen
#endif // EIGEN_CWISE_BINARY_OP_H
densecrf/include/Eigen/src/Core/CwiseNullaryOp.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_CWISE_NULLARY_OP_H
#define EIGEN_CWISE_NULLARY_OP_H
namespace
Eigen
{
/** \class CwiseNullaryOp
* \ingroup Core_Module
*
* \brief Generic expression of a matrix where all coefficients are defined by a functor
*
* \param NullaryOp template functor implementing the operator
* \param PlainObjectType the underlying plain matrix/array type
*
* This class represents an expression of a generic nullary operator.
* It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods,
* and most of the time this is the only way it is used.
*
* However, if you want to write a function returning such an expression, you
* will need to use this class.
*
* \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr()
*/
namespace
internal
{
template
<
typename
NullaryOp
,
typename
PlainObjectType
>
struct
traits
<
CwiseNullaryOp
<
NullaryOp
,
PlainObjectType
>
>
:
traits
<
PlainObjectType
>
{
enum
{
Flags
=
(
traits
<
PlainObjectType
>::
Flags
&
(
HereditaryBits
|
(
functor_has_linear_access
<
NullaryOp
>::
ret
?
LinearAccessBit
:
0
)
|
(
functor_traits
<
NullaryOp
>::
PacketAccess
?
PacketAccessBit
:
0
)))
|
(
functor_traits
<
NullaryOp
>::
IsRepeatable
?
0
:
EvalBeforeNestingBit
),
CoeffReadCost
=
functor_traits
<
NullaryOp
>::
Cost
};
};
}
template
<
typename
NullaryOp
,
typename
PlainObjectType
>
class
CwiseNullaryOp
:
internal
::
no_assignment_operator
,
public
internal
::
dense_xpr_base
<
CwiseNullaryOp
<
NullaryOp
,
PlainObjectType
>
>::
type
{
public:
typedef
typename
internal
::
dense_xpr_base
<
CwiseNullaryOp
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
CwiseNullaryOp
)
CwiseNullaryOp
(
Index
rows
,
Index
cols
,
const
NullaryOp
&
func
=
NullaryOp
())
:
m_rows
(
rows
),
m_cols
(
cols
),
m_functor
(
func
)
{
eigen_assert
(
rows
>=
0
&&
(
RowsAtCompileTime
==
Dynamic
||
RowsAtCompileTime
==
rows
)
&&
cols
>=
0
&&
(
ColsAtCompileTime
==
Dynamic
||
ColsAtCompileTime
==
cols
));
}
EIGEN_STRONG_INLINE
Index
rows
()
const
{
return
m_rows
.
value
();
}
EIGEN_STRONG_INLINE
Index
cols
()
const
{
return
m_cols
.
value
();
}
EIGEN_STRONG_INLINE
const
Scalar
coeff
(
Index
rows
,
Index
cols
)
const
{
return
m_functor
(
rows
,
cols
);
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
return
m_functor
.
packetOp
(
row
,
col
);
}
EIGEN_STRONG_INLINE
const
Scalar
coeff
(
Index
index
)
const
{
return
m_functor
(
index
);
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
index
)
const
{
return
m_functor
.
packetOp
(
index
);
}
/** \returns the functor representing the nullary operation */
const
NullaryOp
&
functor
()
const
{
return
m_functor
;
}
protected:
const
internal
::
variable_if_dynamic
<
Index
,
RowsAtCompileTime
>
m_rows
;
const
internal
::
variable_if_dynamic
<
Index
,
ColsAtCompileTime
>
m_cols
;
const
NullaryOp
m_functor
;
};
/** \returns an expression of a matrix defined by a custom functor \a func
*
* The parameters \a rows and \a cols are the number of rows and of columns of
* the returned matrix. Must be compatible with this MatrixBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
*
* \sa class CwiseNullaryOp
*/
template
<
typename
Derived
>
template
<
typename
CustomNullaryOp
>
EIGEN_STRONG_INLINE
const
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
DenseBase
<
Derived
>::
NullaryExpr
(
Index
rows
,
Index
cols
,
const
CustomNullaryOp
&
func
)
{
return
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
(
rows
,
cols
,
func
);
}
/** \returns an expression of a matrix defined by a custom functor \a func
*
* The parameter \a size is the size of the returned vector.
* Must be compatible with this MatrixBase type.
*
* \only_for_vectors
*
* This variant is meant to be used for dynamic-size vector types. For fixed-size types,
* it is redundant to pass \a size as argument, so Zero() should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
*
* \sa class CwiseNullaryOp
*/
template
<
typename
Derived
>
template
<
typename
CustomNullaryOp
>
EIGEN_STRONG_INLINE
const
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
DenseBase
<
Derived
>::
NullaryExpr
(
Index
size
,
const
CustomNullaryOp
&
func
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
if
(
RowsAtCompileTime
==
1
)
return
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
(
1
,
size
,
func
);
else
return
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
(
size
,
1
,
func
);
}
/** \returns an expression of a matrix defined by a custom functor \a func
*
* This variant is only for fixed-size DenseBase types. For dynamic-size types, you
* need to use the variants taking size arguments.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
*
* \sa class CwiseNullaryOp
*/
template
<
typename
Derived
>
template
<
typename
CustomNullaryOp
>
EIGEN_STRONG_INLINE
const
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
DenseBase
<
Derived
>::
NullaryExpr
(
const
CustomNullaryOp
&
func
)
{
return
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
(
RowsAtCompileTime
,
ColsAtCompileTime
,
func
);
}
/** \returns an expression of a constant matrix of value \a value
*
* The parameters \a rows and \a cols are the number of rows and of columns of
* the returned matrix. Must be compatible with this DenseBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
*
* \sa class CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Constant
(
Index
rows
,
Index
cols
,
const
Scalar
&
value
)
{
return
DenseBase
<
Derived
>::
NullaryExpr
(
rows
,
cols
,
internal
::
scalar_constant_op
<
Scalar
>
(
value
));
}
/** \returns an expression of a constant matrix of value \a value
*
* The parameter \a size is the size of the returned vector.
* Must be compatible with this DenseBase type.
*
* \only_for_vectors
*
* This variant is meant to be used for dynamic-size vector types. For fixed-size types,
* it is redundant to pass \a size as argument, so Zero() should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
*
* \sa class CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Constant
(
Index
size
,
const
Scalar
&
value
)
{
return
DenseBase
<
Derived
>::
NullaryExpr
(
size
,
internal
::
scalar_constant_op
<
Scalar
>
(
value
));
}
/** \returns an expression of a constant matrix of value \a value
*
* This variant is only for fixed-size DenseBase types. For dynamic-size types, you
* need to use the variants taking size arguments.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
*
* \sa class CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Constant
(
const
Scalar
&
value
)
{
EIGEN_STATIC_ASSERT_FIXED_SIZE
(
Derived
)
return
DenseBase
<
Derived
>::
NullaryExpr
(
RowsAtCompileTime
,
ColsAtCompileTime
,
internal
::
scalar_constant_op
<
Scalar
>
(
value
));
}
/**
* \brief Sets a linearly space vector.
*
* The function generates 'size' equally spaced values in the closed interval [low,high].
* This particular version of LinSpaced() uses sequential access, i.e. vector access is
* assumed to be a(0), a(1), ..., a(size). This assumption allows for better vectorization
* and yields faster code than the random access version.
*
* When size is set to 1, a vector of length 1 containing 'high' is returned.
*
* \only_for_vectors
*
* Example: \include DenseBase_LinSpaced_seq.cpp
* Output: \verbinclude DenseBase_LinSpaced_seq.out
*
* \sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Index,Scalar,Scalar), CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
SequentialLinSpacedReturnType
DenseBase
<
Derived
>::
LinSpaced
(
Sequential_t
,
Index
size
,
const
Scalar
&
low
,
const
Scalar
&
high
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
return
DenseBase
<
Derived
>::
NullaryExpr
(
size
,
internal
::
linspaced_op
<
Scalar
,
false
>
(
low
,
high
,
size
));
}
/**
* \copydoc DenseBase::LinSpaced(Sequential_t, Index, const Scalar&, const Scalar&)
* Special version for fixed size types which does not require the size parameter.
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
SequentialLinSpacedReturnType
DenseBase
<
Derived
>::
LinSpaced
(
Sequential_t
,
const
Scalar
&
low
,
const
Scalar
&
high
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
EIGEN_STATIC_ASSERT_FIXED_SIZE
(
Derived
)
return
DenseBase
<
Derived
>::
NullaryExpr
(
Derived
::
SizeAtCompileTime
,
internal
::
linspaced_op
<
Scalar
,
false
>
(
low
,
high
,
Derived
::
SizeAtCompileTime
));
}
/**
* \brief Sets a linearly space vector.
*
* The function generates 'size' equally spaced values in the closed interval [low,high].
* When size is set to 1, a vector of length 1 containing 'high' is returned.
*
* \only_for_vectors
*
* Example: \include DenseBase_LinSpaced.cpp
* Output: \verbinclude DenseBase_LinSpaced.out
*
* \sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Sequential_t,Index,const Scalar&,const Scalar&,Index), CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
RandomAccessLinSpacedReturnType
DenseBase
<
Derived
>::
LinSpaced
(
Index
size
,
const
Scalar
&
low
,
const
Scalar
&
high
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
return
DenseBase
<
Derived
>::
NullaryExpr
(
size
,
internal
::
linspaced_op
<
Scalar
,
true
>
(
low
,
high
,
size
));
}
/**
* \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
* Special version for fixed size types which does not require the size parameter.
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
RandomAccessLinSpacedReturnType
DenseBase
<
Derived
>::
LinSpaced
(
const
Scalar
&
low
,
const
Scalar
&
high
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
EIGEN_STATIC_ASSERT_FIXED_SIZE
(
Derived
)
return
DenseBase
<
Derived
>::
NullaryExpr
(
Derived
::
SizeAtCompileTime
,
internal
::
linspaced_op
<
Scalar
,
true
>
(
low
,
high
,
Derived
::
SizeAtCompileTime
));
}
/** \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
template
<
typename
Derived
>
bool
DenseBase
<
Derived
>::
isApproxToConstant
(
const
Scalar
&
value
,
RealScalar
prec
)
const
{
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
for
(
Index
i
=
0
;
i
<
rows
();
++
i
)
if
(
!
internal
::
isApprox
(
this
->
coeff
(
i
,
j
),
value
,
prec
))
return
false
;
return
true
;
}
/** This is just an alias for isApproxToConstant().
*
* \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
template
<
typename
Derived
>
bool
DenseBase
<
Derived
>::
isConstant
(
const
Scalar
&
value
,
RealScalar
prec
)
const
{
return
isApproxToConstant
(
value
,
prec
);
}
/** Alias for setConstant(): sets all coefficients in this expression to \a value.
*
* \sa setConstant(), Constant(), class CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
void
DenseBase
<
Derived
>::
fill
(
const
Scalar
&
value
)
{
setConstant
(
value
);
}
/** Sets all coefficients in this expression to \a value.
*
* \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
DenseBase
<
Derived
>::
setConstant
(
const
Scalar
&
value
)
{
return
derived
()
=
Constant
(
rows
(),
cols
(),
value
);
}
/** Resizes to the given \a size, and sets all coefficients in this expression to the given \a value.
*
* \only_for_vectors
*
* Example: \include Matrix_setConstant_int.cpp
* Output: \verbinclude Matrix_setConstant_int.out
*
* \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
PlainObjectBase
<
Derived
>::
setConstant
(
Index
size
,
const
Scalar
&
value
)
{
resize
(
size
);
return
setConstant
(
value
);
}
/** Resizes to the given size, and sets all coefficients in this expression to the given \a value.
*
* \param rows the new number of rows
* \param cols the new number of columns
* \param value the value to which all coefficients are set
*
* Example: \include Matrix_setConstant_int_int.cpp
* Output: \verbinclude Matrix_setConstant_int_int.out
*
* \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
PlainObjectBase
<
Derived
>::
setConstant
(
Index
rows
,
Index
cols
,
const
Scalar
&
value
)
{
resize
(
rows
,
cols
);
return
setConstant
(
value
);
}
/**
* \brief Sets a linearly space vector.
*
* The function generates 'size' equally spaced values in the closed interval [low,high].
* When size is set to 1, a vector of length 1 containing 'high' is returned.
*
* \only_for_vectors
*
* Example: \include DenseBase_setLinSpaced.cpp
* Output: \verbinclude DenseBase_setLinSpaced.out
*
* \sa CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
DenseBase
<
Derived
>::
setLinSpaced
(
Index
size
,
const
Scalar
&
low
,
const
Scalar
&
high
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
return
derived
()
=
Derived
::
NullaryExpr
(
size
,
internal
::
linspaced_op
<
Scalar
,
false
>
(
low
,
high
,
size
));
}
/**
* \brief Sets a linearly space vector.
*
* The function fill *this with equally spaced values in the closed interval [low,high].
* When size is set to 1, a vector of length 1 containing 'high' is returned.
*
* \only_for_vectors
*
* \sa setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
DenseBase
<
Derived
>::
setLinSpaced
(
const
Scalar
&
low
,
const
Scalar
&
high
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
return
setLinSpaced
(
size
(),
low
,
high
);
}
// zero:
/** \returns an expression of a zero matrix.
*
* The parameters \a rows and \a cols are the number of rows and of columns of
* the returned matrix. Must be compatible with this MatrixBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
* instead.
*
* Example: \include MatrixBase_zero_int_int.cpp
* Output: \verbinclude MatrixBase_zero_int_int.out
*
* \sa Zero(), Zero(Index)
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Zero
(
Index
rows
,
Index
cols
)
{
return
Constant
(
rows
,
cols
,
Scalar
(
0
));
}
/** \returns an expression of a zero vector.
*
* The parameter \a size is the size of the returned vector.
* Must be compatible with this MatrixBase type.
*
* \only_for_vectors
*
* This variant is meant to be used for dynamic-size vector types. For fixed-size types,
* it is redundant to pass \a size as argument, so Zero() should be used
* instead.
*
* Example: \include MatrixBase_zero_int.cpp
* Output: \verbinclude MatrixBase_zero_int.out
*
* \sa Zero(), Zero(Index,Index)
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Zero
(
Index
size
)
{
return
Constant
(
size
,
Scalar
(
0
));
}
/** \returns an expression of a fixed-size zero matrix or vector.
*
* This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
* need to use the variants taking size arguments.
*
* Example: \include MatrixBase_zero.cpp
* Output: \verbinclude MatrixBase_zero.out
*
* \sa Zero(Index), Zero(Index,Index)
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Zero
()
{
return
Constant
(
Scalar
(
0
));
}
/** \returns true if *this is approximately equal to the zero matrix,
* within the precision given by \a prec.
*
* Example: \include MatrixBase_isZero.cpp
* Output: \verbinclude MatrixBase_isZero.out
*
* \sa class CwiseNullaryOp, Zero()
*/
template
<
typename
Derived
>
bool
DenseBase
<
Derived
>::
isZero
(
RealScalar
prec
)
const
{
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
for
(
Index
i
=
0
;
i
<
rows
();
++
i
)
if
(
!
internal
::
isMuchSmallerThan
(
this
->
coeff
(
i
,
j
),
static_cast
<
Scalar
>
(
1
),
prec
))
return
false
;
return
true
;
}
/** Sets all coefficients in this expression to zero.
*
* Example: \include MatrixBase_setZero.cpp
* Output: \verbinclude MatrixBase_setZero.out
*
* \sa class CwiseNullaryOp, Zero()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
DenseBase
<
Derived
>::
setZero
()
{
return
setConstant
(
Scalar
(
0
));
}
/** Resizes to the given \a size, and sets all coefficients in this expression to zero.
*
* \only_for_vectors
*
* Example: \include Matrix_setZero_int.cpp
* Output: \verbinclude Matrix_setZero_int.out
*
* \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
PlainObjectBase
<
Derived
>::
setZero
(
Index
size
)
{
resize
(
size
);
return
setConstant
(
Scalar
(
0
));
}
/** Resizes to the given size, and sets all coefficients in this expression to zero.
*
* \param rows the new number of rows
* \param cols the new number of columns
*
* Example: \include Matrix_setZero_int_int.cpp
* Output: \verbinclude Matrix_setZero_int_int.out
*
* \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
PlainObjectBase
<
Derived
>::
setZero
(
Index
rows
,
Index
cols
)
{
resize
(
rows
,
cols
);
return
setConstant
(
Scalar
(
0
));
}
// ones:
/** \returns an expression of a matrix where all coefficients equal one.
*
* The parameters \a rows and \a cols are the number of rows and of columns of
* the returned matrix. Must be compatible with this MatrixBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used
* instead.
*
* Example: \include MatrixBase_ones_int_int.cpp
* Output: \verbinclude MatrixBase_ones_int_int.out
*
* \sa Ones(), Ones(Index), isOnes(), class Ones
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Ones
(
Index
rows
,
Index
cols
)
{
return
Constant
(
rows
,
cols
,
Scalar
(
1
));
}
/** \returns an expression of a vector where all coefficients equal one.
*
* The parameter \a size is the size of the returned vector.
* Must be compatible with this MatrixBase type.
*
* \only_for_vectors
*
* This variant is meant to be used for dynamic-size vector types. For fixed-size types,
* it is redundant to pass \a size as argument, so Ones() should be used
* instead.
*
* Example: \include MatrixBase_ones_int.cpp
* Output: \verbinclude MatrixBase_ones_int.out
*
* \sa Ones(), Ones(Index,Index), isOnes(), class Ones
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Ones
(
Index
size
)
{
return
Constant
(
size
,
Scalar
(
1
));
}
/** \returns an expression of a fixed-size matrix or vector where all coefficients equal one.
*
* This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
* need to use the variants taking size arguments.
*
* Example: \include MatrixBase_ones.cpp
* Output: \verbinclude MatrixBase_ones.out
*
* \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
DenseBase
<
Derived
>::
ConstantReturnType
DenseBase
<
Derived
>::
Ones
()
{
return
Constant
(
Scalar
(
1
));
}
/** \returns true if *this is approximately equal to the matrix where all coefficients
* are equal to 1, within the precision given by \a prec.
*
* Example: \include MatrixBase_isOnes.cpp
* Output: \verbinclude MatrixBase_isOnes.out
*
* \sa class CwiseNullaryOp, Ones()
*/
template
<
typename
Derived
>
bool
DenseBase
<
Derived
>::
isOnes
(
RealScalar
prec
)
const
{
return
isApproxToConstant
(
Scalar
(
1
),
prec
);
}
/** Sets all coefficients in this expression to one.
*
* Example: \include MatrixBase_setOnes.cpp
* Output: \verbinclude MatrixBase_setOnes.out
*
* \sa class CwiseNullaryOp, Ones()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
DenseBase
<
Derived
>::
setOnes
()
{
return
setConstant
(
Scalar
(
1
));
}
/** Resizes to the given \a size, and sets all coefficients in this expression to one.
*
* \only_for_vectors
*
* Example: \include Matrix_setOnes_int.cpp
* Output: \verbinclude Matrix_setOnes_int.out
*
* \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
PlainObjectBase
<
Derived
>::
setOnes
(
Index
size
)
{
resize
(
size
);
return
setConstant
(
Scalar
(
1
));
}
/** Resizes to the given size, and sets all coefficients in this expression to one.
*
* \param rows the new number of rows
* \param cols the new number of columns
*
* Example: \include Matrix_setOnes_int_int.cpp
* Output: \verbinclude Matrix_setOnes_int_int.out
*
* \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
PlainObjectBase
<
Derived
>::
setOnes
(
Index
rows
,
Index
cols
)
{
resize
(
rows
,
cols
);
return
setConstant
(
Scalar
(
1
));
}
// Identity:
/** \returns an expression of the identity matrix (not necessarily square).
*
* The parameters \a rows and \a cols are the number of rows and of columns of
* the returned matrix. Must be compatible with this MatrixBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used
* instead.
*
* Example: \include MatrixBase_identity_int_int.cpp
* Output: \verbinclude MatrixBase_identity_int_int.out
*
* \sa Identity(), setIdentity(), isIdentity()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
IdentityReturnType
MatrixBase
<
Derived
>::
Identity
(
Index
rows
,
Index
cols
)
{
return
DenseBase
<
Derived
>::
NullaryExpr
(
rows
,
cols
,
internal
::
scalar_identity_op
<
Scalar
>
());
}
/** \returns an expression of the identity matrix (not necessarily square).
*
* This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
* need to use the variant taking size arguments.
*
* Example: \include MatrixBase_identity.cpp
* Output: \verbinclude MatrixBase_identity.out
*
* \sa Identity(Index,Index), setIdentity(), isIdentity()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
IdentityReturnType
MatrixBase
<
Derived
>::
Identity
()
{
EIGEN_STATIC_ASSERT_FIXED_SIZE
(
Derived
)
return
MatrixBase
<
Derived
>::
NullaryExpr
(
RowsAtCompileTime
,
ColsAtCompileTime
,
internal
::
scalar_identity_op
<
Scalar
>
());
}
/** \returns true if *this is approximately equal to the identity matrix
* (not necessarily square),
* within the precision given by \a prec.
*
* Example: \include MatrixBase_isIdentity.cpp
* Output: \verbinclude MatrixBase_isIdentity.out
*
* \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()
*/
template
<
typename
Derived
>
bool
MatrixBase
<
Derived
>::
isIdentity
(
RealScalar
prec
)
const
{
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
{
for
(
Index
i
=
0
;
i
<
rows
();
++
i
)
{
if
(
i
==
j
)
{
if
(
!
internal
::
isApprox
(
this
->
coeff
(
i
,
j
),
static_cast
<
Scalar
>
(
1
),
prec
))
return
false
;
}
else
{
if
(
!
internal
::
isMuchSmallerThan
(
this
->
coeff
(
i
,
j
),
static_cast
<
RealScalar
>
(
1
),
prec
))
return
false
;
}
}
}
return
true
;
}
namespace
internal
{
template
<
typename
Derived
,
bool
Big
=
(
Derived
::
SizeAtCompileTime
>
=
16
)
>
struct
setIdentity_impl
{
static
EIGEN_STRONG_INLINE
Derived
&
run
(
Derived
&
m
)
{
return
m
=
Derived
::
Identity
(
m
.
rows
(),
m
.
cols
());
}
};
template
<
typename
Derived
>
struct
setIdentity_impl
<
Derived
,
true
>
{
typedef
typename
Derived
::
Index
Index
;
static
EIGEN_STRONG_INLINE
Derived
&
run
(
Derived
&
m
)
{
m
.
setZero
();
const
Index
size
=
(
std
::
min
)(
m
.
rows
(),
m
.
cols
());
for
(
Index
i
=
0
;
i
<
size
;
++
i
)
m
.
coeffRef
(
i
,
i
)
=
typename
Derived
::
Scalar
(
1
);
return
m
;
}
};
}
// end namespace internal
/** Writes the identity expression (not necessarily square) into *this.
*
* Example: \include MatrixBase_setIdentity.cpp
* Output: \verbinclude MatrixBase_setIdentity.out
*
* \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
MatrixBase
<
Derived
>::
setIdentity
()
{
return
internal
::
setIdentity_impl
<
Derived
>::
run
(
derived
());
}
/** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.
*
* \param rows the new number of rows
* \param cols the new number of columns
*
* Example: \include Matrix_setIdentity_int_int.cpp
* Output: \verbinclude Matrix_setIdentity_int_int.out
*
* \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
Derived
&
MatrixBase
<
Derived
>::
setIdentity
(
Index
rows
,
Index
cols
)
{
derived
().
resize
(
rows
,
cols
);
return
setIdentity
();
}
/** \returns an expression of the i-th unit (basis) vector.
*
* \only_for_vectors
*
* \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
BasisReturnType
MatrixBase
<
Derived
>::
Unit
(
Index
size
,
Index
i
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
return
BasisReturnType
(
SquareMatrixType
::
Identity
(
size
,
size
),
i
);
}
/** \returns an expression of the i-th unit (basis) vector.
*
* \only_for_vectors
*
* This variant is for fixed-size vector only.
*
* \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
BasisReturnType
MatrixBase
<
Derived
>::
Unit
(
Index
i
)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
return
BasisReturnType
(
SquareMatrixType
::
Identity
(),
i
);
}
/** \returns an expression of the X axis unit vector (1{,0}^*)
*
* \only_for_vectors
*
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
BasisReturnType
MatrixBase
<
Derived
>::
UnitX
()
{
return
Derived
::
Unit
(
0
);
}
/** \returns an expression of the Y axis unit vector (0,1{,0}^*)
*
* \only_for_vectors
*
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
BasisReturnType
MatrixBase
<
Derived
>::
UnitY
()
{
return
Derived
::
Unit
(
1
);
}
/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
*
* \only_for_vectors
*
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
BasisReturnType
MatrixBase
<
Derived
>::
UnitZ
()
{
return
Derived
::
Unit
(
2
);
}
/** \returns an expression of the W axis unit vector (0,0,0,1)
*
* \only_for_vectors
*
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
const
typename
MatrixBase
<
Derived
>::
BasisReturnType
MatrixBase
<
Derived
>::
UnitW
()
{
return
Derived
::
Unit
(
3
);
}
}
// end namespace Eigen
#endif // EIGEN_CWISE_NULLARY_OP_H
densecrf/include/Eigen/src/Core/CwiseUnaryOp.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_CWISE_UNARY_OP_H
#define EIGEN_CWISE_UNARY_OP_H
namespace
Eigen
{
/** \class CwiseUnaryOp
* \ingroup Core_Module
*
* \brief Generic expression where a coefficient-wise unary operator is applied to an expression
*
* \param UnaryOp template functor implementing the operator
* \param XprType the type of the expression to which we are applying the unary operator
*
* This class represents an expression where a unary operator is applied to an expression.
* It is the return type of all operations taking exactly 1 input expression, regardless of the
* presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix
* is considered unary, because only the right-hand side is an expression, and its
* return type is a specialization of CwiseUnaryOp.
*
* Most of the time, this is the only way that it is used, so you typically don't have to name
* CwiseUnaryOp types explicitly.
*
* \sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp
*/
namespace
internal
{
template
<
typename
UnaryOp
,
typename
XprType
>
struct
traits
<
CwiseUnaryOp
<
UnaryOp
,
XprType
>
>
:
traits
<
XprType
>
{
typedef
typename
result_of
<
UnaryOp
(
typename
XprType
::
Scalar
)
>::
type
Scalar
;
typedef
typename
XprType
::
Nested
XprTypeNested
;
typedef
typename
remove_reference
<
XprTypeNested
>::
type
_XprTypeNested
;
enum
{
Flags
=
_XprTypeNested
::
Flags
&
(
HereditaryBits
|
LinearAccessBit
|
AlignedBit
|
(
functor_traits
<
UnaryOp
>::
PacketAccess
?
PacketAccessBit
:
0
)),
CoeffReadCost
=
_XprTypeNested
::
CoeffReadCost
+
functor_traits
<
UnaryOp
>::
Cost
};
};
}
template
<
typename
UnaryOp
,
typename
XprType
,
typename
StorageKind
>
class
CwiseUnaryOpImpl
;
template
<
typename
UnaryOp
,
typename
XprType
>
class
CwiseUnaryOp
:
internal
::
no_assignment_operator
,
public
CwiseUnaryOpImpl
<
UnaryOp
,
XprType
,
typename
internal
::
traits
<
XprType
>::
StorageKind
>
{
public:
typedef
typename
CwiseUnaryOpImpl
<
UnaryOp
,
XprType
,
typename
internal
::
traits
<
XprType
>::
StorageKind
>::
Base
Base
;
EIGEN_GENERIC_PUBLIC_INTERFACE
(
CwiseUnaryOp
)
inline
CwiseUnaryOp
(
const
XprType
&
xpr
,
const
UnaryOp
&
func
=
UnaryOp
())
:
m_xpr
(
xpr
),
m_functor
(
func
)
{}
EIGEN_STRONG_INLINE
Index
rows
()
const
{
return
m_xpr
.
rows
();
}
EIGEN_STRONG_INLINE
Index
cols
()
const
{
return
m_xpr
.
cols
();
}
/** \returns the functor representing the unary operation */
const
UnaryOp
&
functor
()
const
{
return
m_functor
;
}
/** \returns the nested expression */
const
typename
internal
::
remove_all
<
typename
XprType
::
Nested
>::
type
&
nestedExpression
()
const
{
return
m_xpr
;
}
/** \returns the nested expression */
typename
internal
::
remove_all
<
typename
XprType
::
Nested
>::
type
&
nestedExpression
()
{
return
m_xpr
.
const_cast_derived
();
}
protected:
typename
XprType
::
Nested
m_xpr
;
const
UnaryOp
m_functor
;
};
// This is the generic implementation for dense storage.
// It can be used for any expression types implementing the dense concept.
template
<
typename
UnaryOp
,
typename
XprType
>
class
CwiseUnaryOpImpl
<
UnaryOp
,
XprType
,
Dense
>
:
public
internal
::
dense_xpr_base
<
CwiseUnaryOp
<
UnaryOp
,
XprType
>
>::
type
{
public:
typedef
CwiseUnaryOp
<
UnaryOp
,
XprType
>
Derived
;
typedef
typename
internal
::
dense_xpr_base
<
CwiseUnaryOp
<
UnaryOp
,
XprType
>
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Derived
)
EIGEN_STRONG_INLINE
const
Scalar
coeff
(
Index
row
,
Index
col
)
const
{
return
derived
().
functor
()(
derived
().
nestedExpression
().
coeff
(
row
,
col
));
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
return
derived
().
functor
().
packetOp
(
derived
().
nestedExpression
().
template
packet
<
LoadMode
>(
row
,
col
));
}
EIGEN_STRONG_INLINE
const
Scalar
coeff
(
Index
index
)
const
{
return
derived
().
functor
()(
derived
().
nestedExpression
().
coeff
(
index
));
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
index
)
const
{
return
derived
().
functor
().
packetOp
(
derived
().
nestedExpression
().
template
packet
<
LoadMode
>(
index
));
}
};
}
// end namespace Eigen
#endif // EIGEN_CWISE_UNARY_OP_H
densecrf/include/Eigen/src/Core/CwiseUnaryView.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_CWISE_UNARY_VIEW_H
#define EIGEN_CWISE_UNARY_VIEW_H
namespace
Eigen
{
/** \class CwiseUnaryView
* \ingroup Core_Module
*
* \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
*
* \param ViewOp template functor implementing the view
* \param MatrixType the type of the matrix we are applying the unary operator
*
* This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
* It is the return type of real() and imag(), and most of the time this is the only way it is used.
*
* \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
*/
namespace
internal
{
template
<
typename
ViewOp
,
typename
MatrixType
>
struct
traits
<
CwiseUnaryView
<
ViewOp
,
MatrixType
>
>
:
traits
<
MatrixType
>
{
typedef
typename
result_of
<
ViewOp
(
typename
traits
<
MatrixType
>::
Scalar
)
>::
type
Scalar
;
typedef
typename
MatrixType
::
Nested
MatrixTypeNested
;
typedef
typename
remove_all
<
MatrixTypeNested
>::
type
_MatrixTypeNested
;
enum
{
Flags
=
(
traits
<
_MatrixTypeNested
>::
Flags
&
(
HereditaryBits
|
LvalueBit
|
LinearAccessBit
|
DirectAccessBit
)),
CoeffReadCost
=
traits
<
_MatrixTypeNested
>::
CoeffReadCost
+
functor_traits
<
ViewOp
>::
Cost
,
MatrixTypeInnerStride
=
inner_stride_at_compile_time
<
MatrixType
>::
ret
,
// need to cast the sizeof's from size_t to int explicitly, otherwise:
// "error: no integral type can represent all of the enumerator values
InnerStrideAtCompileTime
=
MatrixTypeInnerStride
==
Dynamic
?
int
(
Dynamic
)
:
int
(
MatrixTypeInnerStride
)
*
int
(
sizeof
(
typename
traits
<
MatrixType
>::
Scalar
)
/
sizeof
(
Scalar
)),
OuterStrideAtCompileTime
=
outer_stride_at_compile_time
<
MatrixType
>::
ret
==
Dynamic
?
int
(
Dynamic
)
:
outer_stride_at_compile_time
<
MatrixType
>::
ret
*
int
(
sizeof
(
typename
traits
<
MatrixType
>::
Scalar
)
/
sizeof
(
Scalar
))
};
};
}
template
<
typename
ViewOp
,
typename
MatrixType
,
typename
StorageKind
>
class
CwiseUnaryViewImpl
;
template
<
typename
ViewOp
,
typename
MatrixType
>
class
CwiseUnaryView
:
internal
::
no_assignment_operator
,
public
CwiseUnaryViewImpl
<
ViewOp
,
MatrixType
,
typename
internal
::
traits
<
MatrixType
>::
StorageKind
>
{
public:
typedef
typename
CwiseUnaryViewImpl
<
ViewOp
,
MatrixType
,
typename
internal
::
traits
<
MatrixType
>::
StorageKind
>::
Base
Base
;
EIGEN_GENERIC_PUBLIC_INTERFACE
(
CwiseUnaryView
)
inline
CwiseUnaryView
(
const
MatrixType
&
mat
,
const
ViewOp
&
func
=
ViewOp
())
:
m_matrix
(
mat
),
m_functor
(
func
)
{}
EIGEN_INHERIT_ASSIGNMENT_OPERATORS
(
CwiseUnaryView
)
EIGEN_STRONG_INLINE
Index
rows
()
const
{
return
m_matrix
.
rows
();
}
EIGEN_STRONG_INLINE
Index
cols
()
const
{
return
m_matrix
.
cols
();
}
/** \returns the functor representing unary operation */
const
ViewOp
&
functor
()
const
{
return
m_functor
;
}
/** \returns the nested expression */
const
typename
internal
::
remove_all
<
typename
MatrixType
::
Nested
>::
type
&
nestedExpression
()
const
{
return
m_matrix
;
}
/** \returns the nested expression */
typename
internal
::
remove_all
<
typename
MatrixType
::
Nested
>::
type
&
nestedExpression
()
{
return
m_matrix
.
const_cast_derived
();
}
protected:
// FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC
typename
internal
::
nested
<
MatrixType
>::
type
m_matrix
;
ViewOp
m_functor
;
};
template
<
typename
ViewOp
,
typename
MatrixType
>
class
CwiseUnaryViewImpl
<
ViewOp
,
MatrixType
,
Dense
>
:
public
internal
::
dense_xpr_base
<
CwiseUnaryView
<
ViewOp
,
MatrixType
>
>::
type
{
public:
typedef
CwiseUnaryView
<
ViewOp
,
MatrixType
>
Derived
;
typedef
typename
internal
::
dense_xpr_base
<
CwiseUnaryView
<
ViewOp
,
MatrixType
>
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Derived
)
inline
Index
innerStride
()
const
{
return
derived
().
nestedExpression
().
innerStride
()
*
sizeof
(
typename
internal
::
traits
<
MatrixType
>::
Scalar
)
/
sizeof
(
Scalar
);
}
inline
Index
outerStride
()
const
{
return
derived
().
nestedExpression
().
outerStride
()
*
sizeof
(
typename
internal
::
traits
<
MatrixType
>::
Scalar
)
/
sizeof
(
Scalar
);
}
EIGEN_STRONG_INLINE
CoeffReturnType
coeff
(
Index
row
,
Index
col
)
const
{
return
derived
().
functor
()(
derived
().
nestedExpression
().
coeff
(
row
,
col
));
}
EIGEN_STRONG_INLINE
CoeffReturnType
coeff
(
Index
index
)
const
{
return
derived
().
functor
()(
derived
().
nestedExpression
().
coeff
(
index
));
}
EIGEN_STRONG_INLINE
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
{
return
derived
().
functor
()(
const_cast_derived
().
nestedExpression
().
coeffRef
(
row
,
col
));
}
EIGEN_STRONG_INLINE
Scalar
&
coeffRef
(
Index
index
)
{
return
derived
().
functor
()(
const_cast_derived
().
nestedExpression
().
coeffRef
(
index
));
}
};
}
// end namespace Eigen
#endif // EIGEN_CWISE_UNARY_VIEW_H
densecrf/include/Eigen/src/Core/DenseBase.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_DENSEBASE_H
#define EIGEN_DENSEBASE_H
namespace
Eigen
{
/** \class DenseBase
* \ingroup Core_Module
*
* \brief Base class for all dense matrices, vectors, and arrays
*
* This class is the base that is inherited by all dense objects (matrix, vector, arrays,
* and related expression types). The common Eigen API for dense objects is contained in this class.
*
* \tparam Derived is the derived type, e.g., a matrix type or an expression.
*
* This class can be extended with the help of the plugin mechanism described on the page
* \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
*
* \sa \ref TopicClassHierarchy
*/
template
<
typename
Derived
>
class
DenseBase
#ifndef EIGEN_PARSED_BY_DOXYGEN
:
public
internal
::
special_scalar_op_base
<
Derived
,
typename
internal
::
traits
<
Derived
>::
Scalar
,
typename
NumTraits
<
typename
internal
::
traits
<
Derived
>::
Scalar
>::
Real
>
#else
:
public
DenseCoeffsBase
<
Derived
>
#endif // not EIGEN_PARSED_BY_DOXYGEN
{
public:
using
internal
::
special_scalar_op_base
<
Derived
,
typename
internal
::
traits
<
Derived
>::
Scalar
,
typename
NumTraits
<
typename
internal
::
traits
<
Derived
>::
Scalar
>::
Real
>::
operator
*
;
class
InnerIterator
;
typedef
typename
internal
::
traits
<
Derived
>::
StorageKind
StorageKind
;
/** \brief The type of indices
* \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
* \sa \ref TopicPreprocessorDirectives.
*/
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
typedef
typename
internal
::
traits
<
Derived
>::
Scalar
Scalar
;
typedef
typename
internal
::
packet_traits
<
Scalar
>::
type
PacketScalar
;
typedef
typename
NumTraits
<
Scalar
>::
Real
RealScalar
;
typedef
DenseCoeffsBase
<
Derived
>
Base
;
using
Base
::
derived
;
using
Base
::
const_cast_derived
;
using
Base
::
rows
;
using
Base
::
cols
;
using
Base
::
size
;
using
Base
::
rowIndexByOuterInner
;
using
Base
::
colIndexByOuterInner
;
using
Base
::
coeff
;
using
Base
::
coeffByOuterInner
;
using
Base
::
packet
;
using
Base
::
packetByOuterInner
;
using
Base
::
writePacket
;
using
Base
::
writePacketByOuterInner
;
using
Base
::
coeffRef
;
using
Base
::
coeffRefByOuterInner
;
using
Base
::
copyCoeff
;
using
Base
::
copyCoeffByOuterInner
;
using
Base
::
copyPacket
;
using
Base
::
copyPacketByOuterInner
;
using
Base
::
operator
();
using
Base
::
operator
[];
using
Base
::
x
;
using
Base
::
y
;
using
Base
::
z
;
using
Base
::
w
;
using
Base
::
stride
;
using
Base
::
innerStride
;
using
Base
::
outerStride
;
using
Base
::
rowStride
;
using
Base
::
colStride
;
typedef
typename
Base
::
CoeffReturnType
CoeffReturnType
;
enum
{
RowsAtCompileTime
=
internal
::
traits
<
Derived
>::
RowsAtCompileTime
,
/**< The number of rows at compile-time. This is just a copy of the value provided
* by the \a Derived type. If a value is not known at compile-time,
* it is set to the \a Dynamic constant.
* \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
ColsAtCompileTime
=
internal
::
traits
<
Derived
>::
ColsAtCompileTime
,
/**< The number of columns at compile-time. This is just a copy of the value provided
* by the \a Derived type. If a value is not known at compile-time,
* it is set to the \a Dynamic constant.
* \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
SizeAtCompileTime
=
(
internal
::
size_at_compile_time
<
internal
::
traits
<
Derived
>::
RowsAtCompileTime
,
internal
::
traits
<
Derived
>::
ColsAtCompileTime
>::
ret
),
/**< This is equal to the number of coefficients, i.e. the number of
* rows times the number of columns, or to \a Dynamic if this is not
* known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
MaxRowsAtCompileTime
=
internal
::
traits
<
Derived
>::
MaxRowsAtCompileTime
,
/**< This value is equal to the maximum possible number of rows that this expression
* might have. If this expression might have an arbitrarily high number of rows,
* this value is set to \a Dynamic.
*
* This value is useful to know when evaluating an expression, in order to determine
* whether it is possible to avoid doing a dynamic memory allocation.
*
* \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
*/
MaxColsAtCompileTime
=
internal
::
traits
<
Derived
>::
MaxColsAtCompileTime
,
/**< This value is equal to the maximum possible number of columns that this expression
* might have. If this expression might have an arbitrarily high number of columns,
* this value is set to \a Dynamic.
*
* This value is useful to know when evaluating an expression, in order to determine
* whether it is possible to avoid doing a dynamic memory allocation.
*
* \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
*/
MaxSizeAtCompileTime
=
(
internal
::
size_at_compile_time
<
internal
::
traits
<
Derived
>::
MaxRowsAtCompileTime
,
internal
::
traits
<
Derived
>::
MaxColsAtCompileTime
>::
ret
),
/**< This value is equal to the maximum possible number of coefficients that this expression
* might have. If this expression might have an arbitrarily high number of coefficients,
* this value is set to \a Dynamic.
*
* This value is useful to know when evaluating an expression, in order to determine
* whether it is possible to avoid doing a dynamic memory allocation.
*
* \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
*/
IsVectorAtCompileTime
=
internal
::
traits
<
Derived
>::
MaxRowsAtCompileTime
==
1
||
internal
::
traits
<
Derived
>::
MaxColsAtCompileTime
==
1
,
/**< This is set to true if either the number of rows or the number of
* columns is known at compile-time to be equal to 1. Indeed, in that case,
* we are dealing with a column-vector (if there is only one column) or with
* a row-vector (if there is only one row). */
Flags
=
internal
::
traits
<
Derived
>::
Flags
,
/**< This stores expression \ref flags flags which may or may not be inherited by new expressions
* constructed from this one. See the \ref flags "list of flags".
*/
IsRowMajor
=
int
(
Flags
)
&
RowMajorBit
,
/**< True if this expression has row-major storage order. */
InnerSizeAtCompileTime
=
int
(
IsVectorAtCompileTime
)
?
int
(
SizeAtCompileTime
)
:
int
(
IsRowMajor
)
?
int
(
ColsAtCompileTime
)
:
int
(
RowsAtCompileTime
),
CoeffReadCost
=
internal
::
traits
<
Derived
>::
CoeffReadCost
,
/**< This is a rough measure of how expensive it is to read one coefficient from
* this expression.
*/
InnerStrideAtCompileTime
=
internal
::
inner_stride_at_compile_time
<
Derived
>::
ret
,
OuterStrideAtCompileTime
=
internal
::
outer_stride_at_compile_time
<
Derived
>::
ret
};
enum
{
ThisConstantIsPrivateInPlainObjectBase
};
/** \returns the number of nonzero coefficients which is in practice the number
* of stored coefficients. */
inline
Index
nonZeros
()
const
{
return
size
();
}
/** \returns true if either the number of rows or the number of columns is equal to 1.
* In other words, this function returns
* \code rows()==1 || cols()==1 \endcode
* \sa rows(), cols(), IsVectorAtCompileTime. */
/** \returns the outer size.
*
* \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
* with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
* column-major matrix, and the number of rows for a row-major matrix. */
Index
outerSize
()
const
{
return
IsVectorAtCompileTime
?
1
:
int
(
IsRowMajor
)
?
this
->
rows
()
:
this
->
cols
();
}
/** \returns the inner size.
*
* \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
* with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
* column-major matrix, and the number of columns for a row-major matrix. */
Index
innerSize
()
const
{
return
IsVectorAtCompileTime
?
this
->
size
()
:
int
(
IsRowMajor
)
?
this
->
cols
()
:
this
->
rows
();
}
/** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
* Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
* nothing else.
*/
void
resize
(
Index
size
)
{
EIGEN_ONLY_USED_FOR_DEBUG
(
size
);
eigen_assert
(
size
==
this
->
size
()
&&
"DenseBase::resize() does not actually allow to resize."
);
}
/** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
* Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
* nothing else.
*/
void
resize
(
Index
rows
,
Index
cols
)
{
EIGEN_ONLY_USED_FOR_DEBUG
(
rows
);
EIGEN_ONLY_USED_FOR_DEBUG
(
cols
);
eigen_assert
(
rows
==
this
->
rows
()
&&
cols
==
this
->
cols
()
&&
"DenseBase::resize() does not actually allow to resize."
);
}
#ifndef EIGEN_PARSED_BY_DOXYGEN
/** \internal Represents a matrix with all coefficients equal to one another*/
typedef
CwiseNullaryOp
<
internal
::
scalar_constant_op
<
Scalar
>
,
Derived
>
ConstantReturnType
;
/** \internal Represents a vector with linearly spaced coefficients that allows sequential access only. */
typedef
CwiseNullaryOp
<
internal
::
linspaced_op
<
Scalar
,
false
>
,
Derived
>
SequentialLinSpacedReturnType
;
/** \internal Represents a vector with linearly spaced coefficients that allows random access. */
typedef
CwiseNullaryOp
<
internal
::
linspaced_op
<
Scalar
,
true
>
,
Derived
>
RandomAccessLinSpacedReturnType
;
/** \internal the return type of MatrixBase::eigenvalues() */
typedef
Matrix
<
typename
NumTraits
<
typename
internal
::
traits
<
Derived
>::
Scalar
>::
Real
,
internal
::
traits
<
Derived
>::
ColsAtCompileTime
,
1
>
EigenvaluesReturnType
;
#endif // not EIGEN_PARSED_BY_DOXYGEN
/** Copies \a other into *this. \returns a reference to *this. */
template
<
typename
OtherDerived
>
Derived
&
operator
=
(
const
DenseBase
<
OtherDerived
>&
other
);
/** Special case of the template operator=, in order to prevent the compiler
* from generating a default operator= (issue hit with g++ 4.1)
*/
Derived
&
operator
=
(
const
DenseBase
&
other
);
template
<
typename
OtherDerived
>
Derived
&
operator
=
(
const
EigenBase
<
OtherDerived
>
&
other
);
template
<
typename
OtherDerived
>
Derived
&
operator
+=
(
const
EigenBase
<
OtherDerived
>
&
other
);
template
<
typename
OtherDerived
>
Derived
&
operator
-=
(
const
EigenBase
<
OtherDerived
>
&
other
);
template
<
typename
OtherDerived
>
Derived
&
operator
=
(
const
ReturnByValue
<
OtherDerived
>&
func
);
#ifndef EIGEN_PARSED_BY_DOXYGEN
/** Copies \a other into *this without evaluating other. \returns a reference to *this. */
template
<
typename
OtherDerived
>
Derived
&
lazyAssign
(
const
DenseBase
<
OtherDerived
>&
other
);
#endif // not EIGEN_PARSED_BY_DOXYGEN
CommaInitializer
<
Derived
>
operator
<<
(
const
Scalar
&
s
);
template
<
unsigned
int
Added
,
unsigned
int
Removed
>
const
Flagged
<
Derived
,
Added
,
Removed
>
flagged
()
const
;
template
<
typename
OtherDerived
>
CommaInitializer
<
Derived
>
operator
<<
(
const
DenseBase
<
OtherDerived
>&
other
);
Eigen
::
Transpose
<
Derived
>
transpose
();
typedef
const
Transpose
<
const
Derived
>
ConstTransposeReturnType
;
ConstTransposeReturnType
transpose
()
const
;
void
transposeInPlace
();
#ifndef EIGEN_NO_DEBUG
protected:
template
<
typename
OtherDerived
>
void
checkTransposeAliasing
(
const
OtherDerived
&
other
)
const
;
public:
#endif
typedef
VectorBlock
<
Derived
>
SegmentReturnType
;
typedef
const
VectorBlock
<
const
Derived
>
ConstSegmentReturnType
;
template
<
int
Size
>
struct
FixedSegmentReturnType
{
typedef
VectorBlock
<
Derived
,
Size
>
Type
;
};
template
<
int
Size
>
struct
ConstFixedSegmentReturnType
{
typedef
const
VectorBlock
<
const
Derived
,
Size
>
Type
;
};
// Note: The "DenseBase::" prefixes are added to help MSVC9 to match these declarations with the later implementations.
SegmentReturnType
segment
(
Index
start
,
Index
size
);
typename
DenseBase
::
ConstSegmentReturnType
segment
(
Index
start
,
Index
size
)
const
;
SegmentReturnType
head
(
Index
size
);
typename
DenseBase
::
ConstSegmentReturnType
head
(
Index
size
)
const
;
SegmentReturnType
tail
(
Index
size
);
typename
DenseBase
::
ConstSegmentReturnType
tail
(
Index
size
)
const
;
template
<
int
Size
>
typename
FixedSegmentReturnType
<
Size
>::
Type
head
();
template
<
int
Size
>
typename
ConstFixedSegmentReturnType
<
Size
>::
Type
head
()
const
;
template
<
int
Size
>
typename
FixedSegmentReturnType
<
Size
>::
Type
tail
();
template
<
int
Size
>
typename
ConstFixedSegmentReturnType
<
Size
>::
Type
tail
()
const
;
template
<
int
Size
>
typename
FixedSegmentReturnType
<
Size
>::
Type
segment
(
Index
start
);
template
<
int
Size
>
typename
ConstFixedSegmentReturnType
<
Size
>::
Type
segment
(
Index
start
)
const
;
static
const
ConstantReturnType
Constant
(
Index
rows
,
Index
cols
,
const
Scalar
&
value
);
static
const
ConstantReturnType
Constant
(
Index
size
,
const
Scalar
&
value
);
static
const
ConstantReturnType
Constant
(
const
Scalar
&
value
);
static
const
SequentialLinSpacedReturnType
LinSpaced
(
Sequential_t
,
Index
size
,
const
Scalar
&
low
,
const
Scalar
&
high
);
static
const
RandomAccessLinSpacedReturnType
LinSpaced
(
Index
size
,
const
Scalar
&
low
,
const
Scalar
&
high
);
static
const
SequentialLinSpacedReturnType
LinSpaced
(
Sequential_t
,
const
Scalar
&
low
,
const
Scalar
&
high
);
static
const
RandomAccessLinSpacedReturnType
LinSpaced
(
const
Scalar
&
low
,
const
Scalar
&
high
);
template
<
typename
CustomNullaryOp
>
static
const
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
NullaryExpr
(
Index
rows
,
Index
cols
,
const
CustomNullaryOp
&
func
);
template
<
typename
CustomNullaryOp
>
static
const
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
NullaryExpr
(
Index
size
,
const
CustomNullaryOp
&
func
);
template
<
typename
CustomNullaryOp
>
static
const
CwiseNullaryOp
<
CustomNullaryOp
,
Derived
>
NullaryExpr
(
const
CustomNullaryOp
&
func
);
static
const
ConstantReturnType
Zero
(
Index
rows
,
Index
cols
);
static
const
ConstantReturnType
Zero
(
Index
size
);
static
const
ConstantReturnType
Zero
();
static
const
ConstantReturnType
Ones
(
Index
rows
,
Index
cols
);
static
const
ConstantReturnType
Ones
(
Index
size
);
static
const
ConstantReturnType
Ones
();
void
fill
(
const
Scalar
&
value
);
Derived
&
setConstant
(
const
Scalar
&
value
);
Derived
&
setLinSpaced
(
Index
size
,
const
Scalar
&
low
,
const
Scalar
&
high
);
Derived
&
setLinSpaced
(
const
Scalar
&
low
,
const
Scalar
&
high
);
Derived
&
setZero
();
Derived
&
setOnes
();
Derived
&
setRandom
();
template
<
typename
OtherDerived
>
bool
isApprox
(
const
DenseBase
<
OtherDerived
>&
other
,
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
bool
isMuchSmallerThan
(
const
RealScalar
&
other
,
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
template
<
typename
OtherDerived
>
bool
isMuchSmallerThan
(
const
DenseBase
<
OtherDerived
>&
other
,
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
bool
isApproxToConstant
(
const
Scalar
&
value
,
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
bool
isConstant
(
const
Scalar
&
value
,
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
bool
isZero
(
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
bool
isOnes
(
RealScalar
prec
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
;
inline
Derived
&
operator
*=
(
const
Scalar
&
other
);
inline
Derived
&
operator
/=
(
const
Scalar
&
other
);
typedef
typename
internal
::
add_const_on_value_type
<
typename
internal
::
eval
<
Derived
>::
type
>::
type
EvalReturnType
;
/** \returns the matrix or vector obtained by evaluating this expression.
*
* Notice that in the case of a plain matrix or vector (not an expression) this function just returns
* a const reference, in order to avoid a useless copy.
*/
EIGEN_STRONG_INLINE
EvalReturnType
eval
()
const
{
// Even though MSVC does not honor strong inlining when the return type
// is a dynamic matrix, we desperately need strong inlining for fixed
// size types on MSVC.
return
typename
internal
::
eval
<
Derived
>::
type
(
derived
());
}
/** swaps *this with the expression \a other.
*
*/
template
<
typename
OtherDerived
>
void
swap
(
const
DenseBase
<
OtherDerived
>&
other
,
int
=
OtherDerived
::
ThisConstantIsPrivateInPlainObjectBase
)
{
SwapWrapper
<
Derived
>
(
derived
()).
lazyAssign
(
other
.
derived
());
}
/** swaps *this with the matrix or array \a other.
*
*/
template
<
typename
OtherDerived
>
void
swap
(
PlainObjectBase
<
OtherDerived
>&
other
)
{
SwapWrapper
<
Derived
>
(
derived
()).
lazyAssign
(
other
.
derived
());
}
inline
const
NestByValue
<
Derived
>
nestByValue
()
const
;
inline
const
ForceAlignedAccess
<
Derived
>
forceAlignedAccess
()
const
;
inline
ForceAlignedAccess
<
Derived
>
forceAlignedAccess
();
template
<
bool
Enable
>
inline
const
typename
internal
::
conditional
<
Enable
,
ForceAlignedAccess
<
Derived
>
,
Derived
&>::
type
forceAlignedAccessIf
()
const
;
template
<
bool
Enable
>
inline
typename
internal
::
conditional
<
Enable
,
ForceAlignedAccess
<
Derived
>
,
Derived
&>::
type
forceAlignedAccessIf
();
Scalar
sum
()
const
;
Scalar
mean
()
const
;
Scalar
trace
()
const
;
Scalar
prod
()
const
;
typename
internal
::
traits
<
Derived
>::
Scalar
minCoeff
()
const
;
typename
internal
::
traits
<
Derived
>::
Scalar
maxCoeff
()
const
;
template
<
typename
IndexType
>
typename
internal
::
traits
<
Derived
>::
Scalar
minCoeff
(
IndexType
*
row
,
IndexType
*
col
)
const
;
template
<
typename
IndexType
>
typename
internal
::
traits
<
Derived
>::
Scalar
maxCoeff
(
IndexType
*
row
,
IndexType
*
col
)
const
;
template
<
typename
IndexType
>
typename
internal
::
traits
<
Derived
>::
Scalar
minCoeff
(
IndexType
*
index
)
const
;
template
<
typename
IndexType
>
typename
internal
::
traits
<
Derived
>::
Scalar
maxCoeff
(
IndexType
*
index
)
const
;
template
<
typename
BinaryOp
>
typename
internal
::
result_of
<
BinaryOp
(
typename
internal
::
traits
<
Derived
>::
Scalar
)
>::
type
redux
(
const
BinaryOp
&
func
)
const
;
template
<
typename
Visitor
>
void
visit
(
Visitor
&
func
)
const
;
inline
const
WithFormat
<
Derived
>
format
(
const
IOFormat
&
fmt
)
const
;
/** \returns the unique coefficient of a 1x1 expression */
CoeffReturnType
value
()
const
{
EIGEN_STATIC_ASSERT_SIZE_1x1
(
Derived
)
eigen_assert
(
this
->
rows
()
==
1
&&
this
->
cols
()
==
1
);
return
derived
().
coeff
(
0
,
0
);
}
/////////// Array module ///////////
bool
all
(
void
)
const
;
bool
any
(
void
)
const
;
Index
count
()
const
;
typedef
VectorwiseOp
<
Derived
,
Horizontal
>
RowwiseReturnType
;
typedef
const
VectorwiseOp
<
const
Derived
,
Horizontal
>
ConstRowwiseReturnType
;
typedef
VectorwiseOp
<
Derived
,
Vertical
>
ColwiseReturnType
;
typedef
const
VectorwiseOp
<
const
Derived
,
Vertical
>
ConstColwiseReturnType
;
ConstRowwiseReturnType
rowwise
()
const
;
RowwiseReturnType
rowwise
();
ConstColwiseReturnType
colwise
()
const
;
ColwiseReturnType
colwise
();
static
const
CwiseNullaryOp
<
internal
::
scalar_random_op
<
Scalar
>
,
Derived
>
Random
(
Index
rows
,
Index
cols
);
static
const
CwiseNullaryOp
<
internal
::
scalar_random_op
<
Scalar
>
,
Derived
>
Random
(
Index
size
);
static
const
CwiseNullaryOp
<
internal
::
scalar_random_op
<
Scalar
>
,
Derived
>
Random
();
template
<
typename
ThenDerived
,
typename
ElseDerived
>
const
Select
<
Derived
,
ThenDerived
,
ElseDerived
>
select
(
const
DenseBase
<
ThenDerived
>&
thenMatrix
,
const
DenseBase
<
ElseDerived
>&
elseMatrix
)
const
;
template
<
typename
ThenDerived
>
inline
const
Select
<
Derived
,
ThenDerived
,
typename
ThenDerived
::
ConstantReturnType
>
select
(
const
DenseBase
<
ThenDerived
>&
thenMatrix
,
typename
ThenDerived
::
Scalar
elseScalar
)
const
;
template
<
typename
ElseDerived
>
inline
const
Select
<
Derived
,
typename
ElseDerived
::
ConstantReturnType
,
ElseDerived
>
select
(
typename
ElseDerived
::
Scalar
thenScalar
,
const
DenseBase
<
ElseDerived
>&
elseMatrix
)
const
;
template
<
int
p
>
RealScalar
lpNorm
()
const
;
template
<
int
RowFactor
,
int
ColFactor
>
const
Replicate
<
Derived
,
RowFactor
,
ColFactor
>
replicate
()
const
;
const
Replicate
<
Derived
,
Dynamic
,
Dynamic
>
replicate
(
Index
rowFacor
,
Index
colFactor
)
const
;
typedef
Reverse
<
Derived
,
BothDirections
>
ReverseReturnType
;
typedef
const
Reverse
<
const
Derived
,
BothDirections
>
ConstReverseReturnType
;
ReverseReturnType
reverse
();
ConstReverseReturnType
reverse
()
const
;
void
reverseInPlace
();
#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
# include "../plugins/BlockMethods.h"
# ifdef EIGEN_DENSEBASE_PLUGIN
# include EIGEN_DENSEBASE_PLUGIN
# endif
#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
#ifdef EIGEN2_SUPPORT
Block
<
Derived
>
corner
(
CornerType
type
,
Index
cRows
,
Index
cCols
);
const
Block
<
Derived
>
corner
(
CornerType
type
,
Index
cRows
,
Index
cCols
)
const
;
template
<
int
CRows
,
int
CCols
>
Block
<
Derived
,
CRows
,
CCols
>
corner
(
CornerType
type
);
template
<
int
CRows
,
int
CCols
>
const
Block
<
Derived
,
CRows
,
CCols
>
corner
(
CornerType
type
)
const
;
#endif // EIGEN2_SUPPORT
// disable the use of evalTo for dense objects with a nice compilation error
template
<
typename
Dest
>
inline
void
evalTo
(
Dest
&
)
const
{
EIGEN_STATIC_ASSERT
((
internal
::
is_same
<
Dest
,
void
>::
value
),
THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS
);
}
protected:
/** Default constructor. Do nothing. */
DenseBase
()
{
/* Just checks for self-consistency of the flags.
* Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
*/
#ifdef EIGEN_INTERNAL_DEBUGGING
EIGEN_STATIC_ASSERT
((
EIGEN_IMPLIES
(
MaxRowsAtCompileTime
==
1
&&
MaxColsAtCompileTime
!=
1
,
int
(
IsRowMajor
))
&&
EIGEN_IMPLIES
(
MaxColsAtCompileTime
==
1
&&
MaxRowsAtCompileTime
!=
1
,
int
(
!
IsRowMajor
))),
INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION
)
#endif
}
private:
explicit
DenseBase
(
int
);
DenseBase
(
int
,
int
);
template
<
typename
OtherDerived
>
explicit
DenseBase
(
const
DenseBase
<
OtherDerived
>&
);
};
}
// end namespace Eigen
#endif // EIGEN_DENSEBASE_H
densecrf/include/Eigen/src/Core/DenseCoeffsBase.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_DENSECOEFFSBASE_H
#define EIGEN_DENSECOEFFSBASE_H
namespace
Eigen
{
namespace
internal
{
template
<
typename
T
>
struct
add_const_on_value_type_if_arithmetic
{
typedef
typename
conditional
<
is_arithmetic
<
T
>::
value
,
T
,
typename
add_const_on_value_type
<
T
>::
type
>::
type
type
;
};
}
/** \brief Base class providing read-only coefficient access to matrices and arrays.
* \ingroup Core_Module
* \tparam Derived Type of the derived class
* \tparam #ReadOnlyAccessors Constant indicating read-only access
*
* This class defines the \c operator() \c const function and friends, which can be used to read specific
* entries of a matrix or array.
*
* \sa DenseCoeffsBase<Derived, WriteAccessors>, DenseCoeffsBase<Derived, DirectAccessors>,
* \ref TopicClassHierarchy
*/
template
<
typename
Derived
>
class
DenseCoeffsBase
<
Derived
,
ReadOnlyAccessors
>
:
public
EigenBase
<
Derived
>
{
public:
typedef
typename
internal
::
traits
<
Derived
>::
StorageKind
StorageKind
;
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
typedef
typename
internal
::
traits
<
Derived
>::
Scalar
Scalar
;
typedef
typename
internal
::
packet_traits
<
Scalar
>::
type
PacketScalar
;
// Explanation for this CoeffReturnType typedef.
// - This is the return type of the coeff() method.
// - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references
// to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value).
// - The is_artihmetic check is required since "const int", "const double", etc. will cause warnings on some systems
// while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is
// not possible, since the underlying expressions might not offer a valid address the reference could be referring to.
typedef
typename
internal
::
conditional
<
bool
(
internal
::
traits
<
Derived
>::
Flags
&
LvalueBit
),
const
Scalar
&
,
typename
internal
::
conditional
<
internal
::
is_arithmetic
<
Scalar
>::
value
,
Scalar
,
const
Scalar
>::
type
>::
type
CoeffReturnType
;
typedef
typename
internal
::
add_const_on_value_type_if_arithmetic
<
typename
internal
::
packet_traits
<
Scalar
>::
type
>::
type
PacketReturnType
;
typedef
EigenBase
<
Derived
>
Base
;
using
Base
::
rows
;
using
Base
::
cols
;
using
Base
::
size
;
using
Base
::
derived
;
EIGEN_STRONG_INLINE
Index
rowIndexByOuterInner
(
Index
outer
,
Index
inner
)
const
{
return
int
(
Derived
::
RowsAtCompileTime
)
==
1
?
0
:
int
(
Derived
::
ColsAtCompileTime
)
==
1
?
inner
:
int
(
Derived
::
Flags
)
&
RowMajorBit
?
outer
:
inner
;
}
EIGEN_STRONG_INLINE
Index
colIndexByOuterInner
(
Index
outer
,
Index
inner
)
const
{
return
int
(
Derived
::
ColsAtCompileTime
)
==
1
?
0
:
int
(
Derived
::
RowsAtCompileTime
)
==
1
?
inner
:
int
(
Derived
::
Flags
)
&
RowMajorBit
?
inner
:
outer
;
}
/** Short version: don't use this function, use
* \link operator()(Index,Index) const \endlink instead.
*
* Long version: this function is similar to
* \link operator()(Index,Index) const \endlink, but without the assertion.
* Use this for limiting the performance cost of debugging code when doing
* repeated coefficient access. Only use this when it is guaranteed that the
* parameters \a row and \a col are in range.
*
* If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
* function equivalent to \link operator()(Index,Index) const \endlink.
*
* \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const
*/
EIGEN_STRONG_INLINE
CoeffReturnType
coeff
(
Index
row
,
Index
col
)
const
{
eigen_internal_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
return
derived
().
coeff
(
row
,
col
);
}
EIGEN_STRONG_INLINE
CoeffReturnType
coeffByOuterInner
(
Index
outer
,
Index
inner
)
const
{
return
coeff
(
rowIndexByOuterInner
(
outer
,
inner
),
colIndexByOuterInner
(
outer
,
inner
));
}
/** \returns the coefficient at given the given row and column.
*
* \sa operator()(Index,Index), operator[](Index)
*/
EIGEN_STRONG_INLINE
CoeffReturnType
operator
()(
Index
row
,
Index
col
)
const
{
eigen_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
return
derived
().
coeff
(
row
,
col
);
}
/** Short version: don't use this function, use
* \link operator[](Index) const \endlink instead.
*
* Long version: this function is similar to
* \link operator[](Index) const \endlink, but without the assertion.
* Use this for limiting the performance cost of debugging code when doing
* repeated coefficient access. Only use this when it is guaranteed that the
* parameter \a index is in range.
*
* If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
* function equivalent to \link operator[](Index) const \endlink.
*
* \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const
*/
EIGEN_STRONG_INLINE
CoeffReturnType
coeff
(
Index
index
)
const
{
eigen_internal_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
coeff
(
index
);
}
/** \returns the coefficient at given index.
*
* This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
*
* \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
* z() const, w() const
*/
EIGEN_STRONG_INLINE
CoeffReturnType
operator
[](
Index
index
)
const
{
#ifndef EIGEN2_SUPPORT
EIGEN_STATIC_ASSERT
(
Derived
::
IsVectorAtCompileTime
,
THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD
)
#endif
eigen_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
coeff
(
index
);
}
/** \returns the coefficient at given index.
*
* This is synonymous to operator[](Index) const.
*
* This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
*
* \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
* z() const, w() const
*/
EIGEN_STRONG_INLINE
CoeffReturnType
operator
()(
Index
index
)
const
{
eigen_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
coeff
(
index
);
}
/** equivalent to operator[](0). */
EIGEN_STRONG_INLINE
CoeffReturnType
x
()
const
{
return
(
*
this
)[
0
];
}
/** equivalent to operator[](1). */
EIGEN_STRONG_INLINE
CoeffReturnType
y
()
const
{
return
(
*
this
)[
1
];
}
/** equivalent to operator[](2). */
EIGEN_STRONG_INLINE
CoeffReturnType
z
()
const
{
return
(
*
this
)[
2
];
}
/** equivalent to operator[](3). */
EIGEN_STRONG_INLINE
CoeffReturnType
w
()
const
{
return
(
*
this
)[
3
];
}
/** \internal
* \returns the packet of coefficients starting at the given row and column. It is your responsibility
* to ensure that a packet really starts there. This method is only available on expressions having the
* PacketAccessBit.
*
* The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
* the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
* starting at an address which is a multiple of the packet size.
*/
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketReturnType
packet
(
Index
row
,
Index
col
)
const
{
eigen_internal_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
return
derived
().
template
packet
<
LoadMode
>(
row
,
col
);
}
/** \internal */
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketReturnType
packetByOuterInner
(
Index
outer
,
Index
inner
)
const
{
return
packet
<
LoadMode
>
(
rowIndexByOuterInner
(
outer
,
inner
),
colIndexByOuterInner
(
outer
,
inner
));
}
/** \internal
* \returns the packet of coefficients starting at the given index. It is your responsibility
* to ensure that a packet really starts there. This method is only available on expressions having the
* PacketAccessBit and the LinearAccessBit.
*
* The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
* the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
* starting at an address which is a multiple of the packet size.
*/
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketReturnType
packet
(
Index
index
)
const
{
eigen_internal_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
template
packet
<
LoadMode
>(
index
);
}
protected:
// explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase.
// But some methods are only available in the DirectAccess case.
// So we add dummy methods here with these names, so that "using... " doesn't fail.
// It's not private so that the child class DenseBase can access them, and it's not public
// either since it's an implementation detail, so has to be protected.
void
coeffRef
();
void
coeffRefByOuterInner
();
void
writePacket
();
void
writePacketByOuterInner
();
void
copyCoeff
();
void
copyCoeffByOuterInner
();
void
copyPacket
();
void
copyPacketByOuterInner
();
void
stride
();
void
innerStride
();
void
outerStride
();
void
rowStride
();
void
colStride
();
};
/** \brief Base class providing read/write coefficient access to matrices and arrays.
* \ingroup Core_Module
* \tparam Derived Type of the derived class
* \tparam #WriteAccessors Constant indicating read/write access
*
* This class defines the non-const \c operator() function and friends, which can be used to write specific
* entries of a matrix or array. This class inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which
* defines the const variant for reading specific entries.
*
* \sa DenseCoeffsBase<Derived, DirectAccessors>, \ref TopicClassHierarchy
*/
template
<
typename
Derived
>
class
DenseCoeffsBase
<
Derived
,
WriteAccessors
>
:
public
DenseCoeffsBase
<
Derived
,
ReadOnlyAccessors
>
{
public:
typedef
DenseCoeffsBase
<
Derived
,
ReadOnlyAccessors
>
Base
;
typedef
typename
internal
::
traits
<
Derived
>::
StorageKind
StorageKind
;
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
typedef
typename
internal
::
traits
<
Derived
>::
Scalar
Scalar
;
typedef
typename
internal
::
packet_traits
<
Scalar
>::
type
PacketScalar
;
typedef
typename
NumTraits
<
Scalar
>::
Real
RealScalar
;
using
Base
::
coeff
;
using
Base
::
rows
;
using
Base
::
cols
;
using
Base
::
size
;
using
Base
::
derived
;
using
Base
::
rowIndexByOuterInner
;
using
Base
::
colIndexByOuterInner
;
using
Base
::
operator
[];
using
Base
::
operator
();
using
Base
::
x
;
using
Base
::
y
;
using
Base
::
z
;
using
Base
::
w
;
/** Short version: don't use this function, use
* \link operator()(Index,Index) \endlink instead.
*
* Long version: this function is similar to
* \link operator()(Index,Index) \endlink, but without the assertion.
* Use this for limiting the performance cost of debugging code when doing
* repeated coefficient access. Only use this when it is guaranteed that the
* parameters \a row and \a col are in range.
*
* If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
* function equivalent to \link operator()(Index,Index) \endlink.
*
* \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index)
*/
EIGEN_STRONG_INLINE
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
{
eigen_internal_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
return
derived
().
coeffRef
(
row
,
col
);
}
EIGEN_STRONG_INLINE
Scalar
&
coeffRefByOuterInner
(
Index
outer
,
Index
inner
)
{
return
coeffRef
(
rowIndexByOuterInner
(
outer
,
inner
),
colIndexByOuterInner
(
outer
,
inner
));
}
/** \returns a reference to the coefficient at given the given row and column.
*
* \sa operator[](Index)
*/
EIGEN_STRONG_INLINE
Scalar
&
operator
()(
Index
row
,
Index
col
)
{
eigen_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
return
derived
().
coeffRef
(
row
,
col
);
}
/** Short version: don't use this function, use
* \link operator[](Index) \endlink instead.
*
* Long version: this function is similar to
* \link operator[](Index) \endlink, but without the assertion.
* Use this for limiting the performance cost of debugging code when doing
* repeated coefficient access. Only use this when it is guaranteed that the
* parameters \a row and \a col are in range.
*
* If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
* function equivalent to \link operator[](Index) \endlink.
*
* \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index)
*/
EIGEN_STRONG_INLINE
Scalar
&
coeffRef
(
Index
index
)
{
eigen_internal_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
coeffRef
(
index
);
}
/** \returns a reference to the coefficient at given index.
*
* This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
*
* \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
*/
EIGEN_STRONG_INLINE
Scalar
&
operator
[](
Index
index
)
{
#ifndef EIGEN2_SUPPORT
EIGEN_STATIC_ASSERT
(
Derived
::
IsVectorAtCompileTime
,
THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD
)
#endif
eigen_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
coeffRef
(
index
);
}
/** \returns a reference to the coefficient at given index.
*
* This is synonymous to operator[](Index).
*
* This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
*
* \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
*/
EIGEN_STRONG_INLINE
Scalar
&
operator
()(
Index
index
)
{
eigen_assert
(
index
>=
0
&&
index
<
size
());
return
derived
().
coeffRef
(
index
);
}
/** equivalent to operator[](0). */
EIGEN_STRONG_INLINE
Scalar
&
x
()
{
return
(
*
this
)[
0
];
}
/** equivalent to operator[](1). */
EIGEN_STRONG_INLINE
Scalar
&
y
()
{
return
(
*
this
)[
1
];
}
/** equivalent to operator[](2). */
EIGEN_STRONG_INLINE
Scalar
&
z
()
{
return
(
*
this
)[
2
];
}
/** equivalent to operator[](3). */
EIGEN_STRONG_INLINE
Scalar
&
w
()
{
return
(
*
this
)[
3
];
}
/** \internal
* Stores the given packet of coefficients, at the given row and column of this expression. It is your responsibility
* to ensure that a packet really starts there. This method is only available on expressions having the
* PacketAccessBit.
*
* The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
* the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
* starting at an address which is a multiple of the packet size.
*/
template
<
int
StoreMode
>
EIGEN_STRONG_INLINE
void
writePacket
(
Index
row
,
Index
col
,
const
typename
internal
::
packet_traits
<
Scalar
>::
type
&
x
)
{
eigen_internal_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
derived
().
template
writePacket
<
StoreMode
>(
row
,
col
,
x
);
}
/** \internal */
template
<
int
StoreMode
>
EIGEN_STRONG_INLINE
void
writePacketByOuterInner
(
Index
outer
,
Index
inner
,
const
typename
internal
::
packet_traits
<
Scalar
>::
type
&
x
)
{
writePacket
<
StoreMode
>
(
rowIndexByOuterInner
(
outer
,
inner
),
colIndexByOuterInner
(
outer
,
inner
),
x
);
}
/** \internal
* Stores the given packet of coefficients, at the given index in this expression. It is your responsibility
* to ensure that a packet really starts there. This method is only available on expressions having the
* PacketAccessBit and the LinearAccessBit.
*
* The \a LoadMode parameter may have the value \a Aligned or \a Unaligned. Its effect is to select
* the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
* starting at an address which is a multiple of the packet size.
*/
template
<
int
StoreMode
>
EIGEN_STRONG_INLINE
void
writePacket
(
Index
index
,
const
typename
internal
::
packet_traits
<
Scalar
>::
type
&
x
)
{
eigen_internal_assert
(
index
>=
0
&&
index
<
size
());
derived
().
template
writePacket
<
StoreMode
>(
index
,
x
);
}
#ifndef EIGEN_PARSED_BY_DOXYGEN
/** \internal Copies the coefficient at position (row,col) of other into *this.
*
* This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
* with usual assignments.
*
* Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
*/
template
<
typename
OtherDerived
>
EIGEN_STRONG_INLINE
void
copyCoeff
(
Index
row
,
Index
col
,
const
DenseBase
<
OtherDerived
>&
other
)
{
eigen_internal_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
derived
().
coeffRef
(
row
,
col
)
=
other
.
derived
().
coeff
(
row
,
col
);
}
/** \internal Copies the coefficient at the given index of other into *this.
*
* This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
* with usual assignments.
*
* Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
*/
template
<
typename
OtherDerived
>
EIGEN_STRONG_INLINE
void
copyCoeff
(
Index
index
,
const
DenseBase
<
OtherDerived
>&
other
)
{
eigen_internal_assert
(
index
>=
0
&&
index
<
size
());
derived
().
coeffRef
(
index
)
=
other
.
derived
().
coeff
(
index
);
}
template
<
typename
OtherDerived
>
EIGEN_STRONG_INLINE
void
copyCoeffByOuterInner
(
Index
outer
,
Index
inner
,
const
DenseBase
<
OtherDerived
>&
other
)
{
const
Index
row
=
rowIndexByOuterInner
(
outer
,
inner
);
const
Index
col
=
colIndexByOuterInner
(
outer
,
inner
);
// derived() is important here: copyCoeff() may be reimplemented in Derived!
derived
().
copyCoeff
(
row
,
col
,
other
);
}
/** \internal Copies the packet at position (row,col) of other into *this.
*
* This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
* with usual assignments.
*
* Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
*/
template
<
typename
OtherDerived
,
int
StoreMode
,
int
LoadMode
>
EIGEN_STRONG_INLINE
void
copyPacket
(
Index
row
,
Index
col
,
const
DenseBase
<
OtherDerived
>&
other
)
{
eigen_internal_assert
(
row
>=
0
&&
row
<
rows
()
&&
col
>=
0
&&
col
<
cols
());
derived
().
template
writePacket
<
StoreMode
>(
row
,
col
,
other
.
derived
().
template
packet
<
LoadMode
>(
row
,
col
));
}
/** \internal Copies the packet at the given index of other into *this.
*
* This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
* with usual assignments.
*
* Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
*/
template
<
typename
OtherDerived
,
int
StoreMode
,
int
LoadMode
>
EIGEN_STRONG_INLINE
void
copyPacket
(
Index
index
,
const
DenseBase
<
OtherDerived
>&
other
)
{
eigen_internal_assert
(
index
>=
0
&&
index
<
size
());
derived
().
template
writePacket
<
StoreMode
>(
index
,
other
.
derived
().
template
packet
<
LoadMode
>(
index
));
}
/** \internal */
template
<
typename
OtherDerived
,
int
StoreMode
,
int
LoadMode
>
EIGEN_STRONG_INLINE
void
copyPacketByOuterInner
(
Index
outer
,
Index
inner
,
const
DenseBase
<
OtherDerived
>&
other
)
{
const
Index
row
=
rowIndexByOuterInner
(
outer
,
inner
);
const
Index
col
=
colIndexByOuterInner
(
outer
,
inner
);
// derived() is important here: copyCoeff() may be reimplemented in Derived!
derived
().
template
copyPacket
<
OtherDerived
,
StoreMode
,
LoadMode
>(
row
,
col
,
other
);
}
#endif
};
/** \brief Base class providing direct read-only coefficient access to matrices and arrays.
* \ingroup Core_Module
* \tparam Derived Type of the derived class
* \tparam #DirectAccessors Constant indicating direct access
*
* This class defines functions to work with strides which can be used to access entries directly. This class
* inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which defines functions to access entries read-only using
* \c operator() .
*
* \sa \ref TopicClassHierarchy
*/
template
<
typename
Derived
>
class
DenseCoeffsBase
<
Derived
,
DirectAccessors
>
:
public
DenseCoeffsBase
<
Derived
,
ReadOnlyAccessors
>
{
public:
typedef
DenseCoeffsBase
<
Derived
,
ReadOnlyAccessors
>
Base
;
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
typedef
typename
internal
::
traits
<
Derived
>::
Scalar
Scalar
;
typedef
typename
NumTraits
<
Scalar
>::
Real
RealScalar
;
using
Base
::
rows
;
using
Base
::
cols
;
using
Base
::
size
;
using
Base
::
derived
;
/** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
*
* \sa outerStride(), rowStride(), colStride()
*/
inline
Index
innerStride
()
const
{
return
derived
().
innerStride
();
}
/** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
* in a column-major matrix).
*
* \sa innerStride(), rowStride(), colStride()
*/
inline
Index
outerStride
()
const
{
return
derived
().
outerStride
();
}
// FIXME shall we remove it ?
inline
Index
stride
()
const
{
return
Derived
::
IsVectorAtCompileTime
?
innerStride
()
:
outerStride
();
}
/** \returns the pointer increment between two consecutive rows.
*
* \sa innerStride(), outerStride(), colStride()
*/
inline
Index
rowStride
()
const
{
return
Derived
::
IsRowMajor
?
outerStride
()
:
innerStride
();
}
/** \returns the pointer increment between two consecutive columns.
*
* \sa innerStride(), outerStride(), rowStride()
*/
inline
Index
colStride
()
const
{
return
Derived
::
IsRowMajor
?
innerStride
()
:
outerStride
();
}
};
/** \brief Base class providing direct read/write coefficient access to matrices and arrays.
* \ingroup Core_Module
* \tparam Derived Type of the derived class
* \tparam #DirectWriteAccessors Constant indicating direct access
*
* This class defines functions to work with strides which can be used to access entries directly. This class
* inherits DenseCoeffsBase<Derived, WriteAccessors> which defines functions to access entries read/write using
* \c operator().
*
* \sa \ref TopicClassHierarchy
*/
template
<
typename
Derived
>
class
DenseCoeffsBase
<
Derived
,
DirectWriteAccessors
>
:
public
DenseCoeffsBase
<
Derived
,
WriteAccessors
>
{
public:
typedef
DenseCoeffsBase
<
Derived
,
WriteAccessors
>
Base
;
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
typedef
typename
internal
::
traits
<
Derived
>::
Scalar
Scalar
;
typedef
typename
NumTraits
<
Scalar
>::
Real
RealScalar
;
using
Base
::
rows
;
using
Base
::
cols
;
using
Base
::
size
;
using
Base
::
derived
;
/** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
*
* \sa outerStride(), rowStride(), colStride()
*/
inline
Index
innerStride
()
const
{
return
derived
().
innerStride
();
}
/** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
* in a column-major matrix).
*
* \sa innerStride(), rowStride(), colStride()
*/
inline
Index
outerStride
()
const
{
return
derived
().
outerStride
();
}
// FIXME shall we remove it ?
inline
Index
stride
()
const
{
return
Derived
::
IsVectorAtCompileTime
?
innerStride
()
:
outerStride
();
}
/** \returns the pointer increment between two consecutive rows.
*
* \sa innerStride(), outerStride(), colStride()
*/
inline
Index
rowStride
()
const
{
return
Derived
::
IsRowMajor
?
outerStride
()
:
innerStride
();
}
/** \returns the pointer increment between two consecutive columns.
*
* \sa innerStride(), outerStride(), rowStride()
*/
inline
Index
colStride
()
const
{
return
Derived
::
IsRowMajor
?
innerStride
()
:
outerStride
();
}
};
namespace
internal
{
template
<
typename
Derived
,
bool
JustReturnZero
>
struct
first_aligned_impl
{
static
inline
typename
Derived
::
Index
run
(
const
Derived
&
)
{
return
0
;
}
};
template
<
typename
Derived
>
struct
first_aligned_impl
<
Derived
,
false
>
{
static
inline
typename
Derived
::
Index
run
(
const
Derived
&
m
)
{
return
internal
::
first_aligned
(
&
m
.
const_cast_derived
().
coeffRef
(
0
,
0
),
m
.
size
());
}
};
/** \internal \returns the index of the first element of the array that is well aligned for vectorization.
*
* There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more
* documentation.
*/
template
<
typename
Derived
>
static
inline
typename
Derived
::
Index
first_aligned
(
const
Derived
&
m
)
{
return
first_aligned_impl
<
Derived
,
(
Derived
::
Flags
&
AlignedBit
)
||
!
(
Derived
::
Flags
&
DirectAccessBit
)
>
::
run
(
m
);
}
template
<
typename
Derived
,
bool
HasDirectAccess
=
has_direct_access
<
Derived
>
::
ret
>
struct
inner_stride_at_compile_time
{
enum
{
ret
=
traits
<
Derived
>::
InnerStrideAtCompileTime
};
};
template
<
typename
Derived
>
struct
inner_stride_at_compile_time
<
Derived
,
false
>
{
enum
{
ret
=
0
};
};
template
<
typename
Derived
,
bool
HasDirectAccess
=
has_direct_access
<
Derived
>
::
ret
>
struct
outer_stride_at_compile_time
{
enum
{
ret
=
traits
<
Derived
>::
OuterStrideAtCompileTime
};
};
template
<
typename
Derived
>
struct
outer_stride_at_compile_time
<
Derived
,
false
>
{
enum
{
ret
=
0
};
};
}
// end namespace internal
}
// end namespace Eigen
#endif // EIGEN_DENSECOEFFSBASE_H
densecrf/include/Eigen/src/Core/DenseStorage.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_MATRIXSTORAGE_H
#define EIGEN_MATRIXSTORAGE_H
#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
#else
#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
#endif
namespace
Eigen
{
namespace
internal
{
struct
constructor_without_unaligned_array_assert
{};
/** \internal
* Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned:
* to 16 bytes boundary if the total size is a multiple of 16 bytes.
*/
template
<
typename
T
,
int
Size
,
int
MatrixOrArrayOptions
,
int
Alignment
=
(
MatrixOrArrayOptions
&
DontAlign
)
?
0
:
(((
Size
*
sizeof
(
T
))
%
16
)
==
0
)
?
16
:
0
>
struct
plain_array
{
T
array
[
Size
];
plain_array
()
{}
plain_array
(
constructor_without_unaligned_array_assert
)
{}
};
#if defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
#elif EIGEN_GNUC_AT_LEAST(4,7)
// GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned.
// See this bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900
// Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined:
template
<
typename
PtrType
>
EIGEN_ALWAYS_INLINE
PtrType
eigen_unaligned_array_assert_workaround_gcc47
(
PtrType
array
)
{
return
array
;
}
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
eigen_assert((reinterpret_cast<size_t>(eigen_unaligned_array_assert_workaround_gcc47(array)) & sizemask) == 0 \
&& "this assertion is explained here: " \
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
" **** READ THIS WEB PAGE !!! ****");
#else
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
eigen_assert((reinterpret_cast<size_t>(array) & sizemask) == 0 \
&& "this assertion is explained here: " \
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
" **** READ THIS WEB PAGE !!! ****");
#endif
template
<
typename
T
,
int
Size
,
int
MatrixOrArrayOptions
>
struct
plain_array
<
T
,
Size
,
MatrixOrArrayOptions
,
16
>
{
EIGEN_USER_ALIGN16
T
array
[
Size
];
plain_array
()
{
EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT
(
0xf
)
}
plain_array
(
constructor_without_unaligned_array_assert
)
{}
};
template
<
typename
T
,
int
MatrixOrArrayOptions
,
int
Alignment
>
struct
plain_array
<
T
,
0
,
MatrixOrArrayOptions
,
Alignment
>
{
EIGEN_USER_ALIGN16
T
array
[
1
];
plain_array
()
{}
plain_array
(
constructor_without_unaligned_array_assert
)
{}
};
}
// end namespace internal
/** \internal
*
* \class DenseStorage
* \ingroup Core_Module
*
* \brief Stores the data of a matrix
*
* This class stores the data of fixed-size, dynamic-size or mixed matrices
* in a way as compact as possible.
*
* \sa Matrix
*/
template
<
typename
T
,
int
Size
,
int
_Rows
,
int
_Cols
,
int
_Options
>
class
DenseStorage
;
// purely fixed-size matrix
template
<
typename
T
,
int
Size
,
int
_Rows
,
int
_Cols
,
int
_Options
>
class
DenseStorage
{
internal
::
plain_array
<
T
,
Size
,
_Options
>
m_data
;
public:
inline
explicit
DenseStorage
()
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
internal
::
constructor_without_unaligned_array_assert
())
{}
inline
DenseStorage
(
DenseIndex
,
DenseIndex
,
DenseIndex
)
{}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
}
static
inline
DenseIndex
rows
(
void
)
{
return
_Rows
;}
static
inline
DenseIndex
cols
(
void
)
{
return
_Cols
;}
inline
void
conservativeResize
(
DenseIndex
,
DenseIndex
,
DenseIndex
)
{}
inline
void
resize
(
DenseIndex
,
DenseIndex
,
DenseIndex
)
{}
inline
const
T
*
data
()
const
{
return
m_data
.
array
;
}
inline
T
*
data
()
{
return
m_data
.
array
;
}
};
// null matrix
template
<
typename
T
,
int
_Rows
,
int
_Cols
,
int
_Options
>
class
DenseStorage
<
T
,
0
,
_Rows
,
_Cols
,
_Options
>
{
public:
inline
explicit
DenseStorage
()
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
{}
inline
DenseStorage
(
DenseIndex
,
DenseIndex
,
DenseIndex
)
{}
inline
void
swap
(
DenseStorage
&
)
{}
static
inline
DenseIndex
rows
(
void
)
{
return
_Rows
;}
static
inline
DenseIndex
cols
(
void
)
{
return
_Cols
;}
inline
void
conservativeResize
(
DenseIndex
,
DenseIndex
,
DenseIndex
)
{}
inline
void
resize
(
DenseIndex
,
DenseIndex
,
DenseIndex
)
{}
inline
const
T
*
data
()
const
{
return
0
;
}
inline
T
*
data
()
{
return
0
;
}
};
// more specializations for null matrices; these are necessary to resolve ambiguities
template
<
typename
T
,
int
_Options
>
class
DenseStorage
<
T
,
0
,
Dynamic
,
Dynamic
,
_Options
>
:
public
DenseStorage
<
T
,
0
,
0
,
0
,
_Options
>
{
};
template
<
typename
T
,
int
_Rows
,
int
_Options
>
class
DenseStorage
<
T
,
0
,
_Rows
,
Dynamic
,
_Options
>
:
public
DenseStorage
<
T
,
0
,
0
,
0
,
_Options
>
{
};
template
<
typename
T
,
int
_Cols
,
int
_Options
>
class
DenseStorage
<
T
,
0
,
Dynamic
,
_Cols
,
_Options
>
:
public
DenseStorage
<
T
,
0
,
0
,
0
,
_Options
>
{
};
// dynamic-size matrix with fixed-size storage
template
<
typename
T
,
int
Size
,
int
_Options
>
class
DenseStorage
<
T
,
Size
,
Dynamic
,
Dynamic
,
_Options
>
{
internal
::
plain_array
<
T
,
Size
,
_Options
>
m_data
;
DenseIndex
m_rows
;
DenseIndex
m_cols
;
public:
inline
explicit
DenseStorage
()
:
m_rows
(
0
),
m_cols
(
0
)
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
internal
::
constructor_without_unaligned_array_assert
()),
m_rows
(
0
),
m_cols
(
0
)
{}
inline
DenseStorage
(
DenseIndex
,
DenseIndex
rows
,
DenseIndex
cols
)
:
m_rows
(
rows
),
m_cols
(
cols
)
{}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
std
::
swap
(
m_rows
,
other
.
m_rows
);
std
::
swap
(
m_cols
,
other
.
m_cols
);
}
inline
DenseIndex
rows
(
void
)
const
{
return
m_rows
;}
inline
DenseIndex
cols
(
void
)
const
{
return
m_cols
;}
inline
void
conservativeResize
(
DenseIndex
,
DenseIndex
rows
,
DenseIndex
cols
)
{
m_rows
=
rows
;
m_cols
=
cols
;
}
inline
void
resize
(
DenseIndex
,
DenseIndex
rows
,
DenseIndex
cols
)
{
m_rows
=
rows
;
m_cols
=
cols
;
}
inline
const
T
*
data
()
const
{
return
m_data
.
array
;
}
inline
T
*
data
()
{
return
m_data
.
array
;
}
};
// dynamic-size matrix with fixed-size storage and fixed width
template
<
typename
T
,
int
Size
,
int
_Cols
,
int
_Options
>
class
DenseStorage
<
T
,
Size
,
Dynamic
,
_Cols
,
_Options
>
{
internal
::
plain_array
<
T
,
Size
,
_Options
>
m_data
;
DenseIndex
m_rows
;
public:
inline
explicit
DenseStorage
()
:
m_rows
(
0
)
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
internal
::
constructor_without_unaligned_array_assert
()),
m_rows
(
0
)
{}
inline
DenseStorage
(
DenseIndex
,
DenseIndex
rows
,
DenseIndex
)
:
m_rows
(
rows
)
{}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
std
::
swap
(
m_rows
,
other
.
m_rows
);
}
inline
DenseIndex
rows
(
void
)
const
{
return
m_rows
;}
inline
DenseIndex
cols
(
void
)
const
{
return
_Cols
;}
inline
void
conservativeResize
(
DenseIndex
,
DenseIndex
rows
,
DenseIndex
)
{
m_rows
=
rows
;
}
inline
void
resize
(
DenseIndex
,
DenseIndex
rows
,
DenseIndex
)
{
m_rows
=
rows
;
}
inline
const
T
*
data
()
const
{
return
m_data
.
array
;
}
inline
T
*
data
()
{
return
m_data
.
array
;
}
};
// dynamic-size matrix with fixed-size storage and fixed height
template
<
typename
T
,
int
Size
,
int
_Rows
,
int
_Options
>
class
DenseStorage
<
T
,
Size
,
_Rows
,
Dynamic
,
_Options
>
{
internal
::
plain_array
<
T
,
Size
,
_Options
>
m_data
;
DenseIndex
m_cols
;
public:
inline
explicit
DenseStorage
()
:
m_cols
(
0
)
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
internal
::
constructor_without_unaligned_array_assert
()),
m_cols
(
0
)
{}
inline
DenseStorage
(
DenseIndex
,
DenseIndex
,
DenseIndex
cols
)
:
m_cols
(
cols
)
{}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
std
::
swap
(
m_cols
,
other
.
m_cols
);
}
inline
DenseIndex
rows
(
void
)
const
{
return
_Rows
;}
inline
DenseIndex
cols
(
void
)
const
{
return
m_cols
;}
inline
void
conservativeResize
(
DenseIndex
,
DenseIndex
,
DenseIndex
cols
)
{
m_cols
=
cols
;
}
inline
void
resize
(
DenseIndex
,
DenseIndex
,
DenseIndex
cols
)
{
m_cols
=
cols
;
}
inline
const
T
*
data
()
const
{
return
m_data
.
array
;
}
inline
T
*
data
()
{
return
m_data
.
array
;
}
};
// purely dynamic matrix.
template
<
typename
T
,
int
_Options
>
class
DenseStorage
<
T
,
Dynamic
,
Dynamic
,
Dynamic
,
_Options
>
{
T
*
m_data
;
DenseIndex
m_rows
;
DenseIndex
m_cols
;
public:
inline
explicit
DenseStorage
()
:
m_data
(
0
),
m_rows
(
0
),
m_cols
(
0
)
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
0
),
m_rows
(
0
),
m_cols
(
0
)
{}
inline
DenseStorage
(
DenseIndex
size
,
DenseIndex
rows
,
DenseIndex
cols
)
:
m_data
(
internal
::
conditional_aligned_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
size
)),
m_rows
(
rows
),
m_cols
(
cols
)
{
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
inline
~
DenseStorage
()
{
internal
::
conditional_aligned_delete_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
m_rows
*
m_cols
);
}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
std
::
swap
(
m_rows
,
other
.
m_rows
);
std
::
swap
(
m_cols
,
other
.
m_cols
);
}
inline
DenseIndex
rows
(
void
)
const
{
return
m_rows
;}
inline
DenseIndex
cols
(
void
)
const
{
return
m_cols
;}
inline
void
conservativeResize
(
DenseIndex
size
,
DenseIndex
rows
,
DenseIndex
cols
)
{
m_data
=
internal
::
conditional_aligned_realloc_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
size
,
m_rows
*
m_cols
);
m_rows
=
rows
;
m_cols
=
cols
;
}
void
resize
(
DenseIndex
size
,
DenseIndex
rows
,
DenseIndex
cols
)
{
if
(
size
!=
m_rows
*
m_cols
)
{
internal
::
conditional_aligned_delete_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
m_rows
*
m_cols
);
if
(
size
)
m_data
=
internal
::
conditional_aligned_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
size
);
else
m_data
=
0
;
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
m_rows
=
rows
;
m_cols
=
cols
;
}
inline
const
T
*
data
()
const
{
return
m_data
;
}
inline
T
*
data
()
{
return
m_data
;
}
};
// matrix with dynamic width and fixed height (so that matrix has dynamic size).
template
<
typename
T
,
int
_Rows
,
int
_Options
>
class
DenseStorage
<
T
,
Dynamic
,
_Rows
,
Dynamic
,
_Options
>
{
T
*
m_data
;
DenseIndex
m_cols
;
public:
inline
explicit
DenseStorage
()
:
m_data
(
0
),
m_cols
(
0
)
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
0
),
m_cols
(
0
)
{}
inline
DenseStorage
(
DenseIndex
size
,
DenseIndex
,
DenseIndex
cols
)
:
m_data
(
internal
::
conditional_aligned_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
size
)),
m_cols
(
cols
)
{
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
inline
~
DenseStorage
()
{
internal
::
conditional_aligned_delete_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
_Rows
*
m_cols
);
}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
std
::
swap
(
m_cols
,
other
.
m_cols
);
}
static
inline
DenseIndex
rows
(
void
)
{
return
_Rows
;}
inline
DenseIndex
cols
(
void
)
const
{
return
m_cols
;}
inline
void
conservativeResize
(
DenseIndex
size
,
DenseIndex
,
DenseIndex
cols
)
{
m_data
=
internal
::
conditional_aligned_realloc_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
size
,
_Rows
*
m_cols
);
m_cols
=
cols
;
}
EIGEN_STRONG_INLINE
void
resize
(
DenseIndex
size
,
DenseIndex
,
DenseIndex
cols
)
{
if
(
size
!=
_Rows
*
m_cols
)
{
internal
::
conditional_aligned_delete_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
_Rows
*
m_cols
);
if
(
size
)
m_data
=
internal
::
conditional_aligned_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
size
);
else
m_data
=
0
;
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
m_cols
=
cols
;
}
inline
const
T
*
data
()
const
{
return
m_data
;
}
inline
T
*
data
()
{
return
m_data
;
}
};
// matrix with dynamic height and fixed width (so that matrix has dynamic size).
template
<
typename
T
,
int
_Cols
,
int
_Options
>
class
DenseStorage
<
T
,
Dynamic
,
Dynamic
,
_Cols
,
_Options
>
{
T
*
m_data
;
DenseIndex
m_rows
;
public:
inline
explicit
DenseStorage
()
:
m_data
(
0
),
m_rows
(
0
)
{}
inline
DenseStorage
(
internal
::
constructor_without_unaligned_array_assert
)
:
m_data
(
0
),
m_rows
(
0
)
{}
inline
DenseStorage
(
DenseIndex
size
,
DenseIndex
rows
,
DenseIndex
)
:
m_data
(
internal
::
conditional_aligned_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
size
)),
m_rows
(
rows
)
{
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
inline
~
DenseStorage
()
{
internal
::
conditional_aligned_delete_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
_Cols
*
m_rows
);
}
inline
void
swap
(
DenseStorage
&
other
)
{
std
::
swap
(
m_data
,
other
.
m_data
);
std
::
swap
(
m_rows
,
other
.
m_rows
);
}
inline
DenseIndex
rows
(
void
)
const
{
return
m_rows
;}
static
inline
DenseIndex
cols
(
void
)
{
return
_Cols
;}
inline
void
conservativeResize
(
DenseIndex
size
,
DenseIndex
rows
,
DenseIndex
)
{
m_data
=
internal
::
conditional_aligned_realloc_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
size
,
m_rows
*
_Cols
);
m_rows
=
rows
;
}
EIGEN_STRONG_INLINE
void
resize
(
DenseIndex
size
,
DenseIndex
rows
,
DenseIndex
)
{
if
(
size
!=
m_rows
*
_Cols
)
{
internal
::
conditional_aligned_delete_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
m_data
,
_Cols
*
m_rows
);
if
(
size
)
m_data
=
internal
::
conditional_aligned_new_auto
<
T
,(
_Options
&
DontAlign
)
==
0
>
(
size
);
else
m_data
=
0
;
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
m_rows
=
rows
;
}
inline
const
T
*
data
()
const
{
return
m_data
;
}
inline
T
*
data
()
{
return
m_data
;
}
};
}
// end namespace Eigen
#endif // EIGEN_MATRIX_H
densecrf/include/Eigen/src/Core/Diagonal.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_DIAGONAL_H
#define EIGEN_DIAGONAL_H
namespace
Eigen
{
/** \class Diagonal
* \ingroup Core_Module
*
* \brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix
*
* \param MatrixType the type of the object in which we are taking a sub/main/super diagonal
* \param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.
* A positive value means a superdiagonal, a negative value means a subdiagonal.
* You can also use Dynamic so the index can be set at runtime.
*
* The matrix is not required to be square.
*
* This class represents an expression of the main diagonal, or any sub/super diagonal
* of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the
* time this is the only way it is used.
*
* \sa MatrixBase::diagonal(), MatrixBase::diagonal(Index)
*/
namespace
internal
{
template
<
typename
MatrixType
,
int
DiagIndex
>
struct
traits
<
Diagonal
<
MatrixType
,
DiagIndex
>
>
:
traits
<
MatrixType
>
{
typedef
typename
nested
<
MatrixType
>::
type
MatrixTypeNested
;
typedef
typename
remove_reference
<
MatrixTypeNested
>::
type
_MatrixTypeNested
;
typedef
typename
MatrixType
::
StorageKind
StorageKind
;
enum
{
RowsAtCompileTime
=
(
int
(
DiagIndex
)
==
Dynamic
||
int
(
MatrixType
::
SizeAtCompileTime
)
==
Dynamic
)
?
Dynamic
:
(
EIGEN_PLAIN_ENUM_MIN
(
MatrixType
::
RowsAtCompileTime
-
EIGEN_PLAIN_ENUM_MAX
(
-
DiagIndex
,
0
),
MatrixType
::
ColsAtCompileTime
-
EIGEN_PLAIN_ENUM_MAX
(
DiagIndex
,
0
))),
ColsAtCompileTime
=
1
,
MaxRowsAtCompileTime
=
int
(
MatrixType
::
MaxSizeAtCompileTime
)
==
Dynamic
?
Dynamic
:
DiagIndex
==
Dynamic
?
EIGEN_SIZE_MIN_PREFER_FIXED
(
MatrixType
::
MaxRowsAtCompileTime
,
MatrixType
::
MaxColsAtCompileTime
)
:
(
EIGEN_PLAIN_ENUM_MIN
(
MatrixType
::
MaxRowsAtCompileTime
-
EIGEN_PLAIN_ENUM_MAX
(
-
DiagIndex
,
0
),
MatrixType
::
MaxColsAtCompileTime
-
EIGEN_PLAIN_ENUM_MAX
(
DiagIndex
,
0
))),
MaxColsAtCompileTime
=
1
,
MaskLvalueBit
=
is_lvalue
<
MatrixType
>::
value
?
LvalueBit
:
0
,
Flags
=
(
unsigned
int
)
_MatrixTypeNested
::
Flags
&
(
HereditaryBits
|
LinearAccessBit
|
MaskLvalueBit
|
DirectAccessBit
)
&
~
RowMajorBit
,
CoeffReadCost
=
_MatrixTypeNested
::
CoeffReadCost
,
MatrixTypeOuterStride
=
outer_stride_at_compile_time
<
MatrixType
>::
ret
,
InnerStrideAtCompileTime
=
MatrixTypeOuterStride
==
Dynamic
?
Dynamic
:
MatrixTypeOuterStride
+
1
,
OuterStrideAtCompileTime
=
0
};
};
}
template
<
typename
MatrixType
,
int
DiagIndex
>
class
Diagonal
:
public
internal
::
dense_xpr_base
<
Diagonal
<
MatrixType
,
DiagIndex
>
>::
type
{
public:
typedef
typename
internal
::
dense_xpr_base
<
Diagonal
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Diagonal
)
inline
Diagonal
(
MatrixType
&
matrix
,
Index
index
=
DiagIndex
)
:
m_matrix
(
matrix
),
m_index
(
index
)
{}
EIGEN_INHERIT_ASSIGNMENT_OPERATORS
(
Diagonal
)
inline
Index
rows
()
const
{
return
m_index
.
value
()
<
0
?
(
std
::
min
)(
m_matrix
.
cols
(),
m_matrix
.
rows
()
+
m_index
.
value
())
:
(
std
::
min
)(
m_matrix
.
rows
(),
m_matrix
.
cols
()
-
m_index
.
value
());
}
inline
Index
cols
()
const
{
return
1
;
}
inline
Index
innerStride
()
const
{
return
m_matrix
.
outerStride
()
+
1
;
}
inline
Index
outerStride
()
const
{
return
0
;
}
typedef
typename
internal
::
conditional
<
internal
::
is_lvalue
<
MatrixType
>::
value
,
Scalar
,
const
Scalar
>::
type
ScalarWithConstIfNotLvalue
;
inline
ScalarWithConstIfNotLvalue
*
data
()
{
return
&
(
m_matrix
.
const_cast_derived
().
coeffRef
(
rowOffset
(),
colOffset
()));
}
inline
const
Scalar
*
data
()
const
{
return
&
(
m_matrix
.
const_cast_derived
().
coeffRef
(
rowOffset
(),
colOffset
()));
}
inline
Scalar
&
coeffRef
(
Index
row
,
Index
)
{
EIGEN_STATIC_ASSERT_LVALUE
(
MatrixType
)
return
m_matrix
.
const_cast_derived
().
coeffRef
(
row
+
rowOffset
(),
row
+
colOffset
());
}
inline
const
Scalar
&
coeffRef
(
Index
row
,
Index
)
const
{
return
m_matrix
.
const_cast_derived
().
coeffRef
(
row
+
rowOffset
(),
row
+
colOffset
());
}
inline
CoeffReturnType
coeff
(
Index
row
,
Index
)
const
{
return
m_matrix
.
coeff
(
row
+
rowOffset
(),
row
+
colOffset
());
}
inline
Scalar
&
coeffRef
(
Index
index
)
{
EIGEN_STATIC_ASSERT_LVALUE
(
MatrixType
)
return
m_matrix
.
const_cast_derived
().
coeffRef
(
index
+
rowOffset
(),
index
+
colOffset
());
}
inline
const
Scalar
&
coeffRef
(
Index
index
)
const
{
return
m_matrix
.
const_cast_derived
().
coeffRef
(
index
+
rowOffset
(),
index
+
colOffset
());
}
inline
CoeffReturnType
coeff
(
Index
index
)
const
{
return
m_matrix
.
coeff
(
index
+
rowOffset
(),
index
+
colOffset
());
}
const
typename
internal
::
remove_all
<
typename
MatrixType
::
Nested
>::
type
&
nestedExpression
()
const
{
return
m_matrix
;
}
int
index
()
const
{
return
m_index
.
value
();
}
protected:
typename
MatrixType
::
Nested
m_matrix
;
const
internal
::
variable_if_dynamic
<
Index
,
DiagIndex
>
m_index
;
private:
// some compilers may fail to optimize std::max etc in case of compile-time constants...
EIGEN_STRONG_INLINE
Index
absDiagIndex
()
const
{
return
m_index
.
value
()
>
0
?
m_index
.
value
()
:
-
m_index
.
value
();
}
EIGEN_STRONG_INLINE
Index
rowOffset
()
const
{
return
m_index
.
value
()
>
0
?
0
:
-
m_index
.
value
();
}
EIGEN_STRONG_INLINE
Index
colOffset
()
const
{
return
m_index
.
value
()
>
0
?
m_index
.
value
()
:
0
;
}
// triger a compile time error is someone try to call packet
template
<
int
LoadMode
>
typename
MatrixType
::
PacketReturnType
packet
(
Index
)
const
;
template
<
int
LoadMode
>
typename
MatrixType
::
PacketReturnType
packet
(
Index
,
Index
)
const
;
};
/** \returns an expression of the main diagonal of the matrix \c *this
*
* \c *this is not required to be square.
*
* Example: \include MatrixBase_diagonal.cpp
* Output: \verbinclude MatrixBase_diagonal.out
*
* \sa class Diagonal */
template
<
typename
Derived
>
inline
typename
MatrixBase
<
Derived
>::
DiagonalReturnType
MatrixBase
<
Derived
>::
diagonal
()
{
return
derived
();
}
/** This is the const version of diagonal(). */
template
<
typename
Derived
>
inline
const
typename
MatrixBase
<
Derived
>::
ConstDiagonalReturnType
MatrixBase
<
Derived
>::
diagonal
()
const
{
return
ConstDiagonalReturnType
(
derived
());
}
/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this
*
* \c *this is not required to be square.
*
* The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
* and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
*
* Example: \include MatrixBase_diagonal_int.cpp
* Output: \verbinclude MatrixBase_diagonal_int.out
*
* \sa MatrixBase::diagonal(), class Diagonal */
template
<
typename
Derived
>
inline
typename
MatrixBase
<
Derived
>::
template
DiagonalIndexReturnType
<
Dynamic
>
::
Type
MatrixBase
<
Derived
>::
diagonal
(
Index
index
)
{
return
typename
DiagonalIndexReturnType
<
Dynamic
>::
Type
(
derived
(),
index
);
}
/** This is the const version of diagonal(Index). */
template
<
typename
Derived
>
inline
typename
MatrixBase
<
Derived
>::
template
ConstDiagonalIndexReturnType
<
Dynamic
>
::
Type
MatrixBase
<
Derived
>::
diagonal
(
Index
index
)
const
{
return
typename
ConstDiagonalIndexReturnType
<
Dynamic
>::
Type
(
derived
(),
index
);
}
/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this
*
* \c *this is not required to be square.
*
* The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
* and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
*
* Example: \include MatrixBase_diagonal_template_int.cpp
* Output: \verbinclude MatrixBase_diagonal_template_int.out
*
* \sa MatrixBase::diagonal(), class Diagonal */
template
<
typename
Derived
>
template
<
int
Index
>
inline
typename
MatrixBase
<
Derived
>::
template
DiagonalIndexReturnType
<
Index
>
::
Type
MatrixBase
<
Derived
>::
diagonal
()
{
return
derived
();
}
/** This is the const version of diagonal<int>(). */
template
<
typename
Derived
>
template
<
int
Index
>
inline
typename
MatrixBase
<
Derived
>::
template
ConstDiagonalIndexReturnType
<
Index
>
::
Type
MatrixBase
<
Derived
>::
diagonal
()
const
{
return
derived
();
}
}
// end namespace Eigen
#endif // EIGEN_DIAGONAL_H
densecrf/include/Eigen/src/Core/DiagonalMatrix.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_DIAGONALMATRIX_H
#define EIGEN_DIAGONALMATRIX_H
namespace
Eigen
{
#ifndef EIGEN_PARSED_BY_DOXYGEN
template
<
typename
Derived
>
class
DiagonalBase
:
public
EigenBase
<
Derived
>
{
public:
typedef
typename
internal
::
traits
<
Derived
>::
DiagonalVectorType
DiagonalVectorType
;
typedef
typename
DiagonalVectorType
::
Scalar
Scalar
;
typedef
typename
DiagonalVectorType
::
RealScalar
RealScalar
;
typedef
typename
internal
::
traits
<
Derived
>::
StorageKind
StorageKind
;
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
enum
{
RowsAtCompileTime
=
DiagonalVectorType
::
SizeAtCompileTime
,
ColsAtCompileTime
=
DiagonalVectorType
::
SizeAtCompileTime
,
MaxRowsAtCompileTime
=
DiagonalVectorType
::
MaxSizeAtCompileTime
,
MaxColsAtCompileTime
=
DiagonalVectorType
::
MaxSizeAtCompileTime
,
IsVectorAtCompileTime
=
0
,
Flags
=
0
};
typedef
Matrix
<
Scalar
,
RowsAtCompileTime
,
ColsAtCompileTime
,
0
,
MaxRowsAtCompileTime
,
MaxColsAtCompileTime
>
DenseMatrixType
;
typedef
DenseMatrixType
DenseType
;
typedef
DiagonalMatrix
<
Scalar
,
DiagonalVectorType
::
SizeAtCompileTime
,
DiagonalVectorType
::
MaxSizeAtCompileTime
>
PlainObject
;
inline
const
Derived
&
derived
()
const
{
return
*
static_cast
<
const
Derived
*>
(
this
);
}
inline
Derived
&
derived
()
{
return
*
static_cast
<
Derived
*>
(
this
);
}
DenseMatrixType
toDenseMatrix
()
const
{
return
derived
();
}
template
<
typename
DenseDerived
>
void
evalTo
(
MatrixBase
<
DenseDerived
>
&
other
)
const
;
template
<
typename
DenseDerived
>
void
addTo
(
MatrixBase
<
DenseDerived
>
&
other
)
const
{
other
.
diagonal
()
+=
diagonal
();
}
template
<
typename
DenseDerived
>
void
subTo
(
MatrixBase
<
DenseDerived
>
&
other
)
const
{
other
.
diagonal
()
-=
diagonal
();
}
inline
const
DiagonalVectorType
&
diagonal
()
const
{
return
derived
().
diagonal
();
}
inline
DiagonalVectorType
&
diagonal
()
{
return
derived
().
diagonal
();
}
inline
Index
rows
()
const
{
return
diagonal
().
size
();
}
inline
Index
cols
()
const
{
return
diagonal
().
size
();
}
template
<
typename
MatrixDerived
>
const
DiagonalProduct
<
MatrixDerived
,
Derived
,
OnTheLeft
>
operator
*
(
const
MatrixBase
<
MatrixDerived
>
&
matrix
)
const
;
inline
const
DiagonalWrapper
<
const
CwiseUnaryOp
<
internal
::
scalar_inverse_op
<
Scalar
>
,
const
DiagonalVectorType
>
>
inverse
()
const
{
return
diagonal
().
cwiseInverse
();
}
inline
const
DiagonalWrapper
<
const
CwiseUnaryOp
<
internal
::
scalar_multiple_op
<
Scalar
>
,
const
DiagonalVectorType
>
>
operator
*
(
const
Scalar
&
scalar
)
const
{
return
diagonal
()
*
scalar
;
}
friend
inline
const
DiagonalWrapper
<
const
CwiseUnaryOp
<
internal
::
scalar_multiple_op
<
Scalar
>
,
const
DiagonalVectorType
>
>
operator
*
(
const
Scalar
&
scalar
,
const
DiagonalBase
&
other
)
{
return
other
.
diagonal
()
*
scalar
;
}
#ifdef EIGEN2_SUPPORT
template
<
typename
OtherDerived
>
bool
isApprox
(
const
DiagonalBase
<
OtherDerived
>&
other
,
typename
NumTraits
<
Scalar
>::
Real
precision
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
{
return
diagonal
().
isApprox
(
other
.
diagonal
(),
precision
);
}
template
<
typename
OtherDerived
>
bool
isApprox
(
const
MatrixBase
<
OtherDerived
>&
other
,
typename
NumTraits
<
Scalar
>::
Real
precision
=
NumTraits
<
Scalar
>::
dummy_precision
())
const
{
return
toDenseMatrix
().
isApprox
(
other
,
precision
);
}
#endif
};
template
<
typename
Derived
>
template
<
typename
DenseDerived
>
void
DiagonalBase
<
Derived
>::
evalTo
(
MatrixBase
<
DenseDerived
>
&
other
)
const
{
other
.
setZero
();
other
.
diagonal
()
=
diagonal
();
}
#endif
/** \class DiagonalMatrix
* \ingroup Core_Module
*
* \brief Represents a diagonal matrix with its storage
*
* \param _Scalar the type of coefficients
* \param SizeAtCompileTime the dimension of the matrix, or Dynamic
* \param MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults
* to SizeAtCompileTime. Most of the time, you do not need to specify it.
*
* \sa class DiagonalWrapper
*/
namespace
internal
{
template
<
typename
_Scalar
,
int
SizeAtCompileTime
,
int
MaxSizeAtCompileTime
>
struct
traits
<
DiagonalMatrix
<
_Scalar
,
SizeAtCompileTime
,
MaxSizeAtCompileTime
>
>
:
traits
<
Matrix
<
_Scalar
,
SizeAtCompileTime
,
SizeAtCompileTime
,
0
,
MaxSizeAtCompileTime
,
MaxSizeAtCompileTime
>
>
{
typedef
Matrix
<
_Scalar
,
SizeAtCompileTime
,
1
,
0
,
MaxSizeAtCompileTime
,
1
>
DiagonalVectorType
;
typedef
Dense
StorageKind
;
typedef
DenseIndex
Index
;
enum
{
Flags
=
LvalueBit
};
};
}
template
<
typename
_Scalar
,
int
SizeAtCompileTime
,
int
MaxSizeAtCompileTime
>
class
DiagonalMatrix
:
public
DiagonalBase
<
DiagonalMatrix
<
_Scalar
,
SizeAtCompileTime
,
MaxSizeAtCompileTime
>
>
{
public:
#ifndef EIGEN_PARSED_BY_DOXYGEN
typedef
typename
internal
::
traits
<
DiagonalMatrix
>::
DiagonalVectorType
DiagonalVectorType
;
typedef
const
DiagonalMatrix
&
Nested
;
typedef
_Scalar
Scalar
;
typedef
typename
internal
::
traits
<
DiagonalMatrix
>::
StorageKind
StorageKind
;
typedef
typename
internal
::
traits
<
DiagonalMatrix
>::
Index
Index
;
#endif
protected:
DiagonalVectorType
m_diagonal
;
public:
/** const version of diagonal(). */
inline
const
DiagonalVectorType
&
diagonal
()
const
{
return
m_diagonal
;
}
/** \returns a reference to the stored vector of diagonal coefficients. */
inline
DiagonalVectorType
&
diagonal
()
{
return
m_diagonal
;
}
/** Default constructor without initialization */
inline
DiagonalMatrix
()
{}
/** Constructs a diagonal matrix with given dimension */
inline
DiagonalMatrix
(
Index
dim
)
:
m_diagonal
(
dim
)
{}
/** 2D constructor. */
inline
DiagonalMatrix
(
const
Scalar
&
x
,
const
Scalar
&
y
)
:
m_diagonal
(
x
,
y
)
{}
/** 3D constructor. */
inline
DiagonalMatrix
(
const
Scalar
&
x
,
const
Scalar
&
y
,
const
Scalar
&
z
)
:
m_diagonal
(
x
,
y
,
z
)
{}
/** Copy constructor. */
template
<
typename
OtherDerived
>
inline
DiagonalMatrix
(
const
DiagonalBase
<
OtherDerived
>&
other
)
:
m_diagonal
(
other
.
diagonal
())
{}
#ifndef EIGEN_PARSED_BY_DOXYGEN
/** copy constructor. prevent a default copy constructor from hiding the other templated constructor */
inline
DiagonalMatrix
(
const
DiagonalMatrix
&
other
)
:
m_diagonal
(
other
.
diagonal
())
{}
#endif
/** generic constructor from expression of the diagonal coefficients */
template
<
typename
OtherDerived
>
explicit
inline
DiagonalMatrix
(
const
MatrixBase
<
OtherDerived
>&
other
)
:
m_diagonal
(
other
)
{}
/** Copy operator. */
template
<
typename
OtherDerived
>
DiagonalMatrix
&
operator
=
(
const
DiagonalBase
<
OtherDerived
>&
other
)
{
m_diagonal
=
other
.
diagonal
();
return
*
this
;
}
#ifndef EIGEN_PARSED_BY_DOXYGEN
/** This is a special case of the templated operator=. Its purpose is to
* prevent a default operator= from hiding the templated operator=.
*/
DiagonalMatrix
&
operator
=
(
const
DiagonalMatrix
&
other
)
{
m_diagonal
=
other
.
diagonal
();
return
*
this
;
}
#endif
/** Resizes to given size. */
inline
void
resize
(
Index
size
)
{
m_diagonal
.
resize
(
size
);
}
/** Sets all coefficients to zero. */
inline
void
setZero
()
{
m_diagonal
.
setZero
();
}
/** Resizes and sets all coefficients to zero. */
inline
void
setZero
(
Index
size
)
{
m_diagonal
.
setZero
(
size
);
}
/** Sets this matrix to be the identity matrix of the current size. */
inline
void
setIdentity
()
{
m_diagonal
.
setOnes
();
}
/** Sets this matrix to be the identity matrix of the given size. */
inline
void
setIdentity
(
Index
size
)
{
m_diagonal
.
setOnes
(
size
);
}
};
/** \class DiagonalWrapper
* \ingroup Core_Module
*
* \brief Expression of a diagonal matrix
*
* \param _DiagonalVectorType the type of the vector of diagonal coefficients
*
* This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients,
* instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal()
* and most of the time this is the only way that it is used.
*
* \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal()
*/
namespace
internal
{
template
<
typename
_DiagonalVectorType
>
struct
traits
<
DiagonalWrapper
<
_DiagonalVectorType
>
>
{
typedef
_DiagonalVectorType
DiagonalVectorType
;
typedef
typename
DiagonalVectorType
::
Scalar
Scalar
;
typedef
typename
DiagonalVectorType
::
Index
Index
;
typedef
typename
DiagonalVectorType
::
StorageKind
StorageKind
;
enum
{
RowsAtCompileTime
=
DiagonalVectorType
::
SizeAtCompileTime
,
ColsAtCompileTime
=
DiagonalVectorType
::
SizeAtCompileTime
,
MaxRowsAtCompileTime
=
DiagonalVectorType
::
SizeAtCompileTime
,
MaxColsAtCompileTime
=
DiagonalVectorType
::
SizeAtCompileTime
,
Flags
=
traits
<
DiagonalVectorType
>::
Flags
&
LvalueBit
};
};
}
template
<
typename
_DiagonalVectorType
>
class
DiagonalWrapper
:
public
DiagonalBase
<
DiagonalWrapper
<
_DiagonalVectorType
>
>
,
internal
::
no_assignment_operator
{
public:
#ifndef EIGEN_PARSED_BY_DOXYGEN
typedef
_DiagonalVectorType
DiagonalVectorType
;
typedef
DiagonalWrapper
Nested
;
#endif
/** Constructor from expression of diagonal coefficients to wrap. */
inline
DiagonalWrapper
(
DiagonalVectorType
&
diagonal
)
:
m_diagonal
(
diagonal
)
{}
/** \returns a const reference to the wrapped expression of diagonal coefficients. */
const
DiagonalVectorType
&
diagonal
()
const
{
return
m_diagonal
;
}
protected:
typename
DiagonalVectorType
::
Nested
m_diagonal
;
};
/** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients
*
* \only_for_vectors
*
* Example: \include MatrixBase_asDiagonal.cpp
* Output: \verbinclude MatrixBase_asDiagonal.out
*
* \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal()
**/
template
<
typename
Derived
>
inline
const
DiagonalWrapper
<
const
Derived
>
MatrixBase
<
Derived
>::
asDiagonal
()
const
{
return
derived
();
}
/** \returns true if *this is approximately equal to a diagonal matrix,
* within the precision given by \a prec.
*
* Example: \include MatrixBase_isDiagonal.cpp
* Output: \verbinclude MatrixBase_isDiagonal.out
*
* \sa asDiagonal()
*/
template
<
typename
Derived
>
bool
MatrixBase
<
Derived
>::
isDiagonal
(
RealScalar
prec
)
const
{
if
(
cols
()
!=
rows
())
return
false
;
RealScalar
maxAbsOnDiagonal
=
static_cast
<
RealScalar
>
(
-
1
);
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
{
RealScalar
absOnDiagonal
=
internal
::
abs
(
coeff
(
j
,
j
));
if
(
absOnDiagonal
>
maxAbsOnDiagonal
)
maxAbsOnDiagonal
=
absOnDiagonal
;
}
for
(
Index
j
=
0
;
j
<
cols
();
++
j
)
for
(
Index
i
=
0
;
i
<
j
;
++
i
)
{
if
(
!
internal
::
isMuchSmallerThan
(
coeff
(
i
,
j
),
maxAbsOnDiagonal
,
prec
))
return
false
;
if
(
!
internal
::
isMuchSmallerThan
(
coeff
(
j
,
i
),
maxAbsOnDiagonal
,
prec
))
return
false
;
}
return
true
;
}
}
// end namespace Eigen
#endif // EIGEN_DIAGONALMATRIX_H
densecrf/include/Eigen/src/Core/DiagonalProduct.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_DIAGONALPRODUCT_H
#define EIGEN_DIAGONALPRODUCT_H
namespace
Eigen
{
namespace
internal
{
template
<
typename
MatrixType
,
typename
DiagonalType
,
int
ProductOrder
>
struct
traits
<
DiagonalProduct
<
MatrixType
,
DiagonalType
,
ProductOrder
>
>
:
traits
<
MatrixType
>
{
typedef
typename
scalar_product_traits
<
typename
MatrixType
::
Scalar
,
typename
DiagonalType
::
Scalar
>::
ReturnType
Scalar
;
enum
{
RowsAtCompileTime
=
MatrixType
::
RowsAtCompileTime
,
ColsAtCompileTime
=
MatrixType
::
ColsAtCompileTime
,
MaxRowsAtCompileTime
=
MatrixType
::
MaxRowsAtCompileTime
,
MaxColsAtCompileTime
=
MatrixType
::
MaxColsAtCompileTime
,
_StorageOrder
=
MatrixType
::
Flags
&
RowMajorBit
?
RowMajor
:
ColMajor
,
_PacketOnDiag
=
!
((
int
(
_StorageOrder
)
==
RowMajor
&&
int
(
ProductOrder
)
==
OnTheLeft
)
||
(
int
(
_StorageOrder
)
==
ColMajor
&&
int
(
ProductOrder
)
==
OnTheRight
)),
_SameTypes
=
is_same
<
typename
MatrixType
::
Scalar
,
typename
DiagonalType
::
Scalar
>::
value
,
// FIXME currently we need same types, but in the future the next rule should be the one
//_Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && ((!_PacketOnDiag) || (_SameTypes && bool(int(DiagonalType::Flags)&PacketAccessBit))),
_Vectorizable
=
bool
(
int
(
MatrixType
::
Flags
)
&
PacketAccessBit
)
&&
_SameTypes
&&
((
!
_PacketOnDiag
)
||
(
bool
(
int
(
DiagonalType
::
Flags
)
&
PacketAccessBit
))),
Flags
=
(
HereditaryBits
&
(
unsigned
int
)(
MatrixType
::
Flags
))
|
(
_Vectorizable
?
PacketAccessBit
:
0
),
CoeffReadCost
=
NumTraits
<
Scalar
>::
MulCost
+
MatrixType
::
CoeffReadCost
+
DiagonalType
::
DiagonalVectorType
::
CoeffReadCost
};
};
}
template
<
typename
MatrixType
,
typename
DiagonalType
,
int
ProductOrder
>
class
DiagonalProduct
:
internal
::
no_assignment_operator
,
public
MatrixBase
<
DiagonalProduct
<
MatrixType
,
DiagonalType
,
ProductOrder
>
>
{
public:
typedef
MatrixBase
<
DiagonalProduct
>
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
DiagonalProduct
)
inline
DiagonalProduct
(
const
MatrixType
&
matrix
,
const
DiagonalType
&
diagonal
)
:
m_matrix
(
matrix
),
m_diagonal
(
diagonal
)
{
eigen_assert
(
diagonal
.
diagonal
().
size
()
==
(
ProductOrder
==
OnTheLeft
?
matrix
.
rows
()
:
matrix
.
cols
()));
}
inline
Index
rows
()
const
{
return
m_matrix
.
rows
();
}
inline
Index
cols
()
const
{
return
m_matrix
.
cols
();
}
const
Scalar
coeff
(
Index
row
,
Index
col
)
const
{
return
m_diagonal
.
diagonal
().
coeff
(
ProductOrder
==
OnTheLeft
?
row
:
col
)
*
m_matrix
.
coeff
(
row
,
col
);
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
enum
{
StorageOrder
=
Flags
&
RowMajorBit
?
RowMajor
:
ColMajor
};
const
Index
indexInDiagonalVector
=
ProductOrder
==
OnTheLeft
?
row
:
col
;
return
packet_impl
<
LoadMode
>
(
row
,
col
,
indexInDiagonalVector
,
typename
internal
::
conditional
<
((
int
(
StorageOrder
)
==
RowMajor
&&
int
(
ProductOrder
)
==
OnTheLeft
)
||
(
int
(
StorageOrder
)
==
ColMajor
&&
int
(
ProductOrder
)
==
OnTheRight
)),
internal
::
true_type
,
internal
::
false_type
>::
type
());
}
protected:
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet_impl
(
Index
row
,
Index
col
,
Index
id
,
internal
::
true_type
)
const
{
return
internal
::
pmul
(
m_matrix
.
template
packet
<
LoadMode
>(
row
,
col
),
internal
::
pset1
<
PacketScalar
>
(
m_diagonal
.
diagonal
().
coeff
(
id
)));
}
template
<
int
LoadMode
>
EIGEN_STRONG_INLINE
PacketScalar
packet_impl
(
Index
row
,
Index
col
,
Index
id
,
internal
::
false_type
)
const
{
enum
{
InnerSize
=
(
MatrixType
::
Flags
&
RowMajorBit
)
?
MatrixType
::
ColsAtCompileTime
:
MatrixType
::
RowsAtCompileTime
,
DiagonalVectorPacketLoadMode
=
(
LoadMode
==
Aligned
&&
((
InnerSize
%
16
)
==
0
))
?
Aligned
:
Unaligned
};
return
internal
::
pmul
(
m_matrix
.
template
packet
<
LoadMode
>(
row
,
col
),
m_diagonal
.
diagonal
().
template
packet
<
DiagonalVectorPacketLoadMode
>(
id
));
}
typename
MatrixType
::
Nested
m_matrix
;
typename
DiagonalType
::
Nested
m_diagonal
;
};
/** \returns the diagonal matrix product of \c *this by the diagonal matrix \a diagonal.
*/
template
<
typename
Derived
>
template
<
typename
DiagonalDerived
>
inline
const
DiagonalProduct
<
Derived
,
DiagonalDerived
,
OnTheRight
>
MatrixBase
<
Derived
>::
operator
*
(
const
DiagonalBase
<
DiagonalDerived
>
&
diagonal
)
const
{
return
DiagonalProduct
<
Derived
,
DiagonalDerived
,
OnTheRight
>
(
derived
(),
diagonal
.
derived
());
}
/** \returns the diagonal matrix product of \c *this by the matrix \a matrix.
*/
template
<
typename
DiagonalDerived
>
template
<
typename
MatrixDerived
>
inline
const
DiagonalProduct
<
MatrixDerived
,
DiagonalDerived
,
OnTheLeft
>
DiagonalBase
<
DiagonalDerived
>::
operator
*
(
const
MatrixBase
<
MatrixDerived
>
&
matrix
)
const
{
return
DiagonalProduct
<
MatrixDerived
,
DiagonalDerived
,
OnTheLeft
>
(
matrix
.
derived
(),
derived
());
}
}
// end namespace Eigen
#endif // EIGEN_DIAGONALPRODUCT_H
densecrf/include/Eigen/src/Core/Dot.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2006-2008, 2010 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_DOT_H
#define EIGEN_DOT_H
namespace
Eigen
{
namespace
internal
{
// helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot
// with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE
// looking at the static assertions. Thus this is a trick to get better compile errors.
template
<
typename
T
,
typename
U
,
// the NeedToTranspose condition here is taken straight from Assign.h
bool
NeedToTranspose
=
T
::
IsVectorAtCompileTime
&&
U
::
IsVectorAtCompileTime
&&
((
int
(
T
::
RowsAtCompileTime
)
==
1
&&
int
(
U
::
ColsAtCompileTime
)
==
1
)
|
// FIXME | instead of || to please GCC 4.4.0 stupid warning "suggest parentheses around &&".
// revert to || as soon as not needed anymore.
(
int
(
T
::
ColsAtCompileTime
)
==
1
&&
int
(
U
::
RowsAtCompileTime
)
==
1
))
>
struct
dot_nocheck
{
typedef
typename
scalar_product_traits
<
typename
traits
<
T
>::
Scalar
,
typename
traits
<
U
>::
Scalar
>::
ReturnType
ResScalar
;
static
inline
ResScalar
run
(
const
MatrixBase
<
T
>&
a
,
const
MatrixBase
<
U
>&
b
)
{
return
a
.
template
binaryExpr
<
scalar_conj_product_op
<
typename
traits
<
T
>
::
Scalar
,
typename
traits
<
U
>::
Scalar
>
>
(
b
).
sum
();
}
};
template
<
typename
T
,
typename
U
>
struct
dot_nocheck
<
T
,
U
,
true
>
{
typedef
typename
scalar_product_traits
<
typename
traits
<
T
>::
Scalar
,
typename
traits
<
U
>::
Scalar
>::
ReturnType
ResScalar
;
static
inline
ResScalar
run
(
const
MatrixBase
<
T
>&
a
,
const
MatrixBase
<
U
>&
b
)
{
return
a
.
transpose
().
template
binaryExpr
<
scalar_conj_product_op
<
typename
traits
<
T
>
::
Scalar
,
typename
traits
<
U
>::
Scalar
>
>
(
b
).
sum
();
}
};
}
// end namespace internal
/** \returns the dot product of *this with other.
*
* \only_for_vectors
*
* \note If the scalar type is complex numbers, then this function returns the hermitian
* (sesquilinear) dot product, conjugate-linear in the first variable and linear in the
* second variable.
*
* \sa squaredNorm(), norm()
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
typename
internal
::
scalar_product_traits
<
typename
internal
::
traits
<
Derived
>::
Scalar
,
typename
internal
::
traits
<
OtherDerived
>::
Scalar
>::
ReturnType
MatrixBase
<
Derived
>::
dot
(
const
MatrixBase
<
OtherDerived
>&
other
)
const
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
OtherDerived
)
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE
(
Derived
,
OtherDerived
)
typedef
internal
::
scalar_conj_product_op
<
Scalar
,
typename
OtherDerived
::
Scalar
>
func
;
EIGEN_CHECK_BINARY_COMPATIBILIY
(
func
,
Scalar
,
typename
OtherDerived
::
Scalar
);
eigen_assert
(
size
()
==
other
.
size
());
return
internal
::
dot_nocheck
<
Derived
,
OtherDerived
>::
run
(
*
this
,
other
);
}
#ifdef EIGEN2_SUPPORT
/** \returns the dot product of *this with other, with the Eigen2 convention that the dot product is linear in the first variable
* (conjugating the second variable). Of course this only makes a difference in the complex case.
*
* This method is only available in EIGEN2_SUPPORT mode.
*
* \only_for_vectors
*
* \sa dot()
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
typename
internal
::
traits
<
Derived
>::
Scalar
MatrixBase
<
Derived
>::
eigen2_dot
(
const
MatrixBase
<
OtherDerived
>&
other
)
const
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
Derived
)
EIGEN_STATIC_ASSERT_VECTOR_ONLY
(
OtherDerived
)
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE
(
Derived
,
OtherDerived
)
EIGEN_STATIC_ASSERT
((
internal
::
is_same
<
Scalar
,
typename
OtherDerived
::
Scalar
>::
value
),
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
)
eigen_assert
(
size
()
==
other
.
size
());
return
internal
::
dot_nocheck
<
OtherDerived
,
Derived
>::
run
(
other
,
*
this
);
}
#endif
//---------- implementation of L2 norm and related functions ----------
/** \returns, for vectors, the squared \em l2 norm of \c *this, and for matrices the Frobenius norm.
* In both cases, it consists in the sum of the square of all the matrix entries.
* For vectors, this is also equals to the dot product of \c *this with itself.
*
* \sa dot(), norm()
*/
template
<
typename
Derived
>
EIGEN_STRONG_INLINE
typename
NumTraits
<
typename
internal
::
traits
<
Derived
>::
Scalar
>::
Real
MatrixBase
<
Derived
>::
squaredNorm
()
const
{
return
internal
::
real
((
*
this
).
cwiseAbs2
().
sum
());
}
/** \returns, for vectors, the \em l2 norm of \c *this, and for matrices the Frobenius norm.
* In both cases, it consists in the square root of the sum of the square of all the matrix entries.
* For vectors, this is also equals to the square root of the dot product of \c *this with itself.
*
* \sa dot(), squaredNorm()
*/
template
<
typename
Derived
>
inline
typename
NumTraits
<
typename
internal
::
traits
<
Derived
>::
Scalar
>::
Real
MatrixBase
<
Derived
>::
norm
()
const
{
return
internal
::
sqrt
(
squaredNorm
());
}
/** \returns an expression of the quotient of *this by its own norm.
*
* \only_for_vectors
*
* \sa norm(), normalize()
*/
template
<
typename
Derived
>
inline
const
typename
MatrixBase
<
Derived
>::
PlainObject
MatrixBase
<
Derived
>::
normalized
()
const
{
typedef
typename
internal
::
nested
<
Derived
>::
type
Nested
;
typedef
typename
internal
::
remove_reference
<
Nested
>::
type
_Nested
;
_Nested
n
(
derived
());
return
n
/
n
.
norm
();
}
/** Normalizes the vector, i.e. divides it by its own norm.
*
* \only_for_vectors
*
* \sa norm(), normalized()
*/
template
<
typename
Derived
>
inline
void
MatrixBase
<
Derived
>::
normalize
()
{
*
this
/=
norm
();
}
//---------- implementation of other norms ----------
namespace
internal
{
template
<
typename
Derived
,
int
p
>
struct
lpNorm_selector
{
typedef
typename
NumTraits
<
typename
traits
<
Derived
>::
Scalar
>::
Real
RealScalar
;
static
inline
RealScalar
run
(
const
MatrixBase
<
Derived
>&
m
)
{
return
pow
(
m
.
cwiseAbs
().
array
().
pow
(
p
).
sum
(),
RealScalar
(
1
)
/
p
);
}
};
template
<
typename
Derived
>
struct
lpNorm_selector
<
Derived
,
1
>
{
static
inline
typename
NumTraits
<
typename
traits
<
Derived
>::
Scalar
>::
Real
run
(
const
MatrixBase
<
Derived
>&
m
)
{
return
m
.
cwiseAbs
().
sum
();
}
};
template
<
typename
Derived
>
struct
lpNorm_selector
<
Derived
,
2
>
{
static
inline
typename
NumTraits
<
typename
traits
<
Derived
>::
Scalar
>::
Real
run
(
const
MatrixBase
<
Derived
>&
m
)
{
return
m
.
norm
();
}
};
template
<
typename
Derived
>
struct
lpNorm_selector
<
Derived
,
Infinity
>
{
static
inline
typename
NumTraits
<
typename
traits
<
Derived
>::
Scalar
>::
Real
run
(
const
MatrixBase
<
Derived
>&
m
)
{
return
m
.
cwiseAbs
().
maxCoeff
();
}
};
}
// end namespace internal
/** \returns the \f$ \ell^p \f$ norm of *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values
* of the coefficients of *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$
* norm, that is the maximum of the absolute values of the coefficients of *this.
*
* \sa norm()
*/
template
<
typename
Derived
>
template
<
int
p
>
inline
typename
NumTraits
<
typename
internal
::
traits
<
Derived
>::
Scalar
>::
Real
MatrixBase
<
Derived
>::
lpNorm
()
const
{
return
internal
::
lpNorm_selector
<
Derived
,
p
>::
run
(
*
this
);
}
//---------- implementation of isOrthogonal / isUnitary ----------
/** \returns true if *this is approximately orthogonal to \a other,
* within the precision given by \a prec.
*
* Example: \include MatrixBase_isOrthogonal.cpp
* Output: \verbinclude MatrixBase_isOrthogonal.out
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
bool
MatrixBase
<
Derived
>::
isOrthogonal
(
const
MatrixBase
<
OtherDerived
>&
other
,
RealScalar
prec
)
const
{
typename
internal
::
nested
<
Derived
,
2
>::
type
nested
(
derived
());
typename
internal
::
nested
<
OtherDerived
,
2
>::
type
otherNested
(
other
.
derived
());
return
internal
::
abs2
(
nested
.
dot
(
otherNested
))
<=
prec
*
prec
*
nested
.
squaredNorm
()
*
otherNested
.
squaredNorm
();
}
/** \returns true if *this is approximately an unitary matrix,
* within the precision given by \a prec. In the case where the \a Scalar
* type is real numbers, a unitary matrix is an orthogonal matrix, whence the name.
*
* \note This can be used to check whether a family of vectors forms an orthonormal basis.
* Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an
* orthonormal basis.
*
* Example: \include MatrixBase_isUnitary.cpp
* Output: \verbinclude MatrixBase_isUnitary.out
*/
template
<
typename
Derived
>
bool
MatrixBase
<
Derived
>::
isUnitary
(
RealScalar
prec
)
const
{
typename
Derived
::
Nested
nested
(
derived
());
for
(
Index
i
=
0
;
i
<
cols
();
++
i
)
{
if
(
!
internal
::
isApprox
(
nested
.
col
(
i
).
squaredNorm
(),
static_cast
<
RealScalar
>
(
1
),
prec
))
return
false
;
for
(
Index
j
=
0
;
j
<
i
;
++
j
)
if
(
!
internal
::
isMuchSmallerThan
(
nested
.
col
(
i
).
dot
(
nested
.
col
(
j
)),
static_cast
<
Scalar
>
(
1
),
prec
))
return
false
;
}
return
true
;
}
}
// end namespace Eigen
#endif // EIGEN_DOT_H
densecrf/include/Eigen/src/Core/EigenBase.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_EIGENBASE_H
#define EIGEN_EIGENBASE_H
namespace
Eigen
{
/** Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
*
* In other words, an EigenBase object is an object that can be copied into a MatrixBase.
*
* Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc.
*
* Notice that this class is trivial, it is only used to disambiguate overloaded functions.
*
* \sa \ref TopicClassHierarchy
*/
template
<
typename
Derived
>
struct
EigenBase
{
// typedef typename internal::plain_matrix_type<Derived>::type PlainObject;
typedef
typename
internal
::
traits
<
Derived
>::
StorageKind
StorageKind
;
typedef
typename
internal
::
traits
<
Derived
>::
Index
Index
;
/** \returns a reference to the derived object */
Derived
&
derived
()
{
return
*
static_cast
<
Derived
*>
(
this
);
}
/** \returns a const reference to the derived object */
const
Derived
&
derived
()
const
{
return
*
static_cast
<
const
Derived
*>
(
this
);
}
inline
Derived
&
const_cast_derived
()
const
{
return
*
static_cast
<
Derived
*>
(
const_cast
<
EigenBase
*>
(
this
));
}
inline
const
Derived
&
const_derived
()
const
{
return
*
static_cast
<
const
Derived
*>
(
this
);
}
/** \returns the number of rows. \sa cols(), RowsAtCompileTime */
inline
Index
rows
()
const
{
return
derived
().
rows
();
}
/** \returns the number of columns. \sa rows(), ColsAtCompileTime*/
inline
Index
cols
()
const
{
return
derived
().
cols
();
}
/** \returns the number of coefficients, which is rows()*cols().
* \sa rows(), cols(), SizeAtCompileTime. */
inline
Index
size
()
const
{
return
rows
()
*
cols
();
}
/** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */
template
<
typename
Dest
>
inline
void
evalTo
(
Dest
&
dst
)
const
{
derived
().
evalTo
(
dst
);
}
/** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */
template
<
typename
Dest
>
inline
void
addTo
(
Dest
&
dst
)
const
{
// This is the default implementation,
// derived class can reimplement it in a more optimized way.
typename
Dest
::
PlainObject
res
(
rows
(),
cols
());
evalTo
(
res
);
dst
+=
res
;
}
/** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */
template
<
typename
Dest
>
inline
void
subTo
(
Dest
&
dst
)
const
{
// This is the default implementation,
// derived class can reimplement it in a more optimized way.
typename
Dest
::
PlainObject
res
(
rows
(),
cols
());
evalTo
(
res
);
dst
-=
res
;
}
/** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */
template
<
typename
Dest
>
inline
void
applyThisOnTheRight
(
Dest
&
dst
)
const
{
// This is the default implementation,
// derived class can reimplement it in a more optimized way.
dst
=
dst
*
this
->
derived
();
}
/** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */
template
<
typename
Dest
>
inline
void
applyThisOnTheLeft
(
Dest
&
dst
)
const
{
// This is the default implementation,
// derived class can reimplement it in a more optimized way.
dst
=
this
->
derived
()
*
dst
;
}
};
/***************************************************************************
* Implementation of matrix base methods
***************************************************************************/
/** \brief Copies the generic expression \a other into *this.
*
* \details The expression must provide a (templated) evalTo(Derived& dst) const
* function which does the actual job. In practice, this allows any user to write
* its own special matrix without having to modify MatrixBase
*
* \returns a reference to *this.
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
Derived
&
DenseBase
<
Derived
>::
operator
=
(
const
EigenBase
<
OtherDerived
>
&
other
)
{
other
.
derived
().
evalTo
(
derived
());
return
derived
();
}
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
Derived
&
DenseBase
<
Derived
>::
operator
+=
(
const
EigenBase
<
OtherDerived
>
&
other
)
{
other
.
derived
().
addTo
(
derived
());
return
derived
();
}
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
Derived
&
DenseBase
<
Derived
>::
operator
-=
(
const
EigenBase
<
OtherDerived
>
&
other
)
{
other
.
derived
().
subTo
(
derived
());
return
derived
();
}
/** replaces \c *this by \c *this * \a other.
*
* \returns a reference to \c *this
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
inline
Derived
&
MatrixBase
<
Derived
>::
operator
*=
(
const
EigenBase
<
OtherDerived
>
&
other
)
{
other
.
derived
().
applyThisOnTheRight
(
derived
());
return
derived
();
}
/** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=() */
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
inline
void
MatrixBase
<
Derived
>::
applyOnTheRight
(
const
EigenBase
<
OtherDerived
>
&
other
)
{
other
.
derived
().
applyThisOnTheRight
(
derived
());
}
/** replaces \c *this by \c *this * \a other. */
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
inline
void
MatrixBase
<
Derived
>::
applyOnTheLeft
(
const
EigenBase
<
OtherDerived
>
&
other
)
{
other
.
derived
().
applyThisOnTheLeft
(
derived
());
}
}
// end namespace Eigen
#endif // EIGEN_EIGENBASE_H
densecrf/include/Eigen/src/Core/Flagged.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_FLAGGED_H
#define EIGEN_FLAGGED_H
namespace
Eigen
{
/** \class Flagged
* \ingroup Core_Module
*
* \brief Expression with modified flags
*
* \param ExpressionType the type of the object of which we are modifying the flags
* \param Added the flags added to the expression
* \param Removed the flags removed from the expression (has priority over Added).
*
* This class represents an expression whose flags have been modified.
* It is the return type of MatrixBase::flagged()
* and most of the time this is the only way it is used.
*
* \sa MatrixBase::flagged()
*/
namespace
internal
{
template
<
typename
ExpressionType
,
unsigned
int
Added
,
unsigned
int
Removed
>
struct
traits
<
Flagged
<
ExpressionType
,
Added
,
Removed
>
>
:
traits
<
ExpressionType
>
{
enum
{
Flags
=
(
ExpressionType
::
Flags
|
Added
)
&
~
Removed
};
};
}
template
<
typename
ExpressionType
,
unsigned
int
Added
,
unsigned
int
Removed
>
class
Flagged
:
public
MatrixBase
<
Flagged
<
ExpressionType
,
Added
,
Removed
>
>
{
public:
typedef
MatrixBase
<
Flagged
>
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
Flagged
)
typedef
typename
internal
::
conditional
<
internal
::
must_nest_by_value
<
ExpressionType
>::
ret
,
ExpressionType
,
const
ExpressionType
&>::
type
ExpressionTypeNested
;
typedef
typename
ExpressionType
::
InnerIterator
InnerIterator
;
inline
Flagged
(
const
ExpressionType
&
matrix
)
:
m_matrix
(
matrix
)
{}
inline
Index
rows
()
const
{
return
m_matrix
.
rows
();
}
inline
Index
cols
()
const
{
return
m_matrix
.
cols
();
}
inline
Index
outerStride
()
const
{
return
m_matrix
.
outerStride
();
}
inline
Index
innerStride
()
const
{
return
m_matrix
.
innerStride
();
}
inline
CoeffReturnType
coeff
(
Index
row
,
Index
col
)
const
{
return
m_matrix
.
coeff
(
row
,
col
);
}
inline
CoeffReturnType
coeff
(
Index
index
)
const
{
return
m_matrix
.
coeff
(
index
);
}
inline
const
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
const
{
return
m_matrix
.
const_cast_derived
().
coeffRef
(
row
,
col
);
}
inline
const
Scalar
&
coeffRef
(
Index
index
)
const
{
return
m_matrix
.
const_cast_derived
().
coeffRef
(
index
);
}
inline
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
{
return
m_matrix
.
const_cast_derived
().
coeffRef
(
row
,
col
);
}
inline
Scalar
&
coeffRef
(
Index
index
)
{
return
m_matrix
.
const_cast_derived
().
coeffRef
(
index
);
}
template
<
int
LoadMode
>
inline
const
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
return
m_matrix
.
template
packet
<
LoadMode
>(
row
,
col
);
}
template
<
int
LoadMode
>
inline
void
writePacket
(
Index
row
,
Index
col
,
const
PacketScalar
&
x
)
{
m_matrix
.
const_cast_derived
().
template
writePacket
<
LoadMode
>(
row
,
col
,
x
);
}
template
<
int
LoadMode
>
inline
const
PacketScalar
packet
(
Index
index
)
const
{
return
m_matrix
.
template
packet
<
LoadMode
>(
index
);
}
template
<
int
LoadMode
>
inline
void
writePacket
(
Index
index
,
const
PacketScalar
&
x
)
{
m_matrix
.
const_cast_derived
().
template
writePacket
<
LoadMode
>(
index
,
x
);
}
const
ExpressionType
&
_expression
()
const
{
return
m_matrix
;
}
template
<
typename
OtherDerived
>
typename
ExpressionType
::
PlainObject
solveTriangular
(
const
MatrixBase
<
OtherDerived
>&
other
)
const
;
template
<
typename
OtherDerived
>
void
solveTriangularInPlace
(
const
MatrixBase
<
OtherDerived
>&
other
)
const
;
protected:
ExpressionTypeNested
m_matrix
;
};
/** \returns an expression of *this with added and removed flags
*
* This is mostly for internal use.
*
* \sa class Flagged
*/
template
<
typename
Derived
>
template
<
unsigned
int
Added
,
unsigned
int
Removed
>
inline
const
Flagged
<
Derived
,
Added
,
Removed
>
DenseBase
<
Derived
>::
flagged
()
const
{
return
derived
();
}
}
// end namespace Eigen
#endif // EIGEN_FLAGGED_H
densecrf/include/Eigen/src/Core/ForceAlignedAccess.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_FORCEALIGNEDACCESS_H
#define EIGEN_FORCEALIGNEDACCESS_H
namespace
Eigen
{
/** \class ForceAlignedAccess
* \ingroup Core_Module
*
* \brief Enforce aligned packet loads and stores regardless of what is requested
*
* \param ExpressionType the type of the object of which we are forcing aligned packet access
*
* This class is the return type of MatrixBase::forceAlignedAccess()
* and most of the time this is the only way it is used.
*
* \sa MatrixBase::forceAlignedAccess()
*/
namespace
internal
{
template
<
typename
ExpressionType
>
struct
traits
<
ForceAlignedAccess
<
ExpressionType
>
>
:
public
traits
<
ExpressionType
>
{};
}
template
<
typename
ExpressionType
>
class
ForceAlignedAccess
:
public
internal
::
dense_xpr_base
<
ForceAlignedAccess
<
ExpressionType
>
>::
type
{
public:
typedef
typename
internal
::
dense_xpr_base
<
ForceAlignedAccess
>::
type
Base
;
EIGEN_DENSE_PUBLIC_INTERFACE
(
ForceAlignedAccess
)
inline
ForceAlignedAccess
(
const
ExpressionType
&
matrix
)
:
m_expression
(
matrix
)
{}
inline
Index
rows
()
const
{
return
m_expression
.
rows
();
}
inline
Index
cols
()
const
{
return
m_expression
.
cols
();
}
inline
Index
outerStride
()
const
{
return
m_expression
.
outerStride
();
}
inline
Index
innerStride
()
const
{
return
m_expression
.
innerStride
();
}
inline
const
CoeffReturnType
coeff
(
Index
row
,
Index
col
)
const
{
return
m_expression
.
coeff
(
row
,
col
);
}
inline
Scalar
&
coeffRef
(
Index
row
,
Index
col
)
{
return
m_expression
.
const_cast_derived
().
coeffRef
(
row
,
col
);
}
inline
const
CoeffReturnType
coeff
(
Index
index
)
const
{
return
m_expression
.
coeff
(
index
);
}
inline
Scalar
&
coeffRef
(
Index
index
)
{
return
m_expression
.
const_cast_derived
().
coeffRef
(
index
);
}
template
<
int
LoadMode
>
inline
const
PacketScalar
packet
(
Index
row
,
Index
col
)
const
{
return
m_expression
.
template
packet
<
Aligned
>(
row
,
col
);
}
template
<
int
LoadMode
>
inline
void
writePacket
(
Index
row
,
Index
col
,
const
PacketScalar
&
x
)
{
m_expression
.
const_cast_derived
().
template
writePacket
<
Aligned
>(
row
,
col
,
x
);
}
template
<
int
LoadMode
>
inline
const
PacketScalar
packet
(
Index
index
)
const
{
return
m_expression
.
template
packet
<
Aligned
>(
index
);
}
template
<
int
LoadMode
>
inline
void
writePacket
(
Index
index
,
const
PacketScalar
&
x
)
{
m_expression
.
const_cast_derived
().
template
writePacket
<
Aligned
>(
index
,
x
);
}
operator
const
ExpressionType
&
()
const
{
return
m_expression
;
}
protected:
const
ExpressionType
&
m_expression
;
private:
ForceAlignedAccess
&
operator
=
(
const
ForceAlignedAccess
&
);
};
/** \returns an expression of *this with forced aligned access
* \sa forceAlignedAccessIf(),class ForceAlignedAccess
*/
template
<
typename
Derived
>
inline
const
ForceAlignedAccess
<
Derived
>
MatrixBase
<
Derived
>::
forceAlignedAccess
()
const
{
return
ForceAlignedAccess
<
Derived
>
(
derived
());
}
/** \returns an expression of *this with forced aligned access
* \sa forceAlignedAccessIf(), class ForceAlignedAccess
*/
template
<
typename
Derived
>
inline
ForceAlignedAccess
<
Derived
>
MatrixBase
<
Derived
>::
forceAlignedAccess
()
{
return
ForceAlignedAccess
<
Derived
>
(
derived
());
}
/** \returns an expression of *this with forced aligned access if \a Enable is true.
* \sa forceAlignedAccess(), class ForceAlignedAccess
*/
template
<
typename
Derived
>
template
<
bool
Enable
>
inline
typename
internal
::
add_const_on_value_type
<
typename
internal
::
conditional
<
Enable
,
ForceAlignedAccess
<
Derived
>
,
Derived
&>::
type
>::
type
MatrixBase
<
Derived
>::
forceAlignedAccessIf
()
const
{
return
derived
();
}
/** \returns an expression of *this with forced aligned access if \a Enable is true.
* \sa forceAlignedAccess(), class ForceAlignedAccess
*/
template
<
typename
Derived
>
template
<
bool
Enable
>
inline
typename
internal
::
conditional
<
Enable
,
ForceAlignedAccess
<
Derived
>
,
Derived
&>::
type
MatrixBase
<
Derived
>::
forceAlignedAccessIf
()
{
return
derived
();
}
}
// end namespace Eigen
#endif // EIGEN_FORCEALIGNEDACCESS_H
densecrf/include/Eigen/src/Core/Functors.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_FUNCTORS_H
#define EIGEN_FUNCTORS_H
namespace
Eigen
{
namespace
internal
{
// associative functors:
/** \internal
* \brief Template functor to compute the sum of two scalars
*
* \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, MatrixBase::sum()
*/
template
<
typename
Scalar
>
struct
scalar_sum_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_sum_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
,
const
Scalar
&
b
)
const
{
return
a
+
b
;
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
internal
::
padd
(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Scalar
predux
(
const
Packet
&
a
)
const
{
return
internal
::
predux
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_sum_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasAdd
};
};
/** \internal
* \brief Template functor to compute the product of two scalars
*
* \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
*/
template
<
typename
LhsScalar
,
typename
RhsScalar
>
struct
scalar_product_op
{
enum
{
// TODO vectorize mixed product
Vectorizable
=
is_same
<
LhsScalar
,
RhsScalar
>::
value
&&
packet_traits
<
LhsScalar
>::
HasMul
&&
packet_traits
<
RhsScalar
>::
HasMul
};
typedef
typename
scalar_product_traits
<
LhsScalar
,
RhsScalar
>::
ReturnType
result_type
;
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_product_op
)
EIGEN_STRONG_INLINE
const
result_type
operator
()
(
const
LhsScalar
&
a
,
const
RhsScalar
&
b
)
const
{
return
a
*
b
;
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
internal
::
pmul
(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
result_type
predux
(
const
Packet
&
a
)
const
{
return
internal
::
predux_mul
(
a
);
}
};
template
<
typename
LhsScalar
,
typename
RhsScalar
>
struct
functor_traits
<
scalar_product_op
<
LhsScalar
,
RhsScalar
>
>
{
enum
{
Cost
=
(
NumTraits
<
LhsScalar
>::
MulCost
+
NumTraits
<
RhsScalar
>::
MulCost
)
/
2
,
// rough estimate!
PacketAccess
=
scalar_product_op
<
LhsScalar
,
RhsScalar
>::
Vectorizable
};
};
/** \internal
* \brief Template functor to compute the conjugate product of two scalars
*
* This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)
*/
template
<
typename
LhsScalar
,
typename
RhsScalar
>
struct
scalar_conj_product_op
{
enum
{
Conj
=
NumTraits
<
LhsScalar
>::
IsComplex
};
typedef
typename
scalar_product_traits
<
LhsScalar
,
RhsScalar
>::
ReturnType
result_type
;
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_conj_product_op
)
EIGEN_STRONG_INLINE
const
result_type
operator
()
(
const
LhsScalar
&
a
,
const
RhsScalar
&
b
)
const
{
return
conj_helper
<
LhsScalar
,
RhsScalar
,
Conj
,
false
>
().
pmul
(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
conj_helper
<
Packet
,
Packet
,
Conj
,
false
>
().
pmul
(
a
,
b
);
}
};
template
<
typename
LhsScalar
,
typename
RhsScalar
>
struct
functor_traits
<
scalar_conj_product_op
<
LhsScalar
,
RhsScalar
>
>
{
enum
{
Cost
=
NumTraits
<
LhsScalar
>::
MulCost
,
PacketAccess
=
internal
::
is_same
<
LhsScalar
,
RhsScalar
>::
value
&&
packet_traits
<
LhsScalar
>::
HasMul
};
};
/** \internal
* \brief Template functor to compute the min of two scalars
*
* \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
*/
template
<
typename
Scalar
>
struct
scalar_min_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_min_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
,
const
Scalar
&
b
)
const
{
using
std
::
min
;
return
(
min
)(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
internal
::
pmin
(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Scalar
predux
(
const
Packet
&
a
)
const
{
return
internal
::
predux_min
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_min_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasMin
};
};
/** \internal
* \brief Template functor to compute the max of two scalars
*
* \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
*/
template
<
typename
Scalar
>
struct
scalar_max_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_max_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
,
const
Scalar
&
b
)
const
{
using
std
::
max
;
return
(
max
)(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
internal
::
pmax
(
a
,
b
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Scalar
predux
(
const
Packet
&
a
)
const
{
return
internal
::
predux_max
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_max_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasMax
};
};
/** \internal
* \brief Template functor to compute the hypot of two scalars
*
* \sa MatrixBase::stableNorm(), class Redux
*/
template
<
typename
Scalar
>
struct
scalar_hypot_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_hypot_op
)
// typedef typename NumTraits<Scalar>::Real result_type;
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
_x
,
const
Scalar
&
_y
)
const
{
using
std
::
max
;
using
std
::
min
;
Scalar
p
=
(
max
)(
_x
,
_y
);
Scalar
q
=
(
min
)(
_x
,
_y
);
Scalar
qp
=
q
/
p
;
return
p
*
sqrt
(
Scalar
(
1
)
+
qp
*
qp
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_hypot_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
0
};
};
/** \internal
* \brief Template functor to compute the pow of two scalars
*/
template
<
typename
Scalar
,
typename
OtherScalar
>
struct
scalar_binary_pow_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_binary_pow_op
)
inline
Scalar
operator
()
(
const
Scalar
&
a
,
const
OtherScalar
&
b
)
const
{
return
internal
::
pow
(
a
,
b
);
}
};
template
<
typename
Scalar
,
typename
OtherScalar
>
struct
functor_traits
<
scalar_binary_pow_op
<
Scalar
,
OtherScalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
false
};
};
// other binary functors:
/** \internal
* \brief Template functor to compute the difference of two scalars
*
* \sa class CwiseBinaryOp, MatrixBase::operator-
*/
template
<
typename
Scalar
>
struct
scalar_difference_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_difference_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
,
const
Scalar
&
b
)
const
{
return
a
-
b
;
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
internal
::
psub
(
a
,
b
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_difference_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasSub
};
};
/** \internal
* \brief Template functor to compute the quotient of two scalars
*
* \sa class CwiseBinaryOp, Cwise::operator/()
*/
template
<
typename
Scalar
>
struct
scalar_quotient_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_quotient_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
,
const
Scalar
&
b
)
const
{
return
a
/
b
;
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
,
const
Packet
&
b
)
const
{
return
internal
::
pdiv
(
a
,
b
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_quotient_op
<
Scalar
>
>
{
enum
{
Cost
=
2
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasDiv
};
};
/** \internal
* \brief Template functor to compute the and of two booleans
*
* \sa class CwiseBinaryOp, ArrayBase::operator&&
*/
struct
scalar_boolean_and_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_boolean_and_op
)
EIGEN_STRONG_INLINE
bool
operator
()
(
const
bool
&
a
,
const
bool
&
b
)
const
{
return
a
&&
b
;
}
};
template
<
>
struct
functor_traits
<
scalar_boolean_and_op
>
{
enum
{
Cost
=
NumTraits
<
bool
>::
AddCost
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to compute the or of two booleans
*
* \sa class CwiseBinaryOp, ArrayBase::operator||
*/
struct
scalar_boolean_or_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_boolean_or_op
)
EIGEN_STRONG_INLINE
bool
operator
()
(
const
bool
&
a
,
const
bool
&
b
)
const
{
return
a
||
b
;
}
};
template
<
>
struct
functor_traits
<
scalar_boolean_or_op
>
{
enum
{
Cost
=
NumTraits
<
bool
>::
AddCost
,
PacketAccess
=
false
};
};
// unary functors:
/** \internal
* \brief Template functor to compute the opposite of a scalar
*
* \sa class CwiseUnaryOp, MatrixBase::operator-
*/
template
<
typename
Scalar
>
struct
scalar_opposite_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_opposite_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
-
a
;
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pnegate
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_opposite_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasNegate
};
};
/** \internal
* \brief Template functor to compute the absolute value of a scalar
*
* \sa class CwiseUnaryOp, Cwise::abs
*/
template
<
typename
Scalar
>
struct
scalar_abs_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_abs_op
)
typedef
typename
NumTraits
<
Scalar
>::
Real
result_type
;
EIGEN_STRONG_INLINE
const
result_type
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
abs
(
a
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pabs
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_abs_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasAbs
};
};
/** \internal
* \brief Template functor to compute the squared absolute value of a scalar
*
* \sa class CwiseUnaryOp, Cwise::abs2
*/
template
<
typename
Scalar
>
struct
scalar_abs2_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_abs2_op
)
typedef
typename
NumTraits
<
Scalar
>::
Real
result_type
;
EIGEN_STRONG_INLINE
const
result_type
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
abs2
(
a
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pmul
(
a
,
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_abs2_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasAbs2
};
};
/** \internal
* \brief Template functor to compute the conjugate of a complex value
*
* \sa class CwiseUnaryOp, MatrixBase::conjugate()
*/
template
<
typename
Scalar
>
struct
scalar_conjugate_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_conjugate_op
)
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
conj
(
a
);
}
template
<
typename
Packet
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pconj
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_conjugate_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
IsComplex
?
NumTraits
<
Scalar
>::
AddCost
:
0
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasConj
};
};
/** \internal
* \brief Template functor to cast a scalar to another type
*
* \sa class CwiseUnaryOp, MatrixBase::cast()
*/
template
<
typename
Scalar
,
typename
NewType
>
struct
scalar_cast_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_cast_op
)
typedef
NewType
result_type
;
EIGEN_STRONG_INLINE
const
NewType
operator
()
(
const
Scalar
&
a
)
const
{
return
cast
<
Scalar
,
NewType
>
(
a
);
}
};
template
<
typename
Scalar
,
typename
NewType
>
struct
functor_traits
<
scalar_cast_op
<
Scalar
,
NewType
>
>
{
enum
{
Cost
=
is_same
<
Scalar
,
NewType
>::
value
?
0
:
NumTraits
<
NewType
>::
AddCost
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to extract the real part of a complex
*
* \sa class CwiseUnaryOp, MatrixBase::real()
*/
template
<
typename
Scalar
>
struct
scalar_real_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_real_op
)
typedef
typename
NumTraits
<
Scalar
>::
Real
result_type
;
EIGEN_STRONG_INLINE
result_type
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
real
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_real_op
<
Scalar
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to extract the imaginary part of a complex
*
* \sa class CwiseUnaryOp, MatrixBase::imag()
*/
template
<
typename
Scalar
>
struct
scalar_imag_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_imag_op
)
typedef
typename
NumTraits
<
Scalar
>::
Real
result_type
;
EIGEN_STRONG_INLINE
result_type
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
imag
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_imag_op
<
Scalar
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to extract the real part of a complex as a reference
*
* \sa class CwiseUnaryOp, MatrixBase::real()
*/
template
<
typename
Scalar
>
struct
scalar_real_ref_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_real_ref_op
)
typedef
typename
NumTraits
<
Scalar
>::
Real
result_type
;
EIGEN_STRONG_INLINE
result_type
&
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
real_ref
(
*
const_cast
<
Scalar
*>
(
&
a
));
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_real_ref_op
<
Scalar
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to extract the imaginary part of a complex as a reference
*
* \sa class CwiseUnaryOp, MatrixBase::imag()
*/
template
<
typename
Scalar
>
struct
scalar_imag_ref_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_imag_ref_op
)
typedef
typename
NumTraits
<
Scalar
>::
Real
result_type
;
EIGEN_STRONG_INLINE
result_type
&
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
imag_ref
(
*
const_cast
<
Scalar
*>
(
&
a
));
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_imag_ref_op
<
Scalar
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
/** \internal
*
* \brief Template functor to compute the exponential of a scalar
*
* \sa class CwiseUnaryOp, Cwise::exp()
*/
template
<
typename
Scalar
>
struct
scalar_exp_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_exp_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
exp
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pexp
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_exp_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasExp
};
};
/** \internal
*
* \brief Template functor to compute the logarithm of a scalar
*
* \sa class CwiseUnaryOp, Cwise::log()
*/
template
<
typename
Scalar
>
struct
scalar_log_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_log_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
log
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
plog
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_log_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasLog
};
};
/** \internal
* \brief Template functor to multiply a scalar by a fixed other one
*
* \sa class CwiseUnaryOp, MatrixBase::operator*, MatrixBase::operator/
*/
/* NOTE why doing the pset1() in packetOp *is* an optimization ?
* indeed it seems better to declare m_other as a Packet and do the pset1() once
* in the constructor. However, in practice:
* - GCC does not like m_other as a Packet and generate a load every time it needs it
* - on the other hand GCC is able to moves the pset1() outside the loop :)
* - simpler code ;)
* (ICC and gcc 4.4 seems to perform well in both cases, the issue is visible with y = a*x + b*y)
*/
template
<
typename
Scalar
>
struct
scalar_multiple_op
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
// FIXME default copy constructors seems bugged with std::complex<>
EIGEN_STRONG_INLINE
scalar_multiple_op
(
const
scalar_multiple_op
&
other
)
:
m_other
(
other
.
m_other
)
{
}
EIGEN_STRONG_INLINE
scalar_multiple_op
(
const
Scalar
&
other
)
:
m_other
(
other
)
{
}
EIGEN_STRONG_INLINE
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
a
*
m_other
;
}
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pmul
(
a
,
pset1
<
Packet
>
(
m_other
));
}
typename
add_const_on_value_type
<
typename
NumTraits
<
Scalar
>::
Nested
>::
type
m_other
;
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_multiple_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasMul
};
};
template
<
typename
Scalar1
,
typename
Scalar2
>
struct
scalar_multiple2_op
{
typedef
typename
scalar_product_traits
<
Scalar1
,
Scalar2
>::
ReturnType
result_type
;
EIGEN_STRONG_INLINE
scalar_multiple2_op
(
const
scalar_multiple2_op
&
other
)
:
m_other
(
other
.
m_other
)
{
}
EIGEN_STRONG_INLINE
scalar_multiple2_op
(
const
Scalar2
&
other
)
:
m_other
(
other
)
{
}
EIGEN_STRONG_INLINE
result_type
operator
()
(
const
Scalar1
&
a
)
const
{
return
a
*
m_other
;
}
typename
add_const_on_value_type
<
typename
NumTraits
<
Scalar2
>::
Nested
>::
type
m_other
;
};
template
<
typename
Scalar1
,
typename
Scalar2
>
struct
functor_traits
<
scalar_multiple2_op
<
Scalar1
,
Scalar2
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar1
>::
MulCost
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to divide a scalar by a fixed other one
*
* This functor is used to implement the quotient of a matrix by
* a scalar where the scalar type is not necessarily a floating point type.
*
* \sa class CwiseUnaryOp, MatrixBase::operator/
*/
template
<
typename
Scalar
>
struct
scalar_quotient1_op
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
// FIXME default copy constructors seems bugged with std::complex<>
EIGEN_STRONG_INLINE
scalar_quotient1_op
(
const
scalar_quotient1_op
&
other
)
:
m_other
(
other
.
m_other
)
{
}
EIGEN_STRONG_INLINE
scalar_quotient1_op
(
const
Scalar
&
other
)
:
m_other
(
other
)
{}
EIGEN_STRONG_INLINE
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
a
/
m_other
;
}
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pdiv
(
a
,
pset1
<
Packet
>
(
m_other
));
}
typename
add_const_on_value_type
<
typename
NumTraits
<
Scalar
>::
Nested
>::
type
m_other
;
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_quotient1_op
<
Scalar
>
>
{
enum
{
Cost
=
2
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasDiv
};
};
// nullary functors
template
<
typename
Scalar
>
struct
scalar_constant_op
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
EIGEN_STRONG_INLINE
scalar_constant_op
(
const
scalar_constant_op
&
other
)
:
m_other
(
other
.
m_other
)
{
}
EIGEN_STRONG_INLINE
scalar_constant_op
(
const
Scalar
&
other
)
:
m_other
(
other
)
{
}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
Index
,
Index
=
0
)
const
{
return
m_other
;
}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
Index
,
Index
=
0
)
const
{
return
internal
::
pset1
<
Packet
>
(
m_other
);
}
const
Scalar
m_other
;
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_constant_op
<
Scalar
>
>
// FIXME replace this packet test by a safe one
{
enum
{
Cost
=
1
,
PacketAccess
=
packet_traits
<
Scalar
>::
Vectorizable
,
IsRepeatable
=
true
};
};
template
<
typename
Scalar
>
struct
scalar_identity_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_identity_op
)
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
Index
row
,
Index
col
)
const
{
return
row
==
col
?
Scalar
(
1
)
:
Scalar
(
0
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_identity_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
false
,
IsRepeatable
=
true
};
};
template
<
typename
Scalar
,
bool
RandomAccess
>
struct
linspaced_op_impl
;
// linear access for packet ops:
// 1) initialization
// base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0])
// 2) each step (where size is 1 for coeff access or PacketSize for packet access)
// base += [size*step, ..., size*step]
//
// TODO: Perhaps it's better to initialize lazily (so not in the constructor but in packetOp)
// in order to avoid the padd() in operator() ?
template
<
typename
Scalar
>
struct
linspaced_op_impl
<
Scalar
,
false
>
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
linspaced_op_impl
(
Scalar
low
,
Scalar
step
)
:
m_low
(
low
),
m_step
(
step
),
m_packetStep
(
pset1
<
Packet
>
(
packet_traits
<
Scalar
>::
size
*
step
)),
m_base
(
padd
(
pset1
<
Packet
>
(
low
),
pmul
(
pset1
<
Packet
>
(
step
),
plset
<
Scalar
>
(
-
packet_traits
<
Scalar
>::
size
))))
{}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
Index
i
)
const
{
m_base
=
padd
(
m_base
,
pset1
<
Packet
>
(
m_step
));
return
m_low
+
i
*
m_step
;
}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
Index
)
const
{
return
m_base
=
padd
(
m_base
,
m_packetStep
);
}
const
Scalar
m_low
;
const
Scalar
m_step
;
const
Packet
m_packetStep
;
mutable
Packet
m_base
;
};
// random access for packet ops:
// 1) each step
// [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) )
template
<
typename
Scalar
>
struct
linspaced_op_impl
<
Scalar
,
true
>
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
linspaced_op_impl
(
Scalar
low
,
Scalar
step
)
:
m_low
(
low
),
m_step
(
step
),
m_lowPacket
(
pset1
<
Packet
>
(
m_low
)),
m_stepPacket
(
pset1
<
Packet
>
(
m_step
)),
m_interPacket
(
plset
<
Scalar
>
(
0
))
{}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
Index
i
)
const
{
return
m_low
+
i
*
m_step
;
}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
Index
i
)
const
{
return
internal
::
padd
(
m_lowPacket
,
pmul
(
m_stepPacket
,
padd
(
pset1
<
Packet
>
(
i
),
m_interPacket
)));
}
const
Scalar
m_low
;
const
Scalar
m_step
;
const
Packet
m_lowPacket
;
const
Packet
m_stepPacket
;
const
Packet
m_interPacket
;
};
// ----- Linspace functor ----------------------------------------------------------------
// Forward declaration (we default to random access which does not really give
// us a speed gain when using packet access but it allows to use the functor in
// nested expressions).
template
<
typename
Scalar
,
bool
RandomAccess
=
true
>
struct
linspaced_op
;
template
<
typename
Scalar
,
bool
RandomAccess
>
struct
functor_traits
<
linspaced_op
<
Scalar
,
RandomAccess
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasSetLinear
,
IsRepeatable
=
true
};
};
template
<
typename
Scalar
,
bool
RandomAccess
>
struct
linspaced_op
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
linspaced_op
(
Scalar
low
,
Scalar
high
,
int
num_steps
)
:
impl
((
num_steps
==
1
?
high
:
low
),
(
num_steps
==
1
?
Scalar
()
:
(
high
-
low
)
/
(
num_steps
-
1
)))
{}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
Index
i
)
const
{
return
impl
(
i
);
}
// We need this function when assigning e.g. a RowVectorXd to a MatrixXd since
// there row==0 and col is used for the actual iteration.
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Scalar
operator
()
(
Index
row
,
Index
col
)
const
{
eigen_assert
(
col
==
0
||
row
==
0
);
return
impl
(
col
+
row
);
}
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
Index
i
)
const
{
return
impl
.
packetOp
(
i
);
}
// We need this function when assigning e.g. a RowVectorXd to a MatrixXd since
// there row==0 and col is used for the actual iteration.
template
<
typename
Index
>
EIGEN_STRONG_INLINE
const
Packet
packetOp
(
Index
row
,
Index
col
)
const
{
eigen_assert
(
col
==
0
||
row
==
0
);
return
impl
.
packetOp
(
col
+
row
);
}
// This proxy object handles the actual required temporaries, the different
// implementations (random vs. sequential access) as well as the
// correct piping to size 2/4 packet operations.
const
linspaced_op_impl
<
Scalar
,
RandomAccess
>
impl
;
};
// all functors allow linear access, except scalar_identity_op. So we fix here a quick meta
// to indicate whether a functor allows linear access, just always answering 'yes' except for
// scalar_identity_op.
// FIXME move this to functor_traits adding a functor_default
template
<
typename
Functor
>
struct
functor_has_linear_access
{
enum
{
ret
=
1
};
};
template
<
typename
Scalar
>
struct
functor_has_linear_access
<
scalar_identity_op
<
Scalar
>
>
{
enum
{
ret
=
0
};
};
// in CwiseBinaryOp, we require the Lhs and Rhs to have the same scalar type, except for multiplication
// where we only require them to have the same _real_ scalar type so one may multiply, say, float by complex<float>.
// FIXME move this to functor_traits adding a functor_default
template
<
typename
Functor
>
struct
functor_allows_mixing_real_and_complex
{
enum
{
ret
=
0
};
};
template
<
typename
LhsScalar
,
typename
RhsScalar
>
struct
functor_allows_mixing_real_and_complex
<
scalar_product_op
<
LhsScalar
,
RhsScalar
>
>
{
enum
{
ret
=
1
};
};
template
<
typename
LhsScalar
,
typename
RhsScalar
>
struct
functor_allows_mixing_real_and_complex
<
scalar_conj_product_op
<
LhsScalar
,
RhsScalar
>
>
{
enum
{
ret
=
1
};
};
/** \internal
* \brief Template functor to add a scalar to a fixed other one
* \sa class CwiseUnaryOp, Array::operator+
*/
/* If you wonder why doing the pset1() in packetOp() is an optimization check scalar_multiple_op */
template
<
typename
Scalar
>
struct
scalar_add_op
{
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
// FIXME default copy constructors seems bugged with std::complex<>
inline
scalar_add_op
(
const
scalar_add_op
&
other
)
:
m_other
(
other
.
m_other
)
{
}
inline
scalar_add_op
(
const
Scalar
&
other
)
:
m_other
(
other
)
{
}
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
a
+
m_other
;
}
inline
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
padd
(
a
,
pset1
<
Packet
>
(
m_other
));
}
const
Scalar
m_other
;
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_add_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
AddCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasAdd
};
};
/** \internal
* \brief Template functor to compute the square root of a scalar
* \sa class CwiseUnaryOp, Cwise::sqrt()
*/
template
<
typename
Scalar
>
struct
scalar_sqrt_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_sqrt_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
sqrt
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
psqrt
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_sqrt_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasSqrt
};
};
/** \internal
* \brief Template functor to compute the cosine of a scalar
* \sa class CwiseUnaryOp, ArrayBase::cos()
*/
template
<
typename
Scalar
>
struct
scalar_cos_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_cos_op
)
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
cos
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pcos
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_cos_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasCos
};
};
/** \internal
* \brief Template functor to compute the sine of a scalar
* \sa class CwiseUnaryOp, ArrayBase::sin()
*/
template
<
typename
Scalar
>
struct
scalar_sin_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_sin_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
sin
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
psin
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_sin_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasSin
};
};
/** \internal
* \brief Template functor to compute the tan of a scalar
* \sa class CwiseUnaryOp, ArrayBase::tan()
*/
template
<
typename
Scalar
>
struct
scalar_tan_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_tan_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
tan
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
ptan
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_tan_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasTan
};
};
/** \internal
* \brief Template functor to compute the arc cosine of a scalar
* \sa class CwiseUnaryOp, ArrayBase::acos()
*/
template
<
typename
Scalar
>
struct
scalar_acos_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_acos_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
acos
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pacos
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_acos_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasACos
};
};
/** \internal
* \brief Template functor to compute the arc sine of a scalar
* \sa class CwiseUnaryOp, ArrayBase::asin()
*/
template
<
typename
Scalar
>
struct
scalar_asin_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_asin_op
)
inline
const
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
asin
(
a
);
}
typedef
typename
packet_traits
<
Scalar
>::
type
Packet
;
inline
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pasin
(
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_asin_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasASin
};
};
/** \internal
* \brief Template functor to raise a scalar to a power
* \sa class CwiseUnaryOp, Cwise::pow
*/
template
<
typename
Scalar
>
struct
scalar_pow_op
{
// FIXME default copy constructors seems bugged with std::complex<>
inline
scalar_pow_op
(
const
scalar_pow_op
&
other
)
:
m_exponent
(
other
.
m_exponent
)
{
}
inline
scalar_pow_op
(
const
Scalar
&
exponent
)
:
m_exponent
(
exponent
)
{}
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
internal
::
pow
(
a
,
m_exponent
);
}
const
Scalar
m_exponent
;
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_pow_op
<
Scalar
>
>
{
enum
{
Cost
=
5
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
false
};
};
/** \internal
* \brief Template functor to compute the quotient between a scalar and array entries.
* \sa class CwiseUnaryOp, Cwise::inverse()
*/
template
<
typename
Scalar
>
struct
scalar_inverse_mult_op
{
scalar_inverse_mult_op
(
const
Scalar
&
other
)
:
m_other
(
other
)
{}
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
m_other
/
a
;
}
template
<
typename
Packet
>
inline
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pdiv
(
pset1
<
Packet
>
(
m_other
),
a
);
}
Scalar
m_other
;
};
/** \internal
* \brief Template functor to compute the inverse of a scalar
* \sa class CwiseUnaryOp, Cwise::inverse()
*/
template
<
typename
Scalar
>
struct
scalar_inverse_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_inverse_op
)
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
Scalar
(
1
)
/
a
;
}
template
<
typename
Packet
>
inline
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pdiv
(
pset1
<
Packet
>
(
Scalar
(
1
)),
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_inverse_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasDiv
};
};
/** \internal
* \brief Template functor to compute the square of a scalar
* \sa class CwiseUnaryOp, Cwise::square()
*/
template
<
typename
Scalar
>
struct
scalar_square_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_square_op
)
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
a
*
a
;
}
template
<
typename
Packet
>
inline
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pmul
(
a
,
a
);
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_square_op
<
Scalar
>
>
{
enum
{
Cost
=
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasMul
};
};
/** \internal
* \brief Template functor to compute the cube of a scalar
* \sa class CwiseUnaryOp, Cwise::cube()
*/
template
<
typename
Scalar
>
struct
scalar_cube_op
{
EIGEN_EMPTY_STRUCT_CTOR
(
scalar_cube_op
)
inline
Scalar
operator
()
(
const
Scalar
&
a
)
const
{
return
a
*
a
*
a
;
}
template
<
typename
Packet
>
inline
const
Packet
packetOp
(
const
Packet
&
a
)
const
{
return
internal
::
pmul
(
a
,
pmul
(
a
,
a
));
}
};
template
<
typename
Scalar
>
struct
functor_traits
<
scalar_cube_op
<
Scalar
>
>
{
enum
{
Cost
=
2
*
NumTraits
<
Scalar
>::
MulCost
,
PacketAccess
=
packet_traits
<
Scalar
>::
HasMul
};
};
// default functor traits for STL functors:
template
<
typename
T
>
struct
functor_traits
<
std
::
multiplies
<
T
>
>
{
enum
{
Cost
=
NumTraits
<
T
>::
MulCost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
divides
<
T
>
>
{
enum
{
Cost
=
NumTraits
<
T
>::
MulCost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
plus
<
T
>
>
{
enum
{
Cost
=
NumTraits
<
T
>::
AddCost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
minus
<
T
>
>
{
enum
{
Cost
=
NumTraits
<
T
>::
AddCost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
negate
<
T
>
>
{
enum
{
Cost
=
NumTraits
<
T
>::
AddCost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
logical_or
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
logical_and
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
logical_not
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
greater
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
less
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
greater_equal
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
less_equal
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
equal_to
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
not_equal_to
<
T
>
>
{
enum
{
Cost
=
1
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
binder2nd
<
T
>
>
{
enum
{
Cost
=
functor_traits
<
T
>::
Cost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
binder1st
<
T
>
>
{
enum
{
Cost
=
functor_traits
<
T
>::
Cost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
unary_negate
<
T
>
>
{
enum
{
Cost
=
1
+
functor_traits
<
T
>::
Cost
,
PacketAccess
=
false
};
};
template
<
typename
T
>
struct
functor_traits
<
std
::
binary_negate
<
T
>
>
{
enum
{
Cost
=
1
+
functor_traits
<
T
>::
Cost
,
PacketAccess
=
false
};
};
#ifdef EIGEN_STDEXT_SUPPORT
template
<
typename
T0
,
typename
T1
>
struct
functor_traits
<
std
::
project1st
<
T0
,
T1
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
template
<
typename
T0
,
typename
T1
>
struct
functor_traits
<
std
::
project2nd
<
T0
,
T1
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
template
<
typename
T0
,
typename
T1
>
struct
functor_traits
<
std
::
select2nd
<
std
::
pair
<
T0
,
T1
>
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
template
<
typename
T0
,
typename
T1
>
struct
functor_traits
<
std
::
select1st
<
std
::
pair
<
T0
,
T1
>
>
>
{
enum
{
Cost
=
0
,
PacketAccess
=
false
};
};
template
<
typename
T0
,
typename
T1
>
struct
functor_traits
<
std
::
unary_compose
<
T0
,
T1
>
>
{
enum
{
Cost
=
functor_traits
<
T0
>::
Cost
+
functor_traits
<
T1
>::
Cost
,
PacketAccess
=
false
};
};
template
<
typename
T0
,
typename
T1
,
typename
T2
>
struct
functor_traits
<
std
::
binary_compose
<
T0
,
T1
,
T2
>
>
{
enum
{
Cost
=
functor_traits
<
T0
>::
Cost
+
functor_traits
<
T1
>::
Cost
+
functor_traits
<
T2
>::
Cost
,
PacketAccess
=
false
};
};
#endif // EIGEN_STDEXT_SUPPORT
// allow to add new functors and specializations of functor_traits from outside Eigen.
// this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
#ifdef EIGEN_FUNCTORS_PLUGIN
#include EIGEN_FUNCTORS_PLUGIN
#endif
}
// end namespace internal
}
// end namespace Eigen
#endif // EIGEN_FUNCTORS_H
densecrf/include/Eigen/src/Core/Fuzzy.h
0 → 100644
View file @
da2c1226
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef EIGEN_FUZZY_H
#define EIGEN_FUZZY_H
namespace
Eigen
{
namespace
internal
{
template
<
typename
Derived
,
typename
OtherDerived
,
bool
is_integer
=
NumTraits
<
typename
Derived
::
Scalar
>
::
IsInteger
>
struct
isApprox_selector
{
static
bool
run
(
const
Derived
&
x
,
const
OtherDerived
&
y
,
typename
Derived
::
RealScalar
prec
)
{
using
std
::
min
;
typename
internal
::
nested
<
Derived
,
2
>::
type
nested
(
x
);
typename
internal
::
nested
<
OtherDerived
,
2
>::
type
otherNested
(
y
);
return
(
nested
-
otherNested
).
cwiseAbs2
().
sum
()
<=
prec
*
prec
*
(
min
)(
nested
.
cwiseAbs2
().
sum
(),
otherNested
.
cwiseAbs2
().
sum
());
}
};
template
<
typename
Derived
,
typename
OtherDerived
>
struct
isApprox_selector
<
Derived
,
OtherDerived
,
true
>
{
static
bool
run
(
const
Derived
&
x
,
const
OtherDerived
&
y
,
typename
Derived
::
RealScalar
)
{
return
x
.
matrix
()
==
y
.
matrix
();
}
};
template
<
typename
Derived
,
typename
OtherDerived
,
bool
is_integer
=
NumTraits
<
typename
Derived
::
Scalar
>
::
IsInteger
>
struct
isMuchSmallerThan_object_selector
{
static
bool
run
(
const
Derived
&
x
,
const
OtherDerived
&
y
,
typename
Derived
::
RealScalar
prec
)
{
return
x
.
cwiseAbs2
().
sum
()
<=
abs2
(
prec
)
*
y
.
cwiseAbs2
().
sum
();
}
};
template
<
typename
Derived
,
typename
OtherDerived
>
struct
isMuchSmallerThan_object_selector
<
Derived
,
OtherDerived
,
true
>
{
static
bool
run
(
const
Derived
&
x
,
const
OtherDerived
&
,
typename
Derived
::
RealScalar
)
{
return
x
.
matrix
()
==
Derived
::
Zero
(
x
.
rows
(),
x
.
cols
()).
matrix
();
}
};
template
<
typename
Derived
,
bool
is_integer
=
NumTraits
<
typename
Derived
::
Scalar
>
::
IsInteger
>
struct
isMuchSmallerThan_scalar_selector
{
static
bool
run
(
const
Derived
&
x
,
const
typename
Derived
::
RealScalar
&
y
,
typename
Derived
::
RealScalar
prec
)
{
return
x
.
cwiseAbs2
().
sum
()
<=
abs2
(
prec
*
y
);
}
};
template
<
typename
Derived
>
struct
isMuchSmallerThan_scalar_selector
<
Derived
,
true
>
{
static
bool
run
(
const
Derived
&
x
,
const
typename
Derived
::
RealScalar
&
,
typename
Derived
::
RealScalar
)
{
return
x
.
matrix
()
==
Derived
::
Zero
(
x
.
rows
(),
x
.
cols
()).
matrix
();
}
};
}
// end namespace internal
/** \returns \c true if \c *this is approximately equal to \a other, within the precision
* determined by \a prec.
*
* \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$
* are considered to be approximately equal within precision \f$ p \f$ if
* \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f]
* For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm
* L2 norm).
*
* \note Because of the multiplicativeness of this comparison, one can't use this function
* to check whether \c *this is approximately equal to the zero matrix or vector.
* Indeed, \c isApprox(zero) returns false unless \c *this itself is exactly the zero matrix
* or vector. If you want to test whether \c *this is zero, use internal::isMuchSmallerThan(const
* RealScalar&, RealScalar) instead.
*
* \sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
bool
DenseBase
<
Derived
>::
isApprox
(
const
DenseBase
<
OtherDerived
>&
other
,
RealScalar
prec
)
const
{
return
internal
::
isApprox_selector
<
Derived
,
OtherDerived
>::
run
(
derived
(),
other
.
derived
(),
prec
);
}
/** \returns \c true if the norm of \c *this is much smaller than \a other,
* within the precision determined by \a prec.
*
* \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
* considered to be much smaller than \f$ x \f$ within precision \f$ p \f$ if
* \f[ \Vert v \Vert \leqslant p\,\vert x\vert. \f]
*
* For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason,
* the value of the reference scalar \a other should come from the Hilbert-Schmidt norm
* of a reference matrix of same dimensions.
*
* \sa isApprox(), isMuchSmallerThan(const DenseBase<OtherDerived>&, RealScalar) const
*/
template
<
typename
Derived
>
bool
DenseBase
<
Derived
>::
isMuchSmallerThan
(
const
typename
NumTraits
<
Scalar
>::
Real
&
other
,
RealScalar
prec
)
const
{
return
internal
::
isMuchSmallerThan_scalar_selector
<
Derived
>::
run
(
derived
(),
other
,
prec
);
}
/** \returns \c true if the norm of \c *this is much smaller than the norm of \a other,
* within the precision determined by \a prec.
*
* \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
* considered to be much smaller than a vector \f$ w \f$ within precision \f$ p \f$ if
* \f[ \Vert v \Vert \leqslant p\,\Vert w\Vert. \f]
* For matrices, the comparison is done using the Hilbert-Schmidt norm.
*
* \sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const
*/
template
<
typename
Derived
>
template
<
typename
OtherDerived
>
bool
DenseBase
<
Derived
>::
isMuchSmallerThan
(
const
DenseBase
<
OtherDerived
>&
other
,
RealScalar
prec
)
const
{
return
internal
::
isMuchSmallerThan_object_selector
<
Derived
,
OtherDerived
>::
run
(
derived
(),
other
.
derived
(),
prec
);
}
}
// end namespace Eigen
#endif // EIGEN_FUZZY_H
Prev
1
2
3
4
5
6
7
8
9
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment