1 #ifndef SimTK_SIMMATRIX_MATRIX_CHARACTERISTICS_H_
2 #define SimTK_SIMMATRIX_MATRIX_CHARACTERISTICS_H_
44 class MatrixStructure;
47 class MatrixCondition;
48 class MatrixCharacter;
49 class MatrixCommitment;
61 NoStructure = 0x00000000,
62 Matrix1d = 0x00000001,
64 Identity = 0x00000004,
65 Permutation = 0x00000008,
66 RepeatedDiagonal = 0x00000010,
67 Diagonal = 0x00000020,
68 BiDiagonal = 0x00000040,
69 TriDiagonal = 0x00000080,
70 BandedSymmetric = 0x00000100,
71 BandedHermitian = 0x00000200,
73 Triangular = 0x00000800,
74 QuasiTriangular = 0x00001000,
75 Hessenberg = 0x00002000,
76 Symmetric = 0x00004000,
77 Hermitian = 0x00008000,
78 SkewSymmetric = 0x00010000,
79 SkewHermitian = 0x00020000,
82 static const char* name(Structure);
98 static const char* name(Position);
111 NoDiagValue = 0x0000,
116 static const char* name(DiagValue);
124 if (structure == NoStructure)
126 if (position == NoPosition)
128 if (diagValue == NoDiagValue)
129 diagValue = StoredDiag;
134 return std::string(name(getStructure()))
135 +
"|" + std::string(name(getPosition()))
136 +
"|" + std::string(name(getDiagValue()));
142 : structure(sm), position(pm), diagValue(dm) {}
144 { structure=UncommittedStructure; position=UncommittedPosition;
145 diagValue=UncommittedDiagValue;
return *
this; }
146 bool isUncommitted()
const
147 {
return structure==UncommittedStructure && position==UncommittedPosition
148 && diagValue==UncommittedDiagValue; }
167 : structure(s), position(p), diagValue(d) {}
184 { structure=s; position=p; diagValue=d;
return *
this; }
187 { structure=NoStructure; position=NoPosition;
188 diagValue=NoDiagValue;
return *
this; }
191 Structure structure:32;
192 Position position:16;
193 DiagValue diagValue:16;
215 static const char* name(Packing);
221 NoPlacement = 0x0000,
225 static const char* name(Placement);
232 ColumnOrder = 0x0001,
235 static const char* name(Order);
245 static const char* name(Diagonal);
254 : packing(UncommittedPacking), placement(UncommittedPlacement),
255 order(UncommittedOrder), diagonal(UncommittedDiagonal) {}
257 : packing(pkm), placement(plm), order(om), diagonal(dm) {}
259 { packing=UncommittedPacking; placement=UncommittedPlacement;
260 order=UncommittedOrder; diagonal=UncommittedDiagonal;
return *
this; }
261 bool isUncommitted()
const
262 {
return packing==UncommittedPacking && placement==UncommittedPlacement
263 && order==UncommittedOrder && diagonal==UncommittedDiagonal; }
283 return std::string(name(getPacking()))
284 +
"|" + std::string(name(getPlacement()))
285 +
"|" + std::string(name(getOrder()))
286 +
"|" + std::string(name(getDiagonal()));
304 : packing(NoPacking), placement(NoPlacement), order(NoOrder), diagonal(NoDiag) {}
310 : packing(pk), placement(pl), order(o), diagonal(d) {}
315 : packing(pk), placement(NoPlacement), order(o), diagonal(StoredDiag) {}
320 if (packing==NoPacking)
322 if (placement==NoPlacement)
326 if (diagonal==NoDiag)
327 diagonal = StoredDiag;
333 { packing=NoPacking; placement=NoPlacement;
334 order=NoOrder; diagonal=NoDiag;
return *
this; }
348 Placement placement:16;
350 Diagonal diagonal:16;
388 static const char* name(Outline);
395 Mask() : outline(UncommittedOutline) {}
405 std::string
name()
const {
return std::string(
name(getOutline()));}
420 static OutlineMask calcMask(Outline);
427 bool isSizeOK(
int m,
int n)
const;
430 void getMinimumSize(
int& m,
int& n)
const;
457 UnknownCondition = 0x0000,
459 PositiveDefinite = 0x0002,
460 WellConditioned = 0x0004,
464 static const char* name(Condition);
471 UnknownDiagonal = 0x0000,
472 ZeroDiagonal = 0x0001,
473 OneDiagonal = 0x0002,
474 RealDiagonal = 0x0004,
475 ImaginaryDiagonal = 0x0008
477 static const char* name(Diagonal);
485 Mask() : condition(UncommittedCondition), diagonal(UncommittedDiagonal) {}
488 { condition=UncommittedCondition; diagonal=UncommittedDiagonal;
return *
this;}
489 bool isUncommitted()
const
490 {
return condition==UncommittedCondition && diagonal==UncommittedDiagonal;}
499 std::string name()
const
500 {
return std::string(
name(getCondition())) +
"|" + std::string(
name(getDiagonal()));}
518 static ConditionMask calcMask(Condition);
525 static DiagonalMask calcMask(Diagonal);
530 {
return Mask(calcMask(getCondition()), calcMask(getDiagonal())); }
539 Condition condition:16;
540 Diagonal diagonal:16;
619 std::pair<int,int>
getSize()
const {
return std::pair<int,int>(nrow(),ncol());}
620 ptrdiff_t
nelt()
const {
return (ptrdiff_t)nrow() * (ptrdiff_t)ncol();}
624 std::pair<int,int> getBandwidth()
const
625 {
return std::pair<int,int>(getLowerBandwidth(), getUpperBandwidth()); }
652 assert(lb>=0 && lb>=0);
653 lband = lb; uband = ub;
675 : nr(m), nc(n), lband(lb), uband(ub),
676 structure(structure), storage(storage),
678 condition(condition) {}
693 { assert(m>=0 && n>=0); nr = m; nc = n;
return *
this; }
695 { assert(m>=0); nr = m;
return *
this; }
696 MatrixCharacter& setNumCols(
int n)
697 { assert(n>=0); nc = n;
return *
this; }
703 operator<<(std::ostream& o,
const MatrixCharacter&);
849 { commitNumRows(m); commitNumCols(n);
return *
this; }
852 masks.nr = m;
return *
this; }
855 masks.nc = n;
return *
this; }
858 { commitLowerBandwidth(lb); commitUpperBandwidth(ub);
return *
this;}
861 masks.lband = lb;
return *
this; }
864 masks.uband = ub;
return *
this; }
867 { structure=s; masks.structure=s.
mask();
return *
this; }
869 { storage=s; masks.storage =s.
mask();
return *
this; }
871 { outline=o; masks.outline =o.
mask();
return *
this; }
873 { condition=c; masks.condition=c.
mask();
return *
this; }
885 MatrixCharacter calcDefaultCharacter(
int minNumRows,
int minNumCols)
const;
907 bool isSizeOK(
int m,
int n)
const {
return masks.isSizeOK(m,n);}
908 bool isSizeOK(
const std::pair<int,int>& mn)
const
909 {
return isSizeOK(mn.first, mn.second); }
911 bool isBandwidthOK(
int lower,
int upper)
const {
return masks.isBandwidthOK(lower,upper);}
914 {
return masks.isSatisfiedBy(actual); }
916 {
return getStructureMask().isSatisfiedBy(s); }
918 {
return getStorageMask().isSatisfiedBy(s); }
920 {
return getOutlineMask().isSatisfiedBy(o); }
922 {
return getConditionMask().isSatisfiedBy(c); }
929 bool isStructureCommitted()
const
930 {
return !getStructureMask().isUncommitted(); }
931 bool isStorageCommitted()
const
932 {
return !getStorageMask().isUncommitted();}
933 bool isOutlineCommitted()
const
934 {
return !getOutlineMask().isUncommitted(); }
935 bool isConditionCommitted()
const
936 {
return !getConditionMask().isUncommitted();}
940 structure.setToNone();
943 condition.setToNone();
944 masks.setToUncommitted();
952 : structure(structure), storage(storage),
953 outline(outline), condition(condition),
960 masks.structure = structure.
mask();
961 masks.storage = storage.
mask();
962 masks.outline = outline.
mask();
963 masks.condition = condition.
mask();
1100 #endif // SimTK_SIMMATRIX_MATRIX_CHARACTERISTICS_H_