rabukasim / tools /verify /calc_coverage.py
trioskosmos's picture
Upload folder using huggingface_hub
463f868 verified
import json
def load_json(path):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def main():
cards = load_json("data/cards_compiled.json")
pool = load_json("verified_card_pool.json")
# 1. Total Playable Cards
# Filter out invalid or non-member cards if necessary, but 'member_db' usually implies members.
# We might want to count Lives too if they are in the pool.
total_members = len(cards.get("member_db", {}))
total_lives = len(cards.get("live_db", {}))
total_cards = total_members + total_lives
# 2. Verified Cards
# Pool can be a list (new format) or dict (old format)
if isinstance(pool, list):
v_abilities = set(pool)
v_vanilla_m = set()
v_vanilla_l = set()
else:
v_abilities = set(pool.get("verified_abilities", []))
v_vanilla_m = set(pool.get("vanilla_members", []))
v_vanilla_l = set(pool.get("vanilla_lives", []))
# Ensure no overlap (though they should be distinct lists, good to check)
all_verified = v_abilities | v_vanilla_m | v_vanilla_l
print("--- Verification Coverage Stats ---")
print(f"Total Cards in Database: {total_cards}")
print(f" - Members: {total_members}")
print(f" - Lives: {total_lives}")
print(f"Verified Pool Total: {len(all_verified)}")
print(f" - Strictly Verified: {len(v_abilities)}")
print(f" - Vanilla Members: {len(v_vanilla_m)}")
print(f" - Vanilla Lives: {len(v_vanilla_l)}")
# 3. Ability Coverage (Requested Metric)
# Identify actual ability cards from the source DB
ability_card_ids = set()
vanilla_card_ids = set()
for db in [cards.get("member_db", {}), cards.get("live_db", {})]:
for cno, card in db.items():
# Check if card has meaningful abilities
abilities = card.get("abilities", [])
has_ability = False
if abilities:
# Ensure it's not just empty parsing
if any(ab.get("raw_text") or ab.get("trigger") for ab in abilities):
has_ability = True
# Use actual card_no, not the dict key (which is an int ID)
real_cno = card.get("card_no")
if not real_cno:
continue
if has_ability:
ability_card_ids.add(real_cno)
else:
vanilla_card_ids.add(real_cno)
total_ability_cards = len(ability_card_ids)
# Intersection: verified_abilities that are actually in the ability_card_ids set
# (Just to be safe against data drift)
verified_ability_hits = v_abilities.intersection(ability_card_ids)
print("-" * 30)
print("Ability-Only Coverage Stats")
print(f"Total Cards with Abilities: {total_ability_cards}")
print(f"Verified Ability Cards: {len(verified_ability_hits)}")
ability_coverage = (len(verified_ability_hits) / total_ability_cards) * 100 if total_ability_cards > 0 else 0
print(f"Ability Coverage: {ability_coverage:.2f}%")
if __name__ == "__main__":
main()