17#include <mlir/IR/BuiltinTypes.h>
19#include <llvm/ADT/SmallVector.h>
20#include <llvm/ADT/Twine.h>
30static llvm::Expected<size_t>
31dynamicAPIntToSize(
const llvm::DynamicAPInt &value, llvm::Twine context) {
33 return makeError(context +
" would underflow size_t");
36 if (as.getActiveBits() > std::numeric_limits<size_t>::digits) {
37 return makeError(context +
" would overflow size_t");
39 return static_cast<size_t>(as.getZExtValue());
44 return dynamicAPIntToSize(value, context);
48 if (ShapedType::isDynamic(dim)) {
49 return makeError(llvm::Twine(context) +
" requires a static shape");
52 return makeError(llvm::Twine(context) +
" has a negative dimension");
54 llvm::DynamicAPInt value(dim);
55 return dynamicAPIntToSize(value, llvm::Twine(context) +
" dimension");
60 llvm::DynamicAPInt count(1);
61 for (int64_t dim : shape) {
64 return dimSize.takeError();
68 return dynamicAPIntToSize(count, context);
72 if (!type.hasStaticShape()) {
73 return makeError(llvm::Twine(context) +
" requires a static shape");
75 int64_t count = type.getNumElements();
77 return makeError(llvm::Twine(context) +
" has an invalid negative element count");
79 return dynamicAPIntToSize(llvm::DynamicAPInt(count), context);
86 std::random_device rd;
87 std::seed_seq seed {rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()};
88 return std::mt19937_64(seed);
92 const llvm::DynamicAPInt prime = field.
prime();
101 const unsigned bitWidth = field.
bitWidth();
102 const unsigned numWords = (bitWidth + 63U) / 64U;
103 std::uniform_int_distribution<uint64_t> wordDist;
104 llvm::SmallVector<uint64_t, 4> words(numWords);
106 for (uint64_t &word : words) {
107 word = wordDist(rng);
111 llvm::DynamicAPInt value =
toDynamicAPInt(llvm::APInt(bitWidth, words));
113 return field.
reduce(value);
119 return std::uniform_int_distribution<
120 int64_t>(std::numeric_limits<int64_t>::min(), std::numeric_limits<int64_t>::max())(rng);
124 return std::uniform_int_distribution<int>(0, 1)(rng) != 0;
This file implements helper methods for constructing DynamicAPInts.
Information about the prime finite field used for the interval analysis.
llvm::DynamicAPInt prime() const
For the prime field p, returns p.
llvm::DynamicAPInt reduce(const llvm::DynamicAPInt &i) const
Returns i mod p and reduces the result into the appropriate bitwidth.
unsigned bitWidth() const
std::mt19937_64 makeDefaultValueRng(const WitgenOptions &options)
Seed an RNG for random/default witness value materialization.
llvm::Expected< size_t > getStaticShapeElementCount(llvm::ArrayRef< int64_t > shape, llvm::StringRef context)
Return the static element count for one shape, rejecting dynamic sizes.
llvm::DynamicAPInt randomFieldElement(std::mt19937_64 &rng, const Field &field)
Draw a uniformly distributed field element in [0, prime).
bool randomBoolValue(std::mt19937_64 &rng)
Draw a uniformly distributed boolean value.
llvm::Expected< size_t > checkedDynamicAPIntToSize(const llvm::DynamicAPInt &value, llvm::StringRef context)
Convert a DynamicAPInt into size_t after validating its range.
llvm::Expected< size_t > getStaticElementCount(ShapedType type, llvm::StringRef context)
llvm::Expected< size_t > checkedShapeDimToSize(int64_t dim, llvm::StringRef context)
Convert one static dimension to size_t, rejecting dynamic or invalid sizes.
int64_t randomIndexValue(std::mt19937_64 &rng)
Draw a uniformly distributed signed index value.
llvm::Error makeError(const llvm::Twine &msg)
Build a string-backed error for user-facing witgen failures.
DynamicAPInt toDynamicAPInt(StringRef str)
APSInt toAPSInt(const DynamicAPInt &i)
Configure one llzk-witgen execution.
std::optional< uint64_t > randomSeed