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
14#include <cstddef>
15#include <cstdint>
16
17namespace oqmc
18{
19
21class SobolImpl
22{
23 // See SamplerInterface for public API documentation.
25
26 static constexpr std::size_t cacheSize = 0;
27 static void initialiseCache(void* cache);
28
29 /*AUTO_DEFINED*/ SobolImpl() = default;
30 OQMC_HOST_DEVICE SobolImpl(State64Bit state);
31 OQMC_HOST_DEVICE SobolImpl(int x, int y, int frame, int index,
32 const void* cache);
33
34 OQMC_HOST_DEVICE SobolImpl newDomain(int key) const;
35 OQMC_HOST_DEVICE SobolImpl newDomainSplit(int key, int size,
36 int index) const;
37 OQMC_HOST_DEVICE SobolImpl newDomainDistrib(int key, int index) const;
38
39 template <int Size>
40 OQMC_HOST_DEVICE void drawSample(std::uint32_t sample[Size]) const;
41
42 template <int Size>
43 OQMC_HOST_DEVICE void drawRnd(std::uint32_t rnd[Size]) const;
44
45 State64Bit state;
46};
47
48inline void SobolImpl::initialiseCache([[maybe_unused]] void* cache)
49{
50}
51
52inline SobolImpl::SobolImpl(State64Bit state) : state(state)
53{
54}
55
56inline SobolImpl::SobolImpl(int x, int y, int frame, int index,
57 [[maybe_unused]] const void* cache)
58 : state(x, y, frame, index)
59{
60 state = state.pixelDecorrelate();
61}
62
63inline SobolImpl SobolImpl::newDomain(int key) const
64{
65 return {state.newDomain(key)};
66}
67
68inline SobolImpl SobolImpl::newDomainSplit(int key, int size, int index) const
69{
70 return {state.newDomainSplit(key, size, index)};
71}
72
73inline SobolImpl SobolImpl::newDomainDistrib(int key, int index) const
74{
75 return {state.newDomainDistrib(key, index)};
76}
77
78template <int Size>
79void SobolImpl::drawSample(std::uint32_t sample[Size]) const
80{
81 shuffledScrambledSobol<Size>(state.sampleId, pcg::output(state.patternId),
82 sample);
83}
84
85template <int Size>
86void SobolImpl::drawRnd(std::uint32_t rnd[Size]) const
87{
88 state.drawRnd<Size>(rnd);
89}
91
111
112} // namespace oqmc
Public sampler API.
Definition sampler.h:111
EncodeKey decodeBits16(std::uint16_t value)
Decode a value back into a key.
Definition encode.h:81