
.. _program_listing_file_library_include_rocrand_rocrand_scrambled_sobol64.h:

Program Listing for File rocrand_scrambled_sobol64.h
====================================================

|exhale_lsh| :ref:`Return to documentation for file <file_library_include_rocrand_rocrand_scrambled_sobol64.h>` (``library/include/rocrand/rocrand_scrambled_sobol64.h``)

.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS

.. code-block:: cpp

   // Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
   //
   // Permission is hereby granted, free of charge, to any person obtaining a copy
   // of this software and associated documentation files (the "Software"), to deal
   // in the Software without restriction, including without limitation the rights
   // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   // copies of the Software, and to permit persons to whom the Software is
   // furnished to do so, subject to the following conditions:
   //
   // The above copyright notice and this permission notice shall be included in
   // all copies or substantial portions of the Software.
   //
   // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
   // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   // THE SOFTWARE.
   
   #ifndef ROCRAND_SCRAMBLED_SOBOL64_H_
   #define ROCRAND_SCRAMBLED_SOBOL64_H_
   
   #ifndef FQUALIFIERS
       #define FQUALIFIERS __forceinline__ __device__
   #endif // FQUALIFIERS_
   
   #include "rocrand/rocrand_common.h"
   #include "rocrand/rocrand_sobol64.h"
   
   namespace rocrand_device
   {
   
   template<bool UseSharedVectors>
   class scrambled_sobol64_engine
   {
   public:
       FQUALIFIERS
       scrambled_sobol64_engine() {}
   
       FQUALIFIERS
       scrambled_sobol64_engine(const unsigned long long int* vectors,
                                const unsigned long long int  scramble_constant,
                                const unsigned int            offset)
           : m_engine(vectors, 0), scramble_constant(scramble_constant)
       {
           discard(offset);
       }
   
       FQUALIFIERS
       void discard(unsigned long long int offset)
       {
           m_engine.discard(offset);
       }
   
       FQUALIFIERS
       void discard()
       {
           m_engine.discard();
       }
   
       FQUALIFIERS
       void discard_stride(unsigned long long int stride)
       {
           m_engine.discard_stride(stride);
       }
   
       FQUALIFIERS
       unsigned long long int operator()()
       {
           return this->next();
       }
   
       FQUALIFIERS
       unsigned long long int next()
       {
           unsigned long long int p = m_engine.next();
           return p ^ scramble_constant;
       }
   
       FQUALIFIERS
       unsigned long long int current()
       {
           unsigned long long int p = m_engine.current();
           return p ^ scramble_constant;
       }
   
   protected:
       // Underlying sobol64 engine
       sobol64_engine<UseSharedVectors> m_engine;
       // scrambling constant
       unsigned long long int scramble_constant;
   
   }; // scrambled_sobol64_engine class
   
   } // end namespace rocrand_device
   
   typedef rocrand_device::scrambled_sobol64_engine<false> rocrand_state_scrambled_sobol64;
   
   FQUALIFIERS
   void rocrand_init(const unsigned long long int*    vectors,
                     const unsigned long long int     scramble_constant,
                     const unsigned int               offset,
                     rocrand_state_scrambled_sobol64* state)
   {
       *state = rocrand_state_scrambled_sobol64(vectors, scramble_constant, offset);
   }
   
   FQUALIFIERS
   unsigned long long int rocrand(rocrand_state_scrambled_sobol64* state)
   {
       return state->next();
   }
   
   FQUALIFIERS
   void skipahead(unsigned long long offset, rocrand_state_scrambled_sobol64* state)
   {
       return state->discard(offset);
   }
   
    // end of group rocranddevice
   #endif // ROCRAND_SCRAMBLED_SOBOL64_H_
