Spaces:
Build error
Build error
/* | |
* SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
* SPDX-License-Identifier: Apache-2.0 | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
/** @file discrete_distribution.h | |
* @author Thomas Müller, NVIDIA | |
*/ | |
namespace ngp { | |
struct DiscreteDistribution { | |
void build(std::vector<float> weights) { | |
float total_weight = 0; | |
for (float w : weights) { | |
total_weight += w; | |
} | |
float inv_total_weight = 1 / total_weight; | |
float cdf_accum = 0; | |
cdf.clear(); | |
for (float w : weights) { | |
float norm = w * inv_total_weight; | |
cdf_accum += norm; | |
pmf.emplace_back(norm); | |
cdf.emplace_back(cdf_accum); | |
} | |
cdf.back() = 1.0f; // Prevent precision problems from causing overruns in the end | |
} | |
uint32_t sample(float val) { | |
return std::min(binary_search(val, cdf.data(), (uint32_t)cdf.size()), (uint32_t)cdf.size()-1); | |
} | |
std::vector<float> pmf; | |
std::vector<float> cdf; | |
}; | |
} | |