Validate pair seed axis rerolls
This commit is contained in:
@@ -1021,6 +1021,47 @@ def _pair_seed_determinism_check(seed: int) -> dict[str, Any]:
|
||||
}
|
||||
|
||||
|
||||
def _pair_seed_reroll_check(
|
||||
seed: int,
|
||||
*,
|
||||
name: str,
|
||||
reroll_axis: str,
|
||||
changed_fields: tuple[str, ...],
|
||||
stable_fields: tuple[str, ...],
|
||||
base_target: str,
|
||||
) -> dict[str, Any]:
|
||||
base = _pair_seed_probe(seed)
|
||||
base_snapshot = _pair_seed_snapshot(base)
|
||||
changed = False
|
||||
changed_seed = None
|
||||
changed_field_names: list[str] = []
|
||||
issues: list[str] = []
|
||||
for reroll_seed in range(seed + 1, seed + 16):
|
||||
rerolled = _pair_seed_probe(seed, reroll_axis=reroll_axis, reroll_seed=reroll_seed)
|
||||
rerolled_snapshot = _pair_seed_snapshot(rerolled)
|
||||
field_issues = _same_fields_issues(name, base_snapshot, rerolled_snapshot, stable_fields, reroll_seed)
|
||||
if field_issues:
|
||||
issues.extend(field_issues)
|
||||
break
|
||||
changed_field_names = [
|
||||
field for field in changed_fields if base_snapshot.get(field) != rerolled_snapshot.get(field)
|
||||
]
|
||||
if changed_field_names:
|
||||
changed = True
|
||||
changed_seed = reroll_seed
|
||||
break
|
||||
if not changed:
|
||||
issues.append(f"{name} did not change {', '.join(changed_fields)} within 15 attempts")
|
||||
return {
|
||||
"name": name,
|
||||
"base": _row_summary(base.get(f"{base_target}_row") or {}),
|
||||
"changed": changed,
|
||||
"changed_seed": changed_seed,
|
||||
"changed_fields": changed_field_names,
|
||||
"issues": issues,
|
||||
}
|
||||
|
||||
|
||||
def _seed_reroll_check(
|
||||
seed: int,
|
||||
*,
|
||||
@@ -1062,95 +1103,141 @@ def _seed_reroll_check(
|
||||
|
||||
|
||||
def _pair_seed_pose_reroll_check(seed: int) -> dict[str, Any]:
|
||||
name = "pair_seed.pose_reroll"
|
||||
base = _pair_seed_probe(seed)
|
||||
base_snapshot = _pair_seed_snapshot(base)
|
||||
changed = False
|
||||
changed_seed = None
|
||||
changed_field_names: list[str] = []
|
||||
issues: list[str] = []
|
||||
stable_fields = (
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"soft_item",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
return _pair_seed_reroll_check(
|
||||
seed,
|
||||
name="pair_seed.pose_reroll",
|
||||
reroll_axis="pose",
|
||||
changed_fields=("hard_position_key", "hard_item", "hard_source_role_graph"),
|
||||
stable_fields=(
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"soft_item",
|
||||
"soft_pose",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
),
|
||||
base_target="hardcore",
|
||||
)
|
||||
changed_fields = ("hard_position_key", "hard_item", "hard_source_role_graph")
|
||||
for reroll_seed in range(seed + 1, seed + 16):
|
||||
rerolled = _pair_seed_probe(seed, reroll_axis="pose", reroll_seed=reroll_seed)
|
||||
rerolled_snapshot = _pair_seed_snapshot(rerolled)
|
||||
field_issues = _same_fields_issues(name, base_snapshot, rerolled_snapshot, stable_fields, reroll_seed)
|
||||
if field_issues:
|
||||
issues.extend(field_issues)
|
||||
break
|
||||
changed_field_names = [
|
||||
field for field in changed_fields if base_snapshot.get(field) != rerolled_snapshot.get(field)
|
||||
]
|
||||
if changed_field_names:
|
||||
changed = True
|
||||
changed_seed = reroll_seed
|
||||
break
|
||||
if not changed:
|
||||
issues.append("pair pose reroll did not change hard_position_key, hard_item, or hard_source_role_graph within 15 attempts")
|
||||
return {
|
||||
"name": name,
|
||||
"base": _row_summary(base.get("hardcore_row") or {}),
|
||||
"changed": changed,
|
||||
"changed_seed": changed_seed,
|
||||
"changed_fields": changed_field_names,
|
||||
"issues": issues,
|
||||
}
|
||||
|
||||
|
||||
def _pair_seed_content_reroll_check(seed: int) -> dict[str, Any]:
|
||||
name = "pair_seed.content_reroll"
|
||||
base = _pair_seed_probe(seed)
|
||||
base_snapshot = _pair_seed_snapshot(base)
|
||||
changed = False
|
||||
changed_seed = None
|
||||
changed_field_names: list[str] = []
|
||||
issues: list[str] = []
|
||||
stable_fields = (
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"hard_item",
|
||||
"hard_position_key",
|
||||
"hard_source_role_graph",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
return _pair_seed_reroll_check(
|
||||
seed,
|
||||
name="pair_seed.content_reroll",
|
||||
reroll_axis="content",
|
||||
changed_fields=("soft_item", "soft_pose"),
|
||||
stable_fields=(
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"hard_item",
|
||||
"hard_position_key",
|
||||
"hard_source_role_graph",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
),
|
||||
base_target="softcore",
|
||||
)
|
||||
|
||||
|
||||
def _pair_seed_person_reroll_check(seed: int) -> dict[str, Any]:
|
||||
return _pair_seed_reroll_check(
|
||||
seed,
|
||||
name="pair_seed.person_reroll",
|
||||
reroll_axis="person",
|
||||
changed_fields=("shared_cast_descriptors", "soft_cast_descriptor_text", "hard_cast_descriptor_text"),
|
||||
stable_fields=(
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"soft_item",
|
||||
"soft_pose",
|
||||
"hard_item",
|
||||
"hard_position_key",
|
||||
"hard_source_role_graph",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
"soft_expression",
|
||||
"hard_expression",
|
||||
),
|
||||
base_target="hardcore",
|
||||
)
|
||||
|
||||
|
||||
def _pair_seed_scene_reroll_check(seed: int) -> dict[str, Any]:
|
||||
return _pair_seed_reroll_check(
|
||||
seed,
|
||||
name="pair_seed.scene_reroll",
|
||||
reroll_axis="scene",
|
||||
changed_fields=("soft_scene_text", "hard_scene_text"),
|
||||
stable_fields=(
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_item",
|
||||
"soft_pose",
|
||||
"hard_item",
|
||||
"hard_position_key",
|
||||
"hard_source_role_graph",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
"soft_expression",
|
||||
"hard_expression",
|
||||
),
|
||||
base_target="hardcore",
|
||||
)
|
||||
|
||||
|
||||
def _pair_seed_expression_reroll_check(seed: int) -> dict[str, Any]:
|
||||
return _pair_seed_reroll_check(
|
||||
seed,
|
||||
name="pair_seed.expression_reroll",
|
||||
reroll_axis="expression",
|
||||
changed_fields=("soft_expression", "hard_expression"),
|
||||
stable_fields=(
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"soft_item",
|
||||
"soft_pose",
|
||||
"hard_item",
|
||||
"hard_position_key",
|
||||
"hard_source_role_graph",
|
||||
"soft_composition",
|
||||
"hard_composition",
|
||||
),
|
||||
base_target="hardcore",
|
||||
)
|
||||
|
||||
|
||||
def _pair_seed_composition_reroll_check(seed: int) -> dict[str, Any]:
|
||||
return _pair_seed_reroll_check(
|
||||
seed,
|
||||
name="pair_seed.composition_reroll",
|
||||
reroll_axis="composition",
|
||||
changed_fields=("soft_composition", "hard_composition"),
|
||||
stable_fields=(
|
||||
"shared_cast_descriptors",
|
||||
"soft_cast_descriptor_text",
|
||||
"hard_cast_descriptor_text",
|
||||
"soft_scene_text",
|
||||
"hard_scene_text",
|
||||
"soft_item",
|
||||
"soft_pose",
|
||||
"hard_item",
|
||||
"hard_position_key",
|
||||
"hard_source_role_graph",
|
||||
"soft_expression",
|
||||
"hard_expression",
|
||||
),
|
||||
base_target="hardcore",
|
||||
)
|
||||
changed_fields = ("soft_item", "soft_pose")
|
||||
for reroll_seed in range(seed + 1, seed + 16):
|
||||
rerolled = _pair_seed_probe(seed, reroll_axis="content", reroll_seed=reroll_seed)
|
||||
rerolled_snapshot = _pair_seed_snapshot(rerolled)
|
||||
field_issues = _same_fields_issues(name, base_snapshot, rerolled_snapshot, stable_fields, reroll_seed)
|
||||
if field_issues:
|
||||
issues.extend(field_issues)
|
||||
break
|
||||
changed_field_names = [
|
||||
field for field in changed_fields if base_snapshot.get(field) != rerolled_snapshot.get(field)
|
||||
]
|
||||
if changed_field_names:
|
||||
changed = True
|
||||
changed_seed = reroll_seed
|
||||
break
|
||||
if not changed:
|
||||
issues.append("pair content reroll did not change soft_item or soft_pose within 15 attempts")
|
||||
return {
|
||||
"name": name,
|
||||
"base": _row_summary(base.get("softcore_row") or {}),
|
||||
"changed": changed,
|
||||
"changed_seed": changed_seed,
|
||||
"changed_fields": changed_field_names,
|
||||
"issues": issues,
|
||||
}
|
||||
|
||||
|
||||
def _seed_axis_checks(seed: int) -> list[dict[str, Any]]:
|
||||
@@ -1192,8 +1279,12 @@ def _seed_axis_checks(seed: int) -> list[dict[str, Any]]:
|
||||
def _pair_seed_checks(seed: int) -> list[dict[str, Any]]:
|
||||
return [
|
||||
_pair_seed_determinism_check(seed),
|
||||
_pair_seed_person_reroll_check(seed),
|
||||
_pair_seed_scene_reroll_check(seed),
|
||||
_pair_seed_content_reroll_check(seed),
|
||||
_pair_seed_pose_reroll_check(seed),
|
||||
_pair_seed_expression_reroll_check(seed),
|
||||
_pair_seed_composition_reroll_check(seed),
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user