OpenQMC API
Loading...
Searching...
No Matches
sobol.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright Contributors to the OpenQMC Project.
3
6
7#pragma once
8
9#include "gpu.h"
10#include "owen.h"
11#include "sampler.h"
12#include "state.h"
13#include "unused.h"
14
15#include <cstddef>
16#include <cstdint>
17
18namespace oqmc
19{
20
22class SobolImpl
23{
24 // See SamplerInterface for public API documentation.
26
27 static constexpr std::size_t cacheSize = 0;
28 static void initialiseCache(void* cache);
29
30 /*AUTO_DEFINED*/ SobolImpl() = default;
32 OQMC_HOST_DEVICE SobolImpl(int x, int y, int frame, int index,
33 const void* cache);
34
35 OQMC_HOST_DEVICE SobolImpl newDomain(int key) const;
36 OQMC_HOST_DEVICE SobolImpl newDomainSplit(int key, int size,
37 int index) const;
38 OQMC_HOST_DEVICE SobolImpl newDomainDistrib(int key, int index) const;
39
40 template <int Size>
41 OQMC_HOST_DEVICE void drawSample(std::uint32_t sample[Size]) const;
42
43 template <int Size>
44 OQMC_HOST_DEVICE void drawRnd(std::uint32_t rnd[Size]) const;
45
46 State64Bit state;
47};
48
49inline void SobolImpl::initialiseCache(void* cache)
50{
52}
53
54inline SobolImpl::SobolImpl(State64Bit state) : state(state)
55{
56}
57
58inline SobolImpl::SobolImpl(int x, int y, int frame, int index,
59 const void* cache)
60 : state(x, y, frame, index)
61{
62 OQMC_MAYBE_UNUSED(cache);
63 state = state.pixelDecorrelate();
64}
65
66inline SobolImpl SobolImpl::newDomain(int key) const
67{
68 return {state.newDomain(key)};
69}
70
71inline SobolImpl SobolImpl::newDomainSplit(int key, int size, int index) const
72{
73 return {state.newDomainSplit(key, size, index)};
74}
75
76inline SobolImpl SobolImpl::newDomainDistrib(int key, int index) const
77{
78 return {state.newDomainDistrib(key, index)};
79}
80
81template <int Size>
82void SobolImpl::drawSample(std::uint32_t sample[Size]) const
83{
84 shuffledScrambledSobol<Size>(state.sampleId, pcg::output(state.patternId),
85 sample);
86}
87
88template <int Size>
89void SobolImpl::drawRnd(std::uint32_t rnd[Size]) const
90{
91 state.drawRnd<Size>(rnd);
92}
94
112
113} // namespace oqmc
#define OQMC_HOST_DEVICE
Definition gpu.h:13
Public sampler API.
Definition sampler.h:111
EncodeKey decodeBits16(std::uint16_t value)
Decode a value back into a key.
Definition encode.h:81
Definition bntables.h:21
#define OQMC_MAYBE_UNUSED(exp)
Macro to declare a symbol unused.
Definition unused.h:11