Files
TheRock/rocm-libraries/dnn-providers/integration-tests/tests/TestSynthesisConfig.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

229 lines
7.1 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include <gtest/gtest.h>
#include "harness/input-init/SynthesisConfig.hpp"
using namespace hipdnn_integration_tests;
// ── setDefault (declaration functions) ──────────────────────────────────────
TEST(TestSynthesisConfig, SetDefaultWritesWhenEmpty)
{
SynthesisConfig config;
config.setDefault(1, FillSpec::free(-1.0f, 1.0f));
const auto fill = config.fill(1);
EXPECT_EQ(fill.kind, FillSpec::Kind::FREE);
EXPECT_FLOAT_EQ(fill.lo, -1.0f);
EXPECT_FLOAT_EQ(fill.hi, 1.0f);
}
TEST(TestSynthesisConfig, SetDefaultDoesNotOverwrite)
{
SynthesisConfig config;
config.setDefault(1, FillSpec::free(-1.0f, 1.0f));
config.setDefault(1, FillSpec::free(-99.0f, 99.0f));
const auto fill = config.fill(1);
EXPECT_FLOAT_EQ(fill.lo, -1.0f);
EXPECT_FLOAT_EQ(fill.hi, 1.0f);
}
// ── set (metadata / test code) ──────────────────────────────────────────────
TEST(TestSynthesisConfig, SetOverwritesDefault)
{
SynthesisConfig config;
config.setDefault(1, FillSpec::free(-1.0f, 1.0f));
config.set(1, FillSpec::free(-5.0f, 5.0f));
const auto fill = config.fill(1);
EXPECT_FLOAT_EQ(fill.lo, -5.0f);
EXPECT_FLOAT_EQ(fill.hi, 5.0f);
}
TEST(TestSynthesisConfig, SetOverwritesSet)
{
SynthesisConfig config;
config.set(1, FillSpec::free(-5.0f, 5.0f));
config.set(1, FillSpec::free(-10.0f, 10.0f));
const auto fill = config.fill(1);
EXPECT_FLOAT_EQ(fill.lo, -10.0f);
EXPECT_FLOAT_EQ(fill.hi, 10.0f);
}
TEST(TestSynthesisConfig, SetDefaultDoesNotOverwriteSet)
{
SynthesisConfig config;
config.set(1, FillSpec::free(-5.0f, 5.0f));
config.setDefault(1, FillSpec::free(-99.0f, 99.0f));
const auto fill = config.fill(1);
EXPECT_FLOAT_EQ(fill.lo, -5.0f);
EXPECT_FLOAT_EQ(fill.hi, 5.0f);
}
// ── Three-tier precedence (the real contract) ───────────────────────────────
TEST(TestSynthesisConfig, ThreeTierPrecedence)
{
SynthesisConfig config;
// 1. Metadata sets a range (runs first via setBundle)
config.set(1, FillSpec::free(-1.0f, 1.0f));
// 2. Declaration function tries to set a default (emplace, should lose)
config.setDefault(1, FillSpec::free(-99.0f, 99.0f));
// 3. Test body overwrites with its own range (runs after metadata)
config.set(1, FillSpec::free(-10.0f, 10.0f));
const auto fill = config.fill(1);
EXPECT_EQ(fill.kind, FillSpec::Kind::FREE);
EXPECT_FLOAT_EQ(fill.lo, -10.0f);
EXPECT_FLOAT_EQ(fill.hi, 10.0f);
}
// ── get returns default-constructed FillSpec for unknown uid ────────────────
TEST(TestSynthesisConfig, GetUnknownUidReturnsDefault)
{
const SynthesisConfig config;
const auto fill = config.fill(999);
EXPECT_EQ(fill.kind, FillSpec::Kind::FREE);
EXPECT_FLOAT_EQ(fill.lo, -1.0f);
EXPECT_FLOAT_EQ(fill.hi, 1.0f);
}
// ── unfilled only checks ownedUids ──────────────────────────────────────────
TEST(TestSynthesisConfig, UnfilledReportsStructuredAndDerived)
{
SynthesisConfig config;
config.set(1, FillSpec::free(-1.0f, 1.0f));
config.set(2, FillSpec::structured());
config.set(3, FillSpec::derived());
config.set(4, FillSpec::fixed(0.5f));
const auto missing = config.unfilled({1, 2, 3, 4});
EXPECT_EQ(missing.size(), 2u);
EXPECT_NE(std::find(missing.begin(), missing.end(), 2), missing.end());
EXPECT_NE(std::find(missing.begin(), missing.end(), 3), missing.end());
}
TEST(TestSynthesisConfig, UnfilledIgnoresNonOwnedUids)
{
SynthesisConfig config;
config.set(1, FillSpec::free(-1.0f, 1.0f));
config.set(2, FillSpec::structured());
// Only check uid 1 — uid 2 (structured) is not owned, should be ignored
const auto missing = config.unfilled({1});
EXPECT_TRUE(missing.empty());
}
// ── seed resolution ─────────────────────────────────────────────────────────
TEST(TestSynthesisConfig, ResolveSeedPerTensor)
{
SynthesisConfig config;
config.setSeed(1, 100);
EXPECT_EQ(config.resolveSeed(1), 100u);
EXPECT_EQ(config.resolveSeed(2), std::nullopt);
}
TEST(TestSynthesisConfig, GlobalSeedDefaultValue)
{
const SynthesisConfig config;
EXPECT_EQ(config.globalSeed(), 42u);
}
TEST(TestSynthesisConfig, GlobalSeedCanBeSet)
{
SynthesisConfig config;
config.setGlobalSeed(123);
EXPECT_EQ(config.globalSeed(), 123u);
}
// ── seed() does not block setDefault() (regression for the footgun) ─────────
TEST(TestSynthesisConfig, SeedThenSetDefaultStillShowsUnfilled)
{
SynthesisConfig config;
config.setSeed(1, 100);
config.setDefault(1, FillSpec::derived());
const auto missing = config.unfilled({1});
EXPECT_EQ(missing.size(), 1u);
EXPECT_EQ(missing[0], 1);
}
// ── JSON round-trip ─────────────────────────────────────────────────────────
TEST(TestSynthesisConfig, ToJsonAndLoadFromJsonRoundTrip)
{
SynthesisConfig original;
original.set(1, FillSpec::free(-2.0f, 2.0f));
original.set(2, FillSpec::fixed(0.5f));
original.set(3, FillSpec::structured());
original.setSeed(1, 42);
const auto json = original.toJson();
// Parse back into uid→json map (same format as BundleMetadata::inputs)
std::unordered_map<int64_t, nlohmann::json> inputMap;
for(const auto& [key, val] : json.items())
{
inputMap[std::stoll(key)] = val;
}
SynthesisConfig loaded;
loaded.loadFromJson(inputMap);
// Verify fills
const auto f1 = loaded.fill(1);
EXPECT_EQ(f1.kind, FillSpec::Kind::FREE);
EXPECT_FLOAT_EQ(f1.lo, -2.0f);
EXPECT_FLOAT_EQ(f1.hi, 2.0f);
const auto f2 = loaded.fill(2);
EXPECT_EQ(f2.kind, FillSpec::Kind::FIXED);
EXPECT_FLOAT_EQ(f2.value, 0.5f);
const auto f3 = loaded.fill(3);
EXPECT_EQ(f3.kind, FillSpec::Kind::STRUCTURED);
// Verify seed survived
EXPECT_EQ(loaded.resolveSeed(1), 42u);
EXPECT_EQ(loaded.resolveSeed(2), std::nullopt);
}
TEST(TestSynthesisConfig, SeedOnlyTensorSurvivesRoundTrip)
{
SynthesisConfig original;
original.set(1, FillSpec::free(-1.0f, 1.0f));
original.setSeed(1, 10);
original.setSeed(2, 20);
const auto json = original.toJson();
std::unordered_map<int64_t, nlohmann::json> inputMap;
for(const auto& [key, val] : json.items())
{
inputMap[std::stoll(key)] = val;
}
SynthesisConfig loaded;
loaded.loadFromJson(inputMap);
EXPECT_EQ(loaded.resolveSeed(1), 10u);
EXPECT_EQ(loaded.resolveSeed(2), 20u);
EXPECT_EQ(loaded.fills().count(1), 1u);
EXPECT_EQ(loaded.fills().count(2), 0u);
}