Blaze 3.9
StrictlyUpperMatrix.h
Go to the documentation of this file.
1//=================================================================================================
33//=================================================================================================
34
35#ifndef _BLAZE_MATH_STRICTLYUPPERMATRIX_H_
36#define _BLAZE_MATH_STRICTLYUPPERMATRIX_H_
37
38
39//*************************************************************************************************
40// Includes
41//*************************************************************************************************
42
43#include <cmath>
44#include <vector>
45#include <blaze/math/Aliases.h>
58#include <blaze/util/Indices.h>
60#include <blaze/util/Random.h>
61#include <blaze/util/Types.h>
62
63
64namespace blaze {
65
66//=================================================================================================
67//
68// RAND SPECIALIZATION
69//
70//=================================================================================================
71
72//*************************************************************************************************
79template< typename MT // Type of the adapted matrix
80 , bool SO // Storage order of the adapted matrix
81 , bool DF > // Density flag
82class Rand< StrictlyUpperMatrix<MT,SO,DF> >
83{
84 public:
85 //**********************************************************************************************
90 inline const StrictlyUpperMatrix<MT,SO,DF> generate() const
91 {
93
94 StrictlyUpperMatrix<MT,SO,DF> matrix;
95 randomize( matrix );
96 return matrix;
97 }
98 //**********************************************************************************************
99
100 //**********************************************************************************************
106 inline const StrictlyUpperMatrix<MT,SO,DF> generate( size_t n ) const
107 {
109
110 StrictlyUpperMatrix<MT,SO,DF> matrix( n );
111 randomize( matrix );
112 return matrix;
113 }
114 //**********************************************************************************************
115
116 //**********************************************************************************************
124 inline const StrictlyUpperMatrix<MT,SO,DF> generate( size_t n, size_t nonzeros ) const
125 {
128
129 if( nonzeros > StrictlyUpperMatrix<MT,SO,DF>::maxNonZeros( n ) ) {
130 BLAZE_THROW_INVALID_ARGUMENT( "Invalid number of non-zero elements" );
131 }
132
133 StrictlyUpperMatrix<MT,SO,DF> matrix( n );
134 randomize( matrix, nonzeros );
135
136 return matrix;
137 }
138 //**********************************************************************************************
139
140 //**********************************************************************************************
147 template< typename Arg > // Min/max argument type
148 inline const StrictlyUpperMatrix<MT,SO,DF> generate( const Arg& min, const Arg& max ) const
149 {
151
152 StrictlyUpperMatrix<MT,SO,DF> matrix;
153 randomize( matrix, min, max );
154 return matrix;
155 }
156 //**********************************************************************************************
157
158 //**********************************************************************************************
166 template< typename Arg > // Min/max argument type
167 inline const StrictlyUpperMatrix<MT,SO,DF>
168 generate( size_t n, const Arg& min, const Arg& max ) const
169 {
171
172 StrictlyUpperMatrix<MT,SO,DF> matrix( n );
173 randomize( matrix, min, max );
174 return matrix;
175 }
176 //**********************************************************************************************
177
178 //**********************************************************************************************
188 template< typename Arg > // Min/max argument type
189 inline const StrictlyUpperMatrix<MT,SO,DF>
190 generate( size_t n, size_t nonzeros, const Arg& min, const Arg& max ) const
191 {
194
195 if( nonzeros > StrictlyUpperMatrix<MT,SO,DF>::maxNonZeros( n ) ) {
196 BLAZE_THROW_INVALID_ARGUMENT( "Invalid number of non-zero elements" );
197 }
198
199 StrictlyUpperMatrix<MT,SO,DF> matrix( n );
200 randomize( matrix, nonzeros, min, max );
201
202 return matrix;
203 }
204 //**********************************************************************************************
205
206 //**********************************************************************************************
212 inline void randomize( StrictlyUpperMatrix<MT,SO,DF>& matrix ) const
213 {
214 randomize( matrix, typename IsDenseMatrix<MT>::Type() );
215 }
216 //**********************************************************************************************
217
218 //**********************************************************************************************
226 inline void randomize( StrictlyUpperMatrix<MT,false,DF>& matrix, size_t nonzeros ) const
227 {
229
230 using ET = ElementType_t<MT>;
231
232 const size_t n( matrix.rows() );
233
234 if( nonzeros > StrictlyUpperMatrix<MT,SO,DF>::maxNonZeros( n ) ) {
235 BLAZE_THROW_INVALID_ARGUMENT( "Invalid number of non-zero elements" );
236 }
237
238 if( n == 0UL || n == 1UL ) return;
239
240 matrix.reset();
241 matrix.reserve( nonzeros );
242
243 std::vector<size_t> dist( n-1UL );
244
245 for( size_t nz=0UL; nz<nonzeros; ) {
246 const size_t index = rand<size_t>( 0UL, n-2UL );
247 if( dist[index] == n - index - 1UL ) continue;
248 ++dist[index];
249 ++nz;
250 }
251
252 for( size_t i=0UL; i<n-1UL; ++i ) {
253 const Indices<size_t> indices( i+1UL, n-1UL, dist[i] );
254 for( size_t j : indices ) {
255 matrix.append( i, j, rand<ET>() );
256 }
257 matrix.finalize( i );
258 }
259
260 matrix.finalize( n-1UL );
261 }
262 //**********************************************************************************************
263
264 //**********************************************************************************************
272 inline void randomize( StrictlyUpperMatrix<MT,true,DF>& matrix, size_t nonzeros ) const
273 {
275
276 using ET = ElementType_t<MT>;
277
278 const size_t n( matrix.rows() );
279
280 if( nonzeros > StrictlyUpperMatrix<MT,SO,DF>::maxNonZeros( n ) ) {
281 BLAZE_THROW_INVALID_ARGUMENT( "Invalid number of non-zero elements" );
282 }
283
284 if( n == 0UL || n == 1UL ) return;
285
286 matrix.reset();
287 matrix.reserve( nonzeros );
288 matrix.finalize( 0UL );
289
290 std::vector<size_t> dist( n );
291
292 for( size_t nz=0UL; nz<nonzeros; ) {
293 const size_t index = rand<size_t>( 1UL, n-1UL );
294 if( dist[index] == index ) continue;
295 ++dist[index];
296 ++nz;
297 }
298
299 for( size_t j=1UL; j<n; ++j ) {
300 const Indices<size_t> indices( 0UL, j-1UL, dist[j] );
301 for( size_t i : indices ) {
302 matrix.append( i, j, rand<ET>() );
303 }
304 matrix.finalize( j );
305 }
306 }
307 //**********************************************************************************************
308
309 //**********************************************************************************************
317 template< typename Arg > // Min/max argument type
318 inline void randomize( StrictlyUpperMatrix<MT,SO,DF>& matrix, const Arg& min, const Arg& max ) const
319 {
320 randomize( matrix, min, max, typename IsDenseMatrix<MT>::Type() );
321 }
322 //**********************************************************************************************
323
324 //**********************************************************************************************
334 template< typename Arg > // Min/max argument type
335 inline void randomize( StrictlyUpperMatrix<MT,false,DF>& matrix,
336 size_t nonzeros, const Arg& min, const Arg& max ) const
337 {
339
340 using ET = ElementType_t<MT>;
341
342 const size_t n( matrix.rows() );
343
344 if( nonzeros > StrictlyUpperMatrix<MT,SO,DF>::maxNonZeros( n ) ) {
345 BLAZE_THROW_INVALID_ARGUMENT( "Invalid number of non-zero elements" );
346 }
347
348 if( n == 0UL || n == 1UL ) return;
349
350 matrix.reset();
351 matrix.reserve( nonzeros );
352
353 std::vector<size_t> dist( n-1UL );
354
355 for( size_t nz=0UL; nz<nonzeros; ) {
356 const size_t index = rand<size_t>( 0UL, n-2UL );
357 if( dist[index] == n - index - 1UL ) continue;
358 ++dist[index];
359 ++nz;
360 }
361
362 for( size_t i=0UL; i<n-1UL; ++i ) {
363 const Indices<size_t> indices( i+1UL, n-1UL, dist[i] );
364 for( size_t j : indices ) {
365 matrix.append( i, j, rand<ET>( min, max ) );
366 }
367 matrix.finalize( i );
368 }
369
370 matrix.finalize( n-1UL );
371 }
372 //**********************************************************************************************
373
374 //**********************************************************************************************
384 template< typename Arg > // Min/max argument type
385 inline void randomize( StrictlyUpperMatrix<MT,true,DF>& matrix,
386 size_t nonzeros, const Arg& min, const Arg& max ) const
387 {
389
390 using ET = ElementType_t<MT>;
391
392 const size_t n( matrix.rows() );
393
394 if( nonzeros > StrictlyUpperMatrix<MT,SO,DF>::maxNonZeros( n ) ) {
395 BLAZE_THROW_INVALID_ARGUMENT( "Invalid number of non-zero elements" );
396 }
397
398 if( n == 0UL || n == 1UL ) return;
399
400 matrix.reset();
401 matrix.reserve( nonzeros );
402 matrix.finalize( 0UL );
403
404 std::vector<size_t> dist( n );
405
406 for( size_t nz=0UL; nz<nonzeros; ) {
407 const size_t index = rand<size_t>( 1UL, n-1UL );
408 if( dist[index] == index ) continue;
409 ++dist[index];
410 ++nz;
411 }
412
413 for( size_t j=1UL; j<n; ++j ) {
414 const Indices<size_t> indices( 0UL, j-1UL, dist[j] );
415 for( size_t i : indices ) {
416 matrix.append( i, j, rand<ET>( min, max ) );
417 }
418 matrix.finalize( j );
419 }
420 }
421 //**********************************************************************************************
422
423 private:
424 //**********************************************************************************************
430 inline void randomize( StrictlyUpperMatrix<MT,SO,DF>& matrix, TrueType ) const
431 {
433
434 using ET = ElementType_t<MT>;
435
436 const size_t n( matrix.rows() );
437
438 for( size_t i=0UL; i<n; ++i ) {
439 for( size_t j=i+1UL; j<n; ++j ) {
440 matrix(i,j) = rand<ET>();
441 }
442 }
443 }
444 //**********************************************************************************************
445
446 //**********************************************************************************************
452 inline void randomize( StrictlyUpperMatrix<MT,SO,DF>& matrix, FalseType ) const
453 {
455
456 const size_t n( matrix.rows() );
457
458 if( n == 0UL || n == 1UL ) return;
459
460 const size_t nonzeros( rand<size_t>( 1UL, std::ceil( 0.2*n*n ) ) );
461
462 randomize( matrix, nonzeros );
463 }
464 //**********************************************************************************************
465
466 //**********************************************************************************************
474 template< typename Arg > // Min/max argument type
475 inline void randomize( StrictlyUpperMatrix<MT,SO,DF>& matrix,
476 const Arg& min, const Arg& max, TrueType ) const
477 {
479
480 using ET = ElementType_t<MT>;
481
482 const size_t n( matrix.rows() );
483
484 for( size_t i=0UL; i<n; ++i ) {
485 for( size_t j=i+1UL; j<n; ++j ) {
486 matrix(i,j) = rand<ET>( min, max );
487 }
488 }
489 }
490 //**********************************************************************************************
491
492 //**********************************************************************************************
500 template< typename Arg > // Min/max argument type
501 inline void randomize( StrictlyUpperMatrix<MT,SO,DF>& matrix,
502 const Arg& min, const Arg& max, FalseType ) const
503 {
505
506 const size_t n( matrix.rows() );
507
508 if( n == 0UL || n == 1UL ) return;
509
510 const size_t nonzeros( rand<size_t>( 1UL, std::ceil( 0.2*n*n ) ) );
511
512 randomize( matrix, nonzeros, min, max );
513 }
514 //**********************************************************************************************
515};
517//*************************************************************************************************
518
519} // namespace blaze
520
521#endif
Header file for auxiliary alias declarations.
Header file for all basic DenseMatrix functionality.
Header file for the Indices class.
Header file for the IntegralConstant class template.
Header file for the IsDenseMatrix type trait.
Constraint on the data type.
Header file for all basic SparseMatrix functionality.
Header file for the complete StrictlyLowerMatrix implementation.
Header file for the complete ZeroMatrix implementation.
Header file for the implementation of a strictly upper triangular matrix adaptor.
Header file for the implementation of a upper unitriangular matrix adaptor.
Header file for the implementation of an upper matrix adaptor.
Constraint on the data type.
Constraint on the data type.
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1339
decltype(auto) max(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise maximum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1375
decltype(auto) ceil(const DenseMatrix< MT, SO > &dm)
Applies the ceil() function to each single element of the dense matrix dm.
Definition: DMatMapExpr.h:1380
decltype(auto) generate(size_t m, size_t n, OP op)
Generates a new dense matrix filled via the given custom binary operation.
Definition: DMatGenExpr.h:675
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_MATRIX_TYPE(T)
Constraint on the data type.
Definition: DenseMatrix.h:61
#define BLAZE_CONSTRAINT_MUST_NOT_BE_RESIZABLE_TYPE(T)
Constraint on the data type.
Definition: Resizable.h:81
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_MATRIX_TYPE(T)
Constraint on the data type.
Definition: SparseMatrix.h:61
#define BLAZE_CONSTRAINT_MUST_BE_RESIZABLE_TYPE(T)
Constraint on the data type.
Definition: Resizable.h:61
void randomize(T &&value)
Randomization of a given variable.
Definition: Random.h:626
BoolConstant< true > TrueType
Type traits base class.
Definition: IntegralConstant.h:132
BoolConstant< false > FalseType
Type/value traits base class.
Definition: IntegralConstant.h:121
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
Header file for the exception macros of the math module.
Implementation of a random number generator.
Header file for basic type definitions.