{"record":{"id":"b8753d44a5de421c","repo":"Comfy-Org/ComfyUI","slug":"unknown-reference-view-selection-strategy-strate","errorCode":null,"errorMessage":"Unknown reference view selection strategy: {strategy!r}. Must be one of: 'first', 'middle', 'saddle_balanced', 'saddle_sim_range'","messagePattern":"Unknown reference view selection strategy: (.+?)\\. Must be one of: 'first', 'middle', 'saddle_balanced', 'saddle_sim_range'","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy/ldm/depth_anything_3/reference_view_selector.py","lineNumber":54,"sourceCode":"        feat_var = img_class_feat.var(dim=-1)                        # (B,S)\n\n        def _normalize(metric):\n            mn = metric.min(dim=1, keepdim=True).values\n            mx = metric.max(dim=1, keepdim=True).values\n            return (metric - mn) / (mx - mn + 1e-8)\n\n        sim_n, norm_n, var_n = _normalize(sim_score), _normalize(feat_norm), _normalize(feat_var)\n        balance = (sim_n - 0.5).abs() + (norm_n - 0.5).abs() + (var_n - 0.5).abs()\n        return balance.argmin(dim=1)\n\n    if strategy == \"saddle_sim_range\":\n        sim = torch.matmul(img_class_feat, img_class_feat.transpose(1, 2))\n        sim_no_diag = sim - torch.eye(S, device=sim.device).unsqueeze(0)\n        sim_max = sim_no_diag.max(dim=-1).values\n        sim_min = sim_no_diag.min(dim=-1).values\n        return (sim_max - sim_min).argmax(dim=1)\n\n    raise ValueError(\n        f\"Unknown reference view selection strategy: {strategy!r}. \"\n        f\"Must be one of: 'first', 'middle', 'saddle_balanced', 'saddle_sim_range'\"\n    )\n\n\ndef reorder_by_reference(x: torch.Tensor, b_idx: torch.Tensor) -> torch.Tensor:\n    \"\"\"Reorder x so the reference view is at position 0 in axis S.\"\"\"\n    B, S = x.shape[0], x.shape[1]\n    if S <= 1:\n        return x\n    positions = torch.arange(S, device=x.device).unsqueeze(0).expand(B, -1)\n    b_idx_exp = b_idx.unsqueeze(1)\n    reorder = torch.where(\n        (positions > 0) & (positions <= b_idx_exp),\n        positions - 1,\n        positions,\n    )\n    reorder[:, 0] = b_idx","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy/ldm/depth_anything_3/reference_view_selector.py#L36-L72","documentation":"The DA3 reference-view selector picks a reference frame by strategy name: 'first', 'middle', 'saddle_balanced', or 'saddle_sim_range'. Any other string falls through to a ValueError listing the valid options. The strategy is a parameter of the selection routine, usually hardcoded or exposed by a node.","triggerScenarios":"Calling select_reference_view (or its caller) with a strategy string that misses the allowlist — typo such as 'saddle_balance', or a new strategy name from a different repo revision.","commonSituations":"Custom nodes exposing the strategy as a text input; syncing code between upstream DA3 forks where strategy names diverged.","solutions":["Use one of the four exact strings: 'first', 'middle', 'saddle_balanced', 'saddle_sim_range'.","If exposing in a node, use a fixed combo input constrained to the four values.","Add the missing strategy branch yourself if you truly need new behavior, before the final raise."],"exampleFix":"# before\nidx = select_reference_view(feat, strategy=\"saddle_balance\")\n\n# after\nidx = select_reference_view(feat, strategy=\"saddle_balanced\")","handlingStrategy":"type-guard","validationCode":"STRATEGIES = {\"first\", \"middle\", \"saddle_balanced\", \"saddle_sim_range\"}\nassert strategy in STRATEGIES, f\"strategy must be one of {sorted(STRATEGIES)}\"","typeGuard":"def is_valid_reference_strategy(strategy: str) -> bool:\n    return strategy in {\"first\", \"middle\", \"saddle_balanced\", \"saddle_sim_range\"}","tryCatchPattern":null,"preventionTips":["Use a fixed allowlist for strategy strings at the node/UI boundary.","Copy strategy names from the raise message itself (it is the authoritative allowlist)."],"tags":["depth-anything-3","reference-view","input-validation"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}