OpenQMC API
Loading...
Searching...
No Matches
pmj.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 "lookup.h"
11#include "sampler.h"
12#include "state.h"
13#include "stochastic.h"
14
15#include <cstddef>
16#include <cstdint>
17
18namespace oqmc
19{
20
22class PmjImpl
23{
24 // See SamplerInterface for public API documentation.
26
27 struct CacheType
28 {
29 std::uint32_t samples[State64Bit::maxIndexSize][4];
30 };
31
32 static constexpr std::size_t cacheSize = sizeof(CacheType);
33 static void initialiseCache(void* cache);
34
35 /*AUTO_DEFINED*/ PmjImpl() = default;
36 OQMC_HOST_DEVICE PmjImpl(State64Bit state, const CacheType* cache);
37 OQMC_HOST_DEVICE PmjImpl(int x, int y, int frame, int index,
38 const void* cache);
39
40 OQMC_HOST_DEVICE PmjImpl newDomain(int key) const;
41 OQMC_HOST_DEVICE PmjImpl newDomainSplit(int key, int size, int index) const;
42 OQMC_HOST_DEVICE PmjImpl newDomainDistrib(int key, int index) const;
43
44 template <int Size>
45 OQMC_HOST_DEVICE void drawSample(std::uint32_t sample[Size]) const;
46
47 template <int Size>
48 OQMC_HOST_DEVICE void drawRnd(std::uint32_t rnd[Size]) const;
49
50 State64Bit state;
51 const CacheType* cache;
52};
53
54inline void PmjImpl::initialiseCache(void* cache)
55{
57
58 auto typedCache = static_cast<CacheType*>(cache);
59
61}
62
63inline PmjImpl::PmjImpl(State64Bit state, const CacheType* cache)
65{
66 assert(cache);
67}
68
69inline PmjImpl::PmjImpl(int x, int y, int frame, int index, const void* cache)
70 : state(x, y, frame, index), cache(static_cast<const CacheType*>(cache))
71{
72 assert(cache);
73
74 state = state.pixelDecorrelate();
75}
76
77inline PmjImpl PmjImpl::newDomain(int key) const
78{
79 return {state.newDomain(key), cache};
80}
81
82inline PmjImpl PmjImpl::newDomainSplit(int key, int size, int index) const
83{
84 return {state.newDomainSplit(key, size, index), cache};
85}
86
87inline PmjImpl PmjImpl::newDomainDistrib(int key, int index) const
88{
89 return {state.newDomainDistrib(key, index), cache};
90}
91
92template <int Size>
93void PmjImpl::drawSample(std::uint32_t sample[Size]) const
94{
95 shuffledScrambledLookup<4, Size>(
96 state.sampleId, pcg::output(state.patternId), cache->samples, sample);
97}
98
99template <int Size>
100void PmjImpl::drawRnd(std::uint32_t rnd[Size]) const
101{
102 state.drawRnd<Size>(rnd);
103}
105
124
125} // 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
void stochasticPmjInit(int nsamples, std::uint32_t table[][4])
Initialise a table with a progressive mult-jittered (0,2) sequence.
Definition stochastic.h:33
static constexpr auto maxIndexSize
2^16 index upper limit.
Definition state.h:30