# PAct Cardinality-Preserved Hard-5 Evaluation

- Samples: `0, 4, 26, 73, 97`
- Sampler policy: PAct official defaults; no `--ss_steps`, `--slat_steps`, `--ss_cfg_strength`, or `--slat_cfg_strength` passed.
- VLM: disabled.
- Preprocessing: cardinality-preserving sentinel labels enabled before writing `_mask.exr`.

| Sample | Dataset | GT parts | Downsample labels before | Downsample labels after | Official exported parts | Phase2 exported parts |
| ---: | --- | ---: | ---: | ---: | ---: | ---: |
| 0 | ArtVIP / major_appliances | 7 | 2 | 7 | 7 | 7 |
| 4 | GAPartNet / small_appliances | 12 | 1 | 12 | 9 | 9 |
| 26 | GAPartNet / electronics | 21 | 1 | 21 | 19 | 18 |
| 73 | PartNetMobility / electronics | 31 | 7 | 31 | 31 | 0 |
| 97 | PartNetMobility / major_appliances | 6 | 3 | 6 | 5 | 0 |

| Variant | Mean score | Part MAE | Joint F1 | Run status |
| --- | ---: | ---: | ---: | --- |
| Official PAct | 45.83 | 1.20 | 0.15 | ok |
| Phase2 RGB edge + dropout | 28.51 | 8.60 | 0.17 | failed after partial outputs |

## Interpretation

- The cardinality-preserving mask fixed the pre-model collapse: all hard-5 samples now enter the official PAct reader with `num_parts == reference parts`.
- Official PAct improves sharply once input cardinality is preserved: hard-5 mean score rises to `45.83` and part MAE drops to `1.20`; #73 reaches `31/31` exported parts.
- Phase2 RGB-edge/dropout is not stable under the corrected high-part-count input. It produced partial outputs for #0/#4/#26, then failed on #73 inside spconv mesh decoding with an int32-range assertion, so #73/#97 are counted as missing.
- This means the immediate bottleneck has shifted: preprocessing cardinality was the dominant first failure; after fixing it, Phase2 needs a density/compute guard before it can be fairly evaluated on high-part-count objects.
