LCOV - code coverage report
Current view: top level - analysis/processing - qgsalgorithmrandomraster.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 512 0.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                          qgsalgorithmrandomraster.cpp
       3                 :            :                          ---------------------
       4                 :            :     begin                : May 2020
       5                 :            :     copyright            : (C) 2020 by Clemens Raffler
       6                 :            :     email                : clemens dot raffler at gmail dot com
       7                 :            :  ***************************************************************************/
       8                 :            : 
       9                 :            : /***************************************************************************
      10                 :            :  *                                                                         *
      11                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      12                 :            :  *   it under the terms of the GNU General Public License as published by  *
      13                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      14                 :            :  *   (at your option) any later version.                                   *
      15                 :            :  *                                                                         *
      16                 :            :  ***************************************************************************/
      17                 :            : 
      18                 :            : #include "qgsalgorithmrandomraster.h"
      19                 :            : #include "qgsrasterfilewriter.h"
      20                 :            : #include "qgsstringutils.h"
      21                 :            : #include "random"
      22                 :            : #include "limits"
      23                 :            : 
      24                 :            : ///@cond PRIVATE
      25                 :            : 
      26                 :            : //
      27                 :            : // QgsRandomRasterAlgorithmBase
      28                 :            : //
      29                 :          0 : QString QgsRandomRasterAlgorithmBase::group() const
      30                 :            : {
      31                 :          0 :   return QObject::tr( "Raster creation" );
      32                 :            : }
      33                 :            : 
      34                 :          0 : QString QgsRandomRasterAlgorithmBase::groupId() const
      35                 :            : {
      36                 :          0 :   return QStringLiteral( "rastercreation" );
      37                 :            : }
      38                 :            : 
      39                 :          0 : void QgsRandomRasterAlgorithmBase::initAlgorithm( const QVariantMap & )
      40                 :            : {
      41                 :          0 :   addParameter( new QgsProcessingParameterExtent( QStringLiteral( "EXTENT" ), QObject::tr( "Desired extent" ) ) );
      42                 :          0 :   addParameter( new QgsProcessingParameterCrs( QStringLiteral( "TARGET_CRS" ), QObject::tr( "Target CRS" ), QStringLiteral( "ProjectCrs" ) ) );
      43                 :          0 :   addParameter( new QgsProcessingParameterNumber( QStringLiteral( "PIXEL_SIZE" ), QObject::tr( "Pixel size" ),
      44                 :          0 :                 QgsProcessingParameterNumber::Double, 1, false, 0.01 ) );
      45                 :            : 
      46                 :            :   //add specific parameters
      47                 :          0 :   addAlgorithmParams();
      48                 :            : 
      49                 :          0 :   addParameter( new QgsProcessingParameterRasterDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Output raster" ) ) );
      50                 :          0 : }
      51                 :            : 
      52                 :          0 : bool QgsRandomRasterAlgorithmBase::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
      53                 :            : {
      54                 :            :   Q_UNUSED( feedback );
      55                 :          0 :   mCrs = parameterAsCrs( parameters, QStringLiteral( "TARGET_CRS" ), context );
      56                 :          0 :   mExtent = parameterAsExtent( parameters, QStringLiteral( "EXTENT" ), context, mCrs );
      57                 :          0 :   mPixelSize = parameterAsDouble( parameters, QStringLiteral( "PIXEL_SIZE" ), context );
      58                 :            : 
      59                 :          0 :   return true;
      60                 :          0 : }
      61                 :            : 
      62                 :          0 : QVariantMap QgsRandomRasterAlgorithmBase::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
      63                 :            : {
      64                 :          0 :   int typeId = parameterAsInt( parameters, QStringLiteral( "OUTPUT_TYPE" ), context );
      65                 :            :   //prepare specific parameters
      66                 :          0 :   mRasterDataType = getRasterDataType( typeId );
      67                 :          0 :   prepareRandomParameters( parameters, context );
      68                 :            : 
      69                 :          0 :   std::random_device rd {};
      70                 :          0 :   std::mt19937 mersenneTwister{rd()};
      71                 :            : 
      72                 :          0 :   const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
      73                 :          0 :   QFileInfo fi( outputFile );
      74                 :          0 :   const QString outputFormat = QgsRasterFileWriter::driverForExtension( fi.suffix() );
      75                 :            : 
      76                 :          0 :   int rows = std::max( std::ceil( mExtent.height() / mPixelSize ), 1.0 );
      77                 :          0 :   int cols = std::max( std::ceil( mExtent.width() / mPixelSize ), 1.0 );
      78                 :            : 
      79                 :            :   //build new raster extent based on number of columns and cellsize
      80                 :            :   //this prevents output cellsize being calculated too small
      81                 :          0 :   QgsRectangle rasterExtent = QgsRectangle( mExtent.xMinimum(), mExtent.yMaximum() - ( rows * mPixelSize ), mExtent.xMinimum() + ( cols * mPixelSize ), mExtent.yMaximum() );
      82                 :            : 
      83                 :          0 :   std::unique_ptr< QgsRasterFileWriter > writer = std::make_unique< QgsRasterFileWriter >( outputFile );
      84                 :          0 :   writer->setOutputProviderKey( QStringLiteral( "gdal" ) );
      85                 :          0 :   writer->setOutputFormat( outputFormat );
      86                 :          0 :   std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( mRasterDataType, cols, rows, rasterExtent, mCrs ) );
      87                 :          0 :   if ( !provider )
      88                 :          0 :     throw QgsProcessingException( QObject::tr( "Could not create raster output: %1" ).arg( outputFile ) );
      89                 :          0 :   if ( !provider->isValid() )
      90                 :          0 :     throw QgsProcessingException( QObject::tr( "Could not create raster output %1: %2" ).arg( outputFile, provider->error().message( QgsErrorMessage::Text ) ) );
      91                 :            : 
      92                 :          0 :   double step = rows > 0 ? 100.0 / rows : 1;
      93                 :            : 
      94                 :          0 :   for ( int row = 0; row < rows ; row++ )
      95                 :            :   {
      96                 :          0 :     if ( feedback->isCanceled() )
      97                 :            :     {
      98                 :          0 :       break;
      99                 :            :     }
     100                 :            :     //prepare raw data depending on raster data type
     101                 :          0 :     QgsRasterBlock block( mRasterDataType, cols, 1 );
     102                 :          0 :     switch ( mRasterDataType )
     103                 :            :     {
     104                 :            :       case Qgis::Byte:
     105                 :            :       {
     106                 :          0 :         std::vector<quint8> byteRow( cols );
     107                 :          0 :         for ( int col = 0; col < cols; col++ )
     108                 :            :         {
     109                 :          0 :           byteRow[col] = static_cast<quint8>( generateRandomLongValue( mersenneTwister ) );
     110                 :          0 :         }
     111                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( byteRow.data() ), QgsRasterBlock::typeSize( Qgis::Byte ) * cols ) );
     112                 :            :         break;
     113                 :          0 :       }
     114                 :            :       case Qgis::Int16:
     115                 :            :       {
     116                 :          0 :         std::vector<qint16> int16Row( cols );
     117                 :          0 :         for ( int col = 0; col < cols; col++ )
     118                 :            :         {
     119                 :          0 :           int16Row[col] = static_cast<qint16>( generateRandomLongValue( mersenneTwister ) );
     120                 :          0 :         }
     121                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( int16Row.data() ), QgsRasterBlock::typeSize( Qgis::Int16 ) * cols ) );
     122                 :            :         break;
     123                 :          0 :       }
     124                 :            :       case Qgis::UInt16:
     125                 :            :       {
     126                 :          0 :         std::vector<quint16> uInt16Row( cols );
     127                 :          0 :         for ( int col = 0; col < cols; col++ )
     128                 :            :         {
     129                 :          0 :           uInt16Row[col] = static_cast<quint16>( generateRandomLongValue( mersenneTwister ) );
     130                 :          0 :         }
     131                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( uInt16Row.data() ), QgsRasterBlock::typeSize( Qgis::UInt16 ) * cols ) );
     132                 :            :         break;
     133                 :          0 :       }
     134                 :            :       case Qgis::Int32:
     135                 :            :       {
     136                 :          0 :         std::vector<qint32> int32Row( cols );
     137                 :          0 :         for ( int col = 0; col < cols; col++ )
     138                 :            :         {
     139                 :          0 :           int32Row[col] = generateRandomLongValue( mersenneTwister );
     140                 :          0 :         }
     141                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( int32Row.data() ), QgsRasterBlock::typeSize( Qgis::Int32 ) * cols ) );
     142                 :            :         break;
     143                 :          0 :       }
     144                 :            :       case Qgis::UInt32:
     145                 :            :       {
     146                 :          0 :         std::vector<quint32> uInt32Row( cols );
     147                 :          0 :         for ( int col = 0; col < cols; col++ )
     148                 :            :         {
     149                 :          0 :           uInt32Row[col] = static_cast<quint32>( generateRandomLongValue( mersenneTwister ) );
     150                 :          0 :         }
     151                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( uInt32Row.data() ), QgsRasterBlock::typeSize( Qgis::UInt32 ) * cols ) );
     152                 :            :         break;
     153                 :          0 :       }
     154                 :            :       case Qgis::Float32:
     155                 :            :       {
     156                 :          0 :         std::vector<float> float32Row( cols );
     157                 :          0 :         for ( int col = 0; col < cols; col++ )
     158                 :            :         {
     159                 :          0 :           float32Row[col] = static_cast<float>( generateRandomDoubleValue( mersenneTwister ) );
     160                 :          0 :         }
     161                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( float32Row.data() ), QgsRasterBlock::typeSize( Qgis::Float32 ) * cols ) );
     162                 :            :         break;
     163                 :          0 :       }
     164                 :            :       case Qgis::Float64:
     165                 :            :       {
     166                 :          0 :         std::vector<double> float64Row( cols );
     167                 :          0 :         for ( int col = 0; col < cols; col++ )
     168                 :            :         {
     169                 :          0 :           float64Row[col] = generateRandomDoubleValue( mersenneTwister );
     170                 :          0 :         }
     171                 :          0 :         block.setData( QByteArray( reinterpret_cast<const char *>( float64Row.data() ), QgsRasterBlock::typeSize( Qgis::Float64 ) * cols ) );
     172                 :            :         break;
     173                 :          0 :       }
     174                 :            :       default:
     175                 :          0 :         break;
     176                 :            :     }
     177                 :          0 :     provider->writeBlock( &block, 1, 0, row );
     178                 :          0 :     feedback->setProgress( row * step );
     179                 :          0 :   }
     180                 :            : 
     181                 :          0 :   QVariantMap outputs;
     182                 :          0 :   outputs.insert( QStringLiteral( "OUTPUT" ), outputFile );
     183                 :          0 :   return outputs;
     184                 :          0 : }
     185                 :            : 
     186                 :            : //
     187                 :            : //QgsRandomUniformRasterAlgorithm
     188                 :            : //
     189                 :          0 : QString QgsRandomUniformRasterAlgorithm::name() const
     190                 :            : {
     191                 :          0 :   return QStringLiteral( "createrandomuniformrasterlayer" );
     192                 :            : }
     193                 :            : 
     194                 :          0 : QString QgsRandomUniformRasterAlgorithm::displayName() const
     195                 :            : {
     196                 :          0 :   return QObject::tr( "Create random raster layer (uniform distribution)" );
     197                 :            : }
     198                 :            : 
     199                 :          0 : QStringList QgsRandomUniformRasterAlgorithm::tags() const
     200                 :            : {
     201                 :          0 :   return QObject::tr( "raster,create,random" ).split( ',' );
     202                 :          0 : }
     203                 :            : 
     204                 :          0 : QString QgsRandomUniformRasterAlgorithm::shortHelpString() const
     205                 :            : {
     206                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     207                 :            :                       "filled with random values.\n"
     208                 :            :                       "By default, the values will range between the minimum and "
     209                 :            :                       "maximum value of the specified output raster type. This can "
     210                 :            :                       "be overridden by using the advanced parameters for lower and "
     211                 :            :                       "upper bound value. If the bounds have the same value or both "
     212                 :            :                       "are zero (default) the algorithm will create random values in "
     213                 :            :                       "the full value range of the chosen raster data type. "
     214                 :            :                       "Choosing bounds outside the acceptable range of the output "
     215                 :            :                       "raster type will abort the algorithm." );
     216                 :            : }
     217                 :            : 
     218                 :          0 : QgsRandomUniformRasterAlgorithm *QgsRandomUniformRasterAlgorithm::createInstance() const
     219                 :            : {
     220                 :          0 :   return new QgsRandomUniformRasterAlgorithm();
     221                 :          0 : }
     222                 :            : 
     223                 :          0 : void QgsRandomUniformRasterAlgorithm::addAlgorithmParams()
     224                 :            : {
     225                 :          0 :   QStringList rasterDataTypes = QStringList();
     226                 :          0 :   rasterDataTypes << QStringLiteral( "Byte" )
     227                 :          0 :                   << QStringLiteral( "Integer16" )
     228                 :          0 :                   << QStringLiteral( "Unsigned Integer16" )
     229                 :          0 :                   << QStringLiteral( "Integer32" )
     230                 :          0 :                   << QStringLiteral( "Unsigned Integer32" )
     231                 :          0 :                   << QStringLiteral( "Float32" )
     232                 :          0 :                   << QStringLiteral( "Float64" );
     233                 :            : 
     234                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 5, false );
     235                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     236                 :          0 :   addParameter( rasterTypeParameter.release() );
     237                 :            : 
     238                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > lowerBoundParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "LOWER_BOUND" ), QStringLiteral( "Lower bound for random number range" ), QgsProcessingParameterNumber::Double, QVariant(), true );
     239                 :          0 :   lowerBoundParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     240                 :          0 :   addParameter( lowerBoundParameter.release() );
     241                 :            : 
     242                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > upperBoundParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "UPPER_BOUND" ), QStringLiteral( "Upper bound for random number range" ), QgsProcessingParameterNumber::Double, QVariant(), true );
     243                 :          0 :   upperBoundParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     244                 :          0 :   addParameter( upperBoundParameter.release() );
     245                 :          0 : }
     246                 :            : 
     247                 :          0 : Qgis::DataType QgsRandomUniformRasterAlgorithm::getRasterDataType( int typeId )
     248                 :            : {
     249                 :          0 :   switch ( typeId )
     250                 :            :   {
     251                 :            :     case 0:
     252                 :          0 :       return Qgis::Byte;
     253                 :            :     case 1:
     254                 :          0 :       return Qgis::Int16;
     255                 :            :     case 2:
     256                 :          0 :       return Qgis::UInt16;
     257                 :            :     case 3:
     258                 :          0 :       return Qgis::Int32;
     259                 :            :     case 4:
     260                 :          0 :       return Qgis::UInt32;
     261                 :            :     case 5:
     262                 :          0 :       return Qgis::Float32;
     263                 :            :     case 6:
     264                 :          0 :       return Qgis::Float64;
     265                 :            :     default:
     266                 :          0 :       return Qgis::Float32;
     267                 :            :   }
     268                 :          0 : }
     269                 :            : 
     270                 :          0 : bool QgsRandomUniformRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     271                 :            : {
     272                 :          0 :   mRandomUpperBound = parameterAsDouble( parameters, QStringLiteral( "UPPER_BOUND" ), context );
     273                 :          0 :   mRandomLowerBound = parameterAsDouble( parameters, QStringLiteral( "LOWER_BOUND" ), context );
     274                 :            : 
     275                 :          0 :   if ( mRandomLowerBound > mRandomUpperBound )
     276                 :          0 :     throw QgsProcessingException( QObject::tr( "The chosen lower bound for random number range is greater than the upper bound. The lower bound value must be smaller than the upper bound value." ) );
     277                 :            : 
     278                 :          0 :   int typeId = parameterAsInt( parameters, QStringLiteral( "OUTPUT_TYPE" ), context );
     279                 :          0 :   Qgis::DataType rasterDataType = getRasterDataType( typeId );
     280                 :            : 
     281                 :          0 :   switch ( rasterDataType )
     282                 :            :   {
     283                 :            :     case Qgis::Byte:
     284                 :          0 :       if ( mRandomLowerBound < std::numeric_limits<quint8>::min() || mRandomUpperBound > std::numeric_limits<quint8>::max() )
     285                 :          0 :         throw QgsProcessingException( QObject::tr( "Raster datasets of type %3 only accept positive values between %1 and %2. Please choose other bounds for random values." ).arg( std::numeric_limits<quint8>::min() ).arg( std::numeric_limits<quint8>::max() ).arg( QLatin1String( "Byte" ) ) );
     286                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     287                 :            :       {
     288                 :            :         //if parameters unset (=both are 0 or equal) --> use the whole value range
     289                 :          0 :         mRandomUpperBound = std::numeric_limits<quint8>::max();
     290                 :          0 :         mRandomLowerBound = std::numeric_limits<quint8>::min();
     291                 :          0 :       }
     292                 :          0 :       break;
     293                 :            :     case Qgis::Int16:
     294                 :          0 :       if ( mRandomLowerBound < std::numeric_limits<qint16>::min() || mRandomUpperBound > std::numeric_limits<qint16>::max() )
     295                 :          0 :         throw QgsProcessingException( QObject::tr( "Raster datasets of type %3 only accept values between %1 and %2. Please choose other bounds for random values." ).arg( std::numeric_limits<qint16>::min() ).arg( std::numeric_limits<qint16>::max() ).arg( QLatin1String( "Integer16" ) ) );
     296                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     297                 :            :       {
     298                 :          0 :         mRandomUpperBound = std::numeric_limits<qint16>::max();
     299                 :          0 :         mRandomLowerBound = std::numeric_limits<qint16>::min();
     300                 :          0 :       }
     301                 :          0 :       break;
     302                 :            :     case Qgis::UInt16:
     303                 :          0 :       if ( mRandomLowerBound < std::numeric_limits<quint16>::min() || mRandomUpperBound > std::numeric_limits<quint16>::max() )
     304                 :          0 :         throw QgsProcessingException( QObject::tr( "Raster datasets of type %3 only accept positive values between %1 and %2. Please choose other bounds for random values." ).arg( std::numeric_limits<quint16>::min() ).arg( std::numeric_limits<quint16>::max() ).arg( QLatin1String( "Unsigned Integer16" ) ) );
     305                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     306                 :            :       {
     307                 :          0 :         mRandomUpperBound = std::numeric_limits<quint16>::max();
     308                 :          0 :         mRandomLowerBound = std::numeric_limits<quint16>::min();
     309                 :          0 :       }
     310                 :          0 :       break;
     311                 :            :     case Qgis::Int32:
     312                 :          0 :       if ( mRandomLowerBound < std::numeric_limits<qint32>::min() || mRandomUpperBound > std::numeric_limits<qint32>::max() )
     313                 :          0 :         throw QgsProcessingException( QObject::tr( "Raster datasets of type %3 only accept values between %1 and %2. Please choose other bounds for random values." ).arg( std::numeric_limits<qint32>::min() ).arg( std::numeric_limits<qint32>::max() ).arg( QLatin1String( "Integer32" ) ) );
     314                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     315                 :            :       {
     316                 :          0 :         mRandomUpperBound = std::numeric_limits<qint32>::max();
     317                 :          0 :         mRandomLowerBound = std::numeric_limits<qint32>::min();
     318                 :          0 :       }
     319                 :          0 :       break;
     320                 :            :     case Qgis::UInt32:
     321                 :          0 :       if ( mRandomLowerBound < std::numeric_limits<quint32>::min() || mRandomUpperBound > std::numeric_limits<quint32>::max() )
     322                 :          0 :         throw QgsProcessingException( QObject::tr( "Raster datasets of type %3 only accept positive values between %1 and %2. Please choose other bounds for random values." ).arg( std::numeric_limits<quint32>::min() ).arg( std::numeric_limits<quint32>::max() ).arg( QLatin1String( "Unsigned Integer32" ) ) );
     323                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     324                 :            :       {
     325                 :          0 :         mRandomUpperBound = std::numeric_limits<quint32>::max();
     326                 :          0 :         mRandomLowerBound = std::numeric_limits<quint32>::min();
     327                 :          0 :       }
     328                 :          0 :       break;
     329                 :            :     case Qgis::Float32:
     330                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     331                 :            :       {
     332                 :          0 :         mRandomUpperBound = std::numeric_limits<float>::max();
     333                 :          0 :         mRandomLowerBound = std::numeric_limits<float>::min();
     334                 :          0 :       }
     335                 :          0 :       break;
     336                 :            :     case Qgis::Float64:
     337                 :          0 :       if ( ( qgsDoubleNear( mRandomLowerBound, 0.0 ) && qgsDoubleNear( mRandomUpperBound, 0.0 ) ) || qgsDoubleNear( mRandomUpperBound, mRandomLowerBound ) )
     338                 :            :       {
     339                 :          0 :         mRandomUpperBound = std::numeric_limits<double>::max();
     340                 :          0 :         mRandomLowerBound = std::numeric_limits<double>::min();
     341                 :          0 :       }
     342                 :          0 :       break;
     343                 :            :     default:
     344                 :          0 :       break;
     345                 :            :   }
     346                 :            : 
     347                 :          0 :   mRandomUniformIntDistribution = std::uniform_int_distribution<long>( mRandomLowerBound, mRandomUpperBound );
     348                 :          0 :   mRandomUniformDoubleDistribution = std::uniform_real_distribution<double>( mRandomLowerBound, mRandomUpperBound );
     349                 :            : 
     350                 :          0 :   return true;
     351                 :          0 : }
     352                 :            : 
     353                 :          0 : long QgsRandomUniformRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     354                 :            : {
     355                 :          0 :   return mRandomUniformIntDistribution( mersenneTwister );
     356                 :            : }
     357                 :            : 
     358                 :          0 : double QgsRandomUniformRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     359                 :            : {
     360                 :          0 :   return mRandomUniformDoubleDistribution( mersenneTwister );
     361                 :            : }
     362                 :            : 
     363                 :            : //
     364                 :            : // QgsRandomBinomialRasterAlgorithm
     365                 :            : //
     366                 :          0 : QString QgsRandomBinomialRasterAlgorithm::name() const
     367                 :            : {
     368                 :          0 :   return QStringLiteral( "createrandombinomialrasterlayer" );
     369                 :            : }
     370                 :            : 
     371                 :          0 : QString QgsRandomBinomialRasterAlgorithm::displayName() const
     372                 :            : {
     373                 :          0 :   return QObject::tr( "Create random raster layer (binomial distribution)" );
     374                 :            : }
     375                 :            : 
     376                 :          0 : QStringList QgsRandomBinomialRasterAlgorithm::tags() const
     377                 :            : {
     378                 :          0 :   return QObject::tr( "raster,create,binomial,random" ).split( ',' );
     379                 :          0 : }
     380                 :            : 
     381                 :          0 : QString QgsRandomBinomialRasterAlgorithm::shortHelpString() const
     382                 :            : {
     383                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     384                 :            :                       "filled with binomially distributed random values.\n"
     385                 :            :                       "By default, the values will be chosen given an N of 10 and a probability of 0.5. "
     386                 :            :                       "This can be overridden by using the advanced parameter for N and probability. "
     387                 :            :                       "The raster data type is set to Integer types (Integer16 by default). "
     388                 :            :                       "The binomial distribution random values are defined as positive integer numbers. "
     389                 :            :                       "A floating point raster will represent a cast of integer values "
     390                 :            :                       "to floating point." );
     391                 :            : }
     392                 :            : 
     393                 :          0 : QgsRandomBinomialRasterAlgorithm *QgsRandomBinomialRasterAlgorithm::createInstance() const
     394                 :            : {
     395                 :          0 :   return new QgsRandomBinomialRasterAlgorithm();
     396                 :          0 : }
     397                 :            : 
     398                 :            : 
     399                 :          0 : void QgsRandomBinomialRasterAlgorithm::addAlgorithmParams( )
     400                 :            : {
     401                 :          0 :   QStringList rasterDataTypes = QStringList();
     402                 :          0 :   rasterDataTypes << QStringLiteral( "Integer16" )
     403                 :          0 :                   << QStringLiteral( "Unsigned Integer16" )
     404                 :          0 :                   << QStringLiteral( "Integer32" )
     405                 :          0 :                   << QStringLiteral( "Unsigned Integer32" )
     406                 :          0 :                   << QStringLiteral( "Float32" )
     407                 :          0 :                   << QStringLiteral( "Float64" );
     408                 :            : 
     409                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     410                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     411                 :          0 :   addParameter( rasterTypeParameter.release() );
     412                 :            : 
     413                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > nParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "N" ), QStringLiteral( "N" ), QgsProcessingParameterNumber::Integer, 10, true, 0 );
     414                 :          0 :   nParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     415                 :          0 :   addParameter( nParameter.release() );
     416                 :            : 
     417                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > probabilityParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "PROBABILITY" ), QStringLiteral( "Probability" ), QgsProcessingParameterNumber::Double, 0.5, true, 0 );
     418                 :          0 :   probabilityParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     419                 :          0 :   addParameter( probabilityParameter.release() );
     420                 :          0 : }
     421                 :            : 
     422                 :          0 : Qgis::DataType QgsRandomBinomialRasterAlgorithm::getRasterDataType( int typeId )
     423                 :            : {
     424                 :          0 :   switch ( typeId )
     425                 :            :   {
     426                 :            :     case 0:
     427                 :          0 :       return Qgis::Int16;
     428                 :            :     case 1:
     429                 :          0 :       return Qgis::UInt16;
     430                 :            :     case 2:
     431                 :          0 :       return Qgis::Int32;
     432                 :            :     case 3:
     433                 :          0 :       return Qgis::UInt32;
     434                 :            :     case 4:
     435                 :          0 :       return Qgis::Float32;
     436                 :            :     case 5:
     437                 :          0 :       return Qgis::Float64;
     438                 :            :     default:
     439                 :          0 :       return Qgis::Float32;
     440                 :            :   }
     441                 :          0 : }
     442                 :            : 
     443                 :          0 : bool QgsRandomBinomialRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     444                 :            : {
     445                 :          0 :   int n = parameterAsInt( parameters, QStringLiteral( "N" ), context );
     446                 :          0 :   double probability = parameterAsDouble( parameters, QStringLiteral( "PROBABILITY" ), context );
     447                 :          0 :   mRandombinomialDistribution = std::binomial_distribution<long>( n, probability );
     448                 :          0 :   return true;
     449                 :          0 : }
     450                 :            : 
     451                 :          0 : long QgsRandomBinomialRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     452                 :            : {
     453                 :          0 :   return mRandombinomialDistribution( mersenneTwister );
     454                 :            : }
     455                 :            : 
     456                 :          0 : double QgsRandomBinomialRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     457                 :            : {
     458                 :          0 :   return static_cast<double>( mRandombinomialDistribution( mersenneTwister ) );
     459                 :            : }
     460                 :            : 
     461                 :            : //
     462                 :            : // QgsRandomExponentialRasterAlgorithm
     463                 :            : //
     464                 :          0 : QString QgsRandomExponentialRasterAlgorithm::name() const
     465                 :            : {
     466                 :          0 :   return QStringLiteral( "createrandomexponentialrasterlayer" );
     467                 :            : }
     468                 :            : 
     469                 :          0 : QString QgsRandomExponentialRasterAlgorithm::displayName() const
     470                 :            : {
     471                 :          0 :   return QObject::tr( "Create random raster layer (exponential distribution)" );
     472                 :            : }
     473                 :            : 
     474                 :          0 : QStringList QgsRandomExponentialRasterAlgorithm::tags() const
     475                 :            : {
     476                 :          0 :   return QObject::tr( "raster,create,random,exponential" ).split( ',' );
     477                 :          0 : }
     478                 :            : 
     479                 :          0 : QString QgsRandomExponentialRasterAlgorithm::shortHelpString() const
     480                 :            : {
     481                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     482                 :            :                       "filled with exponentially distributed random values.\n"
     483                 :            :                       "By default, the values will be chosen given a lambda of 1.0. "
     484                 :            :                       "This can be overridden by using the advanced parameter for lambda. "
     485                 :            :                       "The raster data type is set to Float32 by default as "
     486                 :            :                       "the exponential distribution random values are floating point numbers." );
     487                 :            : }
     488                 :            : 
     489                 :          0 : QgsRandomExponentialRasterAlgorithm *QgsRandomExponentialRasterAlgorithm::createInstance() const
     490                 :            : {
     491                 :          0 :   return new QgsRandomExponentialRasterAlgorithm();
     492                 :          0 : }
     493                 :            : 
     494                 :            : 
     495                 :          0 : void QgsRandomExponentialRasterAlgorithm::addAlgorithmParams()
     496                 :            : {
     497                 :          0 :   QStringList rasterDataTypes = QStringList();
     498                 :          0 :   rasterDataTypes << QStringLiteral( "Float32" )
     499                 :          0 :                   << QStringLiteral( "Float64" );
     500                 :            : 
     501                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     502                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     503                 :          0 :   addParameter( rasterTypeParameter.release() );
     504                 :            : 
     505                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > lambdaParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "LAMBDA" ), QStringLiteral( "Lambda" ), QgsProcessingParameterNumber::Double, 1.0, true, 0.000001 );
     506                 :          0 :   lambdaParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     507                 :          0 :   addParameter( lambdaParameter.release() );
     508                 :          0 : }
     509                 :            : 
     510                 :          0 : Qgis::DataType QgsRandomExponentialRasterAlgorithm::getRasterDataType( int typeId )
     511                 :            : {
     512                 :          0 :   switch ( typeId )
     513                 :            :   {
     514                 :            :     case 0:
     515                 :          0 :       return Qgis::Float32;
     516                 :            :     case 1:
     517                 :          0 :       return Qgis::Float64;
     518                 :            :     default:
     519                 :          0 :       return Qgis::Float32;
     520                 :            :   }
     521                 :          0 : }
     522                 :            : 
     523                 :          0 : bool QgsRandomExponentialRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     524                 :            : {
     525                 :          0 :   double lambda = parameterAsDouble( parameters, QStringLiteral( "LAMBDA" ), context );
     526                 :          0 :   mRandomExponentialDistribution = std::exponential_distribution<double>( lambda );
     527                 :          0 :   return true;
     528                 :          0 : }
     529                 :            : 
     530                 :          0 : long QgsRandomExponentialRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     531                 :            : {
     532                 :          0 :   return static_cast<long>( mRandomExponentialDistribution( mersenneTwister ) );
     533                 :            : }
     534                 :            : 
     535                 :          0 : double QgsRandomExponentialRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     536                 :            : {
     537                 :          0 :   return mRandomExponentialDistribution( mersenneTwister );
     538                 :            : }
     539                 :            : 
     540                 :            : //
     541                 :            : // QgsRandomGammaRasterAlgorithm
     542                 :            : //
     543                 :          0 : QString QgsRandomGammaRasterAlgorithm::name() const
     544                 :            : {
     545                 :          0 :   return QStringLiteral( "createrandomgammarasterlayer" );
     546                 :            : }
     547                 :            : 
     548                 :          0 : QString QgsRandomGammaRasterAlgorithm::displayName() const
     549                 :            : {
     550                 :          0 :   return QObject::tr( "Create random raster layer (gamma distribution)" );
     551                 :            : }
     552                 :            : 
     553                 :          0 : QStringList QgsRandomGammaRasterAlgorithm::tags() const
     554                 :            : {
     555                 :          0 :   return QObject::tr( "raster,create,random,gamma" ).split( ',' );
     556                 :          0 : }
     557                 :            : 
     558                 :          0 : QString QgsRandomGammaRasterAlgorithm::shortHelpString() const
     559                 :            : {
     560                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     561                 :            :                       "filled with gamma distributed random values.\n"
     562                 :            :                       "By default, the values will be chosen given an alpha and beta value of 1.0. "
     563                 :            :                       "This can be overridden by using the advanced parameter for alpha and beta. "
     564                 :            :                       "The raster data type is set to Float32 by default as "
     565                 :            :                       "the gamma distribution random values are floating point numbers." );
     566                 :            : }
     567                 :            : 
     568                 :          0 : QgsRandomGammaRasterAlgorithm *QgsRandomGammaRasterAlgorithm::createInstance() const
     569                 :            : {
     570                 :          0 :   return new QgsRandomGammaRasterAlgorithm();
     571                 :          0 : }
     572                 :            : 
     573                 :            : 
     574                 :          0 : void QgsRandomGammaRasterAlgorithm::addAlgorithmParams()
     575                 :            : {
     576                 :          0 :   QStringList rasterDataTypes = QStringList();
     577                 :          0 :   rasterDataTypes << QStringLiteral( "Float32" )
     578                 :          0 :                   << QStringLiteral( "Float64" );
     579                 :            : 
     580                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     581                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     582                 :          0 :   addParameter( rasterTypeParameter.release() );
     583                 :            : 
     584                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > alphaParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "ALPHA" ), QStringLiteral( "Alpha" ), QgsProcessingParameterNumber::Double, 1.0, true, 0.000001 );
     585                 :          0 :   alphaParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     586                 :          0 :   addParameter( alphaParameter.release() );
     587                 :            : 
     588                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > betaParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "BETA" ), QStringLiteral( "Beta" ), QgsProcessingParameterNumber::Double, 1.0, true, 0.000001 );
     589                 :          0 :   betaParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     590                 :          0 :   addParameter( betaParameter.release() );
     591                 :          0 : }
     592                 :            : 
     593                 :          0 : Qgis::DataType QgsRandomGammaRasterAlgorithm::getRasterDataType( int typeId )
     594                 :            : {
     595                 :          0 :   switch ( typeId )
     596                 :            :   {
     597                 :            :     case 0:
     598                 :          0 :       return Qgis::Float32;
     599                 :            :     case 1:
     600                 :          0 :       return Qgis::Float64;
     601                 :            :     default:
     602                 :          0 :       return Qgis::Float32;
     603                 :            :   }
     604                 :          0 : }
     605                 :            : 
     606                 :          0 : bool QgsRandomGammaRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     607                 :            : {
     608                 :          0 :   double alpha = parameterAsDouble( parameters, QStringLiteral( "ALPHA" ), context );
     609                 :          0 :   double beta = parameterAsDouble( parameters, QStringLiteral( "BETA" ), context );
     610                 :          0 :   mRandomGammaDistribution = std::gamma_distribution<double>( alpha, beta );
     611                 :          0 :   return true;
     612                 :          0 : }
     613                 :            : 
     614                 :          0 : long QgsRandomGammaRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     615                 :            : {
     616                 :          0 :   return static_cast<long>( mRandomGammaDistribution( mersenneTwister ) );
     617                 :            : }
     618                 :            : 
     619                 :          0 : double QgsRandomGammaRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     620                 :            : {
     621                 :          0 :   return mRandomGammaDistribution( mersenneTwister );
     622                 :            : }
     623                 :            : 
     624                 :            : //
     625                 :            : // QgsRandomGeometricRasterAlgorithm
     626                 :            : //
     627                 :          0 : QString QgsRandomGeometricRasterAlgorithm::name() const
     628                 :            : {
     629                 :          0 :   return QStringLiteral( "createrandomgeometricrasterlayer" );
     630                 :            : }
     631                 :            : 
     632                 :          0 : QString QgsRandomGeometricRasterAlgorithm::displayName() const
     633                 :            : {
     634                 :          0 :   return QObject::tr( "Create random raster layer (geometric distribution)" );
     635                 :            : }
     636                 :            : 
     637                 :          0 : QStringList QgsRandomGeometricRasterAlgorithm::tags() const
     638                 :            : {
     639                 :          0 :   return QObject::tr( "raster,create,random,geometric" ).split( ',' );
     640                 :          0 : }
     641                 :            : 
     642                 :          0 : QString QgsRandomGeometricRasterAlgorithm::shortHelpString() const
     643                 :            : {
     644                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     645                 :            :                       "filled with geometrically distributed random values.\n"
     646                 :            :                       "By default, the values will be chosen given a probability of 0.5. "
     647                 :            :                       "This can be overridden by using the advanced parameter for mean "
     648                 :            :                       "value. The raster data type is set to Integer types (Integer16 by default). "
     649                 :            :                       "The geometric distribution random values are defined as positive integer numbers. "
     650                 :            :                       "A floating point raster will represent a cast of "
     651                 :            :                       "integer values to floating point." );
     652                 :            : }
     653                 :            : 
     654                 :          0 : QgsRandomGeometricRasterAlgorithm *QgsRandomGeometricRasterAlgorithm::createInstance() const
     655                 :            : {
     656                 :          0 :   return new QgsRandomGeometricRasterAlgorithm();
     657                 :          0 : }
     658                 :            : 
     659                 :            : 
     660                 :          0 : void QgsRandomGeometricRasterAlgorithm::addAlgorithmParams()
     661                 :            : {
     662                 :          0 :   QStringList rasterDataTypes = QStringList();
     663                 :          0 :   rasterDataTypes << QStringLiteral( "Integer16" )
     664                 :          0 :                   << QStringLiteral( "Unsigned Integer16" )
     665                 :          0 :                   << QStringLiteral( "Integer32" )
     666                 :          0 :                   << QStringLiteral( "Unsigned Integer32" )
     667                 :          0 :                   << QStringLiteral( "Float32" )
     668                 :          0 :                   << QStringLiteral( "Float64" );
     669                 :            : 
     670                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     671                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     672                 :          0 :   addParameter( rasterTypeParameter.release() );
     673                 :            : 
     674                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > probabilityParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "PROBABILITY" ), QStringLiteral( "Probability" ), QgsProcessingParameterNumber::Double, 0.5, true, 0.00001 );
     675                 :          0 :   probabilityParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     676                 :          0 :   addParameter( probabilityParameter.release() );
     677                 :          0 : }
     678                 :            : 
     679                 :          0 : Qgis::DataType QgsRandomGeometricRasterAlgorithm::getRasterDataType( int typeId )
     680                 :            : {
     681                 :          0 :   switch ( typeId )
     682                 :            :   {
     683                 :            :     case 0:
     684                 :          0 :       return Qgis::Int16;
     685                 :            :     case 1:
     686                 :          0 :       return Qgis::UInt16;
     687                 :            :     case 2:
     688                 :          0 :       return Qgis::Int32;
     689                 :            :     case 3:
     690                 :          0 :       return Qgis::UInt32;
     691                 :            :     case 4:
     692                 :          0 :       return Qgis::Float32;
     693                 :            :     case 5:
     694                 :          0 :       return Qgis::Float64;
     695                 :            :     default:
     696                 :          0 :       return Qgis::Float32;
     697                 :            :   }
     698                 :          0 : }
     699                 :            : 
     700                 :          0 : bool QgsRandomGeometricRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     701                 :            : {
     702                 :          0 :   double probability = parameterAsDouble( parameters, QStringLiteral( "PROBABILITY" ), context );
     703                 :          0 :   mRandomGeometricDistribution = std::geometric_distribution<long>( probability );
     704                 :          0 :   return true;
     705                 :          0 : }
     706                 :            : 
     707                 :          0 : long QgsRandomGeometricRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     708                 :            : {
     709                 :          0 :   return mRandomGeometricDistribution( mersenneTwister );
     710                 :            : }
     711                 :            : 
     712                 :          0 : double QgsRandomGeometricRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     713                 :            : {
     714                 :          0 :   return static_cast<double>( mRandomGeometricDistribution( mersenneTwister ) );
     715                 :            : }
     716                 :            : 
     717                 :            : //
     718                 :            : // QgsRandomNegativeBinomialRasterAlgorithm
     719                 :            : //
     720                 :          0 : QString QgsRandomNegativeBinomialRasterAlgorithm::name() const
     721                 :            : {
     722                 :          0 :   return QStringLiteral( "createrandomnegativebinomialrasterlayer" );
     723                 :            : }
     724                 :            : 
     725                 :          0 : QString QgsRandomNegativeBinomialRasterAlgorithm::displayName() const
     726                 :            : {
     727                 :          0 :   return QObject::tr( "Create random raster layer (negative binomial distribution)" );
     728                 :            : }
     729                 :            : 
     730                 :          0 : QStringList QgsRandomNegativeBinomialRasterAlgorithm::tags() const
     731                 :            : {
     732                 :          0 :   return QObject::tr( "raster,create,random,negative,binomial,negative-binomial" ).split( ',' );
     733                 :          0 : }
     734                 :            : 
     735                 :          0 : QString QgsRandomNegativeBinomialRasterAlgorithm::shortHelpString() const
     736                 :            : {
     737                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     738                 :            :                       "filled with negative binomially distributed random values.\n"
     739                 :            :                       "By default, the values will be chosen given a distribution parameter k of 10.0 "
     740                 :            :                       "and a probability of 0.5. "
     741                 :            :                       "This can be overridden by using the advanced parameters for k and probability. "
     742                 :            :                       "The raster data type is set to Integer types (Integer 16 by default). "
     743                 :            :                       "The negative binomial distribution random values are defined as positive integer numbers. "
     744                 :            :                       "A floating point raster will represent a cast of "
     745                 :            :                       "integer values to floating point." );
     746                 :            : }
     747                 :            : 
     748                 :          0 : QgsRandomNegativeBinomialRasterAlgorithm *QgsRandomNegativeBinomialRasterAlgorithm::createInstance() const
     749                 :            : {
     750                 :          0 :   return new QgsRandomNegativeBinomialRasterAlgorithm();
     751                 :          0 : }
     752                 :            : 
     753                 :            : 
     754                 :          0 : void QgsRandomNegativeBinomialRasterAlgorithm::addAlgorithmParams( )
     755                 :            : {
     756                 :          0 :   QStringList rasterDataTypes = QStringList();
     757                 :          0 :   rasterDataTypes << QStringLiteral( "Integer16" )
     758                 :          0 :                   << QStringLiteral( "Unsigned Integer16" )
     759                 :          0 :                   << QStringLiteral( "Integer32" )
     760                 :          0 :                   << QStringLiteral( "Unsigned Integer32" )
     761                 :          0 :                   << QStringLiteral( "Float32" )
     762                 :          0 :                   << QStringLiteral( "Float64" );
     763                 :            : 
     764                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     765                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     766                 :          0 :   addParameter( rasterTypeParameter.release() );
     767                 :            : 
     768                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > kParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "K_PARAMETER" ), QStringLiteral( "Distribution parameter k" ), QgsProcessingParameterNumber::Integer, 10, true, 0.00001 );
     769                 :          0 :   kParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     770                 :          0 :   addParameter( kParameter.release() );
     771                 :            : 
     772                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > probabilityParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "PROBABILITY" ), QStringLiteral( "Probability" ), QgsProcessingParameterNumber::Double, 0.5, true, 0.00001 );
     773                 :          0 :   probabilityParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     774                 :          0 :   addParameter( probabilityParameter.release() );
     775                 :          0 : }
     776                 :            : 
     777                 :          0 : Qgis::DataType QgsRandomNegativeBinomialRasterAlgorithm::getRasterDataType( int typeId )
     778                 :            : {
     779                 :          0 :   switch ( typeId )
     780                 :            :   {
     781                 :            :     case 0:
     782                 :          0 :       return Qgis::Int16;
     783                 :            :     case 1:
     784                 :          0 :       return Qgis::UInt16;
     785                 :            :     case 2:
     786                 :          0 :       return Qgis::Int32;
     787                 :            :     case 3:
     788                 :          0 :       return Qgis::UInt32;
     789                 :            :     case 4:
     790                 :          0 :       return Qgis::Float32;
     791                 :            :     case 5:
     792                 :          0 :       return Qgis::Float64;
     793                 :            :     default:
     794                 :          0 :       return Qgis::Float32;
     795                 :            :   }
     796                 :          0 : }
     797                 :            : 
     798                 :          0 : bool QgsRandomNegativeBinomialRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     799                 :            : {
     800                 :          0 :   int k = parameterAsInt( parameters, QStringLiteral( "K_PARAMETER" ), context );
     801                 :          0 :   double probability = parameterAsDouble( parameters, QStringLiteral( "PROBABILITY" ), context );
     802                 :          0 :   mRandomNegativeBinomialDistribution = std::negative_binomial_distribution<long>( k, probability );
     803                 :          0 :   return true;
     804                 :          0 : }
     805                 :            : 
     806                 :          0 : long QgsRandomNegativeBinomialRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     807                 :            : {
     808                 :          0 :   return mRandomNegativeBinomialDistribution( mersenneTwister );
     809                 :            : }
     810                 :            : 
     811                 :          0 : double QgsRandomNegativeBinomialRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     812                 :            : {
     813                 :          0 :   return static_cast<double>( mRandomNegativeBinomialDistribution( mersenneTwister ) );
     814                 :            : }
     815                 :            : 
     816                 :            : //
     817                 :            : // QgsRandomNormalRasterAlgorithm
     818                 :            : //
     819                 :          0 : QString QgsRandomNormalRasterAlgorithm::name() const
     820                 :            : {
     821                 :          0 :   return QStringLiteral( "createrandomnormalrasterlayer" );
     822                 :            : }
     823                 :            : 
     824                 :          0 : QString QgsRandomNormalRasterAlgorithm::displayName() const
     825                 :            : {
     826                 :          0 :   return QObject::tr( "Create random raster layer (normal distribution)" );
     827                 :            : }
     828                 :            : 
     829                 :          0 : QStringList QgsRandomNormalRasterAlgorithm::tags() const
     830                 :            : {
     831                 :          0 :   return QObject::tr( "raster,create,normal,distribution,random" ).split( ',' );
     832                 :          0 : }
     833                 :            : 
     834                 :          0 : QString QgsRandomNormalRasterAlgorithm::shortHelpString() const
     835                 :            : {
     836                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     837                 :            :                       "filled with normally distributed random values.\n"
     838                 :            :                       "By default, the values will be chosen given a mean of 0.0 and "
     839                 :            :                       "a standard deviation of 1.0. This can be overridden by "
     840                 :            :                       "using the advanced parameters for mean and standard deviation "
     841                 :            :                       "value. The raster data type is set to Float32 by default "
     842                 :            :                       "as the normal distribution random values are floating point numbers." );
     843                 :            : }
     844                 :            : 
     845                 :          0 : QgsRandomNormalRasterAlgorithm *QgsRandomNormalRasterAlgorithm::createInstance() const
     846                 :            : {
     847                 :          0 :   return new QgsRandomNormalRasterAlgorithm();
     848                 :          0 : }
     849                 :            : 
     850                 :          0 : void QgsRandomNormalRasterAlgorithm::addAlgorithmParams()
     851                 :            : {
     852                 :          0 :   QStringList rasterDataTypes = QStringList();
     853                 :          0 :   rasterDataTypes << QStringLiteral( "Float32" )
     854                 :          0 :                   << QStringLiteral( "Float64" );
     855                 :            : 
     856                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     857                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     858                 :          0 :   addParameter( rasterTypeParameter.release() );
     859                 :            : 
     860                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > meanParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "MEAN" ), QStringLiteral( "Mean of normal distribution" ), QgsProcessingParameterNumber::Double, 0, true );
     861                 :          0 :   meanParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     862                 :          0 :   addParameter( meanParameter.release() );
     863                 :            : 
     864                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > stdevParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "STDDEV" ), QStringLiteral( "Standard deviation of normal distribution" ), QgsProcessingParameterNumber::Double, 1, true, 0 );
     865                 :          0 :   stdevParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     866                 :          0 :   addParameter( stdevParameter.release() );
     867                 :          0 : }
     868                 :            : 
     869                 :          0 : Qgis::DataType QgsRandomNormalRasterAlgorithm::getRasterDataType( int typeId )
     870                 :            : {
     871                 :          0 :   switch ( typeId )
     872                 :            :   {
     873                 :            :     case 0:
     874                 :          0 :       return Qgis::Float32;
     875                 :            :     case 1:
     876                 :          0 :       return Qgis::Float64;
     877                 :            :     default:
     878                 :          0 :       return Qgis::Float32;
     879                 :            :   }
     880                 :          0 : }
     881                 :            : 
     882                 :          0 : bool QgsRandomNormalRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     883                 :            : {
     884                 :          0 :   double mean = parameterAsDouble( parameters, QStringLiteral( "MEAN" ), context );
     885                 :          0 :   double stddev = parameterAsDouble( parameters, QStringLiteral( "STDDEV" ), context );
     886                 :          0 :   mRandomNormalDistribution = std::normal_distribution<double>( mean, stddev );
     887                 :          0 :   return true;
     888                 :          0 : }
     889                 :            : 
     890                 :          0 : long QgsRandomNormalRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     891                 :            : {
     892                 :          0 :   return static_cast<long>( mRandomNormalDistribution( mersenneTwister ) );
     893                 :            : }
     894                 :            : 
     895                 :          0 : double QgsRandomNormalRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     896                 :            : {
     897                 :          0 :   return mRandomNormalDistribution( mersenneTwister );
     898                 :            : }
     899                 :            : 
     900                 :            : //
     901                 :            : // QgsRandomPoissonRasterAlgorithm
     902                 :            : //
     903                 :          0 : QString QgsRandomPoissonRasterAlgorithm::name() const
     904                 :            : {
     905                 :          0 :   return QStringLiteral( "createrandompoissonrasterlayer" );
     906                 :            : }
     907                 :            : 
     908                 :          0 : QString QgsRandomPoissonRasterAlgorithm::displayName() const
     909                 :            : {
     910                 :          0 :   return QObject::tr( "Create random raster layer (poisson distribution)" );
     911                 :            : }
     912                 :            : 
     913                 :          0 : QStringList QgsRandomPoissonRasterAlgorithm::tags() const
     914                 :            : {
     915                 :          0 :   return QObject::tr( "raster,create,random,poisson" ).split( ',' );
     916                 :          0 : }
     917                 :            : 
     918                 :          0 : QString QgsRandomPoissonRasterAlgorithm::shortHelpString() const
     919                 :            : {
     920                 :          0 :   return QObject::tr( "Generates a raster layer for given extent and cell size "
     921                 :            :                       "filled with poisson distributed random values.\n"
     922                 :            :                       "By default, the values will be chosen given a mean of 1.0. "
     923                 :            :                       "This can be overridden by using the advanced parameter for mean "
     924                 :            :                       "value. The raster data type is set to Integer types (Integer16 by default). "
     925                 :            :                       "The poisson distribution random values are positive integer numbers. "
     926                 :            :                       "A floating point raster will represent a cast of integer values to floating point." );
     927                 :            : }
     928                 :            : 
     929                 :          0 : QgsRandomPoissonRasterAlgorithm *QgsRandomPoissonRasterAlgorithm::createInstance() const
     930                 :            : {
     931                 :          0 :   return new QgsRandomPoissonRasterAlgorithm();
     932                 :          0 : }
     933                 :            : 
     934                 :            : 
     935                 :          0 : void QgsRandomPoissonRasterAlgorithm::addAlgorithmParams()
     936                 :            : {
     937                 :          0 :   QStringList rasterDataTypes = QStringList();
     938                 :          0 :   rasterDataTypes << QStringLiteral( "Integer16" )
     939                 :          0 :                   << QStringLiteral( "Unsigned Integer16" )
     940                 :          0 :                   << QStringLiteral( "Integer32" )
     941                 :          0 :                   << QStringLiteral( "Unsigned Integer32" )
     942                 :          0 :                   << QStringLiteral( "Float32" )
     943                 :          0 :                   << QStringLiteral( "Float64" );
     944                 :            : 
     945                 :          0 :   std::unique_ptr< QgsProcessingParameterDefinition > rasterTypeParameter = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral( "OUTPUT_TYPE" ), QObject::tr( "Output raster data type" ),  rasterDataTypes, false, 0, false );
     946                 :          0 :   rasterTypeParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     947                 :          0 :   addParameter( rasterTypeParameter.release() );
     948                 :            : 
     949                 :          0 :   std::unique_ptr< QgsProcessingParameterNumber > upperBoundParameter = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "MEAN" ), QStringLiteral( "Mean" ), QgsProcessingParameterNumber::Double, 1.0, true, 0 );
     950                 :          0 :   upperBoundParameter->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
     951                 :          0 :   addParameter( upperBoundParameter.release() );
     952                 :          0 : }
     953                 :            : 
     954                 :          0 : Qgis::DataType QgsRandomPoissonRasterAlgorithm::getRasterDataType( int typeId )
     955                 :            : {
     956                 :          0 :   switch ( typeId )
     957                 :            :   {
     958                 :            :     case 0:
     959                 :          0 :       return Qgis::Int16;
     960                 :            :     case 1:
     961                 :          0 :       return Qgis::UInt16;
     962                 :            :     case 2:
     963                 :          0 :       return Qgis::Int32;
     964                 :            :     case 3:
     965                 :          0 :       return Qgis::UInt32;
     966                 :            :     case 4:
     967                 :          0 :       return Qgis::Float32;
     968                 :            :     case 5:
     969                 :          0 :       return Qgis::Float64;
     970                 :            :     default:
     971                 :          0 :       return Qgis::Float32;
     972                 :            :   }
     973                 :          0 : }
     974                 :            : 
     975                 :          0 : bool QgsRandomPoissonRasterAlgorithm::prepareRandomParameters( const QVariantMap &parameters, QgsProcessingContext &context )
     976                 :            : {
     977                 :          0 :   double mean = parameterAsDouble( parameters, QStringLiteral( "MEAN" ), context );
     978                 :          0 :   mRandomPoissonDistribution = std::poisson_distribution<long>( mean );
     979                 :          0 :   return true;
     980                 :          0 : }
     981                 :            : 
     982                 :          0 : long QgsRandomPoissonRasterAlgorithm::generateRandomLongValue( std::mt19937 &mersenneTwister )
     983                 :            : {
     984                 :          0 :   return mRandomPoissonDistribution( mersenneTwister );
     985                 :            : }
     986                 :            : 
     987                 :          0 : double QgsRandomPoissonRasterAlgorithm::generateRandomDoubleValue( std::mt19937 &mersenneTwister )
     988                 :            : {
     989                 :          0 :   return static_cast<double>( mRandomPoissonDistribution( mersenneTwister ) );
     990                 :            : }
     991                 :            : 
     992                 :            : ///@endcond

Generated by: LCOV version 1.14