tvm
Loading...
Searching...
No Matches
random_engine.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
24#ifndef TVM_S_TIR_RANDOM_ENGINE_H_
25#define TVM_S_TIR_RANDOM_ENGINE_H_
26
27#include <tvm/ffi/error.h>
28#include <tvm/ir/prim/expr.h>
29
30#include <cstdint>
31#include <random>
32
33namespace tvm {
34namespace s_tir {
46 public:
47 using TRandState = int64_t;
49 using result_type = uint64_t;
51 static constexpr TRandState multiplier = 48271;
53 static constexpr TRandState increment = 0;
55 static constexpr TRandState modulus = 2147483647;
57 static constexpr result_type min() { return 0; }
59 static constexpr result_type max() { return modulus - 1; }
60
66 std::random_device rd;
67 return rd() % modulus;
68 }
69
81 (*rand_state_ptr_) = ((*rand_state_ptr_) * multiplier + increment) % modulus;
82 return *rand_state_ptr_;
83 }
89 static TRandState NormalizeSeed(TRandState rand_state) {
90 if (rand_state == -1) {
91 rand_state = DeviceRandom();
92 } else {
93 rand_state %= modulus;
94 }
95 if (rand_state == 0) {
96 rand_state = 1;
97 }
98 if (rand_state < 0) {
99 TVM_FFI_THROW(ValueError) << "Random seed must be non-negative";
100 }
101 return rand_state;
102 }
107 void Seed(TRandState rand_state) {
108 TVM_FFI_ICHECK(rand_state_ptr_ != nullptr);
109 *rand_state_ptr_ = NormalizeSeed(rand_state);
110 }
111
117 // In order for reproducibility, we compute the new seed using RNG's random state and a
118 // different set of parameters. Note that both 32767 and 1999999973 are prime numbers.
119 return ((*this)() * 32767) % 1999999973;
120 }
121
129 explicit LinearCongruentialEngine(TRandState* rand_state_ptr) {
130 rand_state_ptr_ = rand_state_ptr;
131 }
132
133 private:
134 TRandState* rand_state_ptr_;
135};
136
137} // namespace s_tir
138} // namespace tvm
139
140#endif // TVM_S_TIR_RANDOM_ENGINE_H_
This linear congruential engine is a drop-in replacement for std::minstd_rand. It strictly correspond...
Definition random_engine.h:45
static constexpr TRandState multiplier
The multiplier.
Definition random_engine.h:51
void Seed(TRandState rand_state)
Change the start random state of RNG with the seed of a new random state value.
Definition random_engine.h:107
LinearCongruentialEngine(TRandState *rand_state_ptr)
Construct a random number generator with a random state pointer.
Definition random_engine.h:129
TRandState ForkSeed()
Fork a new seed for another RNG from current random state.
Definition random_engine.h:116
static constexpr TRandState modulus
The modulus.
Definition random_engine.h:55
static TRandState DeviceRandom()
Get a device random state.
Definition random_engine.h:65
uint64_t result_type
The result type.
Definition random_engine.h:49
result_type operator()()
Operator to move the random state to the next and return the new random state. According to definitio...
Definition random_engine.h:80
static TRandState NormalizeSeed(TRandState rand_state)
Normalize the random seed to the range of [1, modulus - 1].
Definition random_engine.h:89
static constexpr result_type max()
The maximum possible value of random state here.
Definition random_engine.h:59
int64_t TRandState
Definition random_engine.h:47
static constexpr result_type min()
The minimum possible value of random state here.
Definition random_engine.h:57
static constexpr TRandState increment
The increment.
Definition random_engine.h:53
TIR expressions.
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23