diff --git a/results/archive_manifest.json b/results/archive_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..357855548f77d46a062bfa2aca4ead4e20a2c524 --- /dev/null +++ b/results/archive_manifest.json @@ -0,0 +1,4197 @@ +{ + "artifacts": [ + { + "bytes": 1613415, + "path": "images/visual_table_avif_q70.png", + "sha256": "911e938152bf18f4601c044bf69dd25ae2bc62592628486afc6e6d94d98fda05" + }, + { + "bytes": 2221574, + "path": "images/visual_table_jpeg_q100.png", + "sha256": "5c38c19d9920ca70636a0d0a0f1b0b9882c8b3fe1706b2df34d388a9768f905d" + }, + { + "bytes": 1619977, + "path": "images/visual_table_jpeg_q80.png", + "sha256": "e629155c215ac4b11271f577245a41879f11bec152530e366257f719120df483" + }, + { + "bytes": 1608295, + "path": "images/visual_table_jxl_d1.png", + "sha256": "8ccee5def31275bb527d3d57bece83526e61fe83ace13ff73deb466d3c3fbfef" + }, + { + "bytes": 1611437, + "path": "images/visual_table_webp_q80.png", + "sha256": "3c42502d5b311c9654768d7531aa574ebb012df8ee646d322ada03327a5da0b2" + }, + { + "bytes": 3152718, + "path": "images/visual_tables_contact_sheet.png", + "sha256": "5253eacb30f05e2518b2ddbdbd9cde1409f2da41bb2626de25783c67450fb171" + }, + { + "bytes": 1543, + "path": "results/codec_conditions.csv", + "sha256": "6b7b5db91e838565c742c3d03cc170551b6f0912f7107d58abfe3d296e04d143" + }, + { + "bytes": 1578, + "path": "results/condition_summary.csv", + "sha256": "05283d8227c9ce665cfeadb36d80509ccb12fe1e78cfd1ed945ebe5035202998" + }, + { + "bytes": 2456, + "path": "results/final_conclusion.md", + "sha256": "263010492d899ebd0d7184446a4bc47777e98e565599098760e866189bbd8074" + }, + { + "bytes": 434773, + "path": "results/generation_metrics.csv", + "sha256": "e02046fe9835cbfec06e34ed537d6b8459a2f294bd6f515191d6dbbd8dda9dde" + }, + { + "bytes": 2855, + "path": "results/paired_quality_metrics.csv", + "sha256": "bf6fde481e3beec0fb97c429320bbb4d125fa6935b27affe832c81335fb91cad" + }, + { + "bytes": 8051205, + "path": "results/raw_rows.jsonl", + "sha256": "4cdc11651a3f215427ef34445fae174208e202fb1e477e71bcf6baf898fe483b" + }, + { + "bytes": 217, + "path": "results/representative_prompt_ids.json", + "sha256": "d9ce48e88e71bf23691320d9fab1b548459e8f2e8d8f0f5f2ce90716094ebd89" + }, + { + "bytes": 572915, + "path": "results/resource_monitor.jsonl", + "sha256": "e4bf17b0c1b10347a030f663f2794be11d5747554bb0f227905e2dde40c47a46" + }, + { + "bytes": 24883, + "path": "results/run_manifest.json", + "sha256": "3e7cb7a1a9a3b480d4b14898f32a26df49fc8315d87f0336ac79b9c627218c0e" + }, + { + "bytes": 4903, + "path": "results/source_report_manifest.json", + "sha256": "f6523fdfa75cf8f6a0eaeaf01894c1d974a5cfeebf0c166b2d49000de7467b37" + }, + { + "bytes": 3567, + "path": "results/storage_metrics.csv", + "sha256": "a2ab1b5d4131bdd79ea109baf3f953a34a5c3711ffe394a12781f5e7b9629cf6" + }, + { + "bytes": 2737, + "path": "results/weight_metrics.csv", + "sha256": "bb9a0a4913ae0f889b6644636627bf61a9559259777ed05b50af9cfb82916cae" + }, + { + "bytes": 102725, + "path": "samples/avif_q70_protected_high/pm4-001-cca08f5b.png", + "sha256": "80dd4acd7deabc86fb91b94390ad3841e5f85031e44908a9f5b55b3a286d0564" + }, + { + "bytes": 98731, + "path": "samples/avif_q70_protected_high/pm4-002-effb6eaa.png", + "sha256": "9d8a3448da5eabe056240195530036884b1ccbb099c4650fd88b429d1f9169bc" + }, + { + "bytes": 100339, + "path": "samples/avif_q70_protected_high/pm4-003-46e10145.png", + "sha256": "7af86eeab3044cced957836a042a4c35a08183e15524094d153ecdbaa7557f8d" + }, + { + "bytes": 118312, + "path": "samples/avif_q70_protected_high/pm4-004-ab14afb8.png", + "sha256": "58253941e0d8417717e284670dcdf98e32d23cae4ca2973d44169dc75a7b5fac" + }, + { + "bytes": 111903, + "path": "samples/avif_q70_protected_high/pm4-005-5e9b5a50.png", + "sha256": "8d5871d59ebddc985670c18b0f8914ec9145018be5a5a5c30217ef4fd9cb84c4" + }, + { + "bytes": 100735, + "path": "samples/avif_q70_protected_high/pm4-006-44a2087e.png", + "sha256": "59531fc323dd3eaf20176e171b8a0557755c7babe936847e3cc2e49935ba2b26" + }, + { + "bytes": 110756, + "path": "samples/avif_q70_protected_high/pm4-007-5003533d.png", + "sha256": "b54a42e88f4599037ea531beafb1090c9ab94fdf98cee822717aa7160b4d75f9" + }, + { + "bytes": 110777, + "path": "samples/avif_q70_protected_high/pm4-008-54647723.png", + "sha256": "bdeb63731e4a41871fe3c9aff7190a9cb41ccb6ead0542a2654fa56fa294cdff" + }, + { + "bytes": 113355, + "path": "samples/avif_q70_protected_high/pm4-009-e51903e1.png", + "sha256": "647010a625be10fa733e271d634baafa51c95af42b227d7bdae130af54087e13" + }, + { + "bytes": 102313, + "path": "samples/avif_q70_protected_high/pm4-010-97841ad3.png", + "sha256": "e6899caad76d689367fc7099d28a912669ac3b990cae50a698f28f54e6b435df" + }, + { + "bytes": 116520, + "path": "samples/avif_q70_protected_high/pm4-011-c900b313.png", + "sha256": "03dd00b5d97a639f655a81aea73edfbd7ff01b202c7e336c22bc96a7fec0dba0" + }, + { + "bytes": 107725, + "path": "samples/avif_q70_protected_high/pm4-012-98171122.png", + "sha256": "899aa9d75e222a2dccd57dec48e815f5e49fc9c3f8cdfe4385761546f92bc4a1" + }, + { + "bytes": 122676, + "path": "samples/avif_q70_protected_high/pm4-013-d58e7b01.png", + "sha256": "96a2212b4ca9f2b1bfcfb40ed6fdb7e743debcb02e8aa6b3e59fba3fbf0268c7" + }, + { + "bytes": 116818, + "path": "samples/avif_q70_protected_high/pm4-014-8876ccfb.png", + "sha256": "0d459c8d23b90f561b91468b9aa2d4a4a2abc96ffb950c70c7bf3f8a1e36172b" + }, + { + "bytes": 107904, + "path": "samples/avif_q70_protected_high/pm4-015-8fe08e47.png", + "sha256": "0cfe87c5d5988865104ffbc9224f75a32e357a2f32ed9bee90152177a81b48fc" + }, + { + "bytes": 95248, + "path": "samples/avif_q70_protected_high/pm4-016-fd1eb48d.png", + "sha256": "fa98f4bfdf5f2df47532105358bc23936643e446e34a17d58b9aaf8807642d4a" + }, + { + "bytes": 104884, + "path": "samples/avif_q70_protected_high/pm4-017-7f335742.png", + "sha256": "f51c5476db8a203de1382e6d5d6ab28d224afe1dc49e7ab01a50170cfac8dad7" + }, + { + "bytes": 120002, + "path": "samples/avif_q70_protected_high/pm4-018-4ea91357.png", + "sha256": "91808cc021293555b94ac6de7e16ade8c5f402712cd3e6064dfbb3acea3e516c" + }, + { + "bytes": 124046, + "path": "samples/avif_q70_protected_high/pm4-019-f7070d02.png", + "sha256": "2185f893f4a99854ff16d4b28854f4c6ecdc3f5c242a5fc2bb5bc5a87bc860e8" + }, + { + "bytes": 113745, + "path": "samples/avif_q70_protected_high/pm4-020-d8e94e65.png", + "sha256": "b8e188d1311bdb3e67761e41ae3b51abea6459a8e31d92925dc485b9d20f30a3" + }, + { + "bytes": 139308, + "path": "samples/avif_q70_protected_high/pm4-021-2da79c09.png", + "sha256": "000aca47439e97de957505104306e89bcebc558f2df2cbaffe6c16557fce6aac" + }, + { + "bytes": 113847, + "path": "samples/avif_q70_protected_high/pm4-022-b8b11cb8.png", + "sha256": "e3ee60b5cb3c230a261355d78b127180295249714165afa94a5da936f94d811c" + }, + { + "bytes": 109403, + "path": "samples/avif_q70_protected_high/pm4-023-0eb7f66d.png", + "sha256": "63c455f0b4970175eb4ad9f0ae41a44301d2eab22a2ea31b2c8018016eeb3a63" + }, + { + "bytes": 119673, + "path": "samples/avif_q70_protected_high/pm4-024-56de999a.png", + "sha256": "cb3f9902cd5b429c55ee74d4f6fded3b568e3f378b57b21c4a7f084f7d3984b5" + }, + { + "bytes": 111627, + "path": "samples/avif_q70_protected_high/pm4-025-ef6349d3.png", + "sha256": "b31b1547afa84fe129f2d0cda2b16508b7b71ace6a53459c55a8d8dee2901d39" + }, + { + "bytes": 103308, + "path": "samples/avif_q70_protected_high/pm4-026-ad193361.png", + "sha256": "653bc3cdaee22f4133e6fe9167070c9ed9947f3aa3167a452e8e6ba305625b61" + }, + { + "bytes": 115568, + "path": "samples/avif_q70_protected_high/pm4-027-becf10ea.png", + "sha256": "18bce181a081797dc1d85cc6351ae194151818b576e4c3c6df2c74b3cf757c99" + }, + { + "bytes": 112509, + "path": "samples/avif_q70_protected_high/pm4-028-b56d212e.png", + "sha256": "6c485a837fe7651764185117623e0d71061c53150b9599cdfc9456d2e507abfb" + }, + { + "bytes": 104968, + "path": "samples/avif_q70_protected_high/pm4-029-95eb9f34.png", + "sha256": "67042bdab46ff4de0eb510ad8a902bc90cfe792d555deee381612ec97db21498" + }, + { + "bytes": 122224, + "path": "samples/avif_q70_protected_high/pm4-030-2b63f9ba.png", + "sha256": "ff0584a98a947b7031ada5ec9e8b23e27d057f59b6fe4cb834a4dcf0880f18ad" + }, + { + "bytes": 119116, + "path": "samples/avif_q70_protected_high/pm4-031-844a8814.png", + "sha256": "507e99731d610cd831610b8ac0515c76522dd233cc4f3fa3ef3482f98cc59c13" + }, + { + "bytes": 112817, + "path": "samples/avif_q70_protected_high/pm4-032-42ee9a0f.png", + "sha256": "678e02e1b76d79b7bd5bb8888e98fd6626ea7d2a66aeb4cd0f402fba7761202f" + }, + { + "bytes": 108412, + "path": "samples/avif_q70_protected_high/pm4-033-b5e58e7f.png", + "sha256": "6f8ce3a535c7d5847a21242a0f4f7527294371dc342c8174c3df875ad81f406b" + }, + { + "bytes": 110164, + "path": "samples/avif_q70_protected_high/pm4-034-a383c38f.png", + "sha256": "06a9c4ebd0f9c5791a694205c15675cf58ac5bead4888f4dfaf7111d1590fc28" + }, + { + "bytes": 110254, + "path": "samples/avif_q70_protected_high/pm4-035-f3b99568.png", + "sha256": "3b50b06b6db3dfb06cde703b64baad3e21bb0e84c8670dd03fc3b5d29794c918" + }, + { + "bytes": 112526, + "path": "samples/avif_q70_protected_high/pm4-036-71932e79.png", + "sha256": "b2cc9d06e292a7d0e7195f5b9d078e285fc0b71bf7c318f83340d6ff655d6f1d" + }, + { + "bytes": 120626, + "path": "samples/avif_q70_protected_high/pm4-037-9515174e.png", + "sha256": "cf669387c5d606214a296effd6bf5660bd5f8d6f4e4750950c5bd5a059e8a1e0" + }, + { + "bytes": 111686, + "path": "samples/avif_q70_protected_high/pm4-038-335a27fa.png", + "sha256": "b8fc59540f2b26b65d86aff469f07528b5cfa699833221f29d61d47b509d762c" + }, + { + "bytes": 110346, + "path": "samples/avif_q70_protected_high/pm4-039-066bcab1.png", + "sha256": "5b5f70b1f152f054516072f497d579bb6e2f337a0bd4ddc231891e2051bed370" + }, + { + "bytes": 118193, + "path": "samples/avif_q70_protected_high/pm4-040-eca2f1c2.png", + "sha256": "05b529c53042b56b1234c36c29b171f3c00c5d8baaf753bf4331ed65cebe5302" + }, + { + "bytes": 117922, + "path": "samples/avif_q70_protected_high/pm4-041-7ac2f16a.png", + "sha256": "7ed4e98637f0f92e3be0fb393464ddf2c37b218db919a0715cf1b60c1104887b" + }, + { + "bytes": 129003, + "path": "samples/avif_q70_protected_high/pm4-042-f7a87ffa.png", + "sha256": "3fd3eebbc6b40c872fc4aea549609bbd240155fea3f5f3ae7c381dbdc10a6474" + }, + { + "bytes": 107954, + "path": "samples/avif_q70_protected_high/pm4-043-cde8ad90.png", + "sha256": "f030cd237fc2c212d3eb60cf689d188f02b1eef845c1e26d2defdbc1e776c955" + }, + { + "bytes": 112736, + "path": "samples/avif_q70_protected_high/pm4-044-93deb087.png", + "sha256": "5a9935b1f47a672e68123d3aa718ab99aae0c94b447e7cc9198abbd233336188" + }, + { + "bytes": 113222, + "path": "samples/avif_q70_protected_high/pm4-045-25fa16bb.png", + "sha256": "eff399eb69b19b4ee1e4b4b385cdcfec2592a4dcbb246dfbf191cf56be841578" + }, + { + "bytes": 108717, + "path": "samples/avif_q70_protected_high/pm4-046-bec80a2b.png", + "sha256": "270f15e92b058efdb407ae2da2195343030719231fbcc214d8adcb1314b78b8b" + }, + { + "bytes": 115719, + "path": "samples/avif_q70_protected_high/pm4-047-fc09cfd4.png", + "sha256": "3004ef73e8cb89bc4e007af79b2ca9a4675eba98c3e12d4489518cf4bb5c2963" + }, + { + "bytes": 120196, + "path": "samples/avif_q70_protected_high/pm4-048-e270315e.png", + "sha256": "6ac19a306007415f2c90acc4e612047bff5de9edeb1fdc2029fc00c3ebd6bfbb" + }, + { + "bytes": 114132, + "path": "samples/avif_q70_protected_high/pm4-049-85579bcd.png", + "sha256": "d5c0e179e7c91fd1c65d02242b391a7747c2cbe34eae62f5eccdf597462f1758" + }, + { + "bytes": 117182, + "path": "samples/avif_q70_protected_high/pm4-050-c3e45c01.png", + "sha256": "5593f8a02cb27fa6cc9c7404d51d7d9261ed9e124db48e1b5f95161a767ddc04" + }, + { + "bytes": 94539, + "path": "samples/avif_q70_protected_high/pm4-051-093f1478.png", + "sha256": "6e34ebf37a09da8eab90ee45c824ee746fd63572c7513916b0a9715481fca48b" + }, + { + "bytes": 110172, + "path": "samples/avif_q70_protected_high/pm4-052-03bbf4ac.png", + "sha256": "525c799640436576a61859adb54a8988a7e418197032b4483b8d4926126c59e1" + }, + { + "bytes": 116148, + "path": "samples/avif_q70_protected_high/pm4-053-0c5b1381.png", + "sha256": "73482fe93ea6b01c949e6266c88bb16f0bff71af09c8bb0725177ede4e8c4b83" + }, + { + "bytes": 126204, + "path": "samples/avif_q70_protected_high/pm4-054-92b0a67d.png", + "sha256": "e4fccfbb1227caa5092084ce0001df88b5139ca077476869bf67ef78fb2a43ed" + }, + { + "bytes": 106020, + "path": "samples/avif_q70_protected_high/pm4-055-ac372623.png", + "sha256": "bf8ecfa4bedef379a97ec19f9811f7b1f776a82bf0f44a41fb761af184a29342" + }, + { + "bytes": 105562, + "path": "samples/avif_q70_protected_high/pm4-056-ee005598.png", + "sha256": "641c86e85354e3e19f5fcd8f1513744b65bf0b4c37c2a82cb94820404e7323cc" + }, + { + "bytes": 120325, + "path": "samples/avif_q70_protected_high/pm4-057-8ac12393.png", + "sha256": "141dce7d2e8d2c473ab898acf77f1e870651237fdd7b2001c61c35533623454a" + }, + { + "bytes": 106431, + "path": "samples/avif_q70_protected_high/pm4-058-b655d991.png", + "sha256": "e6646b7a3744ff41ebc85d1109764593538d5d8f2aa5dfe6b925c9a31a474db5" + }, + { + "bytes": 107486, + "path": "samples/avif_q70_protected_high/pm4-059-7d5da4fb.png", + "sha256": "c8d992ed9f40358f6ae57223ac61c84a9e3790fddf7a2667379d210ff44efd8a" + }, + { + "bytes": 96924, + "path": "samples/avif_q70_protected_high/pm4-060-9ea3ad52.png", + "sha256": "b0fdacd7f51c4a11c567a7ed494bb35829b5b2574b165819ec202e17e49a22de" + }, + { + "bytes": 110147, + "path": "samples/avif_q70_protected_high/pm4-061-3e32cfca.png", + "sha256": "32efb98b58cd7850ff90294f22dce6a88c34e1340a78d86e1cb9a06241b5842c" + }, + { + "bytes": 116023, + "path": "samples/avif_q70_protected_high/pm4-062-4e57bc1c.png", + "sha256": "b9cd716cf1c3e0be8ba511434ea12f701e84c48355b09c44a61299f576c58974" + }, + { + "bytes": 101644, + "path": "samples/avif_q70_protected_high/pm4-063-a4e09271.png", + "sha256": "940f05ff3baee6c801900c880732960f7d31cb25e7be5968596b80642fbafc2b" + }, + { + "bytes": 124343, + "path": "samples/avif_q70_protected_high/pm4-064-2264c7eb.png", + "sha256": "cd6216ce0b751c89a877cbb96cf006058963d490a248668f4a7a0d065b063fa4" + }, + { + "bytes": 121561, + "path": "samples/avif_q70_protected_high/pm4-065-1cab116c.png", + "sha256": "df2391d40c30ebd24f01904c378b280c52b7869646c686c277591bca006457e0" + }, + { + "bytes": 102940, + "path": "samples/avif_q70_protected_high/pm4-066-da57563c.png", + "sha256": "7b56da02fe22df4d94772d47e85badd2f5fc187341cf5e243d39bd4832d7e7b6" + }, + { + "bytes": 123656, + "path": "samples/avif_q70_protected_high/pm4-067-ef873e98.png", + "sha256": "0a62e49f7bd5bf5f6b05767e360686d2cebd04b57e51c7cacd47ad723530af8b" + }, + { + "bytes": 118415, + "path": "samples/avif_q70_protected_high/pm4-068-fbe210a2.png", + "sha256": "13eeba7661d34984ece34710b995856cc4ac64d211a317d9a5fb5150dd792436" + }, + { + "bytes": 122311, + "path": "samples/avif_q70_protected_high/pm4-069-cacdab19.png", + "sha256": "d6dde59c781cbdfdf08ed75fa9def3dd7498db16de3c251ec990617bde707527" + }, + { + "bytes": 119184, + "path": "samples/avif_q70_protected_high/pm4-070-691aa003.png", + "sha256": "7deb3234b6f6ca71594970e48623839dac6e103160b68f16468730e21e0478cd" + }, + { + "bytes": 114798, + "path": "samples/avif_q70_protected_high/pm4-071-b9fe92b0.png", + "sha256": "05757d6e32641b780af3d5ee20e357621dbc53fd76dc6c65ce5dd56b79f4c949" + }, + { + "bytes": 122617, + "path": "samples/avif_q70_protected_high/pm4-072-4a0cff0c.png", + "sha256": "cff756fbd9d92c4eededae09efaee17935aea73793e9775c1b327fb33c3211b5" + }, + { + "bytes": 104081, + "path": "samples/avif_q70_protected_high/pm4-073-6ec086e0.png", + "sha256": "18ac34761d81351afc75c5da534204be22c9de6c247b3f9ff59ac71edb0af4b8" + }, + { + "bytes": 113379, + "path": "samples/avif_q70_protected_high/pm4-074-796fd1d3.png", + "sha256": "f21b100df39a73c13bb0ab8578278926b3fe046a0118219c032881337003efaf" + }, + { + "bytes": 88575, + "path": "samples/avif_q70_protected_high/pm4-075-3906d66e.png", + "sha256": "0ce0c0d3e98ad0590bf4cb7b77650c2e26271aeeee4cf5a9583bca3270862bb2" + }, + { + "bytes": 104617, + "path": "samples/avif_q70_protected_high/pm4-076-a577a15d.png", + "sha256": "5196eeb7ad53c6b20476198b475aecce62ad0a6c72f0bbdd4644f89493c3e9da" + }, + { + "bytes": 103245, + "path": "samples/avif_q70_protected_high/pm4-077-7fa689ad.png", + "sha256": "865da8bc45257adf7158efeb1fb445f835f020c43f8dbb83180249bd9b096ddc" + }, + { + "bytes": 94344, + "path": "samples/avif_q70_protected_high/pm4-078-a77b762e.png", + "sha256": "2f61bcbe4fe19516a1dade0285c21980864dac7d85cda55e0c8fe9f07579d88d" + }, + { + "bytes": 108911, + "path": "samples/avif_q70_protected_high/pm4-079-5e8f0ede.png", + "sha256": "0b226b83f0626395d3900ab933cc4b54d25120a1b1c49a39997130fbd1fa6980" + }, + { + "bytes": 88712, + "path": "samples/avif_q70_protected_high/pm4-080-78dedcb6.png", + "sha256": "09120f16d1c5cde4dce15a28f7982e206f1743824851bd5eba0ff4b8996418fe" + }, + { + "bytes": 105536, + "path": "samples/avif_q70_protected_high/pm4-081-5b17a851.png", + "sha256": "05e2a1bf87287dc5a439dac1e7412e42bac4260c2880435f515e3b54bf2e706d" + }, + { + "bytes": 97470, + "path": "samples/avif_q70_protected_high/pm4-082-6adb4a49.png", + "sha256": "b2051186f4f62ccdf3e8d05242303ff4945a5daef76a736f838fba4d0659783e" + }, + { + "bytes": 121814, + "path": "samples/avif_q70_protected_high/pm4-083-02dc5c51.png", + "sha256": "746fa4a862c7f00420127c3494168adffaed19bd63f725113baf1d91a57b3317" + }, + { + "bytes": 115652, + "path": "samples/avif_q70_protected_high/pm4-084-06ed218a.png", + "sha256": "156b5041e25dd875fda033fd91ef6ec38c67f2789d73b98d19f16aa962dda169" + }, + { + "bytes": 121879, + "path": "samples/avif_q70_protected_high/pm4-085-84317ff5.png", + "sha256": "b4ae5bd32c33fcd638c0e59eba1ed15d1c917839075120154991d5607d622c07" + }, + { + "bytes": 103561, + "path": "samples/avif_q70_protected_high/pm4-086-90e23232.png", + "sha256": "5569a22b3f227af4c4266b0fd129773d7012ec4a8fcb1fa278eb8cfe85cef51b" + }, + { + "bytes": 100551, + "path": "samples/avif_q70_protected_high/pm4-087-34bf26a1.png", + "sha256": "ab0de8516ad7a76b747adeceb41f78b3c56553372a4e56852999d4c8a6c0d63a" + }, + { + "bytes": 110024, + "path": "samples/avif_q70_protected_high/pm4-088-92a9c223.png", + "sha256": "350387a36b6b7178bc9159c53720cfd33a4b03ae7f930730b1cc3d24ec6d6a11" + }, + { + "bytes": 97499, + "path": "samples/avif_q70_protected_high/pm4-089-60ad56aa.png", + "sha256": "6e1e5cbc6d7f6efe86f7a050650c096c430963b010ee6fc41c994f475694590c" + }, + { + "bytes": 88049, + "path": "samples/avif_q70_protected_high/pm4-090-c71ebd94.png", + "sha256": "e9e34c90d92b99faddcf0b4c9a40acae9ecdeb6d0ba321239511cfdbd3ae50e1" + }, + { + "bytes": 132593, + "path": "samples/avif_q70_protected_high/pm4-091-c428ceb2.png", + "sha256": "30cf18859b19122523f75de4ad55501d889fc62c6c76bc3a0bed8401b1cbf30f" + }, + { + "bytes": 111144, + "path": "samples/avif_q70_protected_high/pm4-092-cc02ddf9.png", + "sha256": "78564505b3f7a1fd205f0ba9226d847163746b68bc87fb34a2b5d36c8335af2c" + }, + { + "bytes": 129487, + "path": "samples/avif_q70_protected_high/pm4-093-53b39ad0.png", + "sha256": "907a479bcbc38c8c144ab9816d138346a963381a3af3d58d373a176684e5cd50" + }, + { + "bytes": 107933, + "path": "samples/avif_q70_protected_high/pm4-094-dd71e13d.png", + "sha256": "6eef2e31aa518a4b72df2c8c4073eef9a67f6457f8e0dffa35accb9d8c27dcea" + }, + { + "bytes": 106559, + "path": "samples/avif_q70_protected_high/pm4-095-13e2d4a2.png", + "sha256": "c249e088f53a61d7532aa1898f36109b68d3a868ebb00ad74963446d9364f210" + }, + { + "bytes": 117394, + "path": "samples/avif_q70_protected_high/pm4-096-95b0203e.png", + "sha256": "043083f27b9233b9b7f449135b4dd9975a1a52bc669b7a147738922c43403cdc" + }, + { + "bytes": 72509, + "path": "samples/avif_q70_protected_high/pm4-097-0b860832.png", + "sha256": "267cab1de57abea69cd9c0eb09ccd51fb6782f7c0d2879c9d48fecdb9fca547b" + }, + { + "bytes": 101249, + "path": "samples/avif_q70_protected_high/pm4-098-b03251b5.png", + "sha256": "6414c397bd8a541ce6a12c5a2e071ad463942e5263b16a78ffaa73a2b31bfa9b" + }, + { + "bytes": 115517, + "path": "samples/avif_q70_protected_high/pm4-099-d947f488.png", + "sha256": "4ea756b81b098f8d490c15736cf9a125168ddc49221b9ea71e0c2b7c2d4c63fe" + }, + { + "bytes": 106297, + "path": "samples/avif_q70_protected_high/pm4-100-5e269fc4.png", + "sha256": "e762d46230c91551f1000d8d9633854c89a620a94ba0f37927c29882e4da31bf" + }, + { + "bytes": 103179, + "path": "samples/jpeg_q100_protected_high/pm4-001-cca08f5b.png", + "sha256": "cf6b0c83e4f0422cf23376ffa9644135837e0ff9f2b1365afef53f296f163439" + }, + { + "bytes": 98756, + "path": "samples/jpeg_q100_protected_high/pm4-002-effb6eaa.png", + "sha256": "41b89513c6e8a1727dbf7785809e49f04a53646747851ce3ed300fb92935439b" + }, + { + "bytes": 100415, + "path": "samples/jpeg_q100_protected_high/pm4-003-46e10145.png", + "sha256": "d0828d8d6b3cd7eefab22fa24a7a1e957acb0e66ac7f344a6c2195884fc7228f" + }, + { + "bytes": 118176, + "path": "samples/jpeg_q100_protected_high/pm4-004-ab14afb8.png", + "sha256": "e04f81f312299458cd01a6b59a34080b7c8dde3aa2b9b10d06b95504834a51ea" + }, + { + "bytes": 115364, + "path": "samples/jpeg_q100_protected_high/pm4-005-5e9b5a50.png", + "sha256": "f21397962ef5dd0f9ca1ce87a8e84759634752a989570d84b8b490061efe3509" + }, + { + "bytes": 101206, + "path": "samples/jpeg_q100_protected_high/pm4-006-44a2087e.png", + "sha256": "c4081a185fe054cae47079669ddb4858107b97ff5f50ed61dca608556198d4eb" + }, + { + "bytes": 110679, + "path": "samples/jpeg_q100_protected_high/pm4-007-5003533d.png", + "sha256": "56cafab9cd1998f5eb28131d20feae996d32af271b2c9edf8dcf65169188e0b5" + }, + { + "bytes": 110498, + "path": "samples/jpeg_q100_protected_high/pm4-008-54647723.png", + "sha256": "0e1b11d5e23654445b20c92fe007e3a8d690c0504b460e7fd548ccf30d032951" + }, + { + "bytes": 113915, + "path": "samples/jpeg_q100_protected_high/pm4-009-e51903e1.png", + "sha256": "89d28a42e5ea686c58a82f1feef5f7e85b3149d2d4bb41399a359b361b431185" + }, + { + "bytes": 102369, + "path": "samples/jpeg_q100_protected_high/pm4-010-97841ad3.png", + "sha256": "5eef3c5e2ba81617f5012a25737e3d7a1a1dcca3db361f39e754c1d57dc44b4f" + }, + { + "bytes": 116312, + "path": "samples/jpeg_q100_protected_high/pm4-011-c900b313.png", + "sha256": "71af96d7960f8d6041df5ec7acfb314cdb1ed6660663e26163757a452cfec137" + }, + { + "bytes": 107737, + "path": "samples/jpeg_q100_protected_high/pm4-012-98171122.png", + "sha256": "242ada11901d6a8ef7ca700f21a7fa0d97ef29220928ec71a4d91dce5aa66b16" + }, + { + "bytes": 122350, + "path": "samples/jpeg_q100_protected_high/pm4-013-d58e7b01.png", + "sha256": "016888c54d0669e3b40b2464efd2d2d68fa64432f5c1c09fec81a6adfd52bf25" + }, + { + "bytes": 116714, + "path": "samples/jpeg_q100_protected_high/pm4-014-8876ccfb.png", + "sha256": "dbff987f832b38df8d7a16b5cec4ee4aa9c02e027e1d092f8e63505f2d42aa75" + }, + { + "bytes": 108033, + "path": "samples/jpeg_q100_protected_high/pm4-015-8fe08e47.png", + "sha256": "cd257a82322fd7a36ea6172148bad2e76177a60f0e41e634f5467265d36bbea9" + }, + { + "bytes": 94987, + "path": "samples/jpeg_q100_protected_high/pm4-016-fd1eb48d.png", + "sha256": "0daa862837119d73ab939754fa09e8dca9ce6a48e8b18e523e503331f80c37fd" + }, + { + "bytes": 104878, + "path": "samples/jpeg_q100_protected_high/pm4-017-7f335742.png", + "sha256": "959121ef3e730b5e37aaab4b07f7eb0bbbde50571b78e2b3390cff2c393265da" + }, + { + "bytes": 120184, + "path": "samples/jpeg_q100_protected_high/pm4-018-4ea91357.png", + "sha256": "dbfdeb1a2039d3f35bf51540f476303df65f1e299a7c52c58551075f497eb769" + }, + { + "bytes": 123838, + "path": "samples/jpeg_q100_protected_high/pm4-019-f7070d02.png", + "sha256": "5f161a4c377010ca2c2fa4605d06e83babcebc4fe4bb046035c5c7a7b94cb555" + }, + { + "bytes": 113629, + "path": "samples/jpeg_q100_protected_high/pm4-020-d8e94e65.png", + "sha256": "0bf703983000c2456d2d9db01eed589d74ba5446e39cdd7ac174550158919b3e" + }, + { + "bytes": 139476, + "path": "samples/jpeg_q100_protected_high/pm4-021-2da79c09.png", + "sha256": "a870dc30f975034384363ca1744eb268ae92f0a5dbe44a8759e6059848068d0d" + }, + { + "bytes": 114216, + "path": "samples/jpeg_q100_protected_high/pm4-022-b8b11cb8.png", + "sha256": "5985d5243a9d3717b4acde7c6d2a34a8969e15f6559041adc15158c74d2ca728" + }, + { + "bytes": 108981, + "path": "samples/jpeg_q100_protected_high/pm4-023-0eb7f66d.png", + "sha256": "56745c2005515df3029a16cbe74e48fe7e041f454d1ed3a232b67a67318a6df5" + }, + { + "bytes": 120082, + "path": "samples/jpeg_q100_protected_high/pm4-024-56de999a.png", + "sha256": "1bf6e26639e5a736e85ef9133e9c0a0c9d22c2f791141eb39a997a8c056ce0c9" + }, + { + "bytes": 111420, + "path": "samples/jpeg_q100_protected_high/pm4-025-ef6349d3.png", + "sha256": "0d42487250576b6969c4d032d4cc5f234f05064511fdf83f709b43074c6a8952" + }, + { + "bytes": 103195, + "path": "samples/jpeg_q100_protected_high/pm4-026-ad193361.png", + "sha256": "7921b56876ea0aa42c548137d808149aae583d3057cfa21b54574ef7a408df52" + }, + { + "bytes": 114857, + "path": "samples/jpeg_q100_protected_high/pm4-027-becf10ea.png", + "sha256": "1570f0a99e011d9971c6a4e480699685f251db975b4a023dc8b75d4cefc9f796" + }, + { + "bytes": 112507, + "path": "samples/jpeg_q100_protected_high/pm4-028-b56d212e.png", + "sha256": "15892dc1929f40351038b6730ffa98cc26412bc0483e68d23495ded1afa5d7c1" + }, + { + "bytes": 105548, + "path": "samples/jpeg_q100_protected_high/pm4-029-95eb9f34.png", + "sha256": "09c3fb51f2ac67dd130a53df9e09947dded07ab3ae83c1185b980553314e068a" + }, + { + "bytes": 122176, + "path": "samples/jpeg_q100_protected_high/pm4-030-2b63f9ba.png", + "sha256": "8ae8488a1c806f84ed34e280c4f25f22fd091466ecfeb2dd6c4bfa26ec5ce7b7" + }, + { + "bytes": 119378, + "path": "samples/jpeg_q100_protected_high/pm4-031-844a8814.png", + "sha256": "9ca23f35576d303f69bcfb9b0f65c5c81dee0493030d35d73403099f477d9ee4" + }, + { + "bytes": 112666, + "path": "samples/jpeg_q100_protected_high/pm4-032-42ee9a0f.png", + "sha256": "4ed8c85eba2008f841f016cca2604bb348ec7c16bff5f0318b63541262c890f1" + }, + { + "bytes": 108384, + "path": "samples/jpeg_q100_protected_high/pm4-033-b5e58e7f.png", + "sha256": "395c90c215d26711103ed6b9d865231b6f8937f8cb22bf61e13e2c5fe9f095f8" + }, + { + "bytes": 109878, + "path": "samples/jpeg_q100_protected_high/pm4-034-a383c38f.png", + "sha256": "a22076c2a2722a91d7e75caf30e666321e933726cc0ee4caabf93e2d99541d95" + }, + { + "bytes": 110576, + "path": "samples/jpeg_q100_protected_high/pm4-035-f3b99568.png", + "sha256": "c9fb15ee8f0f974e5332c5b21bad7ad5aec10362db0042578e54c4a4ef0f1112" + }, + { + "bytes": 112129, + "path": "samples/jpeg_q100_protected_high/pm4-036-71932e79.png", + "sha256": "97a816f8da4fc640039d2c17a493fb755b4e40594ece2ab041850eed7dcc6cf8" + }, + { + "bytes": 121816, + "path": "samples/jpeg_q100_protected_high/pm4-037-9515174e.png", + "sha256": "6e547bbbad8e82d78098c13404bf7aef78f6304232f6ceaf37512f20e5b409a0" + }, + { + "bytes": 111747, + "path": "samples/jpeg_q100_protected_high/pm4-038-335a27fa.png", + "sha256": "54f5f46e2c393971af343baef2397212a4d109406d9158e4ccd6623e004f9ac9" + }, + { + "bytes": 110280, + "path": "samples/jpeg_q100_protected_high/pm4-039-066bcab1.png", + "sha256": "03ae10b13071f79b651f9b1af59baa999ab9382846ef36551eacdbb6152f81f7" + }, + { + "bytes": 118082, + "path": "samples/jpeg_q100_protected_high/pm4-040-eca2f1c2.png", + "sha256": "9a6ae5538fc2b40a340cb100b3e22b070b6abb4ec823e0e731ed3f57cdc49b84" + }, + { + "bytes": 117696, + "path": "samples/jpeg_q100_protected_high/pm4-041-7ac2f16a.png", + "sha256": "511eea28b5bba4546221e99baeb4076fd2c69ebc582ab45f3508507253d37b25" + }, + { + "bytes": 128972, + "path": "samples/jpeg_q100_protected_high/pm4-042-f7a87ffa.png", + "sha256": "81db7d9957f02caeb672dd63acf6195e1ce91cb2d35d672b0deee591b6faa0a7" + }, + { + "bytes": 108163, + "path": "samples/jpeg_q100_protected_high/pm4-043-cde8ad90.png", + "sha256": "a5226ae0f37350ab72ebc44c5d0618bfb30a70b6bb46ae6cccf701e06d3f9a2b" + }, + { + "bytes": 112358, + "path": "samples/jpeg_q100_protected_high/pm4-044-93deb087.png", + "sha256": "66ae76deb16a219849dd103b474393e31fcd1015d56132181b0c99540bc26258" + }, + { + "bytes": 113353, + "path": "samples/jpeg_q100_protected_high/pm4-045-25fa16bb.png", + "sha256": "96ae9620877a8a6e50ee641c8c3b94549c9508a54f2648d422080885945d7d74" + }, + { + "bytes": 108715, + "path": "samples/jpeg_q100_protected_high/pm4-046-bec80a2b.png", + "sha256": "82b2e9da9baf84536e6e7c146bc7bfacf23bb10913604e406a948f90f8eeabb4" + }, + { + "bytes": 115915, + "path": "samples/jpeg_q100_protected_high/pm4-047-fc09cfd4.png", + "sha256": "e48d4139d98c6e22c528039c78fa4f0aa5e0a68c9948eea857621841da4db07d" + }, + { + "bytes": 119973, + "path": "samples/jpeg_q100_protected_high/pm4-048-e270315e.png", + "sha256": "ae688bcd45b09dd442b381f20691af92ba4ae0837d3989f67ee18d1cb717a46d" + }, + { + "bytes": 113530, + "path": "samples/jpeg_q100_protected_high/pm4-049-85579bcd.png", + "sha256": "3d65551358b36eb46d1116151aefe6691c893ba365f529325d6a838e58fef167" + }, + { + "bytes": 117134, + "path": "samples/jpeg_q100_protected_high/pm4-050-c3e45c01.png", + "sha256": "3e5bced3fdf5b34a9d197b2d74eb44dbbd51f74da4171727d6b1cd60e7e230b5" + }, + { + "bytes": 94113, + "path": "samples/jpeg_q100_protected_high/pm4-051-093f1478.png", + "sha256": "a87684bc1a56140149545567f652c41b2269573cb676343a3a5705c52e061e41" + }, + { + "bytes": 110194, + "path": "samples/jpeg_q100_protected_high/pm4-052-03bbf4ac.png", + "sha256": "6c7249272f7239510088283b2accf33083df120ab1122ab072092771c9d23745" + }, + { + "bytes": 116218, + "path": "samples/jpeg_q100_protected_high/pm4-053-0c5b1381.png", + "sha256": "be202f4a93077a907507019ba488c2d1bcde863ea5991fdc9e9b4ccd0223c987" + }, + { + "bytes": 126264, + "path": "samples/jpeg_q100_protected_high/pm4-054-92b0a67d.png", + "sha256": "c5630b73b91f9788a39aadd0a293d5f145d7ecbcf1077368294a9841ed165145" + }, + { + "bytes": 106414, + "path": "samples/jpeg_q100_protected_high/pm4-055-ac372623.png", + "sha256": "1c2d8aa67ef8d70322cb7b87922cf8d809c6dc887dfef1d5ac24f19db1d291c6" + }, + { + "bytes": 105712, + "path": "samples/jpeg_q100_protected_high/pm4-056-ee005598.png", + "sha256": "9fdccf70384e9fe30dd8bd5e7fbb70d20bae2aa493996d1ab3bf141695d2dcc0" + }, + { + "bytes": 120407, + "path": "samples/jpeg_q100_protected_high/pm4-057-8ac12393.png", + "sha256": "4b9f3b42b5d7920f805f10e9077debda004d112ee29e676d7546320d4921b20f" + }, + { + "bytes": 106363, + "path": "samples/jpeg_q100_protected_high/pm4-058-b655d991.png", + "sha256": "092788491fc1af55f39f6f6c6a3ba2bd0b47b5c01845b873969bccc4322ce625" + }, + { + "bytes": 108065, + "path": "samples/jpeg_q100_protected_high/pm4-059-7d5da4fb.png", + "sha256": "8f7490ca56d238e8d73b37a6586fbba2615f384da918135f5eb6a5e89b1054af" + }, + { + "bytes": 96514, + "path": "samples/jpeg_q100_protected_high/pm4-060-9ea3ad52.png", + "sha256": "324c914096f9543ba05398339ec33f04e0cf5f67b1b9bea322a4c9a367594616" + }, + { + "bytes": 109813, + "path": "samples/jpeg_q100_protected_high/pm4-061-3e32cfca.png", + "sha256": "44091b036febef62cdfd49b3ecfaeda1650a73ab16b2a167a65789e83f4a8290" + }, + { + "bytes": 116197, + "path": "samples/jpeg_q100_protected_high/pm4-062-4e57bc1c.png", + "sha256": "85bb2a7de0fd71222c442e66dbb3ab1dbadc008177a3a329fc6209cf57e76b73" + }, + { + "bytes": 101487, + "path": "samples/jpeg_q100_protected_high/pm4-063-a4e09271.png", + "sha256": "71a75afe9c52ecada885582cca367c64d7512ed437897b0ac7bb3ca5c95f6425" + }, + { + "bytes": 124083, + "path": "samples/jpeg_q100_protected_high/pm4-064-2264c7eb.png", + "sha256": "a236fc6c4f3ca85e9f1c8ea4202db74511674562087ac7c05f2a281a0a5c5c29" + }, + { + "bytes": 121526, + "path": "samples/jpeg_q100_protected_high/pm4-065-1cab116c.png", + "sha256": "73edf2a01700fc950f003b8f2c0dd460a34bb5c10f1f26f8cce381b1515de14f" + }, + { + "bytes": 103019, + "path": "samples/jpeg_q100_protected_high/pm4-066-da57563c.png", + "sha256": "90e8a3ae2fb5398207900ffe8dbfdf66de66adf1843f6103ff885da792cd615b" + }, + { + "bytes": 123557, + "path": "samples/jpeg_q100_protected_high/pm4-067-ef873e98.png", + "sha256": "10731e90bd8e2b3a7460f752bda5d267933ba37812d1fd31fd586ee2b63e9ee8" + }, + { + "bytes": 118346, + "path": "samples/jpeg_q100_protected_high/pm4-068-fbe210a2.png", + "sha256": "ae9b434a145fdc3b57b24d37be53b6a71b04b122482b7be7708b5cbe40db002e" + }, + { + "bytes": 122382, + "path": "samples/jpeg_q100_protected_high/pm4-069-cacdab19.png", + "sha256": "b16aeb9c39115d8b2255e7a767d7340c30aab9d156327b603463a83592d09205" + }, + { + "bytes": 119125, + "path": "samples/jpeg_q100_protected_high/pm4-070-691aa003.png", + "sha256": "9781fb31286ddc86c8aa97bd4be34b47920260fce9a05145d942b020aeb57093" + }, + { + "bytes": 115133, + "path": "samples/jpeg_q100_protected_high/pm4-071-b9fe92b0.png", + "sha256": "4fb92af25f5caf908df0756010daed51d0b430553c4ee0cecf8aca7c28a40ee4" + }, + { + "bytes": 122295, + "path": "samples/jpeg_q100_protected_high/pm4-072-4a0cff0c.png", + "sha256": "0ace033b16d1d4382126292491bfcbbc63325db0296b092e2333b52bfbb878b7" + }, + { + "bytes": 103785, + "path": "samples/jpeg_q100_protected_high/pm4-073-6ec086e0.png", + "sha256": "0d04cd07ade4d3b1078e34791ef29f961677b118ae9e393ab4a40d6c6dcb2461" + }, + { + "bytes": 113862, + "path": "samples/jpeg_q100_protected_high/pm4-074-796fd1d3.png", + "sha256": "15886ef16ff089505c6f3324cfd7afeeeb9276f774ef668bec2bd1cf895b00f2" + }, + { + "bytes": 88487, + "path": "samples/jpeg_q100_protected_high/pm4-075-3906d66e.png", + "sha256": "dc72893bd7ab56f9a2dd7c49f5dd6a89b73307a8929d8661d32c56644a917b61" + }, + { + "bytes": 107908, + "path": "samples/jpeg_q100_protected_high/pm4-076-a577a15d.png", + "sha256": "d4b490ab4380838eabed9ff892e8f488dedf0966cc7e97358eaddecdb9f18872" + }, + { + "bytes": 103289, + "path": "samples/jpeg_q100_protected_high/pm4-077-7fa689ad.png", + "sha256": "1e50f7c79636a917e19aa07bf939fd49a08e6219ddf839a033d3fc0a4b8959bb" + }, + { + "bytes": 94188, + "path": "samples/jpeg_q100_protected_high/pm4-078-a77b762e.png", + "sha256": "994dd8cb78037963339143f00bd1b1465a1e2c56bb06906069dea463611d827f" + }, + { + "bytes": 108894, + "path": "samples/jpeg_q100_protected_high/pm4-079-5e8f0ede.png", + "sha256": "d2105c7113568af70db58c21250e910c518b490731258ae779afce31b7260284" + }, + { + "bytes": 88787, + "path": "samples/jpeg_q100_protected_high/pm4-080-78dedcb6.png", + "sha256": "2ea547f2064af38ae84013a7f27c92d52e793d1c92aa8b6315b6861bbc141c9b" + }, + { + "bytes": 105596, + "path": "samples/jpeg_q100_protected_high/pm4-081-5b17a851.png", + "sha256": "a9ffd9682aeeeb190a2b2736a2a4740a239a260c76fc5c83ad4015101c27f41e" + }, + { + "bytes": 97599, + "path": "samples/jpeg_q100_protected_high/pm4-082-6adb4a49.png", + "sha256": "2e05fa2c33a616dae394bf9252c7d48b8a3213d3b15b49f79c2fc76eee8b4d96" + }, + { + "bytes": 121731, + "path": "samples/jpeg_q100_protected_high/pm4-083-02dc5c51.png", + "sha256": "6332d996ff8dead4d5db8753d194f42f9e7e5ac2ffbcedcd023ac5e54b381c18" + }, + { + "bytes": 115602, + "path": "samples/jpeg_q100_protected_high/pm4-084-06ed218a.png", + "sha256": "4960bcfea902acd307ad3a0aa5fab2f5f142dba3bfa2cbe0af6d178203a9131f" + }, + { + "bytes": 121909, + "path": "samples/jpeg_q100_protected_high/pm4-085-84317ff5.png", + "sha256": "38c8b5670ba48c64baee942b5c40a95a92dfadc8c0c9107818eebbe499ea7d5a" + }, + { + "bytes": 103684, + "path": "samples/jpeg_q100_protected_high/pm4-086-90e23232.png", + "sha256": "ea64b366d31d7e8cd03671368ca9d07a011852b6dcbc6dd0ff0b9d3172135900" + }, + { + "bytes": 100789, + "path": "samples/jpeg_q100_protected_high/pm4-087-34bf26a1.png", + "sha256": "b9825fec79f24eb2a4103719ec603f03d51e902e381ed4d273277e6d93e333c9" + }, + { + "bytes": 110263, + "path": "samples/jpeg_q100_protected_high/pm4-088-92a9c223.png", + "sha256": "54acc418e18a8852a0d000510a27ab5354f846b1ec3d4628ca5825faa925f113" + }, + { + "bytes": 97588, + "path": "samples/jpeg_q100_protected_high/pm4-089-60ad56aa.png", + "sha256": "e696b876766d4e5607684e36c387a9621a286e17b9f62fc842c6e3e0ab06d292" + }, + { + "bytes": 88319, + "path": "samples/jpeg_q100_protected_high/pm4-090-c71ebd94.png", + "sha256": "1b450f0cef4b0a41f25dad0617f44555dd0ef522de64e8e9e89a89da14246aa6" + }, + { + "bytes": 132419, + "path": "samples/jpeg_q100_protected_high/pm4-091-c428ceb2.png", + "sha256": "a02083301cf1e0d46b557fa162299ba43bfd74682100c147280c0b7bc989968e" + }, + { + "bytes": 110901, + "path": "samples/jpeg_q100_protected_high/pm4-092-cc02ddf9.png", + "sha256": "774809e728936a63642eecf205f21e7e0c8a948be29552931bab4a9de2cffc68" + }, + { + "bytes": 129141, + "path": "samples/jpeg_q100_protected_high/pm4-093-53b39ad0.png", + "sha256": "ef5c940995a99eab58c884cfa9c8bc8b345e48fb87d0da4921dca4a23e3836eb" + }, + { + "bytes": 107446, + "path": "samples/jpeg_q100_protected_high/pm4-094-dd71e13d.png", + "sha256": "3822c4453aef2a7343210c8060d24e17563e1a9929140a5ad90d570871a18d83" + }, + { + "bytes": 106691, + "path": "samples/jpeg_q100_protected_high/pm4-095-13e2d4a2.png", + "sha256": "2ec0d0155ee0faee473c285a7076f789784030c256defff5d203c33c7f80dc60" + }, + { + "bytes": 117617, + "path": "samples/jpeg_q100_protected_high/pm4-096-95b0203e.png", + "sha256": "fd3bb0ea997d8c8cb8dd30b42ee578328ea6b0ff2a59e5ec8a2c3df1b421fc21" + }, + { + "bytes": 73147, + "path": "samples/jpeg_q100_protected_high/pm4-097-0b860832.png", + "sha256": "08e8086c8d4c85d7b9f7f9faa236a1a0764a716227df46c9a6cadda82f231e97" + }, + { + "bytes": 101364, + "path": "samples/jpeg_q100_protected_high/pm4-098-b03251b5.png", + "sha256": "97d572f1610d239711dff7bc6b319f2d7db1f425baa1301af8b4d55c8cb6366e" + }, + { + "bytes": 115344, + "path": "samples/jpeg_q100_protected_high/pm4-099-d947f488.png", + "sha256": "581ccaad305709f6d21938409269e24084faa79d2c973c07ba05046133363d1e" + }, + { + "bytes": 106310, + "path": "samples/jpeg_q100_protected_high/pm4-100-5e269fc4.png", + "sha256": "24df188ec329d3f9e6bd005c2663bf9a1874e42e8e3606764e7cb570b8861952" + }, + { + "bytes": 111459, + "path": "samples/jpeg_q100_repair_zero/pm4-001-cca08f5b.png", + "sha256": "7aff3631c3b3636be8f7b7a8e8b5d60197db086f223b3f08e7ad45fcc291e869" + }, + { + "bytes": 107079, + "path": "samples/jpeg_q100_repair_zero/pm4-002-effb6eaa.png", + "sha256": "4be2c550cf05cddf7bf7e2603d88bb9fec36a4c25b5acf7175e8eddd1f9ba06b" + }, + { + "bytes": 122666, + "path": "samples/jpeg_q100_repair_zero/pm4-003-46e10145.png", + "sha256": "ec796f501b70c36d1f3d3b75d8657fe5848004ccc17882f7812b198818a49e77" + }, + { + "bytes": 117333, + "path": "samples/jpeg_q100_repair_zero/pm4-004-ab14afb8.png", + "sha256": "ccd015b31cdc2a7589ddce8e190b28ef579a895cbf6519115d4ec5f801d27197" + }, + { + "bytes": 125942, + "path": "samples/jpeg_q100_repair_zero/pm4-005-5e9b5a50.png", + "sha256": "10f9249babace85353beb6e053767830a1e21c1b39dcd5b887888291cd474858" + }, + { + "bytes": 103459, + "path": "samples/jpeg_q100_repair_zero/pm4-006-44a2087e.png", + "sha256": "d3a5f7111df16c55485dd1e1113f4e5964303ed7944bc35fc4f2ceb5402a2a3a" + }, + { + "bytes": 112823, + "path": "samples/jpeg_q100_repair_zero/pm4-007-5003533d.png", + "sha256": "32f833e53fa09dd01098c7f0184a25a587d288079be763baa30399f5e2acb226" + }, + { + "bytes": 109691, + "path": "samples/jpeg_q100_repair_zero/pm4-008-54647723.png", + "sha256": "5f9460b3f696136edccb78226edd45d1847669a451ab96518b0eb9727b0987f9" + }, + { + "bytes": 122854, + "path": "samples/jpeg_q100_repair_zero/pm4-009-e51903e1.png", + "sha256": "843eeb2bc42cd2a0d3f093f65e64b2f374313c01eb65f26e13dfba3aa1de923a" + }, + { + "bytes": 110061, + "path": "samples/jpeg_q100_repair_zero/pm4-010-97841ad3.png", + "sha256": "88f8e778373f3994dfb4f44e167823116252a6e7d9d079fa4ad135bd6edd07f0" + }, + { + "bytes": 130483, + "path": "samples/jpeg_q100_repair_zero/pm4-011-c900b313.png", + "sha256": "0ee31a444830a8059ebf6f700647abb61b7034e615f75851c5fc5303cf12018d" + }, + { + "bytes": 123460, + "path": "samples/jpeg_q100_repair_zero/pm4-012-98171122.png", + "sha256": "e398d71975c47e4a785534badcd68724a129b8b6a24ea67ba7fa155e30246554" + }, + { + "bytes": 131654, + "path": "samples/jpeg_q100_repair_zero/pm4-013-d58e7b01.png", + "sha256": "89918ff54527a936814b3180a169b3266dc86e49bc7e85036210f408ce240b74" + }, + { + "bytes": 123477, + "path": "samples/jpeg_q100_repair_zero/pm4-014-8876ccfb.png", + "sha256": "ae455a2c02ec9583e60dca9fce2a4feda1266a859ebb3785d4c9574d03990732" + }, + { + "bytes": 115910, + "path": "samples/jpeg_q100_repair_zero/pm4-015-8fe08e47.png", + "sha256": "30ec1c58a7c0729fb7ee7a0fecd509985e124cd399773c80c1698d3cb9295443" + }, + { + "bytes": 95356, + "path": "samples/jpeg_q100_repair_zero/pm4-016-fd1eb48d.png", + "sha256": "0a07e079209cd6a1cda51b4b941ec3b9b6f3f64efaddeb1a846ef37034372cc4" + }, + { + "bytes": 124897, + "path": "samples/jpeg_q100_repair_zero/pm4-017-7f335742.png", + "sha256": "e0c3ecdf3fccb61231b562a6233fd4b274caf68f06282adfeea187f42b0984c3" + }, + { + "bytes": 113871, + "path": "samples/jpeg_q100_repair_zero/pm4-018-4ea91357.png", + "sha256": "bafb735597f2f38dd1fe4b77cbf77bf84be11f6198d566f1af762b2bf7ba056b" + }, + { + "bytes": 132125, + "path": "samples/jpeg_q100_repair_zero/pm4-019-f7070d02.png", + "sha256": "1bd9a4234508153f2bcc73eb77ee89a525c3319faa5487ebd646ef6ab12f1060" + }, + { + "bytes": 123161, + "path": "samples/jpeg_q100_repair_zero/pm4-020-d8e94e65.png", + "sha256": "aecbb1e6f1c8559b86622d84759ca844437f8d316f54eff0fb5a323572f5edc8" + }, + { + "bytes": 135381, + "path": "samples/jpeg_q100_repair_zero/pm4-021-2da79c09.png", + "sha256": "18e5dc707c80d9dae2b03c952b75213f4984a592e21ad1a6ba5d8ac32f0587b4" + }, + { + "bytes": 120939, + "path": "samples/jpeg_q100_repair_zero/pm4-022-b8b11cb8.png", + "sha256": "5036d1badcbdf7dfd47c0177452069223cf74a91ff69ead121b4487c49f99126" + }, + { + "bytes": 100753, + "path": "samples/jpeg_q100_repair_zero/pm4-023-0eb7f66d.png", + "sha256": "229135b797c2ebca07fe0999b90ac0563c06f3755aa63598e95eda55713b4602" + }, + { + "bytes": 122218, + "path": "samples/jpeg_q100_repair_zero/pm4-024-56de999a.png", + "sha256": "97b57bc0e2722114eafdd1cc60f80ec96f133fe53cebc1f021386ccc1a919196" + }, + { + "bytes": 117323, + "path": "samples/jpeg_q100_repair_zero/pm4-025-ef6349d3.png", + "sha256": "befb4397b6fe86e94875a33ed8b84b553143eb02c02587392c5207b244c6a6ad" + }, + { + "bytes": 104522, + "path": "samples/jpeg_q100_repair_zero/pm4-026-ad193361.png", + "sha256": "7f40955af1cc00b9f4a904f11cad2ed7c160899ffcb9e4a3018b75ba96a872ab" + }, + { + "bytes": 129636, + "path": "samples/jpeg_q100_repair_zero/pm4-027-becf10ea.png", + "sha256": "116e718c6aa9675690b85cfe0fb7ed680cdc612ec2012818f68b7131aaa97470" + }, + { + "bytes": 116332, + "path": "samples/jpeg_q100_repair_zero/pm4-028-b56d212e.png", + "sha256": "ab286fe19ea25ddb8930fea70e13164e440a6a214e7d5b0c25c57ed63ddb98f2" + }, + { + "bytes": 124259, + "path": "samples/jpeg_q100_repair_zero/pm4-029-95eb9f34.png", + "sha256": "d4fe78d7200a3a24fb3344d01121def0b5cbf0e1d2478732f11fddb92026793b" + }, + { + "bytes": 122131, + "path": "samples/jpeg_q100_repair_zero/pm4-030-2b63f9ba.png", + "sha256": "e25c1145d05497021b5e5fe5cc911b47c6ca83f3a3e172a52eab0b87573c4d94" + }, + { + "bytes": 125383, + "path": "samples/jpeg_q100_repair_zero/pm4-031-844a8814.png", + "sha256": "35f40267072c805dbe2f91e9751451bb6b9b54131f6dcd7f307282d307ad6f95" + }, + { + "bytes": 116131, + "path": "samples/jpeg_q100_repair_zero/pm4-032-42ee9a0f.png", + "sha256": "9b8be240927801e4809cc6c087137a4a465fe86efc75227bb250108be65d2131" + }, + { + "bytes": 108910, + "path": "samples/jpeg_q100_repair_zero/pm4-033-b5e58e7f.png", + "sha256": "f7d84faaf9a0de0e006ca05e4db19842ba7eba8ec11ade87bd3badce249645ee" + }, + { + "bytes": 111919, + "path": "samples/jpeg_q100_repair_zero/pm4-034-a383c38f.png", + "sha256": "ac261780fd5c8c9bdf6ae1ca8b8e9f926c2d28607bd1ce0a05c2a348aec24f18" + }, + { + "bytes": 124809, + "path": "samples/jpeg_q100_repair_zero/pm4-035-f3b99568.png", + "sha256": "2f82ac2f3be44c7a0767f7782d7a8e4e4970b53ab42472c650b91dbb0c40fc95" + }, + { + "bytes": 116239, + "path": "samples/jpeg_q100_repair_zero/pm4-036-71932e79.png", + "sha256": "8e525d346db70bb989bd0d81b57069da689325082a29f948b945da0e9d1523b1" + }, + { + "bytes": 129793, + "path": "samples/jpeg_q100_repair_zero/pm4-037-9515174e.png", + "sha256": "ced216aab1e55a893d6375587def4f6f2e7f11ae31a74775d365a356c1ebbd1f" + }, + { + "bytes": 113636, + "path": "samples/jpeg_q100_repair_zero/pm4-038-335a27fa.png", + "sha256": "0f0ff979110de332b3708a56142c554798d835cc71a395c3a3a4d2e93d8d1eab" + }, + { + "bytes": 121090, + "path": "samples/jpeg_q100_repair_zero/pm4-039-066bcab1.png", + "sha256": "9d6119cc82ce6c964c5cb347a13d4cd59ef2b30c1f1df50edc920bcfc1ee45d1" + }, + { + "bytes": 119289, + "path": "samples/jpeg_q100_repair_zero/pm4-040-eca2f1c2.png", + "sha256": "c748ca6a69f0977385a4da529399f4c5465b27e08b1c6bedd5bb45000c2800d7" + }, + { + "bytes": 131033, + "path": "samples/jpeg_q100_repair_zero/pm4-041-7ac2f16a.png", + "sha256": "67b20f23c679b66e0b7547b9524bdf2c8067533160b319789d65cee1a5266e8c" + }, + { + "bytes": 129459, + "path": "samples/jpeg_q100_repair_zero/pm4-042-f7a87ffa.png", + "sha256": "0eec0820c59cb07dfc4b927651e78243239af5b0c1906ea267f7b4317e27e836" + }, + { + "bytes": 124865, + "path": "samples/jpeg_q100_repair_zero/pm4-043-cde8ad90.png", + "sha256": "ca5b94a87659edd0a4172979ef2a4474d4b674e71c67eedd3217cc1c3ebe7a36" + }, + { + "bytes": 134653, + "path": "samples/jpeg_q100_repair_zero/pm4-044-93deb087.png", + "sha256": "85da43e90ca86e53934dbf929464289b6439ba532099a98f5e60790f5e635609" + }, + { + "bytes": 124271, + "path": "samples/jpeg_q100_repair_zero/pm4-045-25fa16bb.png", + "sha256": "08c8e1b82eca37424428fdf8490bb4fbc53d9285c3757c4a7b1cb5e954de1594" + }, + { + "bytes": 116844, + "path": "samples/jpeg_q100_repair_zero/pm4-046-bec80a2b.png", + "sha256": "d9305a78b6763945ba425d68404d6312993d529bb917e6e23f86c676d8b311b9" + }, + { + "bytes": 111500, + "path": "samples/jpeg_q100_repair_zero/pm4-047-fc09cfd4.png", + "sha256": "5fd69940867ebfb2448922d7f94d738598ed3f28085059d6ce2239448cdb8217" + }, + { + "bytes": 130730, + "path": "samples/jpeg_q100_repair_zero/pm4-048-e270315e.png", + "sha256": "7ec0e1994aaa686416ed5b33d035944f453f3e97af30090b8cef614c4edd2a54" + }, + { + "bytes": 127887, + "path": "samples/jpeg_q100_repair_zero/pm4-049-85579bcd.png", + "sha256": "7c5fc2b0ab92a06f90a0e424817f8603de09f8c1aace3de3c76f86fb29a20c13" + }, + { + "bytes": 123307, + "path": "samples/jpeg_q100_repair_zero/pm4-050-c3e45c01.png", + "sha256": "16ecccc7e3c1e3fb0c05b42d27611e19f712db51afce3b0f7f47d6784b8460af" + }, + { + "bytes": 121686, + "path": "samples/jpeg_q100_repair_zero/pm4-051-093f1478.png", + "sha256": "957622ee5204e432e4722f5fb28bb3c24a4e88f55f9ae961069b800db9a1d263" + }, + { + "bytes": 109464, + "path": "samples/jpeg_q100_repair_zero/pm4-052-03bbf4ac.png", + "sha256": "8a8bbca79e8fb98a13a02bff163e321e8865c4b620b7228392fbb7a88743dc4c" + }, + { + "bytes": 126532, + "path": "samples/jpeg_q100_repair_zero/pm4-053-0c5b1381.png", + "sha256": "36c4d9dd0d62249e4c397bd9b9ff376395f278bde2bbb1a0c6885cb2d2eb1c15" + }, + { + "bytes": 121943, + "path": "samples/jpeg_q100_repair_zero/pm4-054-92b0a67d.png", + "sha256": "13d9fb0d472dd16993c6f5e5922f0669664451efa2cf968d50bb57c43c43bf04" + }, + { + "bytes": 122476, + "path": "samples/jpeg_q100_repair_zero/pm4-055-ac372623.png", + "sha256": "310596b96fd869a98490787ac8f376be1443daf5ad41cf05740583d28a3909f9" + }, + { + "bytes": 120757, + "path": "samples/jpeg_q100_repair_zero/pm4-056-ee005598.png", + "sha256": "dff95469c50f5532abd0960f76657e18c269e4f1580ceef4cefb58c453269079" + }, + { + "bytes": 127462, + "path": "samples/jpeg_q100_repair_zero/pm4-057-8ac12393.png", + "sha256": "80c89a5d6637ccd80bbd41fa7e75433c4ea5f2f03301459cdafb7a0234a8fb20" + }, + { + "bytes": 103255, + "path": "samples/jpeg_q100_repair_zero/pm4-058-b655d991.png", + "sha256": "0fb7d25b2601a696ee24b9590da08bb89c96c09292007710703bc5765d393ae5" + }, + { + "bytes": 116104, + "path": "samples/jpeg_q100_repair_zero/pm4-059-7d5da4fb.png", + "sha256": "1bdc0eb1f4206a544c6d2ad96e1f886809553d6329c2b934ff9cd116296ed02d" + }, + { + "bytes": 107214, + "path": "samples/jpeg_q100_repair_zero/pm4-060-9ea3ad52.png", + "sha256": "6c64988546885e7fe0c340d12c54f6c1741d20225dd435383e0f4caf5f1f695c" + }, + { + "bytes": 113233, + "path": "samples/jpeg_q100_repair_zero/pm4-061-3e32cfca.png", + "sha256": "043ca595aaaa160bab263c9bf137b625341f09bdd4c8cca717d406cc2e09a727" + }, + { + "bytes": 120822, + "path": "samples/jpeg_q100_repair_zero/pm4-062-4e57bc1c.png", + "sha256": "d24c1fcb64a94a3284dd320e39acb656cdc073833f0264d2ecee7e040709ec75" + }, + { + "bytes": 114035, + "path": "samples/jpeg_q100_repair_zero/pm4-063-a4e09271.png", + "sha256": "d17014ef44d527e6b8cdce773cb47c741cfcff71167a738774a59720a5291fd2" + }, + { + "bytes": 123995, + "path": "samples/jpeg_q100_repair_zero/pm4-064-2264c7eb.png", + "sha256": "1dcedebd7c5c683380b2e021e43f355369d4e9faa284cb3a83af90b7807a0fa8" + }, + { + "bytes": 127170, + "path": "samples/jpeg_q100_repair_zero/pm4-065-1cab116c.png", + "sha256": "bd63a95821e516b6077bdfcc1ea0999668f2f3da174ee5e0ae9753e9bae1e6fa" + }, + { + "bytes": 122780, + "path": "samples/jpeg_q100_repair_zero/pm4-066-da57563c.png", + "sha256": "0150900c52e0208ce8f3ce6821f127fe4e570873fdd7f8ffeeeb34f6a49fd92f" + }, + { + "bytes": 128185, + "path": "samples/jpeg_q100_repair_zero/pm4-067-ef873e98.png", + "sha256": "0c0bd2e4b3f7f0b011a421154ff7e88d5af110ec8c0bf8e308d371f09425607d" + }, + { + "bytes": 119765, + "path": "samples/jpeg_q100_repair_zero/pm4-068-fbe210a2.png", + "sha256": "8e9bb3507065061ec40f6c1116e68c456c9b341d9844479b4e0067ae1749fcec" + }, + { + "bytes": 128982, + "path": "samples/jpeg_q100_repair_zero/pm4-069-cacdab19.png", + "sha256": "c47afa7a8e6315f4c0aeab38466d71d2743d6b42a7e672e8a9e6cdbe541359d9" + }, + { + "bytes": 130199, + "path": "samples/jpeg_q100_repair_zero/pm4-070-691aa003.png", + "sha256": "de166f965342fb30eb7ddca6a8f0bccb0cadc4b4d035609023eff30a30cb8408" + }, + { + "bytes": 123713, + "path": "samples/jpeg_q100_repair_zero/pm4-071-b9fe92b0.png", + "sha256": "2c60b4a328360efc10a7558a5794ee50b93aae3641ec974d4b2a999bea407890" + }, + { + "bytes": 119660, + "path": "samples/jpeg_q100_repair_zero/pm4-072-4a0cff0c.png", + "sha256": "f9fb72736b972cb82f63c6315671a7deb1225692203f35b49c8e92730b67f154" + }, + { + "bytes": 121220, + "path": "samples/jpeg_q100_repair_zero/pm4-073-6ec086e0.png", + "sha256": "4cc28d9f3eb8c1e017d6038d7bbbb398afdea262720835fea73259c12582363b" + }, + { + "bytes": 129546, + "path": "samples/jpeg_q100_repair_zero/pm4-074-796fd1d3.png", + "sha256": "f1696767a1a64265537f135e88a5d110e52d106aaa03d758b0a78602166fbb31" + }, + { + "bytes": 97187, + "path": "samples/jpeg_q100_repair_zero/pm4-075-3906d66e.png", + "sha256": "7f6112711afa9c3c008ba9386c82521bddc55b2c569ef2a2086758c49926d5aa" + }, + { + "bytes": 111168, + "path": "samples/jpeg_q100_repair_zero/pm4-076-a577a15d.png", + "sha256": "49c9a6f9ca742aba4d11b61c1abd5a4127f647af99053f62c03f3a14e8832229" + }, + { + "bytes": 115694, + "path": "samples/jpeg_q100_repair_zero/pm4-077-7fa689ad.png", + "sha256": "883e3aa8756c714e8d0fe2acaae0c3bbec880901bd49bd4785076952384fad4d" + }, + { + "bytes": 104150, + "path": "samples/jpeg_q100_repair_zero/pm4-078-a77b762e.png", + "sha256": "3de79fd67fa4feab4952bb8c6c8d41df448f8f7a89aa8710c5432e6d8a7280b2" + }, + { + "bytes": 123471, + "path": "samples/jpeg_q100_repair_zero/pm4-079-5e8f0ede.png", + "sha256": "ba0bc9d4a71868270110a595351da8ae4ba199d98c76db01459341fef3282453" + }, + { + "bytes": 113182, + "path": "samples/jpeg_q100_repair_zero/pm4-080-78dedcb6.png", + "sha256": "4af0677e0490af44da034f3ba1a1062015ac64360284036ffa838b3865083182" + }, + { + "bytes": 113738, + "path": "samples/jpeg_q100_repair_zero/pm4-081-5b17a851.png", + "sha256": "999cce913dce1b504195e913453c3036ca4ec5a87ccb3111677d709ed04dda43" + }, + { + "bytes": 104225, + "path": "samples/jpeg_q100_repair_zero/pm4-082-6adb4a49.png", + "sha256": "362a53d1142612b6c8378be94a495dd45f6aef47686db0a50b5021c1374f21bf" + }, + { + "bytes": 122843, + "path": "samples/jpeg_q100_repair_zero/pm4-083-02dc5c51.png", + "sha256": "f5451cb93fb2618277b628feebb6eb1d6b013a2c64d39bb1784967509507e22c" + }, + { + "bytes": 118718, + "path": "samples/jpeg_q100_repair_zero/pm4-084-06ed218a.png", + "sha256": "4924929125ef48f387f74f580cda2f807954d0d302ba7f69ce17e7a5d05a01b6" + }, + { + "bytes": 126592, + "path": "samples/jpeg_q100_repair_zero/pm4-085-84317ff5.png", + "sha256": "69af033d4f9fed85591a8189124fec877f648290fe00f2c85204ca1e8a283c3e" + }, + { + "bytes": 92065, + "path": "samples/jpeg_q100_repair_zero/pm4-086-90e23232.png", + "sha256": "7055a7e89a48dc22fd544def55920b6efa8bfcfe115f97abeab86b4d91c98534" + }, + { + "bytes": 109620, + "path": "samples/jpeg_q100_repair_zero/pm4-087-34bf26a1.png", + "sha256": "bf880413811a49a76618caa57d58bd1c9776b00c931ff8e5923ddeb9e673229e" + }, + { + "bytes": 115671, + "path": "samples/jpeg_q100_repair_zero/pm4-088-92a9c223.png", + "sha256": "f8ad5db56163979dc4085ea48b2292d515a6a432eb80c0ce31d87edbdb068630" + }, + { + "bytes": 117057, + "path": "samples/jpeg_q100_repair_zero/pm4-089-60ad56aa.png", + "sha256": "26347dc5bd045b7e7beef9cb281ddeba3a3b7f29ef9572ddc489443bf3ca96c5" + }, + { + "bytes": 95521, + "path": "samples/jpeg_q100_repair_zero/pm4-090-c71ebd94.png", + "sha256": "240441e813be3c228b7e9000133920b2802a9202e595770d8011ebcdb2928b68" + }, + { + "bytes": 133939, + "path": "samples/jpeg_q100_repair_zero/pm4-091-c428ceb2.png", + "sha256": "33b856fafb01bbe1eb0796161aeb8dec3e8f3d386abcb9f3ee8a2ef8c57f7978" + }, + { + "bytes": 125504, + "path": "samples/jpeg_q100_repair_zero/pm4-092-cc02ddf9.png", + "sha256": "bb091d4cdde0fc401ee9fb26df5c36858542aa2e38e4427cad6a5428345662f5" + }, + { + "bytes": 140956, + "path": "samples/jpeg_q100_repair_zero/pm4-093-53b39ad0.png", + "sha256": "898dcf55462a60ed21aff4b02e7f770dadb5902bd1f6992e22293f077794d432" + }, + { + "bytes": 114393, + "path": "samples/jpeg_q100_repair_zero/pm4-094-dd71e13d.png", + "sha256": "785614f58751f643ad21f4961e7ad078d5585188e3cfe32b59834c3177056b75" + }, + { + "bytes": 112739, + "path": "samples/jpeg_q100_repair_zero/pm4-095-13e2d4a2.png", + "sha256": "606e6bb308767279744974d0bfd1c76c7439b949fe9da3ac506ccd44b1793271" + }, + { + "bytes": 121756, + "path": "samples/jpeg_q100_repair_zero/pm4-096-95b0203e.png", + "sha256": "bddffe69fa03775e06766041c45baba31d5a1ff7f3789b4e1703d8b694f255a3" + }, + { + "bytes": 81506, + "path": "samples/jpeg_q100_repair_zero/pm4-097-0b860832.png", + "sha256": "7134c77d77643733bccc411e5c3816638d7108657b4533b519ecfbdc9578becd" + }, + { + "bytes": 110603, + "path": "samples/jpeg_q100_repair_zero/pm4-098-b03251b5.png", + "sha256": "0f458d7c8eea5f87ebd01ab281c6e19784c8fc3ea9c0eeff19956d6def7e6cbc" + }, + { + "bytes": 118488, + "path": "samples/jpeg_q100_repair_zero/pm4-099-d947f488.png", + "sha256": "9e2570cd01a4c06c113766fb0609ab1d3e185259b2cbd84728073ea93d7b520a" + }, + { + "bytes": 114916, + "path": "samples/jpeg_q100_repair_zero/pm4-100-5e269fc4.png", + "sha256": "48675216db8a45b0f4fea9f39caa7741deabda8a774d13d4887442b5e328df4e" + }, + { + "bytes": 102622, + "path": "samples/jpeg_q80_protected_high/pm4-001-cca08f5b.png", + "sha256": "534c9474372d05189bd7c252677246d006a5134a0c32eb66920a5238b4b6ee60" + }, + { + "bytes": 98824, + "path": "samples/jpeg_q80_protected_high/pm4-002-effb6eaa.png", + "sha256": "50515f96f9c4a3e6d0849710977a9007cd7f3323a799697c750b18573ac4f9c7" + }, + { + "bytes": 100232, + "path": "samples/jpeg_q80_protected_high/pm4-003-46e10145.png", + "sha256": "de73dbfde3251c7b2c38e3ab208014258c8232396faeb7594ce21ea9e57d015b" + }, + { + "bytes": 119025, + "path": "samples/jpeg_q80_protected_high/pm4-004-ab14afb8.png", + "sha256": "7c0ac980f4c43bcb838ef60b4465479d320275a0b8d72e93406fd1f13dccabc2" + }, + { + "bytes": 112628, + "path": "samples/jpeg_q80_protected_high/pm4-005-5e9b5a50.png", + "sha256": "80e59308f6df74a87330760899264d73ee7d2b6e21541742ce224332ecbc143a" + }, + { + "bytes": 101600, + "path": "samples/jpeg_q80_protected_high/pm4-006-44a2087e.png", + "sha256": "1dd72ce98747cb1a9460a933c98cc14ff5e3abd4e46120aa13f0fca2503e1f42" + }, + { + "bytes": 111157, + "path": "samples/jpeg_q80_protected_high/pm4-007-5003533d.png", + "sha256": "0c0f932b56a84d5d2e47d0f0cc1496c86f7b65d2648c1fe093fbb449d8c8ffa1" + }, + { + "bytes": 110585, + "path": "samples/jpeg_q80_protected_high/pm4-008-54647723.png", + "sha256": "27eca9d9369f9505096e5286822b6cf2d7c7023259efde6f146722cfec84453b" + }, + { + "bytes": 112683, + "path": "samples/jpeg_q80_protected_high/pm4-009-e51903e1.png", + "sha256": "cff599c54e6b481f8e5aad58f7d370ce37bbfb913a0411dd03a6c22287b56859" + }, + { + "bytes": 102440, + "path": "samples/jpeg_q80_protected_high/pm4-010-97841ad3.png", + "sha256": "958e5b339e5964acfb44ae427efa69f360ced80ebf3aa5a4f612679d143fd25e" + }, + { + "bytes": 116885, + "path": "samples/jpeg_q80_protected_high/pm4-011-c900b313.png", + "sha256": "4644af34b1c1d45380dcf032564d10c7cf4b57669179b388d1ad046940ccc00b" + }, + { + "bytes": 108312, + "path": "samples/jpeg_q80_protected_high/pm4-012-98171122.png", + "sha256": "2060f08e0ab1f73e3da800d1870ad6e9e8086baaf08399ec293c3ff37efffd89" + }, + { + "bytes": 122172, + "path": "samples/jpeg_q80_protected_high/pm4-013-d58e7b01.png", + "sha256": "deee82651c42200c7fb9850f25c6819512d178ad62fbe31530019a4cfef315d5" + }, + { + "bytes": 116159, + "path": "samples/jpeg_q80_protected_high/pm4-014-8876ccfb.png", + "sha256": "6b1b0717967b40533bc929391450e11856e3f086d10f96928b626a4a20cb1de1" + }, + { + "bytes": 108260, + "path": "samples/jpeg_q80_protected_high/pm4-015-8fe08e47.png", + "sha256": "ebee23032ef891f6ae2e7449b2ced1d79e56377e8203c89d5b539dfc26b995db" + }, + { + "bytes": 94605, + "path": "samples/jpeg_q80_protected_high/pm4-016-fd1eb48d.png", + "sha256": "ff094b4c45e45b845d6779b77b770fd6b13953e6423c4539f5904aaaf3e428ae" + }, + { + "bytes": 104899, + "path": "samples/jpeg_q80_protected_high/pm4-017-7f335742.png", + "sha256": "c0a3e2cab98196246a8b96459d8c12aa6719e01fc8db96b430778fd9903f17f4" + }, + { + "bytes": 120745, + "path": "samples/jpeg_q80_protected_high/pm4-018-4ea91357.png", + "sha256": "3cc43caf4b81ae610c3abedccfe5c67986b03225698a5cfee1b4b04deda23927" + }, + { + "bytes": 123820, + "path": "samples/jpeg_q80_protected_high/pm4-019-f7070d02.png", + "sha256": "4e815e6ab285c557fbb136a65b15d4e75ac50b86328047299c23c051cefd8fca" + }, + { + "bytes": 113741, + "path": "samples/jpeg_q80_protected_high/pm4-020-d8e94e65.png", + "sha256": "15daa42762e3dcab159a8d6b1099ec463c4d2f213f8254fee3e03c47a4813bf6" + }, + { + "bytes": 139384, + "path": "samples/jpeg_q80_protected_high/pm4-021-2da79c09.png", + "sha256": "ad6f66dde5a2094560344430bd7250a0d6b2b6f20fb8e4da9f157b95fd37b53d" + }, + { + "bytes": 114130, + "path": "samples/jpeg_q80_protected_high/pm4-022-b8b11cb8.png", + "sha256": "efd35df457a1aa9f13170bc12774d529342b515b519a5cbcd7d13169348dc3c5" + }, + { + "bytes": 109226, + "path": "samples/jpeg_q80_protected_high/pm4-023-0eb7f66d.png", + "sha256": "eb5c7637d718280e4334d94d4f120ea58e7636d32b59ceba7e221c19d635863d" + }, + { + "bytes": 120762, + "path": "samples/jpeg_q80_protected_high/pm4-024-56de999a.png", + "sha256": "7c4ac1bf432634cecf6745111cf4e0080787f5806aa9c4b0da20a8860f786405" + }, + { + "bytes": 110929, + "path": "samples/jpeg_q80_protected_high/pm4-025-ef6349d3.png", + "sha256": "348383d19e59bc3c53e7065c04d01357447ae65025b4aae96b44ee201a4f103c" + }, + { + "bytes": 104013, + "path": "samples/jpeg_q80_protected_high/pm4-026-ad193361.png", + "sha256": "0c5140656b7dca568d143d00f5c73e23c4f439c5e7c6c3a044fc3baea71a0e12" + }, + { + "bytes": 114609, + "path": "samples/jpeg_q80_protected_high/pm4-027-becf10ea.png", + "sha256": "117be9e75724a4c056ed1805753ddc8c835bdae02f4cf408438daa0724a2583d" + }, + { + "bytes": 112628, + "path": "samples/jpeg_q80_protected_high/pm4-028-b56d212e.png", + "sha256": "b8b1de91766327b434a65c58dea9c090736bdb867240c2832bc5b6ba22a1deee" + }, + { + "bytes": 105749, + "path": "samples/jpeg_q80_protected_high/pm4-029-95eb9f34.png", + "sha256": "ae5cb2abe3da52947154306cb3fdda6ea7793c47c6500deae5f4c67e6080be6c" + }, + { + "bytes": 122530, + "path": "samples/jpeg_q80_protected_high/pm4-030-2b63f9ba.png", + "sha256": "c949063090124df0f42d35eade58fa43ce9e535dd62feb9632995c89b040b325" + }, + { + "bytes": 119235, + "path": "samples/jpeg_q80_protected_high/pm4-031-844a8814.png", + "sha256": "11a0a7a2b41cce059e48fe071f4b89089057babbe4ca9a1cfcaf8f11ddf63dba" + }, + { + "bytes": 112577, + "path": "samples/jpeg_q80_protected_high/pm4-032-42ee9a0f.png", + "sha256": "20d6877e7a58414c19d0bd4d992284b3327a445a1c7a66117c18da8c04d5ea3d" + }, + { + "bytes": 108301, + "path": "samples/jpeg_q80_protected_high/pm4-033-b5e58e7f.png", + "sha256": "7b318227a4bb1a241eb594194f0fcea0270f493247b5ada47beb09407faf16d3" + }, + { + "bytes": 109909, + "path": "samples/jpeg_q80_protected_high/pm4-034-a383c38f.png", + "sha256": "2df94306b2ce0aeecf57823ed97002859b1643e31140099ab9424106ec940201" + }, + { + "bytes": 110854, + "path": "samples/jpeg_q80_protected_high/pm4-035-f3b99568.png", + "sha256": "0ab8070590a7f1a6ba3fd97a434c4a4893b653fb34afe015a7c1837433fb3c79" + }, + { + "bytes": 112295, + "path": "samples/jpeg_q80_protected_high/pm4-036-71932e79.png", + "sha256": "8c01425bedf6d3dcc7f3ea5d9796e955e093de5d587d1ebe9c56aa576dd92096" + }, + { + "bytes": 119022, + "path": "samples/jpeg_q80_protected_high/pm4-037-9515174e.png", + "sha256": "dfd4fb1466a07fc7cfda5c09e88f3fd0f9831f8c473836e51ae6d4455f62ddf6" + }, + { + "bytes": 111761, + "path": "samples/jpeg_q80_protected_high/pm4-038-335a27fa.png", + "sha256": "b4029364f7f84f760feef12682e2460a79975c12c76632a850c04beb53ce9b42" + }, + { + "bytes": 110915, + "path": "samples/jpeg_q80_protected_high/pm4-039-066bcab1.png", + "sha256": "dc0b22313bc41d19e0077336ad24a0e9af595e525233c8fb15072987ad66f891" + }, + { + "bytes": 118418, + "path": "samples/jpeg_q80_protected_high/pm4-040-eca2f1c2.png", + "sha256": "a106017b0ed4b5a34604dbf6cbd9a65e51540f76823d1e6eaf637f8fd4b89263" + }, + { + "bytes": 117367, + "path": "samples/jpeg_q80_protected_high/pm4-041-7ac2f16a.png", + "sha256": "8c72fa9f6d9cfc88ff5ac91e9c19a02763334d72e79e0ee7a19fffaf69f4d448" + }, + { + "bytes": 128832, + "path": "samples/jpeg_q80_protected_high/pm4-042-f7a87ffa.png", + "sha256": "5c8f0b6562e44f946828a33717eeabbce36fc583c04025c1503a1b715deac029" + }, + { + "bytes": 108961, + "path": "samples/jpeg_q80_protected_high/pm4-043-cde8ad90.png", + "sha256": "eba6bd697335be0cc471792814f2c84f3f9bc300b1be8c53ee23ff65ebe1a44e" + }, + { + "bytes": 111631, + "path": "samples/jpeg_q80_protected_high/pm4-044-93deb087.png", + "sha256": "91813e87fcd6f9dd4e91020c61aeb06711ce8ec39350b86a2cfc88e8c1f6f405" + }, + { + "bytes": 113368, + "path": "samples/jpeg_q80_protected_high/pm4-045-25fa16bb.png", + "sha256": "18abab2f71c70e6dd96e78bf08b00a5816ea91d6ec0d128a324ef58ed32e4bd7" + }, + { + "bytes": 108609, + "path": "samples/jpeg_q80_protected_high/pm4-046-bec80a2b.png", + "sha256": "53e0b8971e82c716fb184b2186719f36fba9243a36c425de30efad1b766e77ef" + }, + { + "bytes": 115758, + "path": "samples/jpeg_q80_protected_high/pm4-047-fc09cfd4.png", + "sha256": "41b324fc09b2a210d678dea04c7bbafce044e3ee13450e1a4aabe09a1741208f" + }, + { + "bytes": 119968, + "path": "samples/jpeg_q80_protected_high/pm4-048-e270315e.png", + "sha256": "feeaaefed357ceddee2f815bf5931afb515adfb830ed3c8146ab3d25e1cf7ea4" + }, + { + "bytes": 112585, + "path": "samples/jpeg_q80_protected_high/pm4-049-85579bcd.png", + "sha256": "134352703a0482bfe9e04cfe06d405113c7d8cc86ac10a8c9ff9b983ab9ffe8d" + }, + { + "bytes": 117129, + "path": "samples/jpeg_q80_protected_high/pm4-050-c3e45c01.png", + "sha256": "c722363adb55d3d2983377f40cd3cd042623f685ebccf07c2603fe919aa599c9" + }, + { + "bytes": 91491, + "path": "samples/jpeg_q80_protected_high/pm4-051-093f1478.png", + "sha256": "3d8cd7e985ab19bbfe9d04095cb5f89d9977a3493da6911769e46bfda4816c46" + }, + { + "bytes": 110026, + "path": "samples/jpeg_q80_protected_high/pm4-052-03bbf4ac.png", + "sha256": "3a952e162407a8f016ff1bed5365a54c1b4c9e7c23946ac094d2e8c896897026" + }, + { + "bytes": 116434, + "path": "samples/jpeg_q80_protected_high/pm4-053-0c5b1381.png", + "sha256": "51edb12d5b9c9d20789bdd3f6f2984c7bda727aba1814f38c4d10fb4a9c21332" + }, + { + "bytes": 126089, + "path": "samples/jpeg_q80_protected_high/pm4-054-92b0a67d.png", + "sha256": "e3d56b1070fa2807fa5c0b57eff6db07d3a9764f9e3b91218ffad58579b014ae" + }, + { + "bytes": 106484, + "path": "samples/jpeg_q80_protected_high/pm4-055-ac372623.png", + "sha256": "2e258c5f66b000b056ac8955765761ce99d4b365eaf51ed363232f1f2a2f356a" + }, + { + "bytes": 105107, + "path": "samples/jpeg_q80_protected_high/pm4-056-ee005598.png", + "sha256": "c3bc675e9638d1566fdf0892fec2b7f1713d0d6fc8a59bbed9b1b9cc7f0de020" + }, + { + "bytes": 120149, + "path": "samples/jpeg_q80_protected_high/pm4-057-8ac12393.png", + "sha256": "c0df508f202fe6584326f13a21b98ae282b45cc85d18c7becf3d7bf3a2143b5b" + }, + { + "bytes": 106154, + "path": "samples/jpeg_q80_protected_high/pm4-058-b655d991.png", + "sha256": "a8aa33c16bf77c8425fd38780d26979b5482320788c562d4b429bed25203603f" + }, + { + "bytes": 108332, + "path": "samples/jpeg_q80_protected_high/pm4-059-7d5da4fb.png", + "sha256": "d0e9ec884a323e16c568e5cca047c932983a67498609e2e50566bd7ffc7eff09" + }, + { + "bytes": 96043, + "path": "samples/jpeg_q80_protected_high/pm4-060-9ea3ad52.png", + "sha256": "b11ec3df22d98ddbffde839e123140784c053d4df88587a774b89e205f8f6f53" + }, + { + "bytes": 110158, + "path": "samples/jpeg_q80_protected_high/pm4-061-3e32cfca.png", + "sha256": "3f654431e1428dc586bf90f9fb3e723a7a00f9693bfd83765cf32ff713643861" + }, + { + "bytes": 115890, + "path": "samples/jpeg_q80_protected_high/pm4-062-4e57bc1c.png", + "sha256": "31deedcaa5580d0411b127e33bc44a63c5c909e9419d8104dec40d0c7baa1b6a" + }, + { + "bytes": 100982, + "path": "samples/jpeg_q80_protected_high/pm4-063-a4e09271.png", + "sha256": "b97934cb0499b69497aec3123f77dfcda69f6aff02212d604b3dc953a242a851" + }, + { + "bytes": 123794, + "path": "samples/jpeg_q80_protected_high/pm4-064-2264c7eb.png", + "sha256": "121355164311902bc8649376719ba48b97e15a74ab4941cf812b68e371fadf98" + }, + { + "bytes": 121360, + "path": "samples/jpeg_q80_protected_high/pm4-065-1cab116c.png", + "sha256": "fdb0f96fad5ba9770f2cfa7af8bdb03eb1bfa6debb20cc2bac0c92b3b0fae7d7" + }, + { + "bytes": 103073, + "path": "samples/jpeg_q80_protected_high/pm4-066-da57563c.png", + "sha256": "5207ec52dd4e0886a745c691ed434a0300baaa9fa341d60d193e388cb05dbd25" + }, + { + "bytes": 124429, + "path": "samples/jpeg_q80_protected_high/pm4-067-ef873e98.png", + "sha256": "60362c7779e166cb37b0c47763d170573351357686b5fd5e989934d3c083b384" + }, + { + "bytes": 120277, + "path": "samples/jpeg_q80_protected_high/pm4-068-fbe210a2.png", + "sha256": "64cb91d8e49c5961baad18394bd141d704df96cc02c2724049f9663b589cb7fe" + }, + { + "bytes": 122321, + "path": "samples/jpeg_q80_protected_high/pm4-069-cacdab19.png", + "sha256": "a8a07987facdf193db878ed92fcbdf860546b1f77b89e643dc52af43334803e7" + }, + { + "bytes": 118500, + "path": "samples/jpeg_q80_protected_high/pm4-070-691aa003.png", + "sha256": "ce49017ff8060971d2742c6f51f9b7666b21cef3ac81fd2321d788fde50758a0" + }, + { + "bytes": 114661, + "path": "samples/jpeg_q80_protected_high/pm4-071-b9fe92b0.png", + "sha256": "3c4c6afc276bb82f7980064cbbe403a055b7a38227a20229237587801bcea169" + }, + { + "bytes": 122807, + "path": "samples/jpeg_q80_protected_high/pm4-072-4a0cff0c.png", + "sha256": "929e473ff7e9fb34b9afeec128312aa4d52229bf29285170c20a51a07a72512f" + }, + { + "bytes": 103596, + "path": "samples/jpeg_q80_protected_high/pm4-073-6ec086e0.png", + "sha256": "1e4ed90325989113270e20ab33c2d0f24eadc3c04b15dbb6e9bb91b51cc66ce9" + }, + { + "bytes": 113493, + "path": "samples/jpeg_q80_protected_high/pm4-074-796fd1d3.png", + "sha256": "511be14206e6c65dbbb53e56fc71b722f2343e87d65b59035c8c0d9e94bbd66c" + }, + { + "bytes": 88488, + "path": "samples/jpeg_q80_protected_high/pm4-075-3906d66e.png", + "sha256": "2ec2e7c9c8c4887a3bc524e8efa16318207c97fc1c91b3508225a52737c7254c" + }, + { + "bytes": 96645, + "path": "samples/jpeg_q80_protected_high/pm4-076-a577a15d.png", + "sha256": "414275678ba2b6f6e8dcf06d19652fc909485168922f15ae89f4be6561d7c94a" + }, + { + "bytes": 103344, + "path": "samples/jpeg_q80_protected_high/pm4-077-7fa689ad.png", + "sha256": "a12ca5381205ef298fcce4618357edd28b1c3d828bd483ba6eabd2a220c30d55" + }, + { + "bytes": 94493, + "path": "samples/jpeg_q80_protected_high/pm4-078-a77b762e.png", + "sha256": "5fff97268e305c401b5de81875c7efa2087eb2aa16f8120fb0d3d173727690bf" + }, + { + "bytes": 108745, + "path": "samples/jpeg_q80_protected_high/pm4-079-5e8f0ede.png", + "sha256": "3e4b795db5ef85be51dd2d62edc889fa7931e3b947303b21af63f763f87fbcfb" + }, + { + "bytes": 88816, + "path": "samples/jpeg_q80_protected_high/pm4-080-78dedcb6.png", + "sha256": "eefadb3b4ecbc9a1afb1eb7680b845692a35fc279170675be2e3771183d9d0e7" + }, + { + "bytes": 105582, + "path": "samples/jpeg_q80_protected_high/pm4-081-5b17a851.png", + "sha256": "9c83522d933f266ff63607aeba8187e93fef5c497a651293cc88053fe60dc5ca" + }, + { + "bytes": 98046, + "path": "samples/jpeg_q80_protected_high/pm4-082-6adb4a49.png", + "sha256": "f7b01fdae4ae94fc839b93c904597652402dbb5619747efe8f1cb953a0531406" + }, + { + "bytes": 121153, + "path": "samples/jpeg_q80_protected_high/pm4-083-02dc5c51.png", + "sha256": "a33c6778fb799976989860d7da488534e2c5ca058782262a3da800fef43e8937" + }, + { + "bytes": 115826, + "path": "samples/jpeg_q80_protected_high/pm4-084-06ed218a.png", + "sha256": "a28adf735a302dd44e781c78f73701bbf2cc5929c79518060e459942dfde849b" + }, + { + "bytes": 122271, + "path": "samples/jpeg_q80_protected_high/pm4-085-84317ff5.png", + "sha256": "8c7c9997fb4533bad8c04ef5ee628933ff2aaf02cc570518d7e0405272e61719" + }, + { + "bytes": 103935, + "path": "samples/jpeg_q80_protected_high/pm4-086-90e23232.png", + "sha256": "462b150e5d2dd77d17a2792a604fd6fdb88dae54c92c709c61a039636e51a76f" + }, + { + "bytes": 100563, + "path": "samples/jpeg_q80_protected_high/pm4-087-34bf26a1.png", + "sha256": "1208449c1d80bce786d159df3c573971fcc8a6327d4cb1f4391d4b0145c1a4d2" + }, + { + "bytes": 110251, + "path": "samples/jpeg_q80_protected_high/pm4-088-92a9c223.png", + "sha256": "09fe0a98e37809336750d39aeca1ee7af868ac6a0622be3b671b528434ccedd2" + }, + { + "bytes": 96890, + "path": "samples/jpeg_q80_protected_high/pm4-089-60ad56aa.png", + "sha256": "5e0efef34eb2c0cc195a8f39a7520d1e9e2906d022314dffb783f261a0da756b" + }, + { + "bytes": 88035, + "path": "samples/jpeg_q80_protected_high/pm4-090-c71ebd94.png", + "sha256": "efab30f72f54f859977f9e71098a621d1e740c67d6a79ec3bec7e6e445c5543a" + }, + { + "bytes": 132339, + "path": "samples/jpeg_q80_protected_high/pm4-091-c428ceb2.png", + "sha256": "f91373ff8288da35e619459ac784af4a9b766d79252e4aa02daff93e76aed42d" + }, + { + "bytes": 111057, + "path": "samples/jpeg_q80_protected_high/pm4-092-cc02ddf9.png", + "sha256": "5554c553453647111a9a918af61edc3ef4603c0d787a5afc436fd6e7f0badaca" + }, + { + "bytes": 129419, + "path": "samples/jpeg_q80_protected_high/pm4-093-53b39ad0.png", + "sha256": "5d773a88ddc2feccd3affcfd066b3f4eecdf459f77f7e75028b1a2e98ff600fe" + }, + { + "bytes": 107926, + "path": "samples/jpeg_q80_protected_high/pm4-094-dd71e13d.png", + "sha256": "36e498945a0ae4374239dcc989493e631092984e4cbf78808aac0103366e2e85" + }, + { + "bytes": 106422, + "path": "samples/jpeg_q80_protected_high/pm4-095-13e2d4a2.png", + "sha256": "7752253eec5300cb98ed2d9d179cd5860ef712871b51238db97010e1d5ce0315" + }, + { + "bytes": 117140, + "path": "samples/jpeg_q80_protected_high/pm4-096-95b0203e.png", + "sha256": "2cad1521d1110248335ff4dbfec47acc99f35a1323ab4c1f86012e2f94ba5b7b" + }, + { + "bytes": 71406, + "path": "samples/jpeg_q80_protected_high/pm4-097-0b860832.png", + "sha256": "8825deb12c6cb2027c1889358fb42069afb4b3ffe8a8fb287f2254ae134800c2" + }, + { + "bytes": 101171, + "path": "samples/jpeg_q80_protected_high/pm4-098-b03251b5.png", + "sha256": "b92812113ca5acc9dd1c99079171820a23d57c0a32cdd62cc51f7605f516c126" + }, + { + "bytes": 115571, + "path": "samples/jpeg_q80_protected_high/pm4-099-d947f488.png", + "sha256": "6b94073d57e0ceb385540ea69ac135cf53981476eb006247ae3059ef8b25ebd9" + }, + { + "bytes": 106601, + "path": "samples/jpeg_q80_protected_high/pm4-100-5e269fc4.png", + "sha256": "cc3bb59d0ab90139ea90cd6d313eec83fb0d8ab861da86708190dc55a4f2e48f" + }, + { + "bytes": 103030, + "path": "samples/jxl_d1_protected_high/pm4-001-cca08f5b.png", + "sha256": "5500bc80f08e19adc8dc633c3ec2b5f7a45a478c3eb57ae1d0d5f3d4230d0989" + }, + { + "bytes": 98418, + "path": "samples/jxl_d1_protected_high/pm4-002-effb6eaa.png", + "sha256": "0223582f2cbc1e2dd2d2643ff555c9f4fbe89c8f9b6a9979d77da56ea1552d6d" + }, + { + "bytes": 100163, + "path": "samples/jxl_d1_protected_high/pm4-003-46e10145.png", + "sha256": "445033f9728b47860c6675838043f204b161faf7a23f1a02e8b022606c387927" + }, + { + "bytes": 118251, + "path": "samples/jxl_d1_protected_high/pm4-004-ab14afb8.png", + "sha256": "3db2a3463364fa348167cb51eb835fac60598d48ee1fc29b029c203ba4db399b" + }, + { + "bytes": 111845, + "path": "samples/jxl_d1_protected_high/pm4-005-5e9b5a50.png", + "sha256": "23856d4fc12daeb2ee5fde24653403035c4aceb02840a4b84cb01d8e62feb10d" + }, + { + "bytes": 101044, + "path": "samples/jxl_d1_protected_high/pm4-006-44a2087e.png", + "sha256": "096ccda87024371d833dd850787a0242f224968c900d00284c5459c94760047d" + }, + { + "bytes": 110602, + "path": "samples/jxl_d1_protected_high/pm4-007-5003533d.png", + "sha256": "2b4e41f59d0a692f1c65e54878b5a173b790309cdc7200d3917ab7c0ae19dd93" + }, + { + "bytes": 110381, + "path": "samples/jxl_d1_protected_high/pm4-008-54647723.png", + "sha256": "14b93fded03ff2f69ae218e75c0b017d6a6e4c8921e15399332b19d0bbb0bdf5" + }, + { + "bytes": 113819, + "path": "samples/jxl_d1_protected_high/pm4-009-e51903e1.png", + "sha256": "5763dc874e54bd54fa924990969563da59a1cc37521dedd5695dcbcef322e20a" + }, + { + "bytes": 102321, + "path": "samples/jxl_d1_protected_high/pm4-010-97841ad3.png", + "sha256": "9094e629472a6a04816a1154fc0908f5451293e12742e067767d14513bc90961" + }, + { + "bytes": 118143, + "path": "samples/jxl_d1_protected_high/pm4-011-c900b313.png", + "sha256": "fad4fddf73bf7ad415744e16fd87ab5b54304a093d9d25552d7da7dce125b9ca" + }, + { + "bytes": 107640, + "path": "samples/jxl_d1_protected_high/pm4-012-98171122.png", + "sha256": "40a1fd15e45a0e87bc14031bbb71d847b8c2c71483f53712f14e76125ba9f9ce" + }, + { + "bytes": 122130, + "path": "samples/jxl_d1_protected_high/pm4-013-d58e7b01.png", + "sha256": "f9de3f97b17f35c611dcc00aa750d5e14007d1beaf3d0978ee334b9d9102c4fa" + }, + { + "bytes": 116634, + "path": "samples/jxl_d1_protected_high/pm4-014-8876ccfb.png", + "sha256": "8a89fa8e31a846a8d6208164b7a90d5e5fd9833ba10dfd5944e10e646e96933b" + }, + { + "bytes": 108166, + "path": "samples/jxl_d1_protected_high/pm4-015-8fe08e47.png", + "sha256": "a76753e71d7b1c4fc563a5d6877f71e6afea2c976ba1d21979f80ba400ca1bd3" + }, + { + "bytes": 94951, + "path": "samples/jxl_d1_protected_high/pm4-016-fd1eb48d.png", + "sha256": "d38da341540540bb675142569a4c43517ff7efca3ddcad5e543897133f70f226" + }, + { + "bytes": 105215, + "path": "samples/jxl_d1_protected_high/pm4-017-7f335742.png", + "sha256": "4c83caa5a5f587ac9a5508061ceae9e5d426ed84de9563c06111787169ed4a7f" + }, + { + "bytes": 120305, + "path": "samples/jxl_d1_protected_high/pm4-018-4ea91357.png", + "sha256": "c94de9cade83a06f51b3c8733f61dfb76abbefe298af00535e4dd7b3c0b8af7b" + }, + { + "bytes": 123847, + "path": "samples/jxl_d1_protected_high/pm4-019-f7070d02.png", + "sha256": "b60cf9d05f423950ac51e1e29558b102169c4a656d863671b9e2a6fdbbe73de7" + }, + { + "bytes": 113767, + "path": "samples/jxl_d1_protected_high/pm4-020-d8e94e65.png", + "sha256": "af0dfe6b79de22ae0d7173d1128e7ff89a9d36d7076238a072a02ca42e767aab" + }, + { + "bytes": 139224, + "path": "samples/jxl_d1_protected_high/pm4-021-2da79c09.png", + "sha256": "d9c6af0e53c09d5cb6bf23cdd8e66325770ad70fa212315bd7927ff60c447bc9" + }, + { + "bytes": 114137, + "path": "samples/jxl_d1_protected_high/pm4-022-b8b11cb8.png", + "sha256": "1ecfb60ec183eefc4dcb924c2c21fb9d935c68c1c681a6bb03f7a3e258da5cc2" + }, + { + "bytes": 108927, + "path": "samples/jxl_d1_protected_high/pm4-023-0eb7f66d.png", + "sha256": "747f485e21689c13ae55955811ef00ff2f5aa72301977093205a05b509e33db1" + }, + { + "bytes": 119822, + "path": "samples/jxl_d1_protected_high/pm4-024-56de999a.png", + "sha256": "b2e775f6d8a95d8781c37a558079d505c2b0354e9faabd739edec865ba79e845" + }, + { + "bytes": 111591, + "path": "samples/jxl_d1_protected_high/pm4-025-ef6349d3.png", + "sha256": "171e41ba857ada2dc558b5176806da328648b12163bc7918ab9d57dbb3bee29b" + }, + { + "bytes": 102839, + "path": "samples/jxl_d1_protected_high/pm4-026-ad193361.png", + "sha256": "92beadfe5ff06667692d3806181dce566efa19ded7e3fa9fc702bbf512ea5173" + }, + { + "bytes": 114947, + "path": "samples/jxl_d1_protected_high/pm4-027-becf10ea.png", + "sha256": "c105de66b5fca61d43a15d4b93fa2584d87a90060442168b82dccebce2ab6c17" + }, + { + "bytes": 112554, + "path": "samples/jxl_d1_protected_high/pm4-028-b56d212e.png", + "sha256": "13a148b5ee3d3870b7e76bb849576c483b08d4996f6403e47072cc8bef6736a6" + }, + { + "bytes": 105340, + "path": "samples/jxl_d1_protected_high/pm4-029-95eb9f34.png", + "sha256": "c34de5e24c23032aa9ce285b91465c4417dad920f1b933bfb7cd607b177e5da3" + }, + { + "bytes": 122076, + "path": "samples/jxl_d1_protected_high/pm4-030-2b63f9ba.png", + "sha256": "3c3945e81daa014bc3312450bac12ca0931916841eca6b54b13880536161b91c" + }, + { + "bytes": 119398, + "path": "samples/jxl_d1_protected_high/pm4-031-844a8814.png", + "sha256": "0b0bb2df5bb24f8272595e1b74b1938c231b491e3ed63f008e83afaa207a770f" + }, + { + "bytes": 112791, + "path": "samples/jxl_d1_protected_high/pm4-032-42ee9a0f.png", + "sha256": "ec4efd947c11aa4fbe4246627529bf8fcd071213c0ebd74719f284c089eb0399" + }, + { + "bytes": 108306, + "path": "samples/jxl_d1_protected_high/pm4-033-b5e58e7f.png", + "sha256": "a9040c1ac126da62d831241afcf04648138f07f3f8d9d6a347d371ee8be0c1d5" + }, + { + "bytes": 109815, + "path": "samples/jxl_d1_protected_high/pm4-034-a383c38f.png", + "sha256": "4a1137181c28d2f0d4c2bf9f0cc368b635b161dcaad1a86f396a969527012421" + }, + { + "bytes": 110782, + "path": "samples/jxl_d1_protected_high/pm4-035-f3b99568.png", + "sha256": "4c1a7a5f5ad1864a402cb9911fe50534f8698e6f892db93e7853c63abeffe986" + }, + { + "bytes": 112044, + "path": "samples/jxl_d1_protected_high/pm4-036-71932e79.png", + "sha256": "4ded5e2f130c8b3be87e6dfd4359df35be397db85bb652866d503af2feb5c47b" + }, + { + "bytes": 120448, + "path": "samples/jxl_d1_protected_high/pm4-037-9515174e.png", + "sha256": "c98764387bce5bb808f537e0994d600e8d41af94a9014c1c9dc6c1b6b1609049" + }, + { + "bytes": 111531, + "path": "samples/jxl_d1_protected_high/pm4-038-335a27fa.png", + "sha256": "881e84f57f52f8e52ff2a53084c88317550a014fe27bf64d553018779c993283" + }, + { + "bytes": 109678, + "path": "samples/jxl_d1_protected_high/pm4-039-066bcab1.png", + "sha256": "8f4b9bd6e748f7c794e623afb52a2abb90a7bf74d0bbf9a641f319395d765ab0" + }, + { + "bytes": 117950, + "path": "samples/jxl_d1_protected_high/pm4-040-eca2f1c2.png", + "sha256": "cda11352ec30bb67b0fb9729240c2d66d27358789f750b8261b5d51507daaa4d" + }, + { + "bytes": 117576, + "path": "samples/jxl_d1_protected_high/pm4-041-7ac2f16a.png", + "sha256": "3f4fb66406c1f820c9c4cf9e8d7390c26d8e7c09bb79261465f8d6ac2f3f16e3" + }, + { + "bytes": 128882, + "path": "samples/jxl_d1_protected_high/pm4-042-f7a87ffa.png", + "sha256": "78603b93892f187820b1789046f4e276be748a9ac3983eefcd1b9c71e114de8f" + }, + { + "bytes": 108202, + "path": "samples/jxl_d1_protected_high/pm4-043-cde8ad90.png", + "sha256": "7e14c387a9945077f356cd6f0ba0783e872574dc752a1981d25bbaf776512ab9" + }, + { + "bytes": 112562, + "path": "samples/jxl_d1_protected_high/pm4-044-93deb087.png", + "sha256": "711e04ae76641daaf0b13816c63e411867cd3db3dadb0b7ac8dd0ee004833586" + }, + { + "bytes": 113396, + "path": "samples/jxl_d1_protected_high/pm4-045-25fa16bb.png", + "sha256": "3732ddc35f000386926156014f7e65c16a46d2665b33bc9aecb067cfd1a6fabf" + }, + { + "bytes": 108685, + "path": "samples/jxl_d1_protected_high/pm4-046-bec80a2b.png", + "sha256": "812e7546c7a58095905abf10d917429d176a8c85bc18e828f4ce7c3eeef49c23" + }, + { + "bytes": 115660, + "path": "samples/jxl_d1_protected_high/pm4-047-fc09cfd4.png", + "sha256": "72b1d96c36a24768680647588e7842dd06833203292954f58b38064d9ae66859" + }, + { + "bytes": 120160, + "path": "samples/jxl_d1_protected_high/pm4-048-e270315e.png", + "sha256": "26fe8ff68708fccd57245e5cf48d195d6e0b37bd530bd5abe0449e5e89474781" + }, + { + "bytes": 113401, + "path": "samples/jxl_d1_protected_high/pm4-049-85579bcd.png", + "sha256": "62c593d4d7c085f7ef7ab174df1f8c0504905a1bd9762b1e6afdd343941b3802" + }, + { + "bytes": 117124, + "path": "samples/jxl_d1_protected_high/pm4-050-c3e45c01.png", + "sha256": "c02c1a3ad596626ec84ddc10482b0211a0104ed16cced4a5ba71984f6e6fdd10" + }, + { + "bytes": 93055, + "path": "samples/jxl_d1_protected_high/pm4-051-093f1478.png", + "sha256": "2d20e32a6e7cf34aa9a45e95712910516f299226bf58e44925910d9dc67071e7" + }, + { + "bytes": 110140, + "path": "samples/jxl_d1_protected_high/pm4-052-03bbf4ac.png", + "sha256": "49b72df3303cc032799938cfb9be567d936989215bef12f88121724211c44ce0" + }, + { + "bytes": 116174, + "path": "samples/jxl_d1_protected_high/pm4-053-0c5b1381.png", + "sha256": "dd1434b3c05cf3a2ee5cb4f0ff988a691b9d8a420cf2463873d76095524a9cb0" + }, + { + "bytes": 126331, + "path": "samples/jxl_d1_protected_high/pm4-054-92b0a67d.png", + "sha256": "2b82fa79c449da7426b5a932ef31f4891191092f84b3c0e3566ad4938f47d45c" + }, + { + "bytes": 105954, + "path": "samples/jxl_d1_protected_high/pm4-055-ac372623.png", + "sha256": "070de25a48afdd310e79fb22ffd65c1e4e56b1908904df9553bdfd59868692ae" + }, + { + "bytes": 105812, + "path": "samples/jxl_d1_protected_high/pm4-056-ee005598.png", + "sha256": "b758a6c5db85146f60ebb17d3e420216be9ad7edf993a13d3380a359d00bf066" + }, + { + "bytes": 120018, + "path": "samples/jxl_d1_protected_high/pm4-057-8ac12393.png", + "sha256": "305bc55af8b72c7a6a8e2274c4b593a015434c6bcf23c4a5c8fbc58fcc33e797" + }, + { + "bytes": 106087, + "path": "samples/jxl_d1_protected_high/pm4-058-b655d991.png", + "sha256": "74b65c4fccae40a584786081cf40feec569d847920f713bcf6a43eb100cf9170" + }, + { + "bytes": 107608, + "path": "samples/jxl_d1_protected_high/pm4-059-7d5da4fb.png", + "sha256": "ff498292191bd4e2023b049ddfc1b2d800abcedba5b894e8dbc86a579789dcd8" + }, + { + "bytes": 96396, + "path": "samples/jxl_d1_protected_high/pm4-060-9ea3ad52.png", + "sha256": "05031fea6942a9e71c78d4e30a88afeebd9f9733fc527d4968e0288f0f2fa7b2" + }, + { + "bytes": 109857, + "path": "samples/jxl_d1_protected_high/pm4-061-3e32cfca.png", + "sha256": "29766fd6ba8fa49bb7f50ec0bf5c86c87bfe8b380b5df0cf49fdf01d50cad39c" + }, + { + "bytes": 116320, + "path": "samples/jxl_d1_protected_high/pm4-062-4e57bc1c.png", + "sha256": "c0bc1406fe4d826d44786774105cb53196bc2e91e14150bbaf057ac07d1659f3" + }, + { + "bytes": 101542, + "path": "samples/jxl_d1_protected_high/pm4-063-a4e09271.png", + "sha256": "fdede670dc2f1aba3561c4a794f015fcf21a7f09891c48bc481bc572e8128051" + }, + { + "bytes": 124003, + "path": "samples/jxl_d1_protected_high/pm4-064-2264c7eb.png", + "sha256": "872319a3f61b66642d5857cb14b342b6b271a2fddb0e12de6e696053cdb203fc" + }, + { + "bytes": 121444, + "path": "samples/jxl_d1_protected_high/pm4-065-1cab116c.png", + "sha256": "d2ab9c121226f97e1678d889b5b13b92fce89259c5439ebda9c3428e478dac8b" + }, + { + "bytes": 103018, + "path": "samples/jxl_d1_protected_high/pm4-066-da57563c.png", + "sha256": "e2349c4d287c55ec2bf35f65d3cf40579f3093972e33354a51155940795a8618" + }, + { + "bytes": 123632, + "path": "samples/jxl_d1_protected_high/pm4-067-ef873e98.png", + "sha256": "38fc538f642df55b16d8fdd056dc54036c56a628b36389314ea1e879d54c1bc2" + }, + { + "bytes": 118490, + "path": "samples/jxl_d1_protected_high/pm4-068-fbe210a2.png", + "sha256": "f7cb006dc53807f74d4935722d3813e9f965e95b3eb196d95dde7907bbd1862a" + }, + { + "bytes": 122195, + "path": "samples/jxl_d1_protected_high/pm4-069-cacdab19.png", + "sha256": "b712db7031fa095eec87f3308ff21ffc09640d05a207a4299eb6a5a84397c89b" + }, + { + "bytes": 118932, + "path": "samples/jxl_d1_protected_high/pm4-070-691aa003.png", + "sha256": "94a5b277bebd44fffe342b7fda93420633c14fd14a2d07048293edb2ef1041ed" + }, + { + "bytes": 114771, + "path": "samples/jxl_d1_protected_high/pm4-071-b9fe92b0.png", + "sha256": "85e91420d8f1315fc0a98198f6614becd290701a34154fdc0b7e67ddeedfc0a7" + }, + { + "bytes": 122130, + "path": "samples/jxl_d1_protected_high/pm4-072-4a0cff0c.png", + "sha256": "b31a90bc8114ddec4c5eda377c0f19b5e396a7b77419b48e77e0e81f7651da46" + }, + { + "bytes": 103759, + "path": "samples/jxl_d1_protected_high/pm4-073-6ec086e0.png", + "sha256": "b471e7d75af5632c638a8f7547ba5a860b1fa20febae5029c0095c37ba0528ee" + }, + { + "bytes": 113876, + "path": "samples/jxl_d1_protected_high/pm4-074-796fd1d3.png", + "sha256": "3865a4bce7d2247c080b1507c73d1872974488ec4408edb8404e01ec5e87cfeb" + }, + { + "bytes": 88671, + "path": "samples/jxl_d1_protected_high/pm4-075-3906d66e.png", + "sha256": "a05e25809fe25e0ec08ab191dafd386f1e95e08d7bd040c673d8f542b49bdec4" + }, + { + "bytes": 105395, + "path": "samples/jxl_d1_protected_high/pm4-076-a577a15d.png", + "sha256": "91c920057fd0c30f6293dcad4924d7ab98f7de02a720b9232c30c9616be906db" + }, + { + "bytes": 103406, + "path": "samples/jxl_d1_protected_high/pm4-077-7fa689ad.png", + "sha256": "0637fffa4b45c296d18ae1cfc9cd9057130cf3f3ef8add78f3c29e3ced416854" + }, + { + "bytes": 94496, + "path": "samples/jxl_d1_protected_high/pm4-078-a77b762e.png", + "sha256": "18bb02ed72e985c9141d16842e4e2f7399e072fdea82b249b4ba482b0d0e17a1" + }, + { + "bytes": 108971, + "path": "samples/jxl_d1_protected_high/pm4-079-5e8f0ede.png", + "sha256": "7d234ae98e1e6b339237bfed5a80e5d3ea9cecb1fe4b26bb59763cec4f1e4a12" + }, + { + "bytes": 88914, + "path": "samples/jxl_d1_protected_high/pm4-080-78dedcb6.png", + "sha256": "99d3e71960e0f393f1b1e558c2d32031e659c2a483ca464f935c93471475c90c" + }, + { + "bytes": 105587, + "path": "samples/jxl_d1_protected_high/pm4-081-5b17a851.png", + "sha256": "f09ebb2a9d85d1814774b914c1d45de4e55fd8b6677e3268a97b78ab39d3da59" + }, + { + "bytes": 97720, + "path": "samples/jxl_d1_protected_high/pm4-082-6adb4a49.png", + "sha256": "c0728dc5b091a5b4d590cce5d48e80bcbbda21f698947704bea63af9e74ba202" + }, + { + "bytes": 121840, + "path": "samples/jxl_d1_protected_high/pm4-083-02dc5c51.png", + "sha256": "9ddf0017bec88c58afb3eb30977d577f67500b6f01e931a1a8504e5083e07ebc" + }, + { + "bytes": 115602, + "path": "samples/jxl_d1_protected_high/pm4-084-06ed218a.png", + "sha256": "13b53a86b41dc792c1a0d478b9470e6e0e43c0d6f93cae1e032488bb8aec354e" + }, + { + "bytes": 121911, + "path": "samples/jxl_d1_protected_high/pm4-085-84317ff5.png", + "sha256": "33b2425fff2e574a21b50558f7fbbaba4994453e31fdffbc5418a3901349fa7e" + }, + { + "bytes": 103702, + "path": "samples/jxl_d1_protected_high/pm4-086-90e23232.png", + "sha256": "ae95b1ddd0f7ea0e9159a836c078f30fc8129d8e7829eee229f9535f08911b5e" + }, + { + "bytes": 100838, + "path": "samples/jxl_d1_protected_high/pm4-087-34bf26a1.png", + "sha256": "ae650570384457226377d9bec0dc3a3ea762c4e1cccf2fadfb2160ea46d1f9d1" + }, + { + "bytes": 110167, + "path": "samples/jxl_d1_protected_high/pm4-088-92a9c223.png", + "sha256": "73ff6335e9fea5a3f1c9fc221617db0433e5632ce5ed331891004b2e93da9e90" + }, + { + "bytes": 97209, + "path": "samples/jxl_d1_protected_high/pm4-089-60ad56aa.png", + "sha256": "e0e150a16a2196ea1252b57304c46618f7b2178c17d3e8df7b632eefe6763d1d" + }, + { + "bytes": 88035, + "path": "samples/jxl_d1_protected_high/pm4-090-c71ebd94.png", + "sha256": "b65357206c4030483110275f917bb25fd17161946d15c8b44a57ef1f43498e08" + }, + { + "bytes": 132223, + "path": "samples/jxl_d1_protected_high/pm4-091-c428ceb2.png", + "sha256": "1d09dc9350d816a5bd3b8dba482b51d68b3551b6cf590c61ace3c217c78ea8b7" + }, + { + "bytes": 110539, + "path": "samples/jxl_d1_protected_high/pm4-092-cc02ddf9.png", + "sha256": "6470bb363ebc84eb66b1ed889ed35a3db94a839cffc228ad9f847522b7d6e51d" + }, + { + "bytes": 129230, + "path": "samples/jxl_d1_protected_high/pm4-093-53b39ad0.png", + "sha256": "ed6a1afafca2ed40dfd47370ed129e7bddbddf75ab1d262fbec8ab4de9eaa3f0" + }, + { + "bytes": 107150, + "path": "samples/jxl_d1_protected_high/pm4-094-dd71e13d.png", + "sha256": "998184ae7fd5fca3545f3b1524d49d001f95d6fe9cc648631a2f5661c14c6cab" + }, + { + "bytes": 106193, + "path": "samples/jxl_d1_protected_high/pm4-095-13e2d4a2.png", + "sha256": "890e64e867d3d10c5b115ff911528bb826aeed063af0b6cf0c625ec44f2312e8" + }, + { + "bytes": 117515, + "path": "samples/jxl_d1_protected_high/pm4-096-95b0203e.png", + "sha256": "a3d13e5a13aa7c69c0867823a5341c2aea121ad05ade93393d39ab8bc010c2e5" + }, + { + "bytes": 73078, + "path": "samples/jxl_d1_protected_high/pm4-097-0b860832.png", + "sha256": "dcfb2f4c852dc9a6a0f07d0b94b7a1cfed9b333254657778e4e03f65ce362515" + }, + { + "bytes": 101361, + "path": "samples/jxl_d1_protected_high/pm4-098-b03251b5.png", + "sha256": "e6ca63abe9161cd7750cab60bc8ad63f1ce77096814d8e655a17f8effb049622" + }, + { + "bytes": 115283, + "path": "samples/jxl_d1_protected_high/pm4-099-d947f488.png", + "sha256": "4c23d031778488892a07710a0ef54a22f13dac96497b22fdf83636b58a541f03" + }, + { + "bytes": 106680, + "path": "samples/jxl_d1_protected_high/pm4-100-5e269fc4.png", + "sha256": "628f15461d53f448986c107adb58491104645f1a1439f33fe7721cc71a21f15e" + }, + { + "bytes": 103098, + "path": "samples/png_baseline/pm4-001-cca08f5b.png", + "sha256": "0fcd59b963f7d0c16ca56e492e55eb470a0fa51f809e301f2bcf4551ccf2c428" + }, + { + "bytes": 98633, + "path": "samples/png_baseline/pm4-002-effb6eaa.png", + "sha256": "bddc9a957764302db5de3fc6518f14e7dd2653546176572d381eee2b5da8930e" + }, + { + "bytes": 100422, + "path": "samples/png_baseline/pm4-003-46e10145.png", + "sha256": "d601ac568438f5a53f2778809dbed56d5ae1fd818359d2bd1831faa007449a2d" + }, + { + "bytes": 118217, + "path": "samples/png_baseline/pm4-004-ab14afb8.png", + "sha256": "3b70a06c5154bdac73c3311ecb6ca0738c8aa5c774b945740c3581546a0bc1f5" + }, + { + "bytes": 112457, + "path": "samples/png_baseline/pm4-005-5e9b5a50.png", + "sha256": "e73ea094ae3d9a159ede6517d767339de6e2016d2f786ec6e898412253d4a24b" + }, + { + "bytes": 101289, + "path": "samples/png_baseline/pm4-006-44a2087e.png", + "sha256": "e58762332507564f7402c108b89539e493ecd3a409317a60e316344f132ae00b" + }, + { + "bytes": 110707, + "path": "samples/png_baseline/pm4-007-5003533d.png", + "sha256": "06430e40dc1a1e5fe69386bf56ffe7604528d6c4e84870708f5e43520cd3e2f0" + }, + { + "bytes": 110514, + "path": "samples/png_baseline/pm4-008-54647723.png", + "sha256": "c2529a26d6ca574525366ba12fe74a161b485b273d19d46c9602326cb3418864" + }, + { + "bytes": 113938, + "path": "samples/png_baseline/pm4-009-e51903e1.png", + "sha256": "7a450c66b950685b8b4d29ef3120276a687afd0b1608f700e3e39e7cfe6c3715" + }, + { + "bytes": 102345, + "path": "samples/png_baseline/pm4-010-97841ad3.png", + "sha256": "d3a24e3509d67f1a72221133860ad01700e8f93d1219b7142a27d848959a5ad9" + }, + { + "bytes": 116408, + "path": "samples/png_baseline/pm4-011-c900b313.png", + "sha256": "e043efe30b021d155d9e85bafb584f36b7892109d8ccfd15336414d340a582a0" + }, + { + "bytes": 107712, + "path": "samples/png_baseline/pm4-012-98171122.png", + "sha256": "9faf6976b0123d7e245912c193481f313b69fb63b4041a0e3108563a6004f49b" + }, + { + "bytes": 122276, + "path": "samples/png_baseline/pm4-013-d58e7b01.png", + "sha256": "78e6516a07d9138059d14b4ef44177992c2ccc1a87e119d0a854f5b4539fbb2f" + }, + { + "bytes": 116836, + "path": "samples/png_baseline/pm4-014-8876ccfb.png", + "sha256": "2d4afd16c27dc524dcc9b17d6d12ee99cc7ea996b8bc1155a8a2182b1ff00bce" + }, + { + "bytes": 108082, + "path": "samples/png_baseline/pm4-015-8fe08e47.png", + "sha256": "64509596c3136b38ad2f2cc41f6613060d5ecf87b248d5a1e2fa352a63be70b0" + }, + { + "bytes": 94885, + "path": "samples/png_baseline/pm4-016-fd1eb48d.png", + "sha256": "bcff705ad549a9066038afa822e228acad509b850cd9abc07c5e0be980a78d1a" + }, + { + "bytes": 104878, + "path": "samples/png_baseline/pm4-017-7f335742.png", + "sha256": "b070bbd481b06300bea2c873cdab7050d179133da077cc88c61e7edd52d41c24" + }, + { + "bytes": 120275, + "path": "samples/png_baseline/pm4-018-4ea91357.png", + "sha256": "f835d17eada63ed38cb71f124544af22fbeed67d71dd0bd6ea0c76c759f9312d" + }, + { + "bytes": 123937, + "path": "samples/png_baseline/pm4-019-f7070d02.png", + "sha256": "fd76611f13d144554125c9c69e59df65506ff65b40a4666d4fd46179f147ebc8" + }, + { + "bytes": 113683, + "path": "samples/png_baseline/pm4-020-d8e94e65.png", + "sha256": "5e9e022fbb5c6fbda46c5a2bd8016cb142d30ed121a41af02b8e21ab82fe1cbc" + }, + { + "bytes": 139400, + "path": "samples/png_baseline/pm4-021-2da79c09.png", + "sha256": "5d98fed53e4ce7a890b15075dd15eaa20dc33fd2c5cc142ba091366487874d4e" + }, + { + "bytes": 114240, + "path": "samples/png_baseline/pm4-022-b8b11cb8.png", + "sha256": "6fcd0feba56d85cef6caf9cb97ce98bce01f254e15d197a16ad0978be6fb1d17" + }, + { + "bytes": 108902, + "path": "samples/png_baseline/pm4-023-0eb7f66d.png", + "sha256": "6edf2c672479518ad1d19906c5c16c80328e5dd0cd26d968704d6bfe610c7e90" + }, + { + "bytes": 120111, + "path": "samples/png_baseline/pm4-024-56de999a.png", + "sha256": "dd1de29d83b189895960c8b1d8f8fe66058036d5050b962ca639303d01468dbd" + }, + { + "bytes": 111354, + "path": "samples/png_baseline/pm4-025-ef6349d3.png", + "sha256": "b0dc507fecfcf685d49f054cd3a2159911c3e459fbfbc0fce72a758aa7ee5269" + }, + { + "bytes": 103103, + "path": "samples/png_baseline/pm4-026-ad193361.png", + "sha256": "46af2ed7452b2604355f5274338b02ccf8292e281e67e2f8cfc3085832eea72e" + }, + { + "bytes": 114797, + "path": "samples/png_baseline/pm4-027-becf10ea.png", + "sha256": "24ba9fefc62748ea1b45ba5d7c241da1bf1d2896c8f18604e68a1dda9fb4f688" + }, + { + "bytes": 112446, + "path": "samples/png_baseline/pm4-028-b56d212e.png", + "sha256": "af53cbdb8ba96c936b8ff88ba82019b7a2d55d34f53261e7edc31ead980d6a43" + }, + { + "bytes": 105546, + "path": "samples/png_baseline/pm4-029-95eb9f34.png", + "sha256": "3b912cc07182c30a8b32c0f48ea3ba09a06bed9a4fd4a57eef4e13c084ad3634" + }, + { + "bytes": 122171, + "path": "samples/png_baseline/pm4-030-2b63f9ba.png", + "sha256": "15dfb0f72046324290a7fb218c65629962deb637ff5d8b0e489640befa87e2b8" + }, + { + "bytes": 119380, + "path": "samples/png_baseline/pm4-031-844a8814.png", + "sha256": "42484c336cb44b2d1023e432a8ff0958677d5944fd0c05d39dff5874837b42aa" + }, + { + "bytes": 112648, + "path": "samples/png_baseline/pm4-032-42ee9a0f.png", + "sha256": "e5bb4493c664b3c944a0a848adfbbc9f47d133f44ea3ce5533b038c9596c1057" + }, + { + "bytes": 108331, + "path": "samples/png_baseline/pm4-033-b5e58e7f.png", + "sha256": "66f2d2287adae22b471409076aebb6c5109583f049e4f8af1ce2587f572a5074" + }, + { + "bytes": 109906, + "path": "samples/png_baseline/pm4-034-a383c38f.png", + "sha256": "662a662f6f2730c92861d23e50eafa792c624f3f3bc8b17c5d9c6322f03b953e" + }, + { + "bytes": 110674, + "path": "samples/png_baseline/pm4-035-f3b99568.png", + "sha256": "b9d488b4f9ee7207a03d52428a8fcb144f76cba3869591f9aa33db0011d25060" + }, + { + "bytes": 112170, + "path": "samples/png_baseline/pm4-036-71932e79.png", + "sha256": "a8fff8fe5271c97ccc870d954222484943d62196fabba408e709284c973312c0" + }, + { + "bytes": 121753, + "path": "samples/png_baseline/pm4-037-9515174e.png", + "sha256": "85d1d7478b9d21e03d74ca861c9b1fc43a6914bebebd58ac8c8bf4ce95aa4b31" + }, + { + "bytes": 111716, + "path": "samples/png_baseline/pm4-038-335a27fa.png", + "sha256": "7f4bdb8c09522704bdbba7909a1d3f922045a9471e767cf5ea75b8444630000f" + }, + { + "bytes": 110245, + "path": "samples/png_baseline/pm4-039-066bcab1.png", + "sha256": "8807251f32fde85e810f75d41c2ecaf567add89896e87d58f2c48765a7f22e7d" + }, + { + "bytes": 118044, + "path": "samples/png_baseline/pm4-040-eca2f1c2.png", + "sha256": "e9d3987940947f19b6239f26332a00c3db423ef707a43592656f6a65821c9772" + }, + { + "bytes": 117722, + "path": "samples/png_baseline/pm4-041-7ac2f16a.png", + "sha256": "1556f076b29f6b80d2fa78d58b3a87d96c560dec42ccee26f0b0c62a589dc90f" + }, + { + "bytes": 128922, + "path": "samples/png_baseline/pm4-042-f7a87ffa.png", + "sha256": "fd8ba206ff1d69664cfae40c1b0123f2ae4a36f0d4e95a4109583cb818d22302" + }, + { + "bytes": 108200, + "path": "samples/png_baseline/pm4-043-cde8ad90.png", + "sha256": "7cee1c1ac5204ceb7830f7a84baba8b82553eb6c15f6f1aa4f886c4eaa398078" + }, + { + "bytes": 112465, + "path": "samples/png_baseline/pm4-044-93deb087.png", + "sha256": "c90a24b34fcaea14e574f28889c7056a054c7b0839e516006dfbc987320fcfa5" + }, + { + "bytes": 113283, + "path": "samples/png_baseline/pm4-045-25fa16bb.png", + "sha256": "cca74268536ff193a2111e606e4c50714f1dd3b669df1645691e11c7f30ab45a" + }, + { + "bytes": 108657, + "path": "samples/png_baseline/pm4-046-bec80a2b.png", + "sha256": "298777b4b0d2be6fd6aa00173666a01d2a596541a5df239c6eca906de38863d6" + }, + { + "bytes": 115978, + "path": "samples/png_baseline/pm4-047-fc09cfd4.png", + "sha256": "85aeb211ec43a40f73c1fe9265650f555c6a144e1064c41cda5c7192793549e3" + }, + { + "bytes": 120018, + "path": "samples/png_baseline/pm4-048-e270315e.png", + "sha256": "2cf7901f35883f55d3d9e4a45265ff868bd18ec77844805279e3efe54cd3fb65" + }, + { + "bytes": 113425, + "path": "samples/png_baseline/pm4-049-85579bcd.png", + "sha256": "fca97da7e0bf1fd18d0330c8fc43ebfa0014980fdd5760a6941ce6e6df32612c" + }, + { + "bytes": 117136, + "path": "samples/png_baseline/pm4-050-c3e45c01.png", + "sha256": "7127b7833a0852c298213253a3ed037a033f3ad18cc41b00125e5b7644d1eeff" + }, + { + "bytes": 94159, + "path": "samples/png_baseline/pm4-051-093f1478.png", + "sha256": "97dcf33631cc6449ef65f904a84b73166fe79ad161be835e076a70c86aa92aed" + }, + { + "bytes": 110201, + "path": "samples/png_baseline/pm4-052-03bbf4ac.png", + "sha256": "d4d3987f7540ebaa2d67c367005ef20812382cb98e84835be8b69837ffae20e3" + }, + { + "bytes": 116271, + "path": "samples/png_baseline/pm4-053-0c5b1381.png", + "sha256": "951c959837fb14f404b9e5661550001500ac7e5de138af42c36d896d90ce6911" + }, + { + "bytes": 126362, + "path": "samples/png_baseline/pm4-054-92b0a67d.png", + "sha256": "f6ab18bc339c7990d640e44d1d20933967245fe064e93f36c2056ae78b72c41b" + }, + { + "bytes": 106257, + "path": "samples/png_baseline/pm4-055-ac372623.png", + "sha256": "b5e1b894dda863ffbc2f4321590b1328071fd6a07069e9d5bba6af8190f974cd" + }, + { + "bytes": 105685, + "path": "samples/png_baseline/pm4-056-ee005598.png", + "sha256": "289efb8d1d24a2e206d2aad932d8c4568e30417d09fb85c7acb6e7d48c8e5dd8" + }, + { + "bytes": 120368, + "path": "samples/png_baseline/pm4-057-8ac12393.png", + "sha256": "0a1fa8242529d341736c78a942814034579cbe556ab1e6a57ca5baedeb5dc8f8" + }, + { + "bytes": 106366, + "path": "samples/png_baseline/pm4-058-b655d991.png", + "sha256": "053f0e1adc2e5d8c3adf638c3cadb7070dff7d330bf0fcb6e15352b2557e23fe" + }, + { + "bytes": 108010, + "path": "samples/png_baseline/pm4-059-7d5da4fb.png", + "sha256": "c5f7615176664c300fcd681a8cfce97f47786938364c3e07882830825c35ebf5" + }, + { + "bytes": 96564, + "path": "samples/png_baseline/pm4-060-9ea3ad52.png", + "sha256": "14cd284c94b71bca08fd7880e9dc0ce5929fdbf3a94c154cbcf2f8dc0d4f3e38" + }, + { + "bytes": 109806, + "path": "samples/png_baseline/pm4-061-3e32cfca.png", + "sha256": "18bfc1d33efe7d1f2dc07fd9754b3fc8074e8bec4aa0f1f1d34207eaf6ba8b0b" + }, + { + "bytes": 116237, + "path": "samples/png_baseline/pm4-062-4e57bc1c.png", + "sha256": "410654eaba77572f690cca2624fdff6dad9a625988b912731d18ed30ba1370be" + }, + { + "bytes": 101491, + "path": "samples/png_baseline/pm4-063-a4e09271.png", + "sha256": "2b511a867c0ed130040d4769f8a51a89e7e7bca7c0cb6ecc4852fe6144d8e41f" + }, + { + "bytes": 123988, + "path": "samples/png_baseline/pm4-064-2264c7eb.png", + "sha256": "9b31985a931527141c1dbb9b5d97ba740149e3ffb6fd6875dc3c0d11b35cbd76" + }, + { + "bytes": 121489, + "path": "samples/png_baseline/pm4-065-1cab116c.png", + "sha256": "a1019fe92d633511be3b482adfb30ac974fc43aa916ef0b1650fb43073bd313b" + }, + { + "bytes": 102950, + "path": "samples/png_baseline/pm4-066-da57563c.png", + "sha256": "db4077d578b1dd6eb3ba9ff1b58cf75207efabb2dfe8bf9bbe05edeb94bf35d3" + }, + { + "bytes": 123594, + "path": "samples/png_baseline/pm4-067-ef873e98.png", + "sha256": "5f58425fc2007a13a0e0f250d16074debd212cf86f224154cb5bc4762f381bbe" + }, + { + "bytes": 118386, + "path": "samples/png_baseline/pm4-068-fbe210a2.png", + "sha256": "5239864081131ae58b1d0a244eb3a677267bc5c89e41dcafe661d27d891e4933" + }, + { + "bytes": 122354, + "path": "samples/png_baseline/pm4-069-cacdab19.png", + "sha256": "ff0502f0ec00e8ef36a8fafb3d5a862982ae00c66cfb674dccd42e06ff150a7e" + }, + { + "bytes": 119082, + "path": "samples/png_baseline/pm4-070-691aa003.png", + "sha256": "b1a7973984b695a6e62121729c92b1e3d637a10f2329050b9c08f8f66e2af498" + }, + { + "bytes": 115060, + "path": "samples/png_baseline/pm4-071-b9fe92b0.png", + "sha256": "8624329020cce2c1677bdc2ddc5e3f998ee7cc427f14956eb8073b4f680b9ad9" + }, + { + "bytes": 122368, + "path": "samples/png_baseline/pm4-072-4a0cff0c.png", + "sha256": "9e5e4d390a984e909386ccd9fb5af7aa2c2a2a2203fda8474011cf90f5509591" + }, + { + "bytes": 103759, + "path": "samples/png_baseline/pm4-073-6ec086e0.png", + "sha256": "483769187bdce6595e1129c8f63d63c724d5ee84c96c5b279246bd4946d88d46" + }, + { + "bytes": 113680, + "path": "samples/png_baseline/pm4-074-796fd1d3.png", + "sha256": "2ba3d9caeaed8d39fd40ecd127c1663f6ba1771e853e2f36a2362d6ebc47ce80" + }, + { + "bytes": 88445, + "path": "samples/png_baseline/pm4-075-3906d66e.png", + "sha256": "bb0d8bfbf73814e18449531924ca256cf418cb785c979479518909422c62b99c" + }, + { + "bytes": 107522, + "path": "samples/png_baseline/pm4-076-a577a15d.png", + "sha256": "47db78e98d2d475ac8c9ddbb19cfaa7d7e47a5910c46ca6cf82db0ac765bf31b" + }, + { + "bytes": 103276, + "path": "samples/png_baseline/pm4-077-7fa689ad.png", + "sha256": "d2ed56d74eb07107b78127021ce5970fbf86e1ccf06f709efab40cf0dec16333" + }, + { + "bytes": 94261, + "path": "samples/png_baseline/pm4-078-a77b762e.png", + "sha256": "7802ee18eba2ecef97ce147f9eb2488df78961b545b941abf065958d85fd7c22" + }, + { + "bytes": 108917, + "path": "samples/png_baseline/pm4-079-5e8f0ede.png", + "sha256": "ff9a30bb54d86be04df77c5cf815d30307341d748382e0a4c9282847ae46dafc" + }, + { + "bytes": 88920, + "path": "samples/png_baseline/pm4-080-78dedcb6.png", + "sha256": "3876e432e1478afed282f6b029a0c71e626f5bd20a4a2d923b1259df5418e30e" + }, + { + "bytes": 105568, + "path": "samples/png_baseline/pm4-081-5b17a851.png", + "sha256": "628afcde189ce2f39666a9e68ae37b435622a22007028884ff3e2c88bdecd2d4" + }, + { + "bytes": 97699, + "path": "samples/png_baseline/pm4-082-6adb4a49.png", + "sha256": "17155d397425fe97f34525b788266a41b726597bc9917606425a2e4154d42364" + }, + { + "bytes": 121772, + "path": "samples/png_baseline/pm4-083-02dc5c51.png", + "sha256": "9ee65e471640e3b5638313b055cac9867cb34df2b8150a46c8757476f2ebdfca" + }, + { + "bytes": 115564, + "path": "samples/png_baseline/pm4-084-06ed218a.png", + "sha256": "b151d11d8b311fb05fda059b4397251aeea64467a7b02880c82192ea3dcd1dd8" + }, + { + "bytes": 121910, + "path": "samples/png_baseline/pm4-085-84317ff5.png", + "sha256": "d9d5e161fe584f102dddecf6c99ea36367028c445b281df0c4fa78d156eb4cd5" + }, + { + "bytes": 103723, + "path": "samples/png_baseline/pm4-086-90e23232.png", + "sha256": "3cb2578180aa31d47e4566d0b369a71c880bd78ac72f9c48294fbec37eed0429" + }, + { + "bytes": 100822, + "path": "samples/png_baseline/pm4-087-34bf26a1.png", + "sha256": "d20a8c23c2537231026a2a66fb3f9d5e5d0bc6ba29e3fa3645a924f2154c43f4" + }, + { + "bytes": 110191, + "path": "samples/png_baseline/pm4-088-92a9c223.png", + "sha256": "ddaf73ad42ada3a4f3cedc7c63cc2961ddb348cd072a3c696b7b6a09f9abc321" + }, + { + "bytes": 97454, + "path": "samples/png_baseline/pm4-089-60ad56aa.png", + "sha256": "8a46decb953eb4621648cc6f65c50cd9f8d3c2bf8ccb0fc3538bddf3c3b3a186" + }, + { + "bytes": 88345, + "path": "samples/png_baseline/pm4-090-c71ebd94.png", + "sha256": "6c1e8d987942c87afd75e7a5f5306574666b332d76fa8d57c57e890f4d47d9fa" + }, + { + "bytes": 132448, + "path": "samples/png_baseline/pm4-091-c428ceb2.png", + "sha256": "b95e665931de52b3c7e874ef925027f4eaab81e96d302b9cfc795c2ce45ed6a3" + }, + { + "bytes": 110845, + "path": "samples/png_baseline/pm4-092-cc02ddf9.png", + "sha256": "4596d75bb4de3efe20ea1df5840f24445f211155152f41a6a12342d354b66706" + }, + { + "bytes": 129169, + "path": "samples/png_baseline/pm4-093-53b39ad0.png", + "sha256": "16bbc4a917be6c29849b94597d40fc93fb56c2a019a23b351b419cbde411f06a" + }, + { + "bytes": 107201, + "path": "samples/png_baseline/pm4-094-dd71e13d.png", + "sha256": "10ec7b2e09fb1676cc042f112b0836f27a22bebeb96edfb3f3e2d09b2ac0eef8" + }, + { + "bytes": 106499, + "path": "samples/png_baseline/pm4-095-13e2d4a2.png", + "sha256": "80212df1c8e7e08ebd767f128faed183ec98b2634bbd26c193a9b2d5fb7d3919" + }, + { + "bytes": 117603, + "path": "samples/png_baseline/pm4-096-95b0203e.png", + "sha256": "424b83b33b0a604e413afa4a97eb4b446b57838f8d7e8c9ef6650f6692d27198" + }, + { + "bytes": 73161, + "path": "samples/png_baseline/pm4-097-0b860832.png", + "sha256": "b2c5ed25367cfcda6675cb5d78fbdedb2ee841896902eb2ab0bd4b18188c6498" + }, + { + "bytes": 101488, + "path": "samples/png_baseline/pm4-098-b03251b5.png", + "sha256": "24c64d7e65509666399a983b098285b5d5d0db854501bdbb59dbe99d8dbaf99b" + }, + { + "bytes": 115308, + "path": "samples/png_baseline/pm4-099-d947f488.png", + "sha256": "96eaf23a5754fe8e45444e46d6f09792c2b105ebcf43badaca92c29f2685f353" + }, + { + "bytes": 106384, + "path": "samples/png_baseline/pm4-100-5e269fc4.png", + "sha256": "2f6a3de60cd0e00fd0d74ddd89a5d25ad34ffbbd840ad45c7e87896a00098856" + }, + { + "bytes": 103098, + "path": "samples/webp_lossless/pm4-001-cca08f5b.png", + "sha256": "0fcd59b963f7d0c16ca56e492e55eb470a0fa51f809e301f2bcf4551ccf2c428" + }, + { + "bytes": 98633, + "path": "samples/webp_lossless/pm4-002-effb6eaa.png", + "sha256": "bddc9a957764302db5de3fc6518f14e7dd2653546176572d381eee2b5da8930e" + }, + { + "bytes": 100422, + "path": "samples/webp_lossless/pm4-003-46e10145.png", + "sha256": "d601ac568438f5a53f2778809dbed56d5ae1fd818359d2bd1831faa007449a2d" + }, + { + "bytes": 118217, + "path": "samples/webp_lossless/pm4-004-ab14afb8.png", + "sha256": "3b70a06c5154bdac73c3311ecb6ca0738c8aa5c774b945740c3581546a0bc1f5" + }, + { + "bytes": 112457, + "path": "samples/webp_lossless/pm4-005-5e9b5a50.png", + "sha256": "e73ea094ae3d9a159ede6517d767339de6e2016d2f786ec6e898412253d4a24b" + }, + { + "bytes": 101289, + "path": "samples/webp_lossless/pm4-006-44a2087e.png", + "sha256": "e58762332507564f7402c108b89539e493ecd3a409317a60e316344f132ae00b" + }, + { + "bytes": 110707, + "path": "samples/webp_lossless/pm4-007-5003533d.png", + "sha256": "06430e40dc1a1e5fe69386bf56ffe7604528d6c4e84870708f5e43520cd3e2f0" + }, + { + "bytes": 110514, + "path": "samples/webp_lossless/pm4-008-54647723.png", + "sha256": "c2529a26d6ca574525366ba12fe74a161b485b273d19d46c9602326cb3418864" + }, + { + "bytes": 113938, + "path": "samples/webp_lossless/pm4-009-e51903e1.png", + "sha256": "7a450c66b950685b8b4d29ef3120276a687afd0b1608f700e3e39e7cfe6c3715" + }, + { + "bytes": 102345, + "path": "samples/webp_lossless/pm4-010-97841ad3.png", + "sha256": "d3a24e3509d67f1a72221133860ad01700e8f93d1219b7142a27d848959a5ad9" + }, + { + "bytes": 116408, + "path": "samples/webp_lossless/pm4-011-c900b313.png", + "sha256": "e043efe30b021d155d9e85bafb584f36b7892109d8ccfd15336414d340a582a0" + }, + { + "bytes": 107712, + "path": "samples/webp_lossless/pm4-012-98171122.png", + "sha256": "9faf6976b0123d7e245912c193481f313b69fb63b4041a0e3108563a6004f49b" + }, + { + "bytes": 122276, + "path": "samples/webp_lossless/pm4-013-d58e7b01.png", + "sha256": "78e6516a07d9138059d14b4ef44177992c2ccc1a87e119d0a854f5b4539fbb2f" + }, + { + "bytes": 116836, + "path": "samples/webp_lossless/pm4-014-8876ccfb.png", + "sha256": "2d4afd16c27dc524dcc9b17d6d12ee99cc7ea996b8bc1155a8a2182b1ff00bce" + }, + { + "bytes": 108082, + "path": "samples/webp_lossless/pm4-015-8fe08e47.png", + "sha256": "64509596c3136b38ad2f2cc41f6613060d5ecf87b248d5a1e2fa352a63be70b0" + }, + { + "bytes": 94885, + "path": "samples/webp_lossless/pm4-016-fd1eb48d.png", + "sha256": "bcff705ad549a9066038afa822e228acad509b850cd9abc07c5e0be980a78d1a" + }, + { + "bytes": 104878, + "path": "samples/webp_lossless/pm4-017-7f335742.png", + "sha256": "b070bbd481b06300bea2c873cdab7050d179133da077cc88c61e7edd52d41c24" + }, + { + "bytes": 120275, + "path": "samples/webp_lossless/pm4-018-4ea91357.png", + "sha256": "f835d17eada63ed38cb71f124544af22fbeed67d71dd0bd6ea0c76c759f9312d" + }, + { + "bytes": 123937, + "path": "samples/webp_lossless/pm4-019-f7070d02.png", + "sha256": "fd76611f13d144554125c9c69e59df65506ff65b40a4666d4fd46179f147ebc8" + }, + { + "bytes": 113683, + "path": "samples/webp_lossless/pm4-020-d8e94e65.png", + "sha256": "5e9e022fbb5c6fbda46c5a2bd8016cb142d30ed121a41af02b8e21ab82fe1cbc" + }, + { + "bytes": 139400, + "path": "samples/webp_lossless/pm4-021-2da79c09.png", + "sha256": "5d98fed53e4ce7a890b15075dd15eaa20dc33fd2c5cc142ba091366487874d4e" + }, + { + "bytes": 114240, + "path": "samples/webp_lossless/pm4-022-b8b11cb8.png", + "sha256": "6fcd0feba56d85cef6caf9cb97ce98bce01f254e15d197a16ad0978be6fb1d17" + }, + { + "bytes": 108902, + "path": "samples/webp_lossless/pm4-023-0eb7f66d.png", + "sha256": "6edf2c672479518ad1d19906c5c16c80328e5dd0cd26d968704d6bfe610c7e90" + }, + { + "bytes": 120111, + "path": "samples/webp_lossless/pm4-024-56de999a.png", + "sha256": "dd1de29d83b189895960c8b1d8f8fe66058036d5050b962ca639303d01468dbd" + }, + { + "bytes": 111354, + "path": "samples/webp_lossless/pm4-025-ef6349d3.png", + "sha256": "b0dc507fecfcf685d49f054cd3a2159911c3e459fbfbc0fce72a758aa7ee5269" + }, + { + "bytes": 103103, + "path": "samples/webp_lossless/pm4-026-ad193361.png", + "sha256": "46af2ed7452b2604355f5274338b02ccf8292e281e67e2f8cfc3085832eea72e" + }, + { + "bytes": 114797, + "path": "samples/webp_lossless/pm4-027-becf10ea.png", + "sha256": "24ba9fefc62748ea1b45ba5d7c241da1bf1d2896c8f18604e68a1dda9fb4f688" + }, + { + "bytes": 112446, + "path": "samples/webp_lossless/pm4-028-b56d212e.png", + "sha256": "af53cbdb8ba96c936b8ff88ba82019b7a2d55d34f53261e7edc31ead980d6a43" + }, + { + "bytes": 105546, + "path": "samples/webp_lossless/pm4-029-95eb9f34.png", + "sha256": "3b912cc07182c30a8b32c0f48ea3ba09a06bed9a4fd4a57eef4e13c084ad3634" + }, + { + "bytes": 122171, + "path": "samples/webp_lossless/pm4-030-2b63f9ba.png", + "sha256": "15dfb0f72046324290a7fb218c65629962deb637ff5d8b0e489640befa87e2b8" + }, + { + "bytes": 119380, + "path": "samples/webp_lossless/pm4-031-844a8814.png", + "sha256": "42484c336cb44b2d1023e432a8ff0958677d5944fd0c05d39dff5874837b42aa" + }, + { + "bytes": 112648, + "path": "samples/webp_lossless/pm4-032-42ee9a0f.png", + "sha256": "e5bb4493c664b3c944a0a848adfbbc9f47d133f44ea3ce5533b038c9596c1057" + }, + { + "bytes": 108331, + "path": "samples/webp_lossless/pm4-033-b5e58e7f.png", + "sha256": "66f2d2287adae22b471409076aebb6c5109583f049e4f8af1ce2587f572a5074" + }, + { + "bytes": 109906, + "path": "samples/webp_lossless/pm4-034-a383c38f.png", + "sha256": "662a662f6f2730c92861d23e50eafa792c624f3f3bc8b17c5d9c6322f03b953e" + }, + { + "bytes": 110674, + "path": "samples/webp_lossless/pm4-035-f3b99568.png", + "sha256": "b9d488b4f9ee7207a03d52428a8fcb144f76cba3869591f9aa33db0011d25060" + }, + { + "bytes": 112170, + "path": "samples/webp_lossless/pm4-036-71932e79.png", + "sha256": "a8fff8fe5271c97ccc870d954222484943d62196fabba408e709284c973312c0" + }, + { + "bytes": 121753, + "path": "samples/webp_lossless/pm4-037-9515174e.png", + "sha256": "85d1d7478b9d21e03d74ca861c9b1fc43a6914bebebd58ac8c8bf4ce95aa4b31" + }, + { + "bytes": 111716, + "path": "samples/webp_lossless/pm4-038-335a27fa.png", + "sha256": "7f4bdb8c09522704bdbba7909a1d3f922045a9471e767cf5ea75b8444630000f" + }, + { + "bytes": 110245, + "path": "samples/webp_lossless/pm4-039-066bcab1.png", + "sha256": "8807251f32fde85e810f75d41c2ecaf567add89896e87d58f2c48765a7f22e7d" + }, + { + "bytes": 118044, + "path": "samples/webp_lossless/pm4-040-eca2f1c2.png", + "sha256": "e9d3987940947f19b6239f26332a00c3db423ef707a43592656f6a65821c9772" + }, + { + "bytes": 117722, + "path": "samples/webp_lossless/pm4-041-7ac2f16a.png", + "sha256": "1556f076b29f6b80d2fa78d58b3a87d96c560dec42ccee26f0b0c62a589dc90f" + }, + { + "bytes": 128922, + "path": "samples/webp_lossless/pm4-042-f7a87ffa.png", + "sha256": "fd8ba206ff1d69664cfae40c1b0123f2ae4a36f0d4e95a4109583cb818d22302" + }, + { + "bytes": 108200, + "path": "samples/webp_lossless/pm4-043-cde8ad90.png", + "sha256": "7cee1c1ac5204ceb7830f7a84baba8b82553eb6c15f6f1aa4f886c4eaa398078" + }, + { + "bytes": 112465, + "path": "samples/webp_lossless/pm4-044-93deb087.png", + "sha256": "c90a24b34fcaea14e574f28889c7056a054c7b0839e516006dfbc987320fcfa5" + }, + { + "bytes": 113283, + "path": "samples/webp_lossless/pm4-045-25fa16bb.png", + "sha256": "cca74268536ff193a2111e606e4c50714f1dd3b669df1645691e11c7f30ab45a" + }, + { + "bytes": 108657, + "path": "samples/webp_lossless/pm4-046-bec80a2b.png", + "sha256": "298777b4b0d2be6fd6aa00173666a01d2a596541a5df239c6eca906de38863d6" + }, + { + "bytes": 115978, + "path": "samples/webp_lossless/pm4-047-fc09cfd4.png", + "sha256": "85aeb211ec43a40f73c1fe9265650f555c6a144e1064c41cda5c7192793549e3" + }, + { + "bytes": 120018, + "path": "samples/webp_lossless/pm4-048-e270315e.png", + "sha256": "2cf7901f35883f55d3d9e4a45265ff868bd18ec77844805279e3efe54cd3fb65" + }, + { + "bytes": 113425, + "path": "samples/webp_lossless/pm4-049-85579bcd.png", + "sha256": "fca97da7e0bf1fd18d0330c8fc43ebfa0014980fdd5760a6941ce6e6df32612c" + }, + { + "bytes": 117136, + "path": "samples/webp_lossless/pm4-050-c3e45c01.png", + "sha256": "7127b7833a0852c298213253a3ed037a033f3ad18cc41b00125e5b7644d1eeff" + }, + { + "bytes": 94159, + "path": "samples/webp_lossless/pm4-051-093f1478.png", + "sha256": "97dcf33631cc6449ef65f904a84b73166fe79ad161be835e076a70c86aa92aed" + }, + { + "bytes": 110201, + "path": "samples/webp_lossless/pm4-052-03bbf4ac.png", + "sha256": "d4d3987f7540ebaa2d67c367005ef20812382cb98e84835be8b69837ffae20e3" + }, + { + "bytes": 116271, + "path": "samples/webp_lossless/pm4-053-0c5b1381.png", + "sha256": "951c959837fb14f404b9e5661550001500ac7e5de138af42c36d896d90ce6911" + }, + { + "bytes": 126362, + "path": "samples/webp_lossless/pm4-054-92b0a67d.png", + "sha256": "f6ab18bc339c7990d640e44d1d20933967245fe064e93f36c2056ae78b72c41b" + }, + { + "bytes": 106257, + "path": "samples/webp_lossless/pm4-055-ac372623.png", + "sha256": "b5e1b894dda863ffbc2f4321590b1328071fd6a07069e9d5bba6af8190f974cd" + }, + { + "bytes": 105685, + "path": "samples/webp_lossless/pm4-056-ee005598.png", + "sha256": "289efb8d1d24a2e206d2aad932d8c4568e30417d09fb85c7acb6e7d48c8e5dd8" + }, + { + "bytes": 120368, + "path": "samples/webp_lossless/pm4-057-8ac12393.png", + "sha256": "0a1fa8242529d341736c78a942814034579cbe556ab1e6a57ca5baedeb5dc8f8" + }, + { + "bytes": 106366, + "path": "samples/webp_lossless/pm4-058-b655d991.png", + "sha256": "053f0e1adc2e5d8c3adf638c3cadb7070dff7d330bf0fcb6e15352b2557e23fe" + }, + { + "bytes": 108010, + "path": "samples/webp_lossless/pm4-059-7d5da4fb.png", + "sha256": "c5f7615176664c300fcd681a8cfce97f47786938364c3e07882830825c35ebf5" + }, + { + "bytes": 96564, + "path": "samples/webp_lossless/pm4-060-9ea3ad52.png", + "sha256": "14cd284c94b71bca08fd7880e9dc0ce5929fdbf3a94c154cbcf2f8dc0d4f3e38" + }, + { + "bytes": 109806, + "path": "samples/webp_lossless/pm4-061-3e32cfca.png", + "sha256": "18bfc1d33efe7d1f2dc07fd9754b3fc8074e8bec4aa0f1f1d34207eaf6ba8b0b" + }, + { + "bytes": 116237, + "path": "samples/webp_lossless/pm4-062-4e57bc1c.png", + "sha256": "410654eaba77572f690cca2624fdff6dad9a625988b912731d18ed30ba1370be" + }, + { + "bytes": 101491, + "path": "samples/webp_lossless/pm4-063-a4e09271.png", + "sha256": "2b511a867c0ed130040d4769f8a51a89e7e7bca7c0cb6ecc4852fe6144d8e41f" + }, + { + "bytes": 123988, + "path": "samples/webp_lossless/pm4-064-2264c7eb.png", + "sha256": "9b31985a931527141c1dbb9b5d97ba740149e3ffb6fd6875dc3c0d11b35cbd76" + }, + { + "bytes": 121489, + "path": "samples/webp_lossless/pm4-065-1cab116c.png", + "sha256": "a1019fe92d633511be3b482adfb30ac974fc43aa916ef0b1650fb43073bd313b" + }, + { + "bytes": 102950, + "path": "samples/webp_lossless/pm4-066-da57563c.png", + "sha256": "db4077d578b1dd6eb3ba9ff1b58cf75207efabb2dfe8bf9bbe05edeb94bf35d3" + }, + { + "bytes": 123594, + "path": "samples/webp_lossless/pm4-067-ef873e98.png", + "sha256": "5f58425fc2007a13a0e0f250d16074debd212cf86f224154cb5bc4762f381bbe" + }, + { + "bytes": 118386, + "path": "samples/webp_lossless/pm4-068-fbe210a2.png", + "sha256": "5239864081131ae58b1d0a244eb3a677267bc5c89e41dcafe661d27d891e4933" + }, + { + "bytes": 122354, + "path": "samples/webp_lossless/pm4-069-cacdab19.png", + "sha256": "ff0502f0ec00e8ef36a8fafb3d5a862982ae00c66cfb674dccd42e06ff150a7e" + }, + { + "bytes": 119082, + "path": "samples/webp_lossless/pm4-070-691aa003.png", + "sha256": "b1a7973984b695a6e62121729c92b1e3d637a10f2329050b9c08f8f66e2af498" + }, + { + "bytes": 115060, + "path": "samples/webp_lossless/pm4-071-b9fe92b0.png", + "sha256": "8624329020cce2c1677bdc2ddc5e3f998ee7cc427f14956eb8073b4f680b9ad9" + }, + { + "bytes": 122368, + "path": "samples/webp_lossless/pm4-072-4a0cff0c.png", + "sha256": "9e5e4d390a984e909386ccd9fb5af7aa2c2a2a2203fda8474011cf90f5509591" + }, + { + "bytes": 103759, + "path": "samples/webp_lossless/pm4-073-6ec086e0.png", + "sha256": "483769187bdce6595e1129c8f63d63c724d5ee84c96c5b279246bd4946d88d46" + }, + { + "bytes": 113680, + "path": "samples/webp_lossless/pm4-074-796fd1d3.png", + "sha256": "2ba3d9caeaed8d39fd40ecd127c1663f6ba1771e853e2f36a2362d6ebc47ce80" + }, + { + "bytes": 88445, + "path": "samples/webp_lossless/pm4-075-3906d66e.png", + "sha256": "bb0d8bfbf73814e18449531924ca256cf418cb785c979479518909422c62b99c" + }, + { + "bytes": 107522, + "path": "samples/webp_lossless/pm4-076-a577a15d.png", + "sha256": "47db78e98d2d475ac8c9ddbb19cfaa7d7e47a5910c46ca6cf82db0ac765bf31b" + }, + { + "bytes": 103276, + "path": "samples/webp_lossless/pm4-077-7fa689ad.png", + "sha256": "d2ed56d74eb07107b78127021ce5970fbf86e1ccf06f709efab40cf0dec16333" + }, + { + "bytes": 94261, + "path": "samples/webp_lossless/pm4-078-a77b762e.png", + "sha256": "7802ee18eba2ecef97ce147f9eb2488df78961b545b941abf065958d85fd7c22" + }, + { + "bytes": 108917, + "path": "samples/webp_lossless/pm4-079-5e8f0ede.png", + "sha256": "ff9a30bb54d86be04df77c5cf815d30307341d748382e0a4c9282847ae46dafc" + }, + { + "bytes": 88920, + "path": "samples/webp_lossless/pm4-080-78dedcb6.png", + "sha256": "3876e432e1478afed282f6b029a0c71e626f5bd20a4a2d923b1259df5418e30e" + }, + { + "bytes": 105568, + "path": "samples/webp_lossless/pm4-081-5b17a851.png", + "sha256": "628afcde189ce2f39666a9e68ae37b435622a22007028884ff3e2c88bdecd2d4" + }, + { + "bytes": 97699, + "path": "samples/webp_lossless/pm4-082-6adb4a49.png", + "sha256": "17155d397425fe97f34525b788266a41b726597bc9917606425a2e4154d42364" + }, + { + "bytes": 121772, + "path": "samples/webp_lossless/pm4-083-02dc5c51.png", + "sha256": "9ee65e471640e3b5638313b055cac9867cb34df2b8150a46c8757476f2ebdfca" + }, + { + "bytes": 115564, + "path": "samples/webp_lossless/pm4-084-06ed218a.png", + "sha256": "b151d11d8b311fb05fda059b4397251aeea64467a7b02880c82192ea3dcd1dd8" + }, + { + "bytes": 121910, + "path": "samples/webp_lossless/pm4-085-84317ff5.png", + "sha256": "d9d5e161fe584f102dddecf6c99ea36367028c445b281df0c4fa78d156eb4cd5" + }, + { + "bytes": 103723, + "path": "samples/webp_lossless/pm4-086-90e23232.png", + "sha256": "3cb2578180aa31d47e4566d0b369a71c880bd78ac72f9c48294fbec37eed0429" + }, + { + "bytes": 100822, + "path": "samples/webp_lossless/pm4-087-34bf26a1.png", + "sha256": "d20a8c23c2537231026a2a66fb3f9d5e5d0bc6ba29e3fa3645a924f2154c43f4" + }, + { + "bytes": 110191, + "path": "samples/webp_lossless/pm4-088-92a9c223.png", + "sha256": "ddaf73ad42ada3a4f3cedc7c63cc2961ddb348cd072a3c696b7b6a09f9abc321" + }, + { + "bytes": 97454, + "path": "samples/webp_lossless/pm4-089-60ad56aa.png", + "sha256": "8a46decb953eb4621648cc6f65c50cd9f8d3c2bf8ccb0fc3538bddf3c3b3a186" + }, + { + "bytes": 88345, + "path": "samples/webp_lossless/pm4-090-c71ebd94.png", + "sha256": "6c1e8d987942c87afd75e7a5f5306574666b332d76fa8d57c57e890f4d47d9fa" + }, + { + "bytes": 132448, + "path": "samples/webp_lossless/pm4-091-c428ceb2.png", + "sha256": "b95e665931de52b3c7e874ef925027f4eaab81e96d302b9cfc795c2ce45ed6a3" + }, + { + "bytes": 110845, + "path": "samples/webp_lossless/pm4-092-cc02ddf9.png", + "sha256": "4596d75bb4de3efe20ea1df5840f24445f211155152f41a6a12342d354b66706" + }, + { + "bytes": 129169, + "path": "samples/webp_lossless/pm4-093-53b39ad0.png", + "sha256": "16bbc4a917be6c29849b94597d40fc93fb56c2a019a23b351b419cbde411f06a" + }, + { + "bytes": 107201, + "path": "samples/webp_lossless/pm4-094-dd71e13d.png", + "sha256": "10ec7b2e09fb1676cc042f112b0836f27a22bebeb96edfb3f3e2d09b2ac0eef8" + }, + { + "bytes": 106499, + "path": "samples/webp_lossless/pm4-095-13e2d4a2.png", + "sha256": "80212df1c8e7e08ebd767f128faed183ec98b2634bbd26c193a9b2d5fb7d3919" + }, + { + "bytes": 117603, + "path": "samples/webp_lossless/pm4-096-95b0203e.png", + "sha256": "424b83b33b0a604e413afa4a97eb4b446b57838f8d7e8c9ef6650f6692d27198" + }, + { + "bytes": 73161, + "path": "samples/webp_lossless/pm4-097-0b860832.png", + "sha256": "b2c5ed25367cfcda6675cb5d78fbdedb2ee841896902eb2ab0bd4b18188c6498" + }, + { + "bytes": 101488, + "path": "samples/webp_lossless/pm4-098-b03251b5.png", + "sha256": "24c64d7e65509666399a983b098285b5d5d0db854501bdbb59dbe99d8dbaf99b" + }, + { + "bytes": 115308, + "path": "samples/webp_lossless/pm4-099-d947f488.png", + "sha256": "96eaf23a5754fe8e45444e46d6f09792c2b105ebcf43badaca92c29f2685f353" + }, + { + "bytes": 106384, + "path": "samples/webp_lossless/pm4-100-5e269fc4.png", + "sha256": "2f6a3de60cd0e00fd0d74ddd89a5d25ad34ffbbd840ad45c7e87896a00098856" + }, + { + "bytes": 102891, + "path": "samples/webp_q80_protected_high/pm4-001-cca08f5b.png", + "sha256": "b5f8f408ac9331bdff20de0f8586b07efbe59c4b59f9d029315c436f3f0bed29" + }, + { + "bytes": 98892, + "path": "samples/webp_q80_protected_high/pm4-002-effb6eaa.png", + "sha256": "aa5d76385a5111b884447ab7e55062055daabd54f6c11ee21058f28dc6699901" + }, + { + "bytes": 100500, + "path": "samples/webp_q80_protected_high/pm4-003-46e10145.png", + "sha256": "0d0f9b07979e5fa47c396e796bac6aae407cfa4a3f759608ab859d88f62d55cd" + }, + { + "bytes": 117727, + "path": "samples/webp_q80_protected_high/pm4-004-ab14afb8.png", + "sha256": "7b0c7212795be8eb7d1bb4ae57725f0003dc69ed2f60ef8b3e30257c34869471" + }, + { + "bytes": 115343, + "path": "samples/webp_q80_protected_high/pm4-005-5e9b5a50.png", + "sha256": "be34a0bd4ba46ff63ccb691d1d0befc82434bde52359f885a9491c004422d966" + }, + { + "bytes": 101301, + "path": "samples/webp_q80_protected_high/pm4-006-44a2087e.png", + "sha256": "aff1f6ac33f06690a47aeeb17ec4dbbdec4c9d7982c825954a0748a6ac268fe4" + }, + { + "bytes": 110888, + "path": "samples/webp_q80_protected_high/pm4-007-5003533d.png", + "sha256": "958f9786c4b15a68271a6bc3113750e6871033bf81f4a82662308bb72cfb0468" + }, + { + "bytes": 110371, + "path": "samples/webp_q80_protected_high/pm4-008-54647723.png", + "sha256": "963a277bc8bfdf6e46d555d28ffbd6184727773d0b500c166d7bb0e25c6f9e82" + }, + { + "bytes": 113747, + "path": "samples/webp_q80_protected_high/pm4-009-e51903e1.png", + "sha256": "62f1fabf6db80e2f738387d405903b1f72c67e5f94343b1984c763e67f13201c" + }, + { + "bytes": 102411, + "path": "samples/webp_q80_protected_high/pm4-010-97841ad3.png", + "sha256": "e9d283971db4a38d70258a1be741297182b289316b295bae65a43b4217a35935" + }, + { + "bytes": 116640, + "path": "samples/webp_q80_protected_high/pm4-011-c900b313.png", + "sha256": "c7fe7f02e1af5986d9138233ad5995ca967370d129c55fbf068e84a332ae769e" + }, + { + "bytes": 107573, + "path": "samples/webp_q80_protected_high/pm4-012-98171122.png", + "sha256": "68f9ee37637b4cbaea1486bcca1561b9c811ac98dd5b3fe9b4e6bb97d47570be" + }, + { + "bytes": 122122, + "path": "samples/webp_q80_protected_high/pm4-013-d58e7b01.png", + "sha256": "b664a09eca07d9ba2f337d2a6639089a0f87cb4c9859c99543a073c962aee765" + }, + { + "bytes": 116695, + "path": "samples/webp_q80_protected_high/pm4-014-8876ccfb.png", + "sha256": "88eb16a656d17630ddfae9200d36f072d690ce4a4a16a11e5055dcc91279a8ed" + }, + { + "bytes": 108011, + "path": "samples/webp_q80_protected_high/pm4-015-8fe08e47.png", + "sha256": "933b6fd693fbbc0fccd8fcffaec8762bdd4870cda1534238604eaedabe1c42b5" + }, + { + "bytes": 94795, + "path": "samples/webp_q80_protected_high/pm4-016-fd1eb48d.png", + "sha256": "cfa43399b5bafe5a99dc2450235759ae81074495599e7e610c1bd954cef1b221" + }, + { + "bytes": 104863, + "path": "samples/webp_q80_protected_high/pm4-017-7f335742.png", + "sha256": "7f487723a3c28f4d922a1e56329189fa54e408bbe0332a5f047aa1789e9719c1" + }, + { + "bytes": 118855, + "path": "samples/webp_q80_protected_high/pm4-018-4ea91357.png", + "sha256": "af6a93f1f473a7905e0574d5348c327e820ce7290777fc0a47cbbd1adada15cf" + }, + { + "bytes": 124031, + "path": "samples/webp_q80_protected_high/pm4-019-f7070d02.png", + "sha256": "59aae59fe3de4bb7c4a74369b5ede851ee758a764b2621268776fadcfce5a39b" + }, + { + "bytes": 113878, + "path": "samples/webp_q80_protected_high/pm4-020-d8e94e65.png", + "sha256": "8f2e74dfdd3c4328be8e07ef69be5bbf37d5d0cbbd4230cd888c1941c53bbf69" + }, + { + "bytes": 139508, + "path": "samples/webp_q80_protected_high/pm4-021-2da79c09.png", + "sha256": "30c275fc759e8198c5a84d5f2f9d409184020c997b15ebb49ad78bc45161192d" + }, + { + "bytes": 114134, + "path": "samples/webp_q80_protected_high/pm4-022-b8b11cb8.png", + "sha256": "7d3b8c97d7bea6388a1efff6d81b3e44b16ce139c687509f939c65a209f54c3d" + }, + { + "bytes": 108760, + "path": "samples/webp_q80_protected_high/pm4-023-0eb7f66d.png", + "sha256": "5e70618bc2e041a1dc49dbf3927cc82cd9c06435c84ecd9cd66c432e8c7b735f" + }, + { + "bytes": 120291, + "path": "samples/webp_q80_protected_high/pm4-024-56de999a.png", + "sha256": "00ff5314c2fbefabf889bb8c99b7ca17c74d4556fa5c4cf8b13838447411d8e2" + }, + { + "bytes": 111304, + "path": "samples/webp_q80_protected_high/pm4-025-ef6349d3.png", + "sha256": "e050dc578658e0fdb54e2d9feef02f053c80193b680651554a1a84717204bc20" + }, + { + "bytes": 103430, + "path": "samples/webp_q80_protected_high/pm4-026-ad193361.png", + "sha256": "8d1cf3b1404f6ec949cf97ba8a6d7611675d33879b867e94e24f3884c5ccbedb" + }, + { + "bytes": 115027, + "path": "samples/webp_q80_protected_high/pm4-027-becf10ea.png", + "sha256": "37a24dddb1cfe3f829b458952fe7a430870f480edda79a62b0c89fb3f4d446e5" + }, + { + "bytes": 112533, + "path": "samples/webp_q80_protected_high/pm4-028-b56d212e.png", + "sha256": "abf41452177eb274a3d1d4d536d00366bb0826bf8349ed2a78f23b215ff99079" + }, + { + "bytes": 105590, + "path": "samples/webp_q80_protected_high/pm4-029-95eb9f34.png", + "sha256": "2206fed0895239c283110d90d287c95d80fb9510bd70f53edcabb1e29a954c8b" + }, + { + "bytes": 122128, + "path": "samples/webp_q80_protected_high/pm4-030-2b63f9ba.png", + "sha256": "065f9339b5d856326f078dcc9848567f7580e2627bd9a1296393a3c089f09c81" + }, + { + "bytes": 119277, + "path": "samples/webp_q80_protected_high/pm4-031-844a8814.png", + "sha256": "2e7cbe7e1d561a5577404b65af2aefdd4aa7750c08c467e889bd1bb7570dfc8f" + }, + { + "bytes": 112455, + "path": "samples/webp_q80_protected_high/pm4-032-42ee9a0f.png", + "sha256": "f820f181644b489191330177e4c8cc74c14bbb5b3758fa5bfc694cb0bf26ebd3" + }, + { + "bytes": 108133, + "path": "samples/webp_q80_protected_high/pm4-033-b5e58e7f.png", + "sha256": "15cec1aceaeb03f486a4196aca84ac78be47651f90b52ccfd558b8ec9b54e063" + }, + { + "bytes": 109742, + "path": "samples/webp_q80_protected_high/pm4-034-a383c38f.png", + "sha256": "18d14122c5ad692a0186c0eac4ec4612e934b136ec951abf6c1a7c96ec5b688d" + }, + { + "bytes": 110398, + "path": "samples/webp_q80_protected_high/pm4-035-f3b99568.png", + "sha256": "23405ab11172b018b828cdd973bcb8e959342587d8f86d1182249cec32beb3a9" + }, + { + "bytes": 111945, + "path": "samples/webp_q80_protected_high/pm4-036-71932e79.png", + "sha256": "6035f8f7fa4314897a675db471b083ba848f7d2597c4c91e659c2507225638a0" + }, + { + "bytes": 121042, + "path": "samples/webp_q80_protected_high/pm4-037-9515174e.png", + "sha256": "fbecabf45a86f5f800cd591816690602bb9de2e30d1116fa97a06d79c833b36d" + }, + { + "bytes": 111842, + "path": "samples/webp_q80_protected_high/pm4-038-335a27fa.png", + "sha256": "b79cf9ccb1f6a0f22bce043c03ee43a9ccbc25c9c898319f5b29bbacd27bc69d" + }, + { + "bytes": 110414, + "path": "samples/webp_q80_protected_high/pm4-039-066bcab1.png", + "sha256": "2dd7b99c7c9453407eccb0ad359d74ffd1aaa4b2da9eaa8b8019df78d826a18b" + }, + { + "bytes": 117720, + "path": "samples/webp_q80_protected_high/pm4-040-eca2f1c2.png", + "sha256": "74913b690f377fe989d63c5e784ddc1008cd44330299e22160e609921bb49260" + }, + { + "bytes": 117528, + "path": "samples/webp_q80_protected_high/pm4-041-7ac2f16a.png", + "sha256": "f39a71f3c68451ea9a88ef5e8e425d30a0e538b3c7e1550f0e8bbcd7327d8144" + }, + { + "bytes": 128994, + "path": "samples/webp_q80_protected_high/pm4-042-f7a87ffa.png", + "sha256": "5ac91cd665b72402c6e5cd8d5982a7e5174ef71505d46b078b6456d905ab6d19" + }, + { + "bytes": 108402, + "path": "samples/webp_q80_protected_high/pm4-043-cde8ad90.png", + "sha256": "aeadbe45156b633ad39dde79b061ba899813cd38cc7034993b664d469008c0d8" + }, + { + "bytes": 112596, + "path": "samples/webp_q80_protected_high/pm4-044-93deb087.png", + "sha256": "425b94bba216efd18b3c57e38d5ee1d9a211af016a066ef5b1fdf9515027122b" + }, + { + "bytes": 113351, + "path": "samples/webp_q80_protected_high/pm4-045-25fa16bb.png", + "sha256": "4f8a73e56366bce07694f4c5684f7b3f9cd36f98bc0877fea1909d3036697dee" + }, + { + "bytes": 108669, + "path": "samples/webp_q80_protected_high/pm4-046-bec80a2b.png", + "sha256": "9884e8a3d53655ba37cfdf2746900d55ad863f034823bb76703b7ff67abd9327" + }, + { + "bytes": 115836, + "path": "samples/webp_q80_protected_high/pm4-047-fc09cfd4.png", + "sha256": "ad0015f732c41a020b1ba7381cb3b2bbfc122dcd207b52ba4f9ea581ca1968ff" + }, + { + "bytes": 120108, + "path": "samples/webp_q80_protected_high/pm4-048-e270315e.png", + "sha256": "0f0a2eeac8c44d95fd0115a12c2c377e31c314bfe39e5abafe9c1dcecc4a98b5" + }, + { + "bytes": 113242, + "path": "samples/webp_q80_protected_high/pm4-049-85579bcd.png", + "sha256": "763c618bca0dea866fbd3fbb7eb1f5b3f7a5eb1607d1696d9accb20c7f768b97" + }, + { + "bytes": 117046, + "path": "samples/webp_q80_protected_high/pm4-050-c3e45c01.png", + "sha256": "339521481f92b0bfab8918e374030fbf19bd541a23db3aa8201396a310872e0a" + }, + { + "bytes": 94179, + "path": "samples/webp_q80_protected_high/pm4-051-093f1478.png", + "sha256": "0e8398f16621f3d761a4fb2969d8f7dff1fdd68d0aa40ebcbd6d017ca757b142" + }, + { + "bytes": 110454, + "path": "samples/webp_q80_protected_high/pm4-052-03bbf4ac.png", + "sha256": "d15d30accad46045abf77c218b53ef4d9fe787cb9c225b89eab3b91c09d22398" + }, + { + "bytes": 116453, + "path": "samples/webp_q80_protected_high/pm4-053-0c5b1381.png", + "sha256": "cd7e5eba22c601ef2abfeeb70adc05733fac3add65d6837b863ee80d858a4d2e" + }, + { + "bytes": 126059, + "path": "samples/webp_q80_protected_high/pm4-054-92b0a67d.png", + "sha256": "cbf4f49c145ea36921b4ea33aa6be7a36eb7ae200d7142a350bdbbc5ed7d23e3" + }, + { + "bytes": 106334, + "path": "samples/webp_q80_protected_high/pm4-055-ac372623.png", + "sha256": "357921959115b118c85bac1330d8b03af45965f0af60f66f24c731eafdd0778e" + }, + { + "bytes": 105971, + "path": "samples/webp_q80_protected_high/pm4-056-ee005598.png", + "sha256": "ea32d8dac1d36d6045e8c703243cd01c87bdc9f041f456ba9e5e38dd50e883c0" + }, + { + "bytes": 120046, + "path": "samples/webp_q80_protected_high/pm4-057-8ac12393.png", + "sha256": "fddb1e14ff6a3696e03d14bcce62e3b028e9e6b3d6bd6275f03d00cdc7f724c2" + }, + { + "bytes": 106139, + "path": "samples/webp_q80_protected_high/pm4-058-b655d991.png", + "sha256": "d5ebb0c53a6049e1300eb465fe89e69f204645af195f9eef622c897196a12424" + }, + { + "bytes": 107997, + "path": "samples/webp_q80_protected_high/pm4-059-7d5da4fb.png", + "sha256": "a0d3a8575a6ed3d1f064272ae7563fa397664296e684834a2be08903627a7a31" + }, + { + "bytes": 96663, + "path": "samples/webp_q80_protected_high/pm4-060-9ea3ad52.png", + "sha256": "21aaee099e51314518a7fd328b0890fa7b9f8dd6b8949c557a34361a851a731a" + }, + { + "bytes": 109827, + "path": "samples/webp_q80_protected_high/pm4-061-3e32cfca.png", + "sha256": "1f27342fac2a865a1be866cba540b21d31927e09c25bd409c1418613fbd29ce0" + }, + { + "bytes": 116277, + "path": "samples/webp_q80_protected_high/pm4-062-4e57bc1c.png", + "sha256": "577d7cb1cdae8cf0f56272c8579588cb85eca0b33106f01c243b1fe28d5d1693" + }, + { + "bytes": 101423, + "path": "samples/webp_q80_protected_high/pm4-063-a4e09271.png", + "sha256": "a4ff92f529374cdaf6443c5af4bc4be859408a599cde72b661d898a0ea77e4fd" + }, + { + "bytes": 124049, + "path": "samples/webp_q80_protected_high/pm4-064-2264c7eb.png", + "sha256": "4c49a7fbf39e2ee16cdc20d32920344988ffc78f734d041844d27e831244e466" + }, + { + "bytes": 121374, + "path": "samples/webp_q80_protected_high/pm4-065-1cab116c.png", + "sha256": "4e9b67bdc0831494a74b5cfe0abb52dff006fd5aa268d11eee89be4a64860bbb" + }, + { + "bytes": 103393, + "path": "samples/webp_q80_protected_high/pm4-066-da57563c.png", + "sha256": "9a36dde6be3487d05eb1589a9474f2ff26e4aa4ba68a41f77d13851dc057124e" + }, + { + "bytes": 123769, + "path": "samples/webp_q80_protected_high/pm4-067-ef873e98.png", + "sha256": "43b865bac1b0b2344072d651158e5a63ce52890f81414aa0c5ba9e1f0824e9d6" + }, + { + "bytes": 118878, + "path": "samples/webp_q80_protected_high/pm4-068-fbe210a2.png", + "sha256": "bc844bec0b2230a6d2b42532dd03c014d301dcc6a62c06f3bec19d264a0ea353" + }, + { + "bytes": 122353, + "path": "samples/webp_q80_protected_high/pm4-069-cacdab19.png", + "sha256": "47ca54d2b673d22a26ed347d2c9b24cd4409b9f886bcc7500df122b6837f9b7d" + }, + { + "bytes": 118910, + "path": "samples/webp_q80_protected_high/pm4-070-691aa003.png", + "sha256": "2c02215ed3ce414c30983151c5c69d9d902b8cdc7b444566bfa299846b107f4f" + }, + { + "bytes": 114900, + "path": "samples/webp_q80_protected_high/pm4-071-b9fe92b0.png", + "sha256": "9011059ac5a8afc18dd4de9cf8cd0c305fbaf972f990f1e64681f0f6391a38e1" + }, + { + "bytes": 122072, + "path": "samples/webp_q80_protected_high/pm4-072-4a0cff0c.png", + "sha256": "2fc40b534f91693f54a6b9540736de147b9732544070c0a387f46aed6f3c5840" + }, + { + "bytes": 103713, + "path": "samples/webp_q80_protected_high/pm4-073-6ec086e0.png", + "sha256": "32eef224d4f75678dabfbef122bd574d30e0d7c1e15cddf58bcc53dcc8975112" + }, + { + "bytes": 113320, + "path": "samples/webp_q80_protected_high/pm4-074-796fd1d3.png", + "sha256": "03071a21db08e0485b995015424ee2f6d28e808103f07efe9431f83d08f55e80" + }, + { + "bytes": 88210, + "path": "samples/webp_q80_protected_high/pm4-075-3906d66e.png", + "sha256": "962d8d7ab5d59da40c7840d5a3bb0ba894d1e13b6dc968a58754a3137c6df98f" + }, + { + "bytes": 96709, + "path": "samples/webp_q80_protected_high/pm4-076-a577a15d.png", + "sha256": "640dc4db9aaebead3926f17bc571f349f8c21003191ca1468c97678bd878257e" + }, + { + "bytes": 103350, + "path": "samples/webp_q80_protected_high/pm4-077-7fa689ad.png", + "sha256": "2da55eb4bc16d480d1e14f3567110a4464d67a2dfc0abad00d1d7989009f8684" + }, + { + "bytes": 94368, + "path": "samples/webp_q80_protected_high/pm4-078-a77b762e.png", + "sha256": "1aaceaab2b9b09f2de82f649fe1e27b3d6499c97ba84d5ae103e134bb97b172e" + }, + { + "bytes": 108872, + "path": "samples/webp_q80_protected_high/pm4-079-5e8f0ede.png", + "sha256": "6fc0c9647e90dd438309eacb4d4b177387a55282242269a8d865d22a0b843e08" + }, + { + "bytes": 88988, + "path": "samples/webp_q80_protected_high/pm4-080-78dedcb6.png", + "sha256": "8d58fe38eebc3b4cd1eb199916e78611d89d0ad8ac02c5e15f274d6b16fb3779" + }, + { + "bytes": 105339, + "path": "samples/webp_q80_protected_high/pm4-081-5b17a851.png", + "sha256": "acda452c7f0428b1d34400d2f9679aab31da70c90076fc6992696c7967b8bf3f" + }, + { + "bytes": 97465, + "path": "samples/webp_q80_protected_high/pm4-082-6adb4a49.png", + "sha256": "8de8ff443a394c37d87dfddd7015210317bf9bb3c768897ce7ef23df04f1b29e" + }, + { + "bytes": 121627, + "path": "samples/webp_q80_protected_high/pm4-083-02dc5c51.png", + "sha256": "9a232ff765db76f1a19f394f02f480746c40730d8d357d249f381a722ea811cd" + }, + { + "bytes": 115478, + "path": "samples/webp_q80_protected_high/pm4-084-06ed218a.png", + "sha256": "38a7e332a89e46d234681e8772d4a801582fd3c614906e0268e9c3914fbb528f" + }, + { + "bytes": 121585, + "path": "samples/webp_q80_protected_high/pm4-085-84317ff5.png", + "sha256": "e212dfb29a6b9eab112fb11a67811d1adcf6fa550c123f53e0625acb8b1ed082" + }, + { + "bytes": 103667, + "path": "samples/webp_q80_protected_high/pm4-086-90e23232.png", + "sha256": "c0381463a6734a9dc951edf679b226ebbed9357ed1e560903e67068fddc29b08" + }, + { + "bytes": 100925, + "path": "samples/webp_q80_protected_high/pm4-087-34bf26a1.png", + "sha256": "1396c607f0cb08a4c099c43d07c5c573b87cddb41400205fadd2f1bc6d5b14a7" + }, + { + "bytes": 110207, + "path": "samples/webp_q80_protected_high/pm4-088-92a9c223.png", + "sha256": "e1fb366be62056e751db9ed9e22308af407571e680f2047785f057158051deb3" + }, + { + "bytes": 97717, + "path": "samples/webp_q80_protected_high/pm4-089-60ad56aa.png", + "sha256": "69f5b44380038e410e548815122f6160702a247ea87e919064e525a3040daf77" + }, + { + "bytes": 87947, + "path": "samples/webp_q80_protected_high/pm4-090-c71ebd94.png", + "sha256": "e3b3ed24f9c161230da6b8d9c32681bea0a97aa552eebb4eda03608c1f2f56d8" + }, + { + "bytes": 132129, + "path": "samples/webp_q80_protected_high/pm4-091-c428ceb2.png", + "sha256": "dff7530260f7cd75ea28dad20be1f292542bf771bf5becb99c5214d4b032b76d" + }, + { + "bytes": 110417, + "path": "samples/webp_q80_protected_high/pm4-092-cc02ddf9.png", + "sha256": "a813733a062b42e1f8413f3025ca291b4d51e814d264d363a524fe6679d2cf5e" + }, + { + "bytes": 129127, + "path": "samples/webp_q80_protected_high/pm4-093-53b39ad0.png", + "sha256": "66e573db1b197d8def897098e82ef980c5127df6163de3a44bcdb515560498e0" + }, + { + "bytes": 107116, + "path": "samples/webp_q80_protected_high/pm4-094-dd71e13d.png", + "sha256": "687289acab77695ae39961981a8c36e5f032f7cb61521224ce4d1f379235d576" + }, + { + "bytes": 106506, + "path": "samples/webp_q80_protected_high/pm4-095-13e2d4a2.png", + "sha256": "5fc3e2709e2076156e2fad0102cdf64ed8b187d39e9e2fc35b4295f26f5e2876" + }, + { + "bytes": 117566, + "path": "samples/webp_q80_protected_high/pm4-096-95b0203e.png", + "sha256": "df0d542cd808641c96f6adc41dfc2dd6eef8be28ae02fa9c940ed8b2567f536e" + }, + { + "bytes": 72995, + "path": "samples/webp_q80_protected_high/pm4-097-0b860832.png", + "sha256": "df4c52140a7f07f2dc9dae8e817cafe46566d7e407dbfbb1954b573147674096" + }, + { + "bytes": 101336, + "path": "samples/webp_q80_protected_high/pm4-098-b03251b5.png", + "sha256": "d5a32edab5083cea3e5f6e1706fb45fb8772901011add4f97ba496472855db17" + }, + { + "bytes": 115391, + "path": "samples/webp_q80_protected_high/pm4-099-d947f488.png", + "sha256": "ca06dfd6bbfbf297affa73b6fb06a23475cac015d016796b70ae4d05680eb770" + }, + { + "bytes": 106680, + "path": "samples/webp_q80_protected_high/pm4-100-5e269fc4.png", + "sha256": "0c5886d3042f7efd1137cc6fe11410032a1c351ac5c0c7283e7b05fc53db86a8" + }, + { + "bytes": 880, + "path": "weights/README.md", + "sha256": "bb9578f06a8c277d99a734fa2dc6141ed8922be67259fb801cbe56b43538d630" + }, + { + "bytes": 29691217, + "path": "weights/codec_payloads/avif_q70.avif", + "sha256": "b83258bd00e22d5e5d21236f5c441971c7c94b246e63d6eb6b41a1e23ce7952a" + }, + { + "bytes": 156060019, + "path": "weights/codec_payloads/jpeg_q100.jpg", + "sha256": "d74c6e5e16cdf93a5afef3a95b08ef8f2d529cef452beeff71c38fe9359d08d6" + }, + { + "bytes": 50283220, + "path": "weights/codec_payloads/jpeg_q80.jpg", + "sha256": "de6fadf8ec9b44b429629418d79d77b8e852a5cfcc43b0cd3035013eb59accc9" + }, + { + "bytes": 39437937, + "path": "weights/codec_payloads/jxl_d1.jxl", + "sha256": "e7ef2f74cc503897f120d3b414c61bdcb198c8c91c012fa65c668f47c119966d" + }, + { + "bytes": 89711808, + "path": "weights/codec_payloads/png_baseline.png", + "sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31" + }, + { + "bytes": 67929870, + "path": "weights/codec_payloads/webp_lossless.webp", + "sha256": "134c0c741635bb91b0f80d386d03e7ae4b4652fe82a640d6ceb8e228eced0934" + }, + { + "bytes": 25810802, + "path": "weights/codec_payloads/webp_q80.webp", + "sha256": "9139ab3d637498f7fb40f71d531a674098164a3226057cbd51dfb85be1b7da70" + }, + { + "bytes": 2766, + "path": "weights/manifest.csv", + "sha256": "d82be9432197ebb0a183e435afd00f42c76634dcda74ef409daf4596420b3efb" + }, + { + "bytes": 32686473, + "path": "weights/protected/high_byte.png", + "sha256": "82b3031ec79cf1541334e3f454a0af8705da2166f6bde7780196dd1e024df5ab" + }, + { + "bytes": 21791910, + "path": "weights/protected/low_byte/avif_q70_low.avif", + "sha256": "1698fedd0949bfdcf787576d35a81192e6f1adfc21f3499acb610d67d7a443e4" + }, + { + "bytes": 63199775, + "path": "weights/protected/low_byte/jpeg_q100_low.jpg", + "sha256": "99c2c391d129bd1df40e58a25f79ee8b954c7e78fcb1814774b4bf7ac3a6e277" + }, + { + "bytes": 24229532, + "path": "weights/protected/low_byte/jpeg_q80_low.jpg", + "sha256": "d32d9d1e7be1ea666a37fd761e1c74f94445562120313d01ba940711baeeddb1" + }, + { + "bytes": 23636365, + "path": "weights/protected/low_byte/jxl_d1_low.jxl", + "sha256": "a58701006f3b535cfc27473f9ae741c7d3d888c1f7741c53d047d91c82d0a050" + }, + { + "bytes": 23230766, + "path": "weights/protected/low_byte/webp_q80_low.webp", + "sha256": "f200066cf1ffbace7aaa9733d3a5c017379037e4e5fa58b8b09b3c6985655fc9" + } + ], + "conditions": [ + "png_baseline", + "webp_lossless", + "jpeg_q100_raw", + "jpeg_q100_repair_zero", + "jpeg_q100_protected_high", + "jpeg_q80_raw", + "jpeg_q80_repair_zero", + "jpeg_q80_protected_high", + "webp_q80_raw", + "webp_q80_repair_zero", + "webp_q80_protected_high", + "avif_q70_raw", + "avif_q70_repair_zero", + "avif_q70_protected_high", + "jxl_d1_raw", + "jxl_d1_repair_zero", + "jxl_d1_protected_high" + ], + "packaging_source_commit": "939465cee88e49ae212df48aac18e74459763a72", + "profile": "full", + "prompt_count": 100, + "run_identity_hash": "a25f5678a8c81bb51c1835ee821be3662c76e9872d84c99ac1115f4b7ef5bc8b", + "schema_version": 1, + "scientific_identity_hash": "19ed6466ecdde153ae9c7e061d76a285223150b34eee721b009f8073e3805cb0", + "study": "PixelModel-v4 image codec study", + "upstream_repository": "bench-labs/PixelModel-v4", + "upstream_revision": "80878fdd6e130d229c2581424a3456b47b979d4b" +} diff --git a/results/codec_conditions.csv b/results/codec_conditions.csv new file mode 100644 index 0000000000000000000000000000000000000000..9616b8d4d560d0f8cfcff41e841c07350e37142c --- /dev/null +++ b/results/codec_conditions.csv @@ -0,0 +1,18 @@ +condition_id,codec,quality_distance,mode,lossless,reconstruction_mode,repair,protected,status,failure_stage +png_baseline,png,,raw,True,raw,none,False,completed, +webp_lossless,webp_lossless,lossless,raw,True,raw,none,False,completed, +jpeg_q100_raw,jpeg_q100,,raw,False,raw,none,False,weight_gate_blocked,weight_gate +jpeg_q100_repair_zero,jpeg_q100,,repair_zero,False,repair_zero,zero,False,completed, +jpeg_q100_protected_high,jpeg_q100,,protected_high,False,protected_high,none,True,completed, +jpeg_q80_raw,jpeg_q80,,raw,False,raw,none,False,weight_gate_blocked,weight_gate +jpeg_q80_repair_zero,jpeg_q80,,repair_zero,False,repair_zero,zero,False,completed,generation +jpeg_q80_protected_high,jpeg_q80,,protected_high,False,protected_high,none,True,completed, +webp_q80_raw,webp_q80,,raw,False,raw,none,False,weight_gate_blocked,weight_gate +webp_q80_repair_zero,webp_q80,,repair_zero,False,repair_zero,zero,False,completed,generation +webp_q80_protected_high,webp_q80,,protected_high,False,protected_high,none,True,completed, +avif_q70_raw,avif_q70,,raw,False,raw,none,False,weight_gate_blocked,weight_gate +avif_q70_repair_zero,avif_q70,,repair_zero,False,repair_zero,zero,False,completed,generation +avif_q70_protected_high,avif_q70,,protected_high,False,protected_high,none,True,completed, +jxl_d1_raw,jxl_d1,d1,raw,False,raw,none,False,weight_gate_blocked,weight_gate +jxl_d1_repair_zero,jxl_d1,d1,repair_zero,False,repair_zero,zero,False,completed,generation +jxl_d1_protected_high,jxl_d1,d1,protected_high,False,protected_high,none,True,completed, diff --git a/results/condition_summary.csv b/results/condition_summary.csv new file mode 100644 index 0000000000000000000000000000000000000000..09eedd99e913b92ea96926000620fbafb2a0abdb --- /dev/null +++ b/results/condition_summary.csv @@ -0,0 +1,18 @@ +condition_id,attempted,completed,success,denominator,rate,clip_mean,first_failure_stage,sample_sha_match_rate,nan_count,exponent_mismatch_count,payload_over_png +png_baseline,100,100,100,100,1.0,25.60538167953491,,1.0,0,0,1.0 +webp_lossless,100,100,100,100,1.0,25.60538167953491,,1.0,0,0,0.7572009918694315 +jpeg_q100_raw,0,0,0,100,0.0,,weight_gate,N/A,1257,5067354,1.7395705479483816 +jpeg_q100_repair_zero,100,100,100,100,1.0,24.97535108566284,,N/A,0,5066097,1.7395705479483816 +jpeg_q100_protected_high,100,100,100,100,1.0,25.56009853363037,,N/A,0,0,1.0688252766012698 +jpeg_q80_raw,0,0,0,100,0.0,,weight_gate,N/A,144962,36174385,0.5604972313120699 +jpeg_q80_repair_zero,100,100,0,100,0.0,,generation,N/A,0,36172277,0.5604972313120699 +jpeg_q80_protected_high,100,100,100,100,1.0,25.648807697296142,,N/A,0,0,0.6344315900979278 +webp_q80_raw,0,0,0,100,0.0,,weight_gate,N/A,1097350,38755239,0.2877079681640125 +webp_q80_repair_zero,100,100,0,100,0.0,,generation,N/A,0,38754164,0.2877079681640125 +webp_q80_protected_high,100,100,100,100,1.0,25.556653270721437,,N/A,0,0,0.6232985405889936 +avif_q70_raw,0,0,0,100,0.0,,weight_gate,N/A,445041,36883152,0.3309621961916095 +avif_q70_repair_zero,100,100,0,100,0.0,,generation,N/A,0,36881091,0.3309621961916095 +avif_q70_protected_high,100,100,100,100,1.0,25.64476993560791,,N/A,0,0,0.607259893814647 +jxl_d1_raw,0,0,0,100,0.0,,weight_gate,N/A,59017,34599009,0.4396069801647516 +jxl_d1_repair_zero,100,100,0,100,0.0,,generation,N/A,0,34595775,0.4396069801647516 +jxl_d1_protected_high,100,100,100,100,1.0,25.60903305053711,,N/A,0,0,0.6278196734146747 diff --git a/results/final_conclusion.md b/results/final_conclusion.md new file mode 100644 index 0000000000000000000000000000000000000000..22db72f87fcd50c7748c970169b8e1ba625c0bfe --- /dev/null +++ b/results/final_conclusion.md @@ -0,0 +1,29 @@ +# Final conclusion +Profile: `full` +**full run** + +## Conclusions +Hypothesis status: supported (5/5 associated lossy raw codecs). Rule: count lossy raw codecs with nonfinite>0 and raw success", + "" + ], + "imagemagick_full_version": "Version: ImageMagick 7.1.2-19 Q16-HDRI aarch64 77d89c30f:20260412 https://imagemagick.org\nCopyright: (C) 1999 ImageMagick Studio LLC\nLicense: https://imagemagick.org/license/\nFeatures: Cipher DPC HDRI \nDelegates (built-in): bzlib cairo djvu fftw fontconfig freetype heic jng jp2 jpeg jxl lcms lqr openexr pangocairo png raqm raw rsvg tiff uhdr webp x xml zlib zstd\nCompiler: clang (21.1.8)\n", + "libjxl_delegate_version": "0.11.2", + "libjxl_distance": 1.0, + "probe_dimensions": [ + 8, + 8 + ], + "probe_q50_bytes": 60, + "probe_q50_dimensions": [ + 8, + 8 + ], + "probe_q50_sha256": "653e980d930f3c68af0c29e93e3b7865a9062a94412216fa125585e2e4c62a2a", + "probe_q90_bytes": 70, + "probe_q90_sha256": "ee3af32bba6504ebe2da7349560f6ada89cfa0875e6827cbbcbc7cc2efd52268", + "quality": 90, + "quality_mapping": "JxlEncoderDistanceFromQuality(quality)", + "stderr": "" + }, + "name": "jxl_d1", + "reason": null, + "version": "Version: ImageMagick 7.1.2-19 Q16-HDRI aarch64 77d89c30f:20260412 https://imagemagick.org\nCopyright: (C) 1999 ImageMagick Studio LLC\nLicense: https://imagemagick.org/license/\nFeatures: Cipher DPC HDRI \nDelegates (built-in): bzlib cairo djvu fftw fontconfig freetype heic jng jp2 jpeg jxl lcms lqr openexr pangocairo png raqm raw rsvg tiff uhdr webp x xml zlib zstd\nCompiler: clang (21.1.8)\n" + } + ], + "completed_at": "2026-07-28T03:48:45.471852+00:00", + "condition_registry_hash": "46175e92a6d66e131fbb2e2d1c200caec636ba06148f4498e05625a4b9bb29de", + "conditions": [ + "png_baseline", + "webp_lossless", + "jpeg_q100_raw", + "jpeg_q100_repair_zero", + "jpeg_q100_protected_high", + "jpeg_q80_raw", + "jpeg_q80_repair_zero", + "jpeg_q80_protected_high", + "webp_q80_raw", + "webp_q80_repair_zero", + "webp_q80_protected_high", + "avif_q70_raw", + "avif_q70_repair_zero", + "avif_q70_protected_high", + "jxl_d1_raw", + "jxl_d1_repair_zero", + "jxl_d1_protected_high" + ], + "config_sha256": "1362537aa9469ab6434bcee789d92a2ca3b1d84ceb3996d786261336d1c41c36", + "inference_scope": { + "cfg": 6.0, + "profile": "full", + "requested_device": "mps", + "resolved_device": "mps", + "steps": 50 + }, + "layer_ids": [ + "x_embed.weight", + "x_embed.bias", + "t_mlp.0.weight", + "t_mlp.0.bias", + "t_mlp.2.weight", + "t_mlp.2.bias", + "text_proj.weight", + "text_proj.bias", + "text_pool.weight", + "text_pool.bias", + "blocks.0.cross_gate", + "blocks.0.attn.q.weight", + "blocks.0.attn.q.bias", + "blocks.0.attn.kv.weight", + "blocks.0.attn.kv.bias", + "blocks.0.attn.proj.weight", + "blocks.0.attn.proj.bias", + "blocks.0.cross.q.weight", + "blocks.0.cross.q.bias", + "blocks.0.cross.kv.weight", + "blocks.0.cross.kv.bias", + "blocks.0.cross.proj.weight", + "blocks.0.cross.proj.bias", + "blocks.0.mlp.0.weight", + "blocks.0.mlp.0.bias", + "blocks.0.mlp.2.weight", + "blocks.0.mlp.2.bias", + "blocks.0.ada.1.weight", + "blocks.0.ada.1.bias", + "blocks.1.cross_gate", + "blocks.1.attn.q.weight", + "blocks.1.attn.q.bias", + "blocks.1.attn.kv.weight", + "blocks.1.attn.kv.bias", + "blocks.1.attn.proj.weight", + "blocks.1.attn.proj.bias", + "blocks.1.cross.q.weight", + "blocks.1.cross.q.bias", + "blocks.1.cross.kv.weight", + "blocks.1.cross.kv.bias", + "blocks.1.cross.proj.weight", + "blocks.1.cross.proj.bias", + "blocks.1.mlp.0.weight", + "blocks.1.mlp.0.bias", + "blocks.1.mlp.2.weight", + "blocks.1.mlp.2.bias", + "blocks.1.ada.1.weight", + "blocks.1.ada.1.bias", + "blocks.2.cross_gate", + "blocks.2.attn.q.weight", + "blocks.2.attn.q.bias", + "blocks.2.attn.kv.weight", + "blocks.2.attn.kv.bias", + "blocks.2.attn.proj.weight", + "blocks.2.attn.proj.bias", + "blocks.2.cross.q.weight", + "blocks.2.cross.q.bias", + "blocks.2.cross.kv.weight", + "blocks.2.cross.kv.bias", + "blocks.2.cross.proj.weight", + "blocks.2.cross.proj.bias", + "blocks.2.mlp.0.weight", + "blocks.2.mlp.0.bias", + "blocks.2.mlp.2.weight", + "blocks.2.mlp.2.bias", + "blocks.2.ada.1.weight", + "blocks.2.ada.1.bias", + "blocks.3.cross_gate", + "blocks.3.attn.q.weight", + "blocks.3.attn.q.bias", + "blocks.3.attn.kv.weight", + "blocks.3.attn.kv.bias", + "blocks.3.attn.proj.weight", + "blocks.3.attn.proj.bias", + "blocks.3.cross.q.weight", + "blocks.3.cross.q.bias", + "blocks.3.cross.kv.weight", + "blocks.3.cross.kv.bias", + "blocks.3.cross.proj.weight", + "blocks.3.cross.proj.bias", + "blocks.3.mlp.0.weight", + "blocks.3.mlp.0.bias", + "blocks.3.mlp.2.weight", + "blocks.3.mlp.2.bias", + "blocks.3.ada.1.weight", + "blocks.3.ada.1.bias", + "blocks.4.cross_gate", + "blocks.4.attn.q.weight", + "blocks.4.attn.q.bias", + "blocks.4.attn.kv.weight", + "blocks.4.attn.kv.bias", + "blocks.4.attn.proj.weight", + "blocks.4.attn.proj.bias", + "blocks.4.cross.q.weight", + "blocks.4.cross.q.bias", + "blocks.4.cross.kv.weight", + "blocks.4.cross.kv.bias", + "blocks.4.cross.proj.weight", + "blocks.4.cross.proj.bias", + "blocks.4.mlp.0.weight", + "blocks.4.mlp.0.bias", + "blocks.4.mlp.2.weight", + "blocks.4.mlp.2.bias", + "blocks.4.ada.1.weight", + "blocks.4.ada.1.bias", + "blocks.5.cross_gate", + "blocks.5.attn.q.weight", + "blocks.5.attn.q.bias", + "blocks.5.attn.kv.weight", + "blocks.5.attn.kv.bias", + "blocks.5.attn.proj.weight", + "blocks.5.attn.proj.bias", + "blocks.5.cross.q.weight", + "blocks.5.cross.q.bias", + "blocks.5.cross.kv.weight", + "blocks.5.cross.kv.bias", + "blocks.5.cross.proj.weight", + "blocks.5.cross.proj.bias", + "blocks.5.mlp.0.weight", + "blocks.5.mlp.0.bias", + "blocks.5.mlp.2.weight", + "blocks.5.mlp.2.bias", + "blocks.5.ada.1.weight", + "blocks.5.ada.1.bias", + "blocks.6.cross_gate", + "blocks.6.attn.q.weight", + "blocks.6.attn.q.bias", + "blocks.6.attn.kv.weight", + "blocks.6.attn.kv.bias", + "blocks.6.attn.proj.weight", + "blocks.6.attn.proj.bias", + "blocks.6.cross.q.weight", + "blocks.6.cross.q.bias", + "blocks.6.cross.kv.weight", + "blocks.6.cross.kv.bias", + "blocks.6.cross.proj.weight", + "blocks.6.cross.proj.bias", + "blocks.6.mlp.0.weight", + "blocks.6.mlp.0.bias", + "blocks.6.mlp.2.weight", + "blocks.6.mlp.2.bias", + "blocks.6.ada.1.weight", + "blocks.6.ada.1.bias", + "blocks.7.cross_gate", + "blocks.7.attn.q.weight", + "blocks.7.attn.q.bias", + "blocks.7.attn.kv.weight", + "blocks.7.attn.kv.bias", + "blocks.7.attn.proj.weight", + "blocks.7.attn.proj.bias", + "blocks.7.cross.q.weight", + "blocks.7.cross.q.bias", + "blocks.7.cross.kv.weight", + "blocks.7.cross.kv.bias", + "blocks.7.cross.proj.weight", + "blocks.7.cross.proj.bias", + "blocks.7.mlp.0.weight", + "blocks.7.mlp.0.bias", + "blocks.7.mlp.2.weight", + "blocks.7.mlp.2.bias", + "blocks.7.ada.1.weight", + "blocks.7.ada.1.bias", + "blocks.8.cross_gate", + "blocks.8.attn.q.weight", + "blocks.8.attn.q.bias", + "blocks.8.attn.kv.weight", + "blocks.8.attn.kv.bias", + "blocks.8.attn.proj.weight", + "blocks.8.attn.proj.bias", + "blocks.8.cross.q.weight", + "blocks.8.cross.q.bias", + "blocks.8.cross.kv.weight", + "blocks.8.cross.kv.bias", + "blocks.8.cross.proj.weight", + "blocks.8.cross.proj.bias", + "blocks.8.mlp.0.weight", + "blocks.8.mlp.0.bias", + "blocks.8.mlp.2.weight", + "blocks.8.mlp.2.bias", + "blocks.8.ada.1.weight", + "blocks.8.ada.1.bias", + "blocks.9.cross_gate", + "blocks.9.attn.q.weight", + "blocks.9.attn.q.bias", + "blocks.9.attn.kv.weight", + "blocks.9.attn.kv.bias", + "blocks.9.attn.proj.weight", + "blocks.9.attn.proj.bias", + "blocks.9.cross.q.weight", + "blocks.9.cross.q.bias", + "blocks.9.cross.kv.weight", + "blocks.9.cross.kv.bias", + "blocks.9.cross.proj.weight", + "blocks.9.cross.proj.bias", + "blocks.9.mlp.0.weight", + "blocks.9.mlp.0.bias", + "blocks.9.mlp.2.weight", + "blocks.9.mlp.2.bias", + "blocks.9.ada.1.weight", + "blocks.9.ada.1.bias", + "blocks.10.cross_gate", + "blocks.10.attn.q.weight", + "blocks.10.attn.q.bias", + "blocks.10.attn.kv.weight", + "blocks.10.attn.kv.bias", + "blocks.10.attn.proj.weight", + "blocks.10.attn.proj.bias", + "blocks.10.cross.q.weight", + "blocks.10.cross.q.bias", + "blocks.10.cross.kv.weight", + "blocks.10.cross.kv.bias", + "blocks.10.cross.proj.weight", + "blocks.10.cross.proj.bias", + "blocks.10.mlp.0.weight", + "blocks.10.mlp.0.bias", + "blocks.10.mlp.2.weight", + "blocks.10.mlp.2.bias", + "blocks.10.ada.1.weight", + "blocks.10.ada.1.bias", + "blocks.11.cross_gate", + "blocks.11.attn.q.weight", + "blocks.11.attn.q.bias", + "blocks.11.attn.kv.weight", + "blocks.11.attn.kv.bias", + "blocks.11.attn.proj.weight", + "blocks.11.attn.proj.bias", + "blocks.11.cross.q.weight", + "blocks.11.cross.q.bias", + "blocks.11.cross.kv.weight", + "blocks.11.cross.kv.bias", + "blocks.11.cross.proj.weight", + "blocks.11.cross.proj.bias", + "blocks.11.mlp.0.weight", + "blocks.11.mlp.0.bias", + "blocks.11.mlp.2.weight", + "blocks.11.mlp.2.bias", + "blocks.11.ada.1.weight", + "blocks.11.ada.1.bias", + "ada_out.1.weight", + "ada_out.1.bias", + "head.weight", + "head.bias" + ], + "mode": "real", + "model_sha256": "f0e3c181e04b83b4bfc546dd31f00ba20c73b626859efa0995cd07c553185d9e", + "package_versions": {}, + "profile": "full", + "prompt_ids": [ + "pm4-001-cca08f5b", + "pm4-002-effb6eaa", + "pm4-003-46e10145", + "pm4-004-ab14afb8", + "pm4-005-5e9b5a50", + "pm4-006-44a2087e", + "pm4-007-5003533d", + "pm4-008-54647723", + "pm4-009-e51903e1", + "pm4-010-97841ad3", + "pm4-011-c900b313", + "pm4-012-98171122", + "pm4-013-d58e7b01", + "pm4-014-8876ccfb", + "pm4-015-8fe08e47", + "pm4-016-fd1eb48d", + "pm4-017-7f335742", + "pm4-018-4ea91357", + "pm4-019-f7070d02", + "pm4-020-d8e94e65", + "pm4-021-2da79c09", + "pm4-022-b8b11cb8", + "pm4-023-0eb7f66d", + "pm4-024-56de999a", + "pm4-025-ef6349d3", + "pm4-026-ad193361", + "pm4-027-becf10ea", + "pm4-028-b56d212e", + "pm4-029-95eb9f34", + "pm4-030-2b63f9ba", + "pm4-031-844a8814", + "pm4-032-42ee9a0f", + "pm4-033-b5e58e7f", + "pm4-034-a383c38f", + "pm4-035-f3b99568", + "pm4-036-71932e79", + "pm4-037-9515174e", + "pm4-038-335a27fa", + "pm4-039-066bcab1", + "pm4-040-eca2f1c2", + "pm4-041-7ac2f16a", + "pm4-042-f7a87ffa", + "pm4-043-cde8ad90", + "pm4-044-93deb087", + "pm4-045-25fa16bb", + "pm4-046-bec80a2b", + "pm4-047-fc09cfd4", + "pm4-048-e270315e", + "pm4-049-85579bcd", + "pm4-050-c3e45c01", + "pm4-051-093f1478", + "pm4-052-03bbf4ac", + "pm4-053-0c5b1381", + "pm4-054-92b0a67d", + "pm4-055-ac372623", + "pm4-056-ee005598", + "pm4-057-8ac12393", + "pm4-058-b655d991", + "pm4-059-7d5da4fb", + "pm4-060-9ea3ad52", + "pm4-061-3e32cfca", + "pm4-062-4e57bc1c", + "pm4-063-a4e09271", + "pm4-064-2264c7eb", + "pm4-065-1cab116c", + "pm4-066-da57563c", + "pm4-067-ef873e98", + "pm4-068-fbe210a2", + "pm4-069-cacdab19", + "pm4-070-691aa003", + "pm4-071-b9fe92b0", + "pm4-072-4a0cff0c", + "pm4-073-6ec086e0", + "pm4-074-796fd1d3", + "pm4-075-3906d66e", + "pm4-076-a577a15d", + "pm4-077-7fa689ad", + "pm4-078-a77b762e", + "pm4-079-5e8f0ede", + "pm4-080-78dedcb6", + "pm4-081-5b17a851", + "pm4-082-6adb4a49", + "pm4-083-02dc5c51", + "pm4-084-06ed218a", + "pm4-085-84317ff5", + "pm4-086-90e23232", + "pm4-087-34bf26a1", + "pm4-088-92a9c223", + "pm4-089-60ad56aa", + "pm4-090-c71ebd94", + "pm4-091-c428ceb2", + "pm4-092-cc02ddf9", + "pm4-093-53b39ad0", + "pm4-094-dd71e13d", + "pm4-095-13e2d4a2", + "pm4-096-95b0203e", + "pm4-097-0b860832", + "pm4-098-b03251b5", + "pm4-099-d947f488", + "pm4-100-5e269fc4" + ], + "prompt_selection_hash": "1a715aef6bd8062b519c010e308e730837644ea20cf3eea1ad9f0f9cd34c622e", + "prompt_sha256": "66b61947ffa80eb7ebce6f99b33f36dd2c84bbd983fb6b5d1bed0322305317d5", + "raw_rows_bytes": 8051205, + "raw_rows_sha256": "4cdc11651a3f215427ef34445fae174208e202fb1e477e71bcf6baf898fe483b", + "requested_device": "mps", + "resolved_device": "mps", + "resource_monitor": { + "binding_code_hash": "f8c7ad81ca8d23bfc2b601992df74114ee290a9bf3b5beec9c8376e8868b0ca7", + "binding_method": "post_run_verified", + "bound_at": "2026-07-28T05:07:51.090283+00:00", + "bytes": 572915, + "generation_count": 1200, + "min_available_percent": 16.851425170898438, + "path": "results/resource_monitor.jsonl", + "peak_mps_allocated_bytes": 1300606976, + "peak_mps_driver_allocated_bytes": 1653719040, + "peak_rss_bytes": 1818787840, + "preflight_count": 1, + "row_count": 1201, + "sha256": "e4bf17b0c1b10347a030f663f2794be11d5747554bb0f227905e2dde40c47a46", + "violation_count": 0 + }, + "run_identity": { + "cfg": 6.0, + "clip": { + "requested": "openai/clip-vit-base-patch32", + "revision": "3d74acf9a28c67741b2f4f2ea7635f0aaf6f0268" + }, + "code_hashes": { + "cross_codec": "aa48dcea43d7d15082488c64a11266ee6b48e6cf5598577fcb62d69ff6d53610", + "jpeg_repair": "5172c0fb3c9155c0d8a88ac2579d743d6fd8cfb09a6868a0cf85ce377600224a", + "runner": "917bbec0fc71f21f60d84c59df8a2822434b8802f4bb42790673a98c00b14a8b" + }, + "codec_preflight": [ + { + "argv": [ + "Pillow", + "PNG" + ], + "available": true, + "diagnostics": {}, + "metadata": {}, + "name": "png", + "reason": null, + "version": "12.2.0" + }, + { + "argv": [ + "Pillow", + "WEBP" + ], + "available": true, + "diagnostics": {}, + "metadata": {}, + "name": "webp_lossless", + "reason": null, + "version": "12.2.0" + }, + { + "argv": [ + "Pillow", + "JPEG" + ], + "available": true, + "diagnostics": {}, + "metadata": {}, + "name": "jpeg_q100", + "reason": null, + "version": "12.2.0" + }, + { + "argv": [ + "Pillow", + "JPEG" + ], + "available": true, + "diagnostics": {}, + "metadata": {}, + "name": "jpeg_q80", + "reason": null, + "version": "12.2.0" + }, + { + "argv": [ + "Pillow", + "WEBP" + ], + "available": true, + "diagnostics": {}, + "metadata": {}, + "name": "webp_q80", + "reason": null, + "version": "12.2.0" + }, + { + "argv": [ + "Pillow", + "AVIF" + ], + "available": true, + "diagnostics": {}, + "metadata": {}, + "name": "avif_q70", + "reason": null, + "version": "12.2.0" + }, + { + "argv": [ + "/etc/profiles/per-user/scratchbrulee/bin/magick", + "-version" + ], + "available": true, + "diagnostics": { + "argv": [ + "/etc/profiles/per-user/scratchbrulee/bin/magick", + "-version" + ], + "returncode": 0, + "stderr": "", + "stdout": "Version: ImageMagick 7.1.2-19 Q16-HDRI aarch64 77d89c30f:20260412 https://imagemagick.org\nCopyright: (C) 1999 ImageMagick Studio LLC\nLicense: https://imagemagick.org/license/\nFeatures: Cipher DPC HDRI \nDelegates (built-in): bzlib cairo djvu fftw fontconfig freetype heic jng jp2 jpeg jxl lcms lqr openexr pangocairo png raqm raw rsvg tiff uhdr webp x xml zlib zstd\nCompiler: clang (21.1.8)\n" + }, + "metadata": { + "argv_template": [ + "/etc/profiles/per-user/scratchbrulee/bin/magick", + "-quality", + "90", + "", + "" + ], + "imagemagick_full_version": "Version: ImageMagick 7.1.2-19 Q16-HDRI aarch64 77d89c30f:20260412 https://imagemagick.org\nCopyright: (C) 1999 ImageMagick Studio LLC\nLicense: https://imagemagick.org/license/\nFeatures: Cipher DPC HDRI \nDelegates (built-in): bzlib cairo djvu fftw fontconfig freetype heic jng jp2 jpeg jxl lcms lqr openexr pangocairo png raqm raw rsvg tiff uhdr webp x xml zlib zstd\nCompiler: clang (21.1.8)\n", + "libjxl_delegate_version": "0.11.2", + "libjxl_distance": 1.0, + "probe_dimensions": [ + 8, + 8 + ], + "probe_q50_bytes": 60, + "probe_q50_dimensions": [ + 8, + 8 + ], + "probe_q50_sha256": "653e980d930f3c68af0c29e93e3b7865a9062a94412216fa125585e2e4c62a2a", + "probe_q90_bytes": 70, + "probe_q90_sha256": "ee3af32bba6504ebe2da7349560f6ada89cfa0875e6827cbbcbc7cc2efd52268", + "quality": 90, + "quality_mapping": "JxlEncoderDistanceFromQuality(quality)", + "stderr": "" + }, + "name": "jxl_d1", + "reason": null, + "version": "Version: ImageMagick 7.1.2-19 Q16-HDRI aarch64 77d89c30f:20260412 https://imagemagick.org\nCopyright: (C) 1999 ImageMagick Studio LLC\nLicense: https://imagemagick.org/license/\nFeatures: Cipher DPC HDRI \nDelegates (built-in): bzlib cairo djvu fftw fontconfig freetype heic jng jp2 jpeg jxl lcms lqr openexr pangocairo png raqm raw rsvg tiff uhdr webp x xml zlib zstd\nCompiler: clang (21.1.8)\n" + } + ], + "condition_registry_hash": "46175e92a6d66e131fbb2e2d1c200caec636ba06148f4498e05625a4b9bb29de", + "config_sha256": "1362537aa9469ab6434bcee789d92a2ca3b1d84ceb3996d786261336d1c41c36", + "mode": "real", + "model_sha256": "f0e3c181e04b83b4bfc546dd31f00ba20c73b626859efa0995cd07c553185d9e", + "package_versions": {}, + "profile": "full", + "prompt_ids": [ + "pm4-001-cca08f5b", + "pm4-002-effb6eaa", + "pm4-003-46e10145", + "pm4-004-ab14afb8", + "pm4-005-5e9b5a50", + "pm4-006-44a2087e", + "pm4-007-5003533d", + "pm4-008-54647723", + "pm4-009-e51903e1", + "pm4-010-97841ad3", + "pm4-011-c900b313", + "pm4-012-98171122", + "pm4-013-d58e7b01", + "pm4-014-8876ccfb", + "pm4-015-8fe08e47", + "pm4-016-fd1eb48d", + "pm4-017-7f335742", + "pm4-018-4ea91357", + "pm4-019-f7070d02", + "pm4-020-d8e94e65", + "pm4-021-2da79c09", + "pm4-022-b8b11cb8", + "pm4-023-0eb7f66d", + "pm4-024-56de999a", + "pm4-025-ef6349d3", + "pm4-026-ad193361", + "pm4-027-becf10ea", + "pm4-028-b56d212e", + "pm4-029-95eb9f34", + "pm4-030-2b63f9ba", + "pm4-031-844a8814", + "pm4-032-42ee9a0f", + "pm4-033-b5e58e7f", + "pm4-034-a383c38f", + "pm4-035-f3b99568", + "pm4-036-71932e79", + "pm4-037-9515174e", + "pm4-038-335a27fa", + "pm4-039-066bcab1", + "pm4-040-eca2f1c2", + "pm4-041-7ac2f16a", + "pm4-042-f7a87ffa", + "pm4-043-cde8ad90", + "pm4-044-93deb087", + "pm4-045-25fa16bb", + "pm4-046-bec80a2b", + "pm4-047-fc09cfd4", + "pm4-048-e270315e", + "pm4-049-85579bcd", + "pm4-050-c3e45c01", + "pm4-051-093f1478", + "pm4-052-03bbf4ac", + "pm4-053-0c5b1381", + "pm4-054-92b0a67d", + "pm4-055-ac372623", + "pm4-056-ee005598", + "pm4-057-8ac12393", + "pm4-058-b655d991", + "pm4-059-7d5da4fb", + "pm4-060-9ea3ad52", + "pm4-061-3e32cfca", + "pm4-062-4e57bc1c", + "pm4-063-a4e09271", + "pm4-064-2264c7eb", + "pm4-065-1cab116c", + "pm4-066-da57563c", + "pm4-067-ef873e98", + "pm4-068-fbe210a2", + "pm4-069-cacdab19", + "pm4-070-691aa003", + "pm4-071-b9fe92b0", + "pm4-072-4a0cff0c", + "pm4-073-6ec086e0", + "pm4-074-796fd1d3", + "pm4-075-3906d66e", + "pm4-076-a577a15d", + "pm4-077-7fa689ad", + "pm4-078-a77b762e", + "pm4-079-5e8f0ede", + "pm4-080-78dedcb6", + "pm4-081-5b17a851", + "pm4-082-6adb4a49", + "pm4-083-02dc5c51", + "pm4-084-06ed218a", + "pm4-085-84317ff5", + "pm4-086-90e23232", + "pm4-087-34bf26a1", + "pm4-088-92a9c223", + "pm4-089-60ad56aa", + "pm4-090-c71ebd94", + "pm4-091-c428ceb2", + "pm4-092-cc02ddf9", + "pm4-093-53b39ad0", + "pm4-094-dd71e13d", + "pm4-095-13e2d4a2", + "pm4-096-95b0203e", + "pm4-097-0b860832", + "pm4-098-b03251b5", + "pm4-099-d947f488", + "pm4-100-5e269fc4" + ], + "prompt_selection_hash": "1a715aef6bd8062b519c010e308e730837644ea20cf3eea1ad9f0f9cd34c622e", + "prompt_sha256": "66b61947ffa80eb7ebce6f99b33f36dd2c84bbd983fb6b5d1bed0322305317d5", + "requested_device": "mps", + "resolved_device": "mps", + "runtime_git": { + "dirty": false, + "head": "a7ae00009e2ae56ca1110340903b4e9f1ad9de32" + }, + "runtime_platform": { + "machine": "arm64", + "python": "3.11.15", + "release": "27.0.0", + "system": "Darwin" + }, + "scientific_identity_hash": "19ed6466ecdde153ae9c7e061d76a285223150b34eee721b009f8073e3805cb0", + "source_sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31", + "steps": 50, + "upstream_revision": "80878fdd6e130d229c2581424a3456b47b979d4b", + "vae": { + "requested": "stabilityai/sd-vae-ft-mse", + "revision": "31f26fdeee1355a5c34592e401dd41e45d25a493" + } + }, + "run_identity_hash": "a25f5678a8c81bb51c1835ee821be3662c76e9872d84c99ac1115f4b7ef5bc8b", + "runtime_git": { + "dirty": false, + "head": "a7ae00009e2ae56ca1110340903b4e9f1ad9de32" + }, + "runtime_platform": { + "machine": "arm64", + "python": "3.11.15", + "release": "27.0.0", + "system": "Darwin" + }, + "scientific_identity_hash": "19ed6466ecdde153ae9c7e061d76a285223150b34eee721b009f8073e3805cb0", + "source_bytes": 89711808, + "source_sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31", + "started_at": "2026-07-28T02:30:16.686530+00:00", + "status": "completed", + "steps": 50, + "upstream_revision": "80878fdd6e130d229c2581424a3456b47b979d4b", + "vae": { + "requested": "stabilityai/sd-vae-ft-mse", + "revision": "31f26fdeee1355a5c34592e401dd41e45d25a493" + } +} diff --git a/results/source_report_manifest.json b/results/source_report_manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..4922483b466b4fc6b7f93f093a3ce69cab129722 --- /dev/null +++ b/results/source_report_manifest.json @@ -0,0 +1,128 @@ +{ + "artifacts": [ + { + "bytes": 1543, + "path": "codec_conditions.csv", + "sha256": "6b7b5db91e838565c742c3d03cc170551b6f0912f7107d58abfe3d296e04d143" + }, + { + "bytes": 1578, + "path": "condition_summary.csv", + "sha256": "05283d8227c9ce665cfeadb36d80509ccb12fe1e78cfd1ed945ebe5035202998" + }, + { + "bytes": 2319, + "path": "final_conclusion.md", + "sha256": "efa04abab22c61fdd179ee60886be41421fdac7008724bc2e193a350ac69698b" + }, + { + "bytes": 434773, + "path": "generation_metrics.csv", + "sha256": "e02046fe9835cbfec06e34ed537d6b8459a2f294bd6f515191d6dbbd8dda9dde" + }, + { + "bytes": 668, + "path": "index.html", + "sha256": "e215c58d49819a0b06037417f3d0a07d66189e28354beeafc740bac0d445e814" + }, + { + "bytes": 2855, + "path": "paired_quality_metrics.csv", + "sha256": "bf6fde481e3beec0fb97c429320bbb4d125fa6935b27affe832c81335fb91cad" + }, + { + "bytes": 39906, + "path": "plots/exponent_mismatch_vs_success.png", + "sha256": "355990377b85217759232c8ed9b8ab1f2157ffb454273dad2765d301f68a3e16" + }, + { + "bytes": 61445865, + "path": "plots/generation_comparison_grid.png", + "sha256": "b2f1d18024b07c784eba035c7109d52bcc1b5d1beaf918baf5ab8599b1bcbd5e" + }, + { + "bytes": 20465106, + "path": "plots/generation_comparison_grid_jpeg_q80.png", + "sha256": "44cd65bcecf80f5a844f6af16b9bfb2c05bdfcf6612259d12cb3d7cbeb255a94" + }, + { + "bytes": 37891, + "path": "plots/nan_vs_success.png", + "sha256": "41ac7d7380d1c5fa1ef1372b1d5b7e3a2a38ed2a0ad2837e7a5f53bc2567fcd0" + }, + { + "bytes": 37843, + "path": "plots/payload_vs_quality.png", + "sha256": "6c84af8f60f3b8c5b40d1de8ef7edca07170e20292c2c1e392daa57fe3cd720f" + }, + { + "bytes": 725122, + "path": "plots/representative_weight_error_maps.png", + "sha256": "af8eb7d94843a2866ddf32592f40d69fe9ea13a4205afadc0a534d81f843381a" + }, + { + "bytes": 34863, + "path": "plots/success_vs_payload.png", + "sha256": "afd529373319d28675319467478643b027b7fd3c5dd0dcabd9322570611a4725" + }, + { + "bytes": 3567, + "path": "storage_metrics.csv", + "sha256": "a2ab1b5d4131bdd79ea109baf3f953a34a5c3711ffe394a12781f5e7b9629cf6" + }, + { + "bytes": 3506, + "path": "summary.md", + "sha256": "583d18832110cfdec93941f2ffc5da541d953fb0d5d6b6f9940238786af4479f" + }, + { + "bytes": 2737, + "path": "weight_metrics.csv", + "sha256": "bb9a0a4913ae0f889b6644636627bf61a9559259777ed05b50af9cfb82916cae" + } + ], + "bootstrap": { + "order": "sorted prompt_id", + "resamples": 10000, + "seed": 20260727 + }, + "generated_at": "2026-07-28T03:48:45.471852+00:00", + "input_provenance": { + "baseline_source_bytes": 89711808, + "baseline_source_path": "payloads/png_baseline.bin", + "baseline_source_sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31", + "prompt_projection": "paired_seed_equals_seed", + "raw_rows_bytes": 8051205, + "raw_rows_sha256": "4cdc11651a3f215427ef34445fae174208e202fb1e477e71bcf6baf898fe483b", + "resource_monitor_bytes": 572915, + "resource_monitor_path": "results/resource_monitor.jsonl", + "resource_monitor_row_count": 1201, + "resource_monitor_sha256": "e4bf17b0c1b10347a030f663f2794be11d5747554bb0f227905e2dde40c47a46", + "resource_monitor_violation_count": 0, + "source_bytes": 89711808, + "source_sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31" + }, + "report_identity": { + "baseline_source_bytes": 89711808, + "baseline_source_path": "payloads/png_baseline.bin", + "baseline_source_sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31", + "condition_registry_hash": "46175e92a6d66e131fbb2e2d1c200caec636ba06148f4498e05625a4b9bb29de", + "profile": "full", + "prompt_projection": "paired_seed_equals_seed", + "prompt_selection_hash": "1a715aef6bd8062b519c010e308e730837644ea20cf3eea1ad9f0f9cd34c622e", + "raw_rows_bytes": 8051205, + "raw_rows_sha256": "4cdc11651a3f215427ef34445fae174208e202fb1e477e71bcf6baf898fe483b", + "report_code_hash": "164f0fe625fa59319b34e43fd3f3845694044340afeaf527d3fc1e67360da9da", + "report_options": {}, + "resource_monitor_bytes": 572915, + "resource_monitor_path": "results/resource_monitor.jsonl", + "resource_monitor_row_count": 1201, + "resource_monitor_sha256": "e4bf17b0c1b10347a030f663f2794be11d5747554bb0f227905e2dde40c47a46", + "resource_monitor_violation_count": 0, + "run_identity_hash": "a25f5678a8c81bb51c1835ee821be3662c76e9872d84c99ac1115f4b7ef5bc8b", + "source_bytes": 89711808, + "source_sha256": "a7b64d9d69c6ba1e428a5957bf1eae7a60145dc60cf8341300e8bdbcf80b2b31" + }, + "report_identity_hash": "44470541862e827f99e6cef34e0ee701c527d8670d71207c266c5601eea6bec2", + "status": "completed" +} diff --git a/results/storage_metrics.csv b/results/storage_metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..2e6145bad402ffb7de8aeebff6639eea9229a8a7 --- /dev/null +++ b/results/storage_metrics.csv @@ -0,0 +1,18 @@ +condition_id,payload_bytes,payload_over_png,png_over_payload,size_saving_percent,source_bytes,payload_definition,status,reason +png_baseline,89711808,1.0,1.0,0.0,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +webp_lossless,67929870,0.7572009918694315,1.3206533149555564,24.279900813056855,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +jpeg_q100_raw,156060019,1.7395705479483816,0.5748545243993595,-73.95705479483816,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,weight_gate_blocked,raw candidate contains nonfinite values +jpeg_q100_repair_zero,156060019,1.7395705479483816,0.5748545243993595,-73.95705479483816,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +jpeg_q100_protected_high,95886248,1.0688252766012698,0.9356066158725911,-6.88252766012698,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +jpeg_q80_raw,50283220,0.5604972313120699,1.784130133273088,43.95027686879301,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,weight_gate_blocked,raw candidate contains nonfinite values +jpeg_q80_repair_zero,50283220,0.5604972313120699,1.784130133273088,43.95027686879301,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +jpeg_q80_protected_high,56916005,0.6344315900979278,1.576214071946898,36.55684099020722,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +webp_q80_raw,25810802,0.2877079681640125,3.4757466273229323,71.22920318359876,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,weight_gate_blocked,raw candidate contains nonfinite values +webp_q80_repair_zero,25810802,0.2877079681640125,3.4757466273229323,71.22920318359876,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +webp_q80_protected_high,55917239,0.6232985405889936,1.6043676262341924,37.67014594110064,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +avif_q70_raw,29691217,0.3309621961916095,3.0214931237072564,66.90378038083905,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,weight_gate_blocked,raw candidate contains nonfinite values +avif_q70_repair_zero,29691217,0.3309621961916095,3.0214931237072564,66.90378038083905,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +avif_q70_protected_high,54478383,0.607259893814647,1.6467413873132029,39.27401061853531,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +jxl_d1_raw,39437937,0.4396069801647516,2.2747591487861043,56.03930198352485,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,weight_gate_blocked,raw candidate contains nonfinite values +jxl_d1_repair_zero,39437937,0.4396069801647516,2.2747591487861043,56.03930198352485,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, +jxl_d1_protected_high,56322838,0.6278196734146747,1.5928140552860635,37.21803265853253,89711808,encoded payload; protected=high PNG + low codec bytes; materialized inference excluded,completed, diff --git a/results/weight_metrics.csv b/results/weight_metrics.csv new file mode 100644 index 0000000000000000000000000000000000000000..1e4033a3501f167f3d429fd2c25d7f682059ac17 --- /dev/null +++ b/results/weight_metrics.csv @@ -0,0 +1,18 @@ +condition_id,status,observed,reason,nan_count,posinf_count,neginf_count,mse,mae,cosine,finite_pair_label,sign_mismatch_count,exponent_mismatch_count,mantissa_mismatch_count,repaired_count +png_baseline,completed,True,,0,0,0,0.0,0.0,0.9999999999999999,all_elements,0,0,0,0 +webp_lossless,completed,True,,0,0,0,0.0,0.0,0.9999999999999999,all_elements,0,0,0,0 +jpeg_q100_raw,weight_gate_blocked,True,raw candidate contains nonfinite values,1257,0,0,5.4881295475738446e-05,0.003559188682838826,0.9903323544919294,finite_pairs_only,1257,5067354,24791367,0 +jpeg_q100_repair_zero,completed,True,,0,0,0,5.487957143756694e-05,0.003559077162479919,0.990332354491207,all_elements,1257,5066097,24791367,1257 +jpeg_q100_protected_high,completed,True,,0,0,0,1.3014929651809084e-10,2.6048120947148933e-06,0.9999999761803293,all_elements,0,0,3690171,0 +jpeg_q80_raw,weight_gate_blocked,True,raw candidate contains nonfinite values,144962,289,0,7024895.994903378,164.57187652722124,-0.014809603123820987,finite_pairs_only,356491,36174385,39618800,0 +jpeg_q80_repair_zero,completed,True,,0,0,0,6999395.578097853,163.9745397278324,-0.014802301495400884,all_elements,356501,36172277,39619828,145251 +jpeg_q80_protected_high,completed,True,,0,0,0,8.169289120070928e-08,0.00016925741840394,0.9999850473977007,all_elements,0,0,37747797,0 +webp_q80_raw,weight_gate_blocked,True,raw candidate contains nonfinite values,1097350,0,0,98754140.09414132,2929.361963854419,-0.015171901313633943,finite_pairs_only,12701499,38755239,39903368,0 +webp_q80_repair_zero,completed,True,,0,0,0,96045890.23673588,2849.0277774002207,-0.01495644092434077,all_elements,12702272,38754164,39904121,1097350 +webp_q80_protected_high,completed,True,,0,0,0,2.017992703470279e-08,8.495182242402414e-05,0.9999963078223306,all_elements,0,0,35716246,0 +avif_q70_raw,weight_gate_blocked,True,raw candidate contains nonfinite values,445041,59,0,24357805.164385818,592.5061781162018,-0.04967410960660835,finite_pairs_only,1290544,36883152,39655937,0 +avif_q70_repair_zero,completed,True,,0,0,0,24086858.383334663,585.9156553677589,-0.04953238071602046,all_elements,1290547,36881091,39656741,445100 +avif_q70_protected_high,completed,True,,0,0,0,3.9861152629792095e-08,0.00011898540307367023,0.9999927113372081,all_elements,0,0,36929012,0 +jxl_d1_raw,weight_gate_blocked,True,raw candidate contains nonfinite values,59017,13,0,4291985.282294988,128.71621866599182,0.024541673765650893,finite_pairs_only,149008,34599009,39341010,0 +jxl_d1_repair_zero,completed,True,,0,0,0,4285653.597939928,128.52635960370048,0.024534470275170278,all_elements,149015,34595775,39341835,59030 +jxl_d1_protected_high,completed,True,,0,0,0,2.357740676387026e-08,9.130686217578188e-05,0.9999956844331621,all_elements,0,0,35988822,0 diff --git a/samples/avif_q70_protected_high/pm4-002-effb6eaa.png b/samples/avif_q70_protected_high/pm4-002-effb6eaa.png new file mode 100644 index 0000000000000000000000000000000000000000..83fe9102de4243ae6cd2646f27613254a47187c0 Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-002-effb6eaa.png differ diff --git a/samples/avif_q70_protected_high/pm4-016-fd1eb48d.png b/samples/avif_q70_protected_high/pm4-016-fd1eb48d.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e86add30d42bfa22f72ba04f11d06e0737a2de Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-016-fd1eb48d.png differ diff --git a/samples/avif_q70_protected_high/pm4-051-093f1478.png b/samples/avif_q70_protected_high/pm4-051-093f1478.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d735c46a459ec9a116e3e5c59559d3c9f0c917 Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-051-093f1478.png differ diff --git a/samples/avif_q70_protected_high/pm4-075-3906d66e.png b/samples/avif_q70_protected_high/pm4-075-3906d66e.png new file mode 100644 index 0000000000000000000000000000000000000000..0c3cd3d9c5f91e9cd5465fb85fb4e36da71c6ca3 Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-075-3906d66e.png differ diff --git a/samples/avif_q70_protected_high/pm4-078-a77b762e.png b/samples/avif_q70_protected_high/pm4-078-a77b762e.png new file mode 100644 index 0000000000000000000000000000000000000000..b88cbe13015e4f6d3f60e21bd945a4df5caee446 Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-078-a77b762e.png differ diff --git a/samples/avif_q70_protected_high/pm4-082-6adb4a49.png b/samples/avif_q70_protected_high/pm4-082-6adb4a49.png new file mode 100644 index 0000000000000000000000000000000000000000..674ce7b80c8a3b11d203560f936c129df16a156a Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-082-6adb4a49.png differ diff --git a/samples/avif_q70_protected_high/pm4-089-60ad56aa.png b/samples/avif_q70_protected_high/pm4-089-60ad56aa.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6c3baa155a1c318ba9e9619282adcfc1113ba3 Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-089-60ad56aa.png differ diff --git a/samples/avif_q70_protected_high/pm4-097-0b860832.png b/samples/avif_q70_protected_high/pm4-097-0b860832.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec6e5f632836cb3bbce6faf09859965a2074c9e Binary files /dev/null and b/samples/avif_q70_protected_high/pm4-097-0b860832.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-002-effb6eaa.png b/samples/jpeg_q100_protected_high/pm4-002-effb6eaa.png new file mode 100644 index 0000000000000000000000000000000000000000..26749b6c8700b1a5389fac5d74e7539407c228a5 Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-002-effb6eaa.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-016-fd1eb48d.png b/samples/jpeg_q100_protected_high/pm4-016-fd1eb48d.png new file mode 100644 index 0000000000000000000000000000000000000000..546889194affa136886161b022526b8ddb8773df Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-016-fd1eb48d.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-051-093f1478.png b/samples/jpeg_q100_protected_high/pm4-051-093f1478.png new file mode 100644 index 0000000000000000000000000000000000000000..155a1d3f76c6cfc680bc577e36fc1c5e19c9a05b Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-051-093f1478.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-060-9ea3ad52.png b/samples/jpeg_q100_protected_high/pm4-060-9ea3ad52.png new file mode 100644 index 0000000000000000000000000000000000000000..41bf355f5c46801d130262cd8182e401e5c9b135 Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-060-9ea3ad52.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-075-3906d66e.png b/samples/jpeg_q100_protected_high/pm4-075-3906d66e.png new file mode 100644 index 0000000000000000000000000000000000000000..a4525e23e7c20dcefa544314dfc8950cdc0d45bc Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-075-3906d66e.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-078-a77b762e.png b/samples/jpeg_q100_protected_high/pm4-078-a77b762e.png new file mode 100644 index 0000000000000000000000000000000000000000..130771f8b50ab067e10d6d0f740bf9ab64956bd4 Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-078-a77b762e.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-080-78dedcb6.png b/samples/jpeg_q100_protected_high/pm4-080-78dedcb6.png new file mode 100644 index 0000000000000000000000000000000000000000..adb38e98c671f78838bec2fae74c02161d2a2320 Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-080-78dedcb6.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-082-6adb4a49.png b/samples/jpeg_q100_protected_high/pm4-082-6adb4a49.png new file mode 100644 index 0000000000000000000000000000000000000000..66998200483ff6f73ab7e59718093ab057a944ad Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-082-6adb4a49.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-089-60ad56aa.png b/samples/jpeg_q100_protected_high/pm4-089-60ad56aa.png new file mode 100644 index 0000000000000000000000000000000000000000..56aed7c5afa62b8657987dbca226abed5fd56234 Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-089-60ad56aa.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-090-c71ebd94.png b/samples/jpeg_q100_protected_high/pm4-090-c71ebd94.png new file mode 100644 index 0000000000000000000000000000000000000000..ac81ccf05644ac2070a4e09669cc5639ee545456 Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-090-c71ebd94.png differ diff --git a/samples/jpeg_q100_protected_high/pm4-097-0b860832.png b/samples/jpeg_q100_protected_high/pm4-097-0b860832.png new file mode 100644 index 0000000000000000000000000000000000000000..94666979b27fe21950a295cdc211a26a165c95ea Binary files /dev/null and b/samples/jpeg_q100_protected_high/pm4-097-0b860832.png differ diff --git a/samples/jpeg_q100_repair_zero/pm4-090-c71ebd94.png b/samples/jpeg_q100_repair_zero/pm4-090-c71ebd94.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b5fa72e7b1303e4c7972b1d8ddbcaba4762f79 Binary files /dev/null and b/samples/jpeg_q100_repair_zero/pm4-090-c71ebd94.png differ diff --git a/samples/jxl_d1_protected_high/pm4-002-effb6eaa.png b/samples/jxl_d1_protected_high/pm4-002-effb6eaa.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5c76781177d38535e5aa8db9f6352084532c32 Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-002-effb6eaa.png differ diff --git a/samples/jxl_d1_protected_high/pm4-016-fd1eb48d.png b/samples/jxl_d1_protected_high/pm4-016-fd1eb48d.png new file mode 100644 index 0000000000000000000000000000000000000000..2e93b6a935fab2c87f57d219e4ed34e6c8cefc2f Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-016-fd1eb48d.png differ diff --git a/samples/jxl_d1_protected_high/pm4-051-093f1478.png b/samples/jxl_d1_protected_high/pm4-051-093f1478.png new file mode 100644 index 0000000000000000000000000000000000000000..93574110218f221cd9e2f74406a3a6c4657ce0d7 Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-051-093f1478.png differ diff --git a/samples/jxl_d1_protected_high/pm4-060-9ea3ad52.png b/samples/jxl_d1_protected_high/pm4-060-9ea3ad52.png new file mode 100644 index 0000000000000000000000000000000000000000..89990f18fc5593190ea8be2a8bc0e4adfedd7015 Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-060-9ea3ad52.png differ diff --git a/samples/jxl_d1_protected_high/pm4-075-3906d66e.png b/samples/jxl_d1_protected_high/pm4-075-3906d66e.png new file mode 100644 index 0000000000000000000000000000000000000000..8eede7db3de34c79d15999ff71f946074618aa9d Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-075-3906d66e.png differ diff --git a/samples/jxl_d1_protected_high/pm4-078-a77b762e.png b/samples/jxl_d1_protected_high/pm4-078-a77b762e.png new file mode 100644 index 0000000000000000000000000000000000000000..07dec8f2b4f3317994f1087dfdc3d0c02850beaf Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-078-a77b762e.png differ diff --git a/samples/jxl_d1_protected_high/pm4-080-78dedcb6.png b/samples/jxl_d1_protected_high/pm4-080-78dedcb6.png new file mode 100644 index 0000000000000000000000000000000000000000..6e328125e9538d116ce8059ad07c32ace9727a6c Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-080-78dedcb6.png differ diff --git a/samples/jxl_d1_protected_high/pm4-082-6adb4a49.png b/samples/jxl_d1_protected_high/pm4-082-6adb4a49.png new file mode 100644 index 0000000000000000000000000000000000000000..2e64275583c04ba68fd280d1c46d4a8d0e2fa826 Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-082-6adb4a49.png differ diff --git a/samples/jxl_d1_protected_high/pm4-089-60ad56aa.png b/samples/jxl_d1_protected_high/pm4-089-60ad56aa.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb040c76420498f4b80c5f778134ccd43543344 Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-089-60ad56aa.png differ diff --git a/samples/jxl_d1_protected_high/pm4-090-c71ebd94.png b/samples/jxl_d1_protected_high/pm4-090-c71ebd94.png new file mode 100644 index 0000000000000000000000000000000000000000..189ebf662df9fce01682f3531289236db91ed6ff Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-090-c71ebd94.png differ diff --git a/samples/jxl_d1_protected_high/pm4-097-0b860832.png b/samples/jxl_d1_protected_high/pm4-097-0b860832.png new file mode 100644 index 0000000000000000000000000000000000000000..da7c24930db34ef0582c711742844f8ade3dd061 Binary files /dev/null and b/samples/jxl_d1_protected_high/pm4-097-0b860832.png differ diff --git a/samples/png_baseline/pm4-002-effb6eaa.png b/samples/png_baseline/pm4-002-effb6eaa.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a139e50fcc66fa8bea26eced582a6f5ce5d563 Binary files /dev/null and b/samples/png_baseline/pm4-002-effb6eaa.png differ diff --git a/samples/png_baseline/pm4-016-fd1eb48d.png b/samples/png_baseline/pm4-016-fd1eb48d.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6098275d0b80dcac7c5c7f1c4a5d82e0af9a9c Binary files /dev/null and b/samples/png_baseline/pm4-016-fd1eb48d.png differ diff --git a/samples/png_baseline/pm4-051-093f1478.png b/samples/png_baseline/pm4-051-093f1478.png new file mode 100644 index 0000000000000000000000000000000000000000..22f9c45b70439e7c7bba15fd4f7ba8176202ee12 Binary files /dev/null and b/samples/png_baseline/pm4-051-093f1478.png differ diff --git a/samples/png_baseline/pm4-060-9ea3ad52.png b/samples/png_baseline/pm4-060-9ea3ad52.png new file mode 100644 index 0000000000000000000000000000000000000000..440545adc2d0bda1c40d1e94d1776c0581a198a1 Binary files /dev/null and b/samples/png_baseline/pm4-060-9ea3ad52.png differ diff --git a/samples/png_baseline/pm4-075-3906d66e.png b/samples/png_baseline/pm4-075-3906d66e.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6150038e6a7ef52ef315d7a01fe58068e06843 Binary files /dev/null and b/samples/png_baseline/pm4-075-3906d66e.png differ diff --git a/samples/png_baseline/pm4-078-a77b762e.png b/samples/png_baseline/pm4-078-a77b762e.png new file mode 100644 index 0000000000000000000000000000000000000000..07530efe529d08d9bcab82791b21f4b0c5af5476 Binary files /dev/null and b/samples/png_baseline/pm4-078-a77b762e.png differ diff --git a/samples/png_baseline/pm4-080-78dedcb6.png b/samples/png_baseline/pm4-080-78dedcb6.png new file mode 100644 index 0000000000000000000000000000000000000000..99d5cdf266c1ce10debae7a37c2c0e50005bbb04 Binary files /dev/null and b/samples/png_baseline/pm4-080-78dedcb6.png differ diff --git a/samples/png_baseline/pm4-082-6adb4a49.png b/samples/png_baseline/pm4-082-6adb4a49.png new file mode 100644 index 0000000000000000000000000000000000000000..aec9e08ac2718ad5604e3493ac009edb8e99ae77 Binary files /dev/null and b/samples/png_baseline/pm4-082-6adb4a49.png differ diff --git a/samples/png_baseline/pm4-089-60ad56aa.png b/samples/png_baseline/pm4-089-60ad56aa.png new file mode 100644 index 0000000000000000000000000000000000000000..b2dbdcf9aa4a377cfd5f0cc0c89f5d41ff624a44 Binary files /dev/null and b/samples/png_baseline/pm4-089-60ad56aa.png differ diff --git a/samples/png_baseline/pm4-090-c71ebd94.png b/samples/png_baseline/pm4-090-c71ebd94.png new file mode 100644 index 0000000000000000000000000000000000000000..fc969d603617a3adb55f472b5abefe4ffe337c24 Binary files /dev/null and b/samples/png_baseline/pm4-090-c71ebd94.png differ diff --git a/samples/png_baseline/pm4-097-0b860832.png b/samples/png_baseline/pm4-097-0b860832.png new file mode 100644 index 0000000000000000000000000000000000000000..bffb2566529c2a2bffcc06214a1c859e87c93a85 Binary files /dev/null and b/samples/png_baseline/pm4-097-0b860832.png differ diff --git a/samples/webp_lossless/pm4-016-fd1eb48d.png b/samples/webp_lossless/pm4-016-fd1eb48d.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6098275d0b80dcac7c5c7f1c4a5d82e0af9a9c Binary files /dev/null and b/samples/webp_lossless/pm4-016-fd1eb48d.png differ diff --git a/samples/webp_lossless/pm4-060-9ea3ad52.png b/samples/webp_lossless/pm4-060-9ea3ad52.png new file mode 100644 index 0000000000000000000000000000000000000000..440545adc2d0bda1c40d1e94d1776c0581a198a1 Binary files /dev/null and b/samples/webp_lossless/pm4-060-9ea3ad52.png differ diff --git a/samples/webp_lossless/pm4-078-a77b762e.png b/samples/webp_lossless/pm4-078-a77b762e.png new file mode 100644 index 0000000000000000000000000000000000000000..07530efe529d08d9bcab82791b21f4b0c5af5476 Binary files /dev/null and b/samples/webp_lossless/pm4-078-a77b762e.png differ diff --git a/samples/webp_lossless/pm4-080-78dedcb6.png b/samples/webp_lossless/pm4-080-78dedcb6.png new file mode 100644 index 0000000000000000000000000000000000000000..99d5cdf266c1ce10debae7a37c2c0e50005bbb04 Binary files /dev/null and b/samples/webp_lossless/pm4-080-78dedcb6.png differ diff --git a/samples/webp_lossless/pm4-090-c71ebd94.png b/samples/webp_lossless/pm4-090-c71ebd94.png new file mode 100644 index 0000000000000000000000000000000000000000..fc969d603617a3adb55f472b5abefe4ffe337c24 Binary files /dev/null and b/samples/webp_lossless/pm4-090-c71ebd94.png differ diff --git a/samples/webp_lossless/pm4-097-0b860832.png b/samples/webp_lossless/pm4-097-0b860832.png new file mode 100644 index 0000000000000000000000000000000000000000..bffb2566529c2a2bffcc06214a1c859e87c93a85 Binary files /dev/null and b/samples/webp_lossless/pm4-097-0b860832.png differ diff --git a/scripts/config/config.json b/scripts/config/config.json new file mode 100644 index 0000000000000000000000000000000000000000..7e7e0110251e8153d854ecbea1959fba2ccf9927 --- /dev/null +++ b/scripts/config/config.json @@ -0,0 +1,30 @@ +{ + "architecture": "latent-diffusion-dit", + "objective": "rectified-flow", + "dit": { + "dim": 384, + "depth": 12, + "heads": 6, + "patch": 2, + "latent_ch": 4, + "latent_size": 32, + "text_dim": 512, + "mlp_ratio": 4.0 + }, + "vae": "stabilityai/sd-vae-ft-mse", + "text_encoder": "openai/clip-vit-base-patch32", + "max_tokens": 40, + "trainable_parameters": 40013980, + "total_parameters_incl_frozen": 161500000, + "sampling": { + "steps": 50, + "cfg": 6.0 + }, + "eval": { + "fid": 39.54, + "clip_score": 28.04, + "n": 5000, + "dataset": "MS-COCO val2014, 256 center crop", + "protocol": "torchmetrics FrechetInceptionDistance + CLIPScore (openai/clip-vit-base-patch32)" + } +} diff --git a/scripts/config/model_png.json b/scripts/config/model_png.json new file mode 100644 index 0000000000000000000000000000000000000000..3e4d6ced7d4593bb49adf306c810f041accf8f72 --- /dev/null +++ b/scripts/config/model_png.json @@ -0,0 +1 @@ +{"cfg": {"dim": 384, "depth": 12, "heads": 6}, "params": [{"name": "x_embed.weight", "shape": [384, 16], "numel": 6144}, {"name": "x_embed.bias", "shape": [384], "numel": 384}, {"name": "t_mlp.0.weight", "shape": [384, 384], "numel": 147456}, {"name": "t_mlp.0.bias", "shape": [384], "numel": 384}, {"name": "t_mlp.2.weight", "shape": [384, 384], "numel": 147456}, {"name": "t_mlp.2.bias", "shape": [384], "numel": 384}, {"name": "text_proj.weight", "shape": [384, 512], "numel": 196608}, {"name": "text_proj.bias", "shape": [384], "numel": 384}, {"name": "text_pool.weight", "shape": [384, 512], "numel": 196608}, {"name": "text_pool.bias", "shape": [384], "numel": 384}, {"name": "blocks.0.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.0.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.0.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.0.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.0.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.0.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.0.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.0.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.0.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.0.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.0.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.0.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.0.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.0.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.0.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.0.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.0.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.0.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.0.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.1.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.1.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.1.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.1.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.1.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.1.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.1.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.1.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.1.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.1.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.1.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.1.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.1.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.1.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.1.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.1.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.1.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.1.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.1.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.2.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.2.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.2.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.2.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.2.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.2.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.2.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.2.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.2.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.2.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.2.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.2.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.2.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.2.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.2.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.2.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.2.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.2.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.2.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.3.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.3.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.3.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.3.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.3.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.3.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.3.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.3.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.3.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.3.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.3.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.3.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.3.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.3.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.3.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.3.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.3.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.3.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.3.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.4.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.4.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.4.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.4.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.4.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.4.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.4.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.4.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.4.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.4.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.4.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.4.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.4.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.4.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.4.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.4.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.4.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.4.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.4.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.5.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.5.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.5.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.5.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.5.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.5.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.5.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.5.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.5.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.5.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.5.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.5.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.5.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.5.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.5.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.5.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.5.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.5.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.5.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.6.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.6.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.6.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.6.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.6.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.6.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.6.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.6.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.6.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.6.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.6.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.6.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.6.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.6.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.6.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.6.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.6.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.6.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.6.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.7.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.7.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.7.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.7.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.7.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.7.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.7.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.7.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.7.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.7.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.7.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.7.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.7.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.7.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.7.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.7.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.7.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.7.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.7.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.8.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.8.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.8.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.8.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.8.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.8.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.8.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.8.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.8.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.8.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.8.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.8.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.8.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.8.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.8.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.8.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.8.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.8.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.8.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.9.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.9.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.9.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.9.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.9.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.9.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.9.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.9.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.9.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.9.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.9.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.9.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.9.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.9.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.9.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.9.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.9.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.9.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.9.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.10.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.10.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.10.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.10.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.10.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.10.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.10.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.10.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.10.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.10.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.10.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.10.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.10.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.10.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.10.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.10.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.10.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.10.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.10.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "blocks.11.cross_gate", "shape": [1], "numel": 1}, {"name": "blocks.11.attn.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.11.attn.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.11.attn.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.11.attn.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.11.attn.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.11.attn.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.11.cross.q.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.11.cross.q.bias", "shape": [384], "numel": 384}, {"name": "blocks.11.cross.kv.weight", "shape": [768, 384], "numel": 294912}, {"name": "blocks.11.cross.kv.bias", "shape": [768], "numel": 768}, {"name": "blocks.11.cross.proj.weight", "shape": [384, 384], "numel": 147456}, {"name": "blocks.11.cross.proj.bias", "shape": [384], "numel": 384}, {"name": "blocks.11.mlp.0.weight", "shape": [1536, 384], "numel": 589824}, {"name": "blocks.11.mlp.0.bias", "shape": [1536], "numel": 1536}, {"name": "blocks.11.mlp.2.weight", "shape": [384, 1536], "numel": 589824}, {"name": "blocks.11.mlp.2.bias", "shape": [384], "numel": 384}, {"name": "blocks.11.ada.1.weight", "shape": [2304, 384], "numel": 884736}, {"name": "blocks.11.ada.1.bias", "shape": [2304], "numel": 2304}, {"name": "ada_out.1.weight", "shape": [768, 384], "numel": 294912}, {"name": "ada_out.1.bias", "shape": [768], "numel": 768}, {"name": "head.weight", "shape": [16, 384], "numel": 6144}, {"name": "head.bias", "shape": [16], "numel": 16}], "total_parameters": 40013980, "side": 6326, "dtype": "float16", "channels": "R=hi,G=lo,B=unused"} \ No newline at end of file diff --git a/scripts/config/prompts.json b/scripts/config/prompts.json new file mode 100644 index 0000000000000000000000000000000000000000..08c9dea4b06807ded5ce7a1e23475ed848069a04 --- /dev/null +++ b/scripts/config/prompts.json @@ -0,0 +1,802 @@ +[ + { + "prompt_id": "pm4-001-cca08f5b", + "category": "animals", + "prompt": "red fox crossing a snowy ridge, wide composition, morning light, high detail, scene 1", + "seed": 10000, + "paired_seed": 10000, + "initial_latent_seed": 10000 + }, + { + "prompt_id": "pm4-002-effb6eaa", + "category": "people", + "prompt": "violinist backstage before a concert, wide composition, morning light, high detail, scene 2", + "seed": 10001, + "paired_seed": 10001, + "initial_latent_seed": 10001 + }, + { + "prompt_id": "pm4-003-46e10145", + "category": "landscapes", + "prompt": "volcanic valley beneath low clouds, wide composition, morning light, high detail, scene 3", + "seed": 10002, + "paired_seed": 10002, + "initial_latent_seed": 10002 + }, + { + "prompt_id": "pm4-004-ab14afb8", + "category": "vehicles", + "prompt": "yellow tram turning through old streets, wide composition, morning light, high detail, scene 4", + "seed": 10003, + "paired_seed": 10003, + "initial_latent_seed": 10003 + }, + { + "prompt_id": "pm4-005-5e9b5a50", + "category": "architecture", + "prompt": "brutalist library in winter, wide composition, morning light, high detail, scene 5", + "seed": 10004, + "paired_seed": 10004, + "initial_latent_seed": 10004 + }, + { + "prompt_id": "pm4-006-44a2087e", + "category": "food", + "prompt": "sourdough loaf cooling on linen, wide composition, morning light, high detail, scene 6", + "seed": 10005, + "paired_seed": 10005, + "initial_latent_seed": 10005 + }, + { + "prompt_id": "pm4-007-5003533d", + "category": "indoor", + "prompt": "sunlit reading nook with a velvet chair, wide composition, morning light, high detail, scene 7", + "seed": 10006, + "paired_seed": 10006, + "initial_latent_seed": 10006 + }, + { + "prompt_id": "pm4-008-54647723", + "category": "abstract", + "prompt": "ink spirals colliding with gold leaf, wide composition, morning light, high detail, scene 8", + "seed": 10007, + "paired_seed": 10007, + "initial_latent_seed": 10007 + }, + { + "prompt_id": "pm4-009-e51903e1", + "category": "animals", + "prompt": "sea turtle above a coral reef, intimate composition, soft overcast light, high detail, scene 9", + "seed": 10008, + "paired_seed": 10008, + "initial_latent_seed": 10008 + }, + { + "prompt_id": "pm4-010-97841ad3", + "category": "people", + "prompt": "ceramic artist shaping a bowl, intimate composition, soft overcast light, high detail, scene 10", + "seed": 10009, + "paired_seed": 10009, + "initial_latent_seed": 10009 + }, + { + "prompt_id": "pm4-011-c900b313", + "category": "landscapes", + "prompt": "lavender fields in Provence, intimate composition, soft overcast light, high detail, scene 11", + "seed": 10010, + "paired_seed": 10010, + "initial_latent_seed": 10010 + }, + { + "prompt_id": "pm4-012-98171122", + "category": "vehicles", + "prompt": "sailboat in a harbor of lanterns, intimate composition, soft overcast light, high detail, scene 12", + "seed": 10011, + "paired_seed": 10011, + "initial_latent_seed": 10011 + }, + { + "prompt_id": "pm4-013-d58e7b01", + "category": "architecture", + "prompt": "wooden temple surrounded by cedars, intimate composition, soft overcast light, high detail, scene 13", + "seed": 10012, + "paired_seed": 10012, + "initial_latent_seed": 10012 + }, + { + "prompt_id": "pm4-014-8876ccfb", + "category": "food", + "prompt": "ramen bowl in a tiny Tokyo shop, intimate composition, soft overcast light, high detail, scene 14", + "seed": 10013, + "paired_seed": 10013, + "initial_latent_seed": 10013 + }, + { + "prompt_id": "pm4-015-8fe08e47", + "category": "indoor", + "prompt": "rainy day kitchen with copper pans, intimate composition, soft overcast light, high detail, scene 15", + "seed": 10014, + "paired_seed": 10014, + "initial_latent_seed": 10014 + }, + { + "prompt_id": "pm4-016-fd1eb48d", + "category": "abstract", + "prompt": "isometric cubes in coral and teal, intimate composition, soft overcast light, high detail, scene 16", + "seed": 10015, + "paired_seed": 10015, + "initial_latent_seed": 10015 + }, + { + "prompt_id": "pm4-017-7f335742", + "category": "animals", + "prompt": "owl on a mossy branch, cinematic composition, late afternoon light, high detail, scene 17", + "seed": 10016, + "paired_seed": 10016, + "initial_latent_seed": 10016 + }, + { + "prompt_id": "pm4-018-4ea91357", + "category": "people", + "prompt": "runner crossing a bridge at dawn, cinematic composition, late afternoon light, high detail, scene 18", + "seed": 10017, + "paired_seed": 10017, + "initial_latent_seed": 10017 + }, + { + "prompt_id": "pm4-019-f7070d02", + "category": "landscapes", + "prompt": "desert canyon after rain, cinematic composition, late afternoon light, high detail, scene 19", + "seed": 10018, + "paired_seed": 10018, + "initial_latent_seed": 10018 + }, + { + "prompt_id": "pm4-020-d8e94e65", + "category": "vehicles", + "prompt": "red bicycle beside a canal, cinematic composition, late afternoon light, high detail, scene 20", + "seed": 10019, + "paired_seed": 10019, + "initial_latent_seed": 10019 + }, + { + "prompt_id": "pm4-021-2da79c09", + "category": "architecture", + "prompt": "Art Deco cinema at twilight, cinematic composition, late afternoon light, high detail, scene 21", + "seed": 10020, + "paired_seed": 10020, + "initial_latent_seed": 10020 + }, + { + "prompt_id": "pm4-022-b8b11cb8", + "category": "food", + "prompt": "summer peaches on a blue plate, cinematic composition, late afternoon light, high detail, scene 22", + "seed": 10021, + "paired_seed": 10021, + "initial_latent_seed": 10021 + }, + { + "prompt_id": "pm4-023-0eb7f66d", + "category": "indoor", + "prompt": "minimal studio with a drafting table, cinematic composition, late afternoon light, high detail, scene 23", + "seed": 10022, + "paired_seed": 10022, + "initial_latent_seed": 10022 + }, + { + "prompt_id": "pm4-024-56de999a", + "category": "abstract", + "prompt": "watercolor gradients like a topographic map, cinematic composition, late afternoon light, high detail, scene 24", + "seed": 10023, + "paired_seed": 10023, + "initial_latent_seed": 10023 + }, + { + "prompt_id": "pm4-025-ef6349d3", + "category": "animals", + "prompt": "elephant family at dusk, wide composition, blue hour light, high detail, scene 25", + "seed": 10024, + "paired_seed": 10024, + "initial_latent_seed": 10024 + }, + { + "prompt_id": "pm4-026-ad193361", + "category": "people", + "prompt": "grandmother reading beside a window, wide composition, blue hour light, high detail, scene 26", + "seed": 10025, + "paired_seed": 10025, + "initial_latent_seed": 10025 + }, + { + "prompt_id": "pm4-027-becf10ea", + "category": "landscapes", + "prompt": "fjord with a small wooden ferry, wide composition, blue hour light, high detail, scene 27", + "seed": 10026, + "paired_seed": 10026, + "initial_latent_seed": 10026 + }, + { + "prompt_id": "pm4-028-b56d212e", + "category": "vehicles", + "prompt": "electric train entering a tunnel, wide composition, blue hour light, high detail, scene 28", + "seed": 10027, + "paired_seed": 10027, + "initial_latent_seed": 10027 + }, + { + "prompt_id": "pm4-029-95eb9f34", + "category": "architecture", + "prompt": "floating pavilion on a lake, wide composition, blue hour light, high detail, scene 29", + "seed": 10028, + "paired_seed": 10028, + "initial_latent_seed": 10028 + }, + { + "prompt_id": "pm4-030-2b63f9ba", + "category": "food", + "prompt": "spice market with open jars, wide composition, blue hour light, high detail, scene 30", + "seed": 10029, + "paired_seed": 10029, + "initial_latent_seed": 10029 + }, + { + "prompt_id": "pm4-031-844a8814", + "category": "indoor", + "prompt": "old train compartment with luggage, wide composition, blue hour light, high detail, scene 31", + "seed": 10030, + "paired_seed": 10030, + "initial_latent_seed": 10030 + }, + { + "prompt_id": "pm4-032-42ee9a0f", + "category": "abstract", + "prompt": "paper cut shapes casting long shadows, wide composition, blue hour light, high detail, scene 32", + "seed": 10031, + "paired_seed": 10031, + "initial_latent_seed": 10031 + }, + { + "prompt_id": "pm4-033-b5e58e7f", + "category": "animals", + "prompt": "golden retriever in a farmers market, intimate composition, morning light, high detail, scene 33", + "seed": 10032, + "paired_seed": 10032, + "initial_latent_seed": 10032 + }, + { + "prompt_id": "pm4-034-a383c38f", + "category": "people", + "prompt": "astronomer under a meteor shower, intimate composition, morning light, high detail, scene 34", + "seed": 10033, + "paired_seed": 10033, + "initial_latent_seed": 10033 + }, + { + "prompt_id": "pm4-035-f3b99568", + "category": "landscapes", + "prompt": "autumn forest reflected in a lake, intimate composition, morning light, high detail, scene 35", + "seed": 10034, + "paired_seed": 10034, + "initial_latent_seed": 10034 + }, + { + "prompt_id": "pm4-036-71932e79", + "category": "vehicles", + "prompt": "vintage airplane in a hangar, intimate composition, morning light, high detail, scene 36", + "seed": 10035, + "paired_seed": 10035, + "initial_latent_seed": 10035 + }, + { + "prompt_id": "pm4-037-9515174e", + "category": "architecture", + "prompt": "desert observatory with domes, intimate composition, morning light, high detail, scene 37", + "seed": 10036, + "paired_seed": 10036, + "initial_latent_seed": 10036 + }, + { + "prompt_id": "pm4-038-335a27fa", + "category": "food", + "prompt": "chocolate cake with raspberry glaze, intimate composition, morning light, high detail, scene 38", + "seed": 10037, + "paired_seed": 10037, + "initial_latent_seed": 10037 + }, + { + "prompt_id": "pm4-039-066bcab1", + "category": "indoor", + "prompt": "music room filled with records, intimate composition, morning light, high detail, scene 39", + "seed": 10038, + "paired_seed": 10038, + "initial_latent_seed": 10038 + }, + { + "prompt_id": "pm4-040-eca2f1c2", + "category": "abstract", + "prompt": "glass ribbons twisting in sunlight, intimate composition, morning light, high detail, scene 40", + "seed": 10039, + "paired_seed": 10039, + "initial_latent_seed": 10039 + }, + { + "prompt_id": "pm4-041-7ac2f16a", + "category": "animals", + "prompt": "penguin colony on blue ice, cinematic composition, soft overcast light, high detail, scene 41", + "seed": 10040, + "paired_seed": 10040, + "initial_latent_seed": 10040 + }, + { + "prompt_id": "pm4-042-f7a87ffa", + "category": "people", + "prompt": "street dancer in a neon alley, cinematic composition, soft overcast light, high detail, scene 42", + "seed": 10041, + "paired_seed": 10041, + "initial_latent_seed": 10041 + }, + { + "prompt_id": "pm4-043-cde8ad90", + "category": "landscapes", + "prompt": "rice terraces in morning mist, cinematic composition, soft overcast light, high detail, scene 43", + "seed": 10042, + "paired_seed": 10042, + "initial_latent_seed": 10042 + }, + { + "prompt_id": "pm4-044-93deb087", + "category": "vehicles", + "prompt": "motorcycle on a coastal road, cinematic composition, soft overcast light, high detail, scene 44", + "seed": 10043, + "paired_seed": 10043, + "initial_latent_seed": 10043 + }, + { + "prompt_id": "pm4-045-25fa16bb", + "category": "architecture", + "prompt": "narrow townhouse courtyard, cinematic composition, soft overcast light, high detail, scene 45", + "seed": 10044, + "paired_seed": 10044, + "initial_latent_seed": 10044 + }, + { + "prompt_id": "pm4-046-bec80a2b", + "category": "food", + "prompt": "breakfast table with coffee and oranges, cinematic composition, soft overcast light, high detail, scene 46", + "seed": 10045, + "paired_seed": 10045, + "initial_latent_seed": 10045 + }, + { + "prompt_id": "pm4-047-fc09cfd4", + "category": "indoor", + "prompt": "green apartment balcony after watering, cinematic composition, soft overcast light, high detail, scene 47", + "seed": 10046, + "paired_seed": 10046, + "initial_latent_seed": 10046 + }, + { + "prompt_id": "pm4-048-e270315e", + "category": "abstract", + "prompt": "monochrome circles with one yellow accent, cinematic composition, soft overcast light, high detail, scene 48", + "seed": 10047, + "paired_seed": 10047, + "initial_latent_seed": 10047 + }, + { + "prompt_id": "pm4-049-85579bcd", + "category": "animals", + "prompt": "dragonfly on a lotus pond, wide composition, late afternoon light, high detail, scene 49", + "seed": 10048, + "paired_seed": 10048, + "initial_latent_seed": 10048 + }, + { + "prompt_id": "pm4-050-c3e45c01", + "category": "people", + "prompt": "gardener holding heirloom tomatoes, wide composition, late afternoon light, high detail, scene 50", + "seed": 10049, + "paired_seed": 10049, + "initial_latent_seed": 10049 + }, + { + "prompt_id": "pm4-051-093f1478", + "category": "landscapes", + "prompt": "coastal cliffs under storm light, wide composition, late afternoon light, high detail, scene 51", + "seed": 10050, + "paired_seed": 10050, + "initial_latent_seed": 10050 + }, + { + "prompt_id": "pm4-052-03bbf4ac", + "category": "vehicles", + "prompt": "blue pickup at a rural gas station, wide composition, late afternoon light, high detail, scene 52", + "seed": 10051, + "paired_seed": 10051, + "initial_latent_seed": 10051 + }, + { + "prompt_id": "pm4-053-0c5b1381", + "category": "architecture", + "prompt": "futuristic transit station, wide composition, late afternoon light, high detail, scene 53", + "seed": 10052, + "paired_seed": 10052, + "initial_latent_seed": 10052 + }, + { + "prompt_id": "pm4-054-92b0a67d", + "category": "food", + "prompt": "handmade dumplings on bamboo, wide composition, late afternoon light, high detail, scene 54", + "seed": 10053, + "paired_seed": 10053, + "initial_latent_seed": 10053 + }, + { + "prompt_id": "pm4-055-ac372623", + "category": "indoor", + "prompt": "museum gallery with a skylight, wide composition, late afternoon light, high detail, scene 55", + "seed": 10054, + "paired_seed": 10054, + "initial_latent_seed": 10054 + }, + { + "prompt_id": "pm4-056-ee005598", + "category": "abstract", + "prompt": "liquid metal waves on black, wide composition, late afternoon light, high detail, scene 56", + "seed": 10055, + "paired_seed": 10055, + "initial_latent_seed": 10055 + }, + { + "prompt_id": "pm4-057-8ac12393", + "category": "animals", + "prompt": "wild horse in desert wind, intimate composition, blue hour light, high detail, scene 57", + "seed": 10056, + "paired_seed": 10056, + "initial_latent_seed": 10056 + }, + { + "prompt_id": "pm4-058-b655d991", + "category": "people", + "prompt": "chef plating a tasting menu, intimate composition, blue hour light, high detail, scene 58", + "seed": 10057, + "paired_seed": 10057, + "initial_latent_seed": 10057 + }, + { + "prompt_id": "pm4-059-7d5da4fb", + "category": "landscapes", + "prompt": "alpine meadow with a footpath, intimate composition, blue hour light, high detail, scene 59", + "seed": 10058, + "paired_seed": 10058, + "initial_latent_seed": 10058 + }, + { + "prompt_id": "pm4-060-9ea3ad52", + "category": "vehicles", + "prompt": "submarine beneath polar ice, intimate composition, blue hour light, high detail, scene 60", + "seed": 10059, + "paired_seed": 10059, + "initial_latent_seed": 10059 + }, + { + "prompt_id": "pm4-061-3e32cfca", + "category": "architecture", + "prompt": "stone bridge over a market canal, intimate composition, blue hour light, high detail, scene 61", + "seed": 10060, + "paired_seed": 10060, + "initial_latent_seed": 10060 + }, + { + "prompt_id": "pm4-062-4e57bc1c", + "category": "food", + "prompt": "roasted vegetables on a ceramic platter, intimate composition, blue hour light, high detail, scene 62", + "seed": 10061, + "paired_seed": 10061, + "initial_latent_seed": 10061 + }, + { + "prompt_id": "pm4-063-a4e09271", + "category": "indoor", + "prompt": "warm cabin bedroom with quilts, intimate composition, blue hour light, high detail, scene 63", + "seed": 10062, + "paired_seed": 10062, + "initial_latent_seed": 10062 + }, + { + "prompt_id": "pm4-064-2264c7eb", + "category": "abstract", + "prompt": "woven threads forming a labyrinth, intimate composition, blue hour light, high detail, scene 64", + "seed": 10063, + "paired_seed": 10063, + "initial_latent_seed": 10063 + }, + { + "prompt_id": "pm4-065-1cab116c", + "category": "animals", + "prompt": "sleeping koala in eucalyptus, cinematic composition, morning light, high detail, scene 65", + "seed": 10064, + "paired_seed": 10064, + "initial_latent_seed": 10064 + }, + { + "prompt_id": "pm4-066-da57563c", + "category": "people", + "prompt": "child flying a paper kite, cinematic composition, morning light, high detail, scene 66", + "seed": 10065, + "paired_seed": 10065, + "initial_latent_seed": 10065 + }, + { + "prompt_id": "pm4-067-ef873e98", + "category": "landscapes", + "prompt": "tropical waterfall behind ferns, cinematic composition, morning light, high detail, scene 67", + "seed": 10066, + "paired_seed": 10066, + "initial_latent_seed": 10066 + }, + { + "prompt_id": "pm4-068-fbe210a2", + "category": "vehicles", + "prompt": "hot air balloon over vineyards, cinematic composition, morning light, high detail, scene 68", + "seed": 10067, + "paired_seed": 10067, + "initial_latent_seed": 10067 + }, + { + "prompt_id": "pm4-069-cacdab19", + "category": "architecture", + "prompt": "greenhouse made of iron and glass, cinematic composition, morning light, high detail, scene 69", + "seed": 10068, + "paired_seed": 10068, + "initial_latent_seed": 10068 + }, + { + "prompt_id": "pm4-070-691aa003", + "category": "food", + "prompt": "lemon tart beside garden flowers, cinematic composition, morning light, high detail, scene 70", + "seed": 10069, + "paired_seed": 10069, + "initial_latent_seed": 10069 + }, + { + "prompt_id": "pm4-071-b9fe92b0", + "category": "indoor", + "prompt": "maker workshop with wooden tools, cinematic composition, morning light, high detail, scene 71", + "seed": 10070, + "paired_seed": 10070, + "initial_latent_seed": 10070 + }, + { + "prompt_id": "pm4-072-4a0cff0c", + "category": "abstract", + "prompt": "pixel mosaic inspired by ocean tides, cinematic composition, morning light, high detail, scene 72", + "seed": 10071, + "paired_seed": 10071, + "initial_latent_seed": 10071 + }, + { + "prompt_id": "pm4-073-6ec086e0", + "category": "animals", + "prompt": "humpback whale breaching offshore, wide composition, soft overcast light, high detail, scene 73", + "seed": 10072, + "paired_seed": 10072, + "initial_latent_seed": 10072 + }, + { + "prompt_id": "pm4-074-796fd1d3", + "category": "people", + "prompt": "sailor repairing a bright red net, wide composition, soft overcast light, high detail, scene 74", + "seed": 10073, + "paired_seed": 10073, + "initial_latent_seed": 10073 + }, + { + "prompt_id": "pm4-075-3906d66e", + "category": "landscapes", + "prompt": "salt flats mirroring the night sky, wide composition, soft overcast light, high detail, scene 75", + "seed": 10074, + "paired_seed": 10074, + "initial_latent_seed": 10074 + }, + { + "prompt_id": "pm4-076-a577a15d", + "category": "vehicles", + "prompt": "kayak on a glassy river, wide composition, soft overcast light, high detail, scene 76", + "seed": 10075, + "paired_seed": 10075, + "initial_latent_seed": 10075 + }, + { + "prompt_id": "pm4-077-7fa689ad", + "category": "architecture", + "prompt": "lighthouse on a basalt shore, wide composition, soft overcast light, high detail, scene 77", + "seed": 10076, + "paired_seed": 10076, + "initial_latent_seed": 10076 + }, + { + "prompt_id": "pm4-078-a77b762e", + "category": "food", + "prompt": "night market skewers over charcoal, wide composition, soft overcast light, high detail, scene 78", + "seed": 10077, + "paired_seed": 10077, + "initial_latent_seed": 10077 + }, + { + "prompt_id": "pm4-079-5e8f0ede", + "category": "indoor", + "prompt": "quiet cafe corner beside a window, wide composition, soft overcast light, high detail, scene 79", + "seed": 10078, + "paired_seed": 10078, + "initial_latent_seed": 10078 + }, + { + "prompt_id": "pm4-080-78dedcb6", + "category": "abstract", + "prompt": "floating geometric shards in soft fog, wide composition, soft overcast light, high detail, scene 80", + "seed": 10079, + "paired_seed": 10079, + "initial_latent_seed": 10079 + }, + { + "prompt_id": "pm4-081-5b17a851", + "category": "animals", + "prompt": "red fox crossing a snowy ridge, intimate composition, late afternoon light, high detail, scene 81", + "seed": 10080, + "paired_seed": 10080, + "initial_latent_seed": 10080 + }, + { + "prompt_id": "pm4-082-6adb4a49", + "category": "people", + "prompt": "violinist backstage before a concert, intimate composition, late afternoon light, high detail, scene 82", + "seed": 10081, + "paired_seed": 10081, + "initial_latent_seed": 10081 + }, + { + "prompt_id": "pm4-083-02dc5c51", + "category": "landscapes", + "prompt": "volcanic valley beneath low clouds, intimate composition, late afternoon light, high detail, scene 83", + "seed": 10082, + "paired_seed": 10082, + "initial_latent_seed": 10082 + }, + { + "prompt_id": "pm4-084-06ed218a", + "category": "vehicles", + "prompt": "yellow tram turning through old streets, intimate composition, late afternoon light, high detail, scene 84", + "seed": 10083, + "paired_seed": 10083, + "initial_latent_seed": 10083 + }, + { + "prompt_id": "pm4-085-84317ff5", + "category": "architecture", + "prompt": "brutalist library in winter, intimate composition, late afternoon light, high detail, scene 85", + "seed": 10084, + "paired_seed": 10084, + "initial_latent_seed": 10084 + }, + { + "prompt_id": "pm4-086-90e23232", + "category": "food", + "prompt": "sourdough loaf cooling on linen, intimate composition, late afternoon light, high detail, scene 86", + "seed": 10085, + "paired_seed": 10085, + "initial_latent_seed": 10085 + }, + { + "prompt_id": "pm4-087-34bf26a1", + "category": "indoor", + "prompt": "sunlit reading nook with a velvet chair, intimate composition, late afternoon light, high detail, scene 87", + "seed": 10086, + "paired_seed": 10086, + "initial_latent_seed": 10086 + }, + { + "prompt_id": "pm4-088-92a9c223", + "category": "abstract", + "prompt": "ink spirals colliding with gold leaf, intimate composition, late afternoon light, high detail, scene 88", + "seed": 10087, + "paired_seed": 10087, + "initial_latent_seed": 10087 + }, + { + "prompt_id": "pm4-089-60ad56aa", + "category": "animals", + "prompt": "sea turtle above a coral reef, cinematic composition, blue hour light, high detail, scene 89", + "seed": 10088, + "paired_seed": 10088, + "initial_latent_seed": 10088 + }, + { + "prompt_id": "pm4-090-c71ebd94", + "category": "people", + "prompt": "ceramic artist shaping a bowl, cinematic composition, blue hour light, high detail, scene 90", + "seed": 10089, + "paired_seed": 10089, + "initial_latent_seed": 10089 + }, + { + "prompt_id": "pm4-091-c428ceb2", + "category": "landscapes", + "prompt": "lavender fields in Provence, cinematic composition, blue hour light, high detail, scene 91", + "seed": 10090, + "paired_seed": 10090, + "initial_latent_seed": 10090 + }, + { + "prompt_id": "pm4-092-cc02ddf9", + "category": "vehicles", + "prompt": "sailboat in a harbor of lanterns, cinematic composition, blue hour light, high detail, scene 92", + "seed": 10091, + "paired_seed": 10091, + "initial_latent_seed": 10091 + }, + { + "prompt_id": "pm4-093-53b39ad0", + "category": "architecture", + "prompt": "wooden temple surrounded by cedars, cinematic composition, blue hour light, high detail, scene 93", + "seed": 10092, + "paired_seed": 10092, + "initial_latent_seed": 10092 + }, + { + "prompt_id": "pm4-094-dd71e13d", + "category": "food", + "prompt": "ramen bowl in a tiny Tokyo shop, cinematic composition, blue hour light, high detail, scene 94", + "seed": 10093, + "paired_seed": 10093, + "initial_latent_seed": 10093 + }, + { + "prompt_id": "pm4-095-13e2d4a2", + "category": "indoor", + "prompt": "rainy day kitchen with copper pans, cinematic composition, blue hour light, high detail, scene 95", + "seed": 10094, + "paired_seed": 10094, + "initial_latent_seed": 10094 + }, + { + "prompt_id": "pm4-096-95b0203e", + "category": "abstract", + "prompt": "isometric cubes in coral and teal, cinematic composition, blue hour light, high detail, scene 96", + "seed": 10095, + "paired_seed": 10095, + "initial_latent_seed": 10095 + }, + { + "prompt_id": "pm4-097-0b860832", + "category": "animals", + "prompt": "owl on a mossy branch, wide composition, morning light, high detail, scene 97", + "seed": 10096, + "paired_seed": 10096, + "initial_latent_seed": 10096 + }, + { + "prompt_id": "pm4-098-b03251b5", + "category": "people", + "prompt": "runner crossing a bridge at dawn, wide composition, morning light, high detail, scene 98", + "seed": 10097, + "paired_seed": 10097, + "initial_latent_seed": 10097 + }, + { + "prompt_id": "pm4-099-d947f488", + "category": "landscapes", + "prompt": "desert canyon after rain, wide composition, morning light, high detail, scene 99", + "seed": 10098, + "paired_seed": 10098, + "initial_latent_seed": 10098 + }, + { + "prompt_id": "pm4-100-5e269fc4", + "category": "vehicles", + "prompt": "red bicycle beside a canal, wide composition, morning light, high detail, scene 100", + "seed": 10099, + "paired_seed": 10099, + "initial_latent_seed": 10099 + } +] diff --git a/scripts/cross_codec_report.py b/scripts/cross_codec_report.py new file mode 100644 index 0000000000000000000000000000000000000000..a341ac3a93c1df752a0072d1b8dec869e9a9cee4 --- /dev/null +++ b/scripts/cross_codec_report.py @@ -0,0 +1,551 @@ +"""Task3 cross-codec report: runner-owned raw data only, strict and deterministic.""" +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import logging +import math +import shutil +from collections.abc import Callable, Iterable, Mapping, Sequence +from pathlib import Path +from typing import Any + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np +from PIL import Image, UnidentifiedImageError + +from pixelmodel_robustness import cross_codec +from pixelmodel_robustness.cross_codec_experiment import ( + _hash, + condition_complete, + load_rows_strict, + scientific_identity_hash, + validate_resource_monitor, +) + +LOGGER = logging.getLogger(__name__) +REPORT_VERSION = "cross-codec-task3-v2" +BOOTSTRAP_SEED = 20260727 +BOOTSTRAP_SAMPLES = 10_000 +CONDITION_IDS = cross_codec.CONDITION_IDS +CONDITION_REGISTRY = cross_codec.CONDITION_REGISTRY +PAIRED_COLUMNS = ("condition_id", "baseline_condition", "paired_n", "prompt_ids_sha256", "mean_delta", "ci_low", "ci_high", "seed", "resamples", "na_reason") +GRID_COLUMNS = ("PNG", "JPEG Q100 Raw", "JPEG Q100 Repair", "JPEG Q100 Protected", "WebP Q80 Raw", "WebP Q80 Repair", "WebP Q80 Protected", "AVIF Q70 Raw", "AVIF Q70 Repair", "AVIF Q70 Protected", "JXL d1 Raw", "JXL d1 Repair", "JXL d1 Protected") +GRID_CONDITIONS = ("png_baseline", "jpeg_q100_raw", "jpeg_q100_repair_zero", "jpeg_q100_protected_high", "webp_q80_raw", "webp_q80_repair_zero", "webp_q80_protected_high", "avif_q70_raw", "avif_q70_repair_zero", "avif_q70_protected_high", "jxl_d1_raw", "jxl_d1_repair_zero", "jxl_d1_protected_high") +GENERATION_COLUMNS = ("condition_id", "prompt_id", "category", "prompt", "seed", "initial_latent_seed", "attempted", "completed", "success", "rate", "clip_score", "error", "sample_path", "sample_sha256", "sample_bytes") +CONDITION_COLUMNS = ("condition_id", "codec", "quality_distance", "mode", "lossless", "reconstruction_mode", "repair", "protected", "status", "failure_stage") +WEIGHT_COLUMNS = ("condition_id", "status", "observed", "reason", "nan_count", "posinf_count", "neginf_count", "mse", "mae", "cosine", "finite_pair_label", "sign_mismatch_count", "exponent_mismatch_count", "mantissa_mismatch_count", "repaired_count") +STORAGE_COLUMNS = ("condition_id", "payload_bytes", "payload_over_png", "png_over_payload", "size_saving_percent", "source_bytes", "payload_definition", "status", "reason") +SUMMARY_COLUMNS = ("condition_id", "attempted", "completed", "success", "denominator", "rate", "clip_mean", "first_failure_stage", "sample_sha_match_rate", "nan_count", "exponent_mismatch_count", "payload_over_png") +REQUIRED_ARTIFACTS = frozenset({"codec_conditions.csv", "weight_metrics.csv", "generation_metrics.csv", "storage_metrics.csv", "condition_summary.csv", "paired_quality_metrics.csv", "summary.md", "final_conclusion.md", "index.html", "plots/generation_comparison_grid.png", "plots/generation_comparison_grid_jpeg_q80.png", "plots/payload_vs_quality.png", "plots/success_vs_payload.png", "plots/nan_vs_success.png", "plots/exponent_mismatch_vs_success.png", "plots/representative_weight_error_maps.png"}) + + +def _sha(data: bytes) -> str: + return hashlib.sha256(data).hexdigest() + + +def _sha_file(path: Path) -> str: + return _sha(path.read_bytes()) + + +def _write_csv(path: Path, columns: Sequence[str], rows: Iterable[Mapping[str, object]]) -> None: + with path.open("w", newline="", encoding="utf-8") as stream: + writer = csv.DictWriter(stream, fieldnames=list(columns), extrasaction="ignore", lineterminator="\n") + writer.writeheader() + for row in rows: + writer.writerow({column: "" if row.get(column) is None else row.get(column) for column in columns}) + + +def _artifact(root: Path, value: object) -> Path: + if not isinstance(value, Mapping) or not isinstance(value.get("path"), str): + raise TypeError("artifact metadata missing path") + path = (root / str(value["path"])).resolve() + path.relative_to(root.resolve()) + if not path.is_file() or path.stat().st_size != int(value.get("bytes", -1)) or _sha_file(path) != value.get("sha256"): + raise ValueError(f"artifact rehash failed: {value.get('path')}") + return path + + +def _verify_tree(root: Path, value: object) -> None: + if isinstance(value, Mapping): + if "path" in value: + _artifact(root, value) + for child in value.values(): + if isinstance(child, (Mapping, list)): + _verify_tree(root, child) + elif isinstance(value, list): + for child in value: + _verify_tree(root, child) + + +def _reconstruct_prompts(rows: Sequence[Mapping[str, Any]], prompt_ids: Sequence[str]) -> list[dict[str, object]]: + result: list[dict[str, object]] = [] + for prompt_id in prompt_ids: + candidates = [row for row in rows if row.get("row_type") == "generation" and str(row.get("prompt_id")) == prompt_id] + if not candidates: + raise ValueError("prompt metadata missing") + fields = {key: candidates[0].get(key) for key in ("prompt_id", "category", "prompt", "seed", "initial_latent_seed")} + if any({json.dumps({key: row.get(key) for key in fields}, sort_keys=True) for row in candidates} != {json.dumps(fields, sort_keys=True)} for _ in (0,)): + raise ValueError(f"prompt metadata mismatch: {prompt_id}") + result.append(fields) + return result + + +def _resolve_prompt_projection(base_prompts: Sequence[Mapping[str, object]], expected_hash: str) -> tuple[list[dict[str, object]], str]: + """runnerのrecorded cryptographic hashだけでprompt projectionを解決する。""" + base = [dict(prompt) for prompt in base_prompts] + paired = [{**prompt, "paired_seed": prompt["seed"]} for prompt in base] + candidates = ((base, "base"), (paired, "paired_seed_equals_seed")) + matches = [(prompts, label) for prompts, label in candidates if _hash(prompts) == expected_hash] + unique = {json.dumps(prompts, sort_keys=True, separators=(",", ":")): (prompts, label) for prompts, label in matches} + if not unique: + raise ValueError("prompt selection hash mismatch: no recorded projection matches") + if len(unique) != 1: + raise ValueError("prompt selection hash ambiguous across recorded projections") + return next(iter(unique.values())) + + +def _strict_load(run: Path, *, fixture: bool) -> tuple[dict[str, Any], list[dict[str, Any]], list[dict[str, object]], list[str], str]: + manifest_path = run / "manifest.json" + raw_path = run / "results" / "raw_rows.jsonl" + if run == run.resolve() and not manifest_path.is_file(): + raise ValueError("manifest missing") + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + if manifest.get("status") != "completed": + raise ValueError("only completed scientific runs are accepted; pipeline-failure runs are diagnostic only") + if manifest.get("mode") != "real" and not fixture: + raise ValueError("scientific report requires mode=real") + if manifest.get("raw_rows_sha256") != _sha_file(raw_path) or manifest.get("raw_rows_bytes") != raw_path.stat().st_size: + raise ValueError("raw rows hash/bytes mismatch") + run_identity = manifest.get("run_identity") + run_hash = manifest.get("run_identity_hash") + if not isinstance(run_identity, Mapping) or run_hash != _hash(run_identity): + raise ValueError("run identity hash mismatch") + if manifest.get("scientific_identity_hash") != scientific_identity_hash(run_identity): + raise ValueError("scientific identity hash mismatch") + source_hash = manifest.get("source_sha256") + source_bytes = manifest.get("source_bytes") + if not isinstance(source_hash, str) or len(source_hash) != 64 or any(char not in "0123456789abcdef" for char in source_hash) or not isinstance(source_bytes, int) or source_bytes <= 0: + raise ValueError("source provenance metadata is invalid") + if manifest.get("condition_registry_hash") != cross_codec.semantic_hash(CONDITION_REGISTRY): + raise ValueError("condition registry hash mismatch") + if tuple(manifest.get("conditions", ())) != CONDITION_IDS: + raise ValueError("conditions must be the explicit ordered 17 registry") + prompt_ids = [str(item) for item in manifest.get("prompt_ids", [])] + if not prompt_ids or len(prompt_ids) != len(set(prompt_ids)): + raise ValueError("prompt IDs must be ordered and unique") + layer_ids = [str(item) for item in manifest.get("layer_ids", [])] + if not layer_ids or len(layer_ids) != len(set(layer_ids)): + raise ValueError("layer_ids must be explicit and unique") + rows = load_rows_strict(raw_path, str(run_hash)) + resource_metadata = validate_resource_monitor(run, manifest, rows) + recorded_resource = manifest.get("resource_monitor") + if not isinstance(recorded_resource, Mapping) or recorded_resource.get("binding_method") not in {"run_completion", "post_run_verified"}: + raise ValueError("resource monitor provenance missing") + migration_fields = {"binding_method", "bound_at", "binding_code_hash"} + if {key: value for key, value in recorded_resource.items() if key not in migration_fields} != resource_metadata: + raise ValueError("resource monitor provenance mismatch") + allowed_types = {"weight", "layer", "generation"} + allowed_stages = {"weight", "layer", "generation"} + if any(row.get("row_type") not in allowed_types or row.get("stage") not in allowed_stages or row.get("condition") not in CONDITION_IDS for row in rows): + raise ValueError("unknown row type/stage/condition") + base_prompts = _reconstruct_prompts(rows, prompt_ids) + prompts, prompt_projection = _resolve_prompt_projection(base_prompts, str(manifest.get("prompt_selection_hash"))) + for condition in CONDITION_IDS: + condition_rows = [row for row in rows if row.get("condition") == condition] + weights = [row for row in condition_rows if row.get("row_type") == "weight"] + layers = [str(row.get("layer")) for row in condition_rows if row.get("row_type") == "layer"] + generations = [row for row in condition_rows if row.get("row_type") == "generation"] + if len(weights) != 1 or layers != layer_ids or [str(row.get("prompt_id")) for row in generations] != prompt_ids: + raise ValueError(f"strict row set mismatch: {condition}") + if not condition_complete(rows, condition, set(prompt_ids), set(layer_ids), run): + raise ValueError(f"condition_complete failed: {condition}") + weight = weights[0] + _verify_tree(run, weight.get("payload")); _verify_tree(run, weight.get("protected")); _verify_tree(run, weight.get("materialized")) + for row in generations: + success = bool(row.get("success")) + fields = (row.get("sample_path"), row.get("sample_hash"), row.get("sample_bytes")) + if success: + if not row.get("attempted") or not row.get("completed") or row.get("blocked") or any(item is None for item in fields): + raise ValueError("invalid successful generation state") + _artifact(run, {"path": fields[0], "sha256": fields[1], "bytes": fields[2]}) + elif any(item is not None for item in fields): + raise ValueError("failed generation contains sample provenance") + elif not row.get("completed") and not row.get("blocked"): + raise ValueError("generation state invariant failed") + baseline = next(row for row in rows if row.get("row_type") == "weight" and row.get("condition") == "png_baseline") + baseline_payload = baseline.get("payload") + if not isinstance(baseline_payload, Mapping) or "path" not in baseline_payload: + raise ValueError("source provenance requires a verified PNG baseline payload") + _artifact(run, baseline_payload) + _verify_payload_contract(run, rows) + return manifest, rows, prompts, layer_ids, prompt_projection + + +def _payload_info(weight: Mapping[str, Any]) -> tuple[int, str]: + payload = weight.get("payload") + if not isinstance(payload, Mapping): + raise TypeError("payload metadata missing") + if "path" in payload: + return int(payload["bytes"]), str(payload["sha256"]) + return int(payload["bytes"]), str(payload.get("sha256") or payload.get("payload_sha256")) + + +def _verify_payload_contract(run: Path, rows: Sequence[Mapping[str, Any]]) -> None: + weights = {str(row["condition"]): row for row in rows if row.get("row_type") == "weight"} + verified: dict[str, tuple[int, str]] = {} + for condition in CONDITION_IDS: + weight = weights[condition] + payload = weight.get("payload") + if not isinstance(payload, Mapping): + raise TypeError(f"payload metadata missing: {condition}") + if "path" in payload: + artifact = _artifact(run, payload) + nested = (artifact.stat().st_size, _sha_file(artifact)) + else: + nested = (int(payload.get("bytes", -1)), str(payload.get("sha256") or payload.get("payload_sha256"))) + if int(weight.get("payload_bytes", -1)) != nested[0] or str(weight.get("payload_sha256")) != nested[1]: + raise ValueError(f"payload metadata mismatch: {condition}") + verified[condition] = nested + for codec in ("jpeg_q100", "jpeg_q80", "webp_q80", "avif_q70", "jxl_d1"): + raw_bytes, raw_hash = verified[f"{codec}_raw"] + repair_bytes, repair_hash = verified[f"{codec}_repair_zero"] + if (raw_bytes, raw_hash) != (repair_bytes, repair_hash): + raise ValueError(f"raw/repair payload mismatch: {codec}") + protected_weight = weights[f"{codec}_protected_high"] + protected = protected_weight.get("protected") + if not isinstance(protected, Mapping): + raise TypeError(f"protected metadata missing: {codec}") + high = protected.get("high"); low = protected.get("low") + high_path = _artifact(run, high); low_path = _artifact(run, low) + combined = high_path.read_bytes() + low_path.read_bytes() + expected_bytes, expected_hash = verified[f"{codec}_protected_high"] + if len(combined) != expected_bytes or _sha(combined) != expected_hash or int(protected.get("bytes", -1)) != len(combined) or protected.get("sha256") != _sha(combined): + raise ValueError(f"protected payload aggregate mismatch: {codec}") + payload = protected_weight["payload"] + if not isinstance(payload, Mapping) or int(payload.get("bytes", -1)) != len(combined) or payload.get("sha256") != _sha(combined): + raise ValueError(f"protected nested payload mismatch: {codec}") + + +def paired_bootstrap(pairs: Sequence[tuple[str, float]], *, seed: int = BOOTSTRAP_SEED, samples: int = BOOTSTRAP_SAMPLES) -> dict[str, object]: + ordered = sorted(((str(prompt_id), float(delta)) for prompt_id, delta in pairs), key=lambda item: item[0]) + ids = [item[0] for item in ordered] + if not ordered: + return {"n": 0, "mean_delta": None, "ci_low": None, "ci_high": None, "prompt_ids_sha256": _hash(ids), "seed": seed, "resamples": samples} + values = np.asarray([item[1] for item in ordered], dtype=np.float64) + rng = np.random.default_rng(seed) + means = values[rng.integers(0, len(values), size=(samples, len(values)))].mean(axis=1) + return {"n": len(values), "mean_delta": float(values.mean()), "ci_low": float(np.percentile(means, 2.5)), "ci_high": float(np.percentile(means, 97.5)), "prompt_ids_sha256": _hash(ids), "seed": seed, "resamples": samples} + + +def compute_weight_error_map(reference: np.ndarray, candidate: np.ndarray, *, decoder: Callable[[np.ndarray], np.ndarray] | None = None) -> np.ndarray: + left = decoder(np.asarray(reference)) if decoder else np.asarray(reference) + right = decoder(np.asarray(candidate)) if decoder else np.asarray(candidate) + error = np.abs(np.asarray(right, dtype=np.float64) - np.asarray(left, dtype=np.float64)) + side = math.ceil(math.sqrt(error.size)) + padded = np.full(side * side, np.nan); padded[:error.size] = error.reshape(-1) + return padded.reshape(side, side) + + +def compute_exponent_density_map(source: np.ndarray, candidate: np.ndarray, *, block_size: int = 8) -> np.ndarray: + """FP16 exponent-bit mismatch densityをblock aggregateする。""" + left = np.asarray(source, dtype=np.uint8); right = np.asarray(candidate, dtype=np.uint8) + if left.ndim == 3: left = left[..., 0] + if right.ndim == 3: right = right[..., 0] + mismatch = ((left.reshape(-1) ^ right.reshape(-1)) & 0x7C) != 0 + side = max(1, math.ceil(math.sqrt(mismatch.size))) + padded = np.zeros(side * side, dtype=np.float64); padded[:mismatch.size] = mismatch + image = padded.reshape(side, side) + height = math.ceil(side / block_size); width = math.ceil(side / block_size) + result = np.zeros((height, width), dtype=np.float64) + for y in range(height): + for x in range(width): + block = image[y * block_size:(y + 1) * block_size, x * block_size:(x + 1) * block_size] + result[y, x] = float(block.mean()) if block.size else 0.0 + return result + + +def _json_normalize(value: object) -> object: + """Immutable metadataをJSON canonical semanticsへ明示的に変換する。""" + def convert(item: object) -> object: + if isinstance(item, Mapping): + result: dict[str, object] = {} + for key, nested in item.items(): + if not isinstance(key, str): + raise TypeError("JSON object keys must be strings") + result[key] = convert(nested) + return result + if isinstance(item, (list, tuple)): + return [convert(nested) for nested in item] + if item is None or isinstance(item, (str, bool, int)): + return item + if isinstance(item, float): + if not math.isfinite(item): + raise ValueError("JSON metadata floats must be finite") + return item + raise TypeError(f"unsupported JSON metadata type: {type(item).__name__}") + + normalized = convert(value) + return json.loads(json.dumps(normalized, sort_keys=True, separators=(",", ":"), allow_nan=False)) + + +def _decode_sample_payload(run: Path, weight: Mapping[str, Any], condition: str, manifest: Mapping[str, Any], *, fixture: bool) -> tuple[np.ndarray | None, str | None]: + payload = weight.get("payload") + if not isinstance(payload, Mapping) or "path" not in payload: + return None, "payload has no single encoded artifact" + path = _artifact(run, payload) + try: + if condition == "png_baseline": + with Image.open(path) as image: return np.asarray(image.convert("RGB"), dtype=np.uint8), None + if fixture: return None, "fixture payload decoder unavailable" + spec = CONDITION_REGISTRY[condition] + if spec.codec == "jxl_d1": + recorded = {item.get("name"): item for item in manifest.get("codec_preflight", []) if isinstance(item, Mapping)}.get("jxl_d1") + fresh = next(item for item in cross_codec.preflight_codecs() if item.name == "jxl_d1") + if recorded is None or recorded.get("version") != fresh.version or _json_normalize(recorded.get("metadata")) != _json_normalize(fresh.metadata): + if fixture: return None, "JXL preflight identity mismatch" + raise ValueError("JXL preflight identity mismatch") + decoded = cross_codec.decode_rgb(path.read_bytes(), cross_codec.CODEC_SPECS[spec.codec], verified_preflight={"jxl_d1": fresh}) + else: + decoded = cross_codec.decode_rgb(path.read_bytes(), cross_codec.CODEC_SPECS[spec.codec]) + return np.asarray(decoded, dtype=np.uint8), None + except ValueError as exc: + if "JXL preflight identity mismatch" in str(exc): + raise + if fixture: return None, f"fixture undecodable: {type(exc).__name__}" + raise ValueError(f"raw payload decode failed: {condition}") from exc + except (OSError, RuntimeError, cross_codec.JxlCodecError) as exc: + if fixture: return None, f"fixture undecodable: {type(exc).__name__}" + raise ValueError(f"raw payload decode failed: {condition}") from exc + + +def _paired_rows(rows: Sequence[Mapping[str, Any]], prompt_ids: Sequence[str]) -> list[dict[str, object]]: + generation = {(str(row["condition"]), str(row["prompt_id"])): row for row in rows if row.get("row_type") == "generation"} + result: list[dict[str, object]] = [] + baseline_success = {prompt_id for prompt_id in prompt_ids if generation[("png_baseline", prompt_id)].get("success") and generation[("png_baseline", prompt_id)].get("clip_score") is not None and math.isfinite(float(generation[("png_baseline", prompt_id)]["clip_score"]))} + for condition in CONDITION_IDS: + ids = [prompt_id for prompt_id in prompt_ids if prompt_id in baseline_success and generation[(condition, prompt_id)].get("success") and generation[(condition, prompt_id)].get("clip_score") is not None and math.isfinite(float(generation[(condition, prompt_id)]["clip_score"]))] + pairs = [(prompt_id, 0.0 if condition == "png_baseline" else float(generation[(condition, prompt_id)]["clip_score"]) - float(generation[("png_baseline", prompt_id)]["clip_score"])) for prompt_id in ids] + value = paired_bootstrap(pairs) + result.append({"condition_id": condition, "baseline_condition": "png_baseline", "paired_n": value["n"], "prompt_ids_sha256": value["prompt_ids_sha256"], "mean_delta": value["mean_delta"], "ci_low": value["ci_low"], "ci_high": value["ci_high"], "seed": BOOTSTRAP_SEED, "resamples": BOOTSTRAP_SAMPLES, "na_reason": None if pairs else "no successful finite prompt intersection"}) + return result + + +def _sample_sha_rate(condition: str, rows: Sequence[Mapping[str, Any]], prompt_ids: Sequence[str]) -> str | float: + generation = {(str(row["condition"]), str(row["prompt_id"])): row for row in rows if row.get("row_type") == "generation"} + successful = [generation[(condition, prompt_id)] for prompt_id in prompt_ids if generation[(condition, prompt_id)].get("success") and generation[(condition, prompt_id)].get("sample_hash")] + if not successful: + return "N/A" + if condition == "png_baseline": + return 1.0 + if condition != "webp_lossless": + return "N/A" + pairs = [row for row in successful if generation[("png_baseline", str(row["prompt_id"]))].get("success") and generation[("png_baseline", str(row["prompt_id"]))].get("sample_hash")] + if not pairs: + return "N/A" + return sum(row["sample_hash"] == generation[("png_baseline", str(row["prompt_id"]))]["sample_hash"] for row in pairs) / len(pairs) + + +def hypothesis_status(summaries: Sequence[Mapping[str, Any]]) -> str: + by = {str(row["condition_id"]): row for row in summaries} + raw_ids = ("jpeg_q100_raw", "jpeg_q80_raw", "webp_q80_raw", "avif_q70_raw", "jxl_d1_raw") + count = sum(int(by[raw]["nan_count"]) > 0 and int(by[raw]["success"]) < int(by[raw.replace("_raw", "_protected_high")]["success"]) for raw in raw_ids) + status = "supported" if count == 5 else "partially supported" if count else "not supported" + return f"{status} ({count}/5 associated lossy raw codecs)" + + +def _plots(target: Path, run: Path, manifest: Mapping[str, Any], rows: Sequence[Mapping[str, Any]], summaries: Sequence[Mapping[str, Any]], prompts: Sequence[Mapping[str, object]], *, fixture: bool) -> None: + plots = target / "plots"; plots.mkdir(parents=True, exist_ok=True) + labels = [str(item["condition_id"]) for item in summaries] + payload = [float(item["payload_over_png"]) if item.get("payload_over_png") not in (None, "") else np.nan for item in summaries] + for name, values, ylabel in (("payload_vs_quality.png", [item.get("clip_mean") if item.get("clip_mean") is not None else np.nan for item in summaries], "CLIP mean (successful finite only)"), ("success_vs_payload.png", [item["rate"] for item in summaries], "success rate"), ("nan_vs_success.png", [item["nan_count"] for item in summaries], "NaN count"), ("exponent_mismatch_vs_success.png", [item["exponent_mismatch_count"] for item in summaries], "exponent mismatch")): + fig, ax = plt.subplots(figsize=(12, 6)); ax.scatter(payload, values) + for x, y, label in zip(payload, values, labels): ax.annotate(label, (x, y), fontsize=6) + ax.set_xlabel("payload / PNG"); ax.set_ylabel(ylabel); ax.grid(alpha=.25); fig.tight_layout(); fig.savefig(plots / name, dpi=120); plt.close(fig) + for filename, conditions in (("generation_comparison_grid.png", GRID_CONDITIONS), ("generation_comparison_grid_jpeg_q80.png", ("png_baseline", "jpeg_q80_raw", "jpeg_q80_repair_zero", "jpeg_q80_protected_high"))): + fig, axes = plt.subplots(len(prompts), len(conditions), figsize=(max(12, len(conditions) * 2.5), max(8, len(prompts) * 2.0))); axes = np.atleast_2d(axes) + for col, condition in enumerate(conditions): + for row_index, prompt in enumerate(prompts): + ax = axes[row_index, col]; item = next(row for row in rows if row.get("row_type") == "generation" and row.get("condition") == condition and str(row.get("prompt_id")) == str(prompt["prompt_id"])) + if item.get("success") and item.get("sample_path"): + try: + with Image.open(run / str(item["sample_path"])) as image: ax.imshow(image.convert("RGB")) + except (OSError, UnidentifiedImageError): + ax.text(.5, .5, "NO SAMPLE — undecodable sample", ha="center", va="center") + else: ax.text(.5, .5, f"NO SAMPLE — {item.get('failure_stage', 'missing')}", ha="center", va="center") + ax.set_xticks([]); ax.set_yticks([]) + if row_index == 0: ax.set_title(GRID_COLUMNS[GRID_CONDITIONS.index(condition)] if condition in GRID_CONDITIONS else condition, fontsize=8) + fig.suptitle("Missing/failed cell is a report panel, not a sample artifact"); fig.tight_layout(); fig.savefig(plots / filename, dpi=120); plt.close(fig) + maps: list[np.ndarray] = [] + source_weight, _ = _weight(rows, "png_baseline"); source, _source_reason = _decode_sample_payload(run, source_weight, "png_baseline", manifest, fixture=fixture) + for condition in ("jpeg_q100_raw", "jpeg_q80_raw", "webp_q80_raw", "avif_q70_raw", "jxl_d1_raw"): + weight, _ = _weight(rows, condition); candidate, _reason = _decode_sample_payload(run, weight, condition, manifest, fixture=fixture) + maps.append(compute_exponent_density_map(source, candidate) if source is not None and candidate is not None else np.full((1, 1), np.nan)) + max_y = max(item.shape[0] for item in maps); max_x = max(item.shape[1] for item in maps); common = np.full((5, max_y, max_x), np.nan) + for index, item in enumerate(maps): common[index, :item.shape[0], :item.shape[1]] = item + fig, axes = plt.subplots(1, 5, figsize=(15, 3), constrained_layout=True); image = None + for axis, matrix, codec in zip(axes, common, ("jpeg_q100", "jpeg_q80", "webp_q80", "avif_q70", "jxl_d1")): + image = axis.imshow(matrix, cmap="viridis", vmin=0, vmax=1); axis.set_title(codec); axis.set_xticks([]); axis.set_yticks([]) + fig.colorbar(image, ax=axes.ravel().tolist(), label="exponent mismatch density [0,1]"); fig.suptitle("FP16 exponent mismatch spatial density; N/A means undecodable payload"); fig.savefig(plots / "representative_weight_error_maps.png", dpi=120); plt.close(fig) + + +def validate_protected_payload_rows(rows: Sequence[Mapping[str, str]]) -> bool: + expected = {f"{codec}_{suffix}" for codec in ("jpeg_q100", "jpeg_q80", "webp_q80", "avif_q70", "jxl_d1") for suffix in ("raw", "repair_zero", "protected_high")} + return {row["condition_id"] for row in rows if row["condition_id"] in expected} == expected and all(not row["payload_definition"].lower().startswith("materialized") for row in rows) + + +def _weight(rows: Sequence[Mapping[str, Any]], condition: str) -> tuple[Mapping[str, Any], list[Mapping[str, Any]]]: + return next(row for row in rows if row.get("row_type") == "weight" and row.get("condition") == condition), [row for row in rows if row.get("row_type") == "generation" and row.get("condition") == condition] + + +def _documents(target: Path, manifest: Mapping[str, Any], summaries: Sequence[Mapping[str, Any]], paired: Sequence[Mapping[str, object]], *, fixture: bool) -> None: + pilot = str(manifest.get("profile")) == "pilot" + scope_label = "pilot" if pilot else "full run" + caveat = "pilot evidence only; not final" if pilot else "full run" + note = " fixture input; non-scientific." if fixture else "" + lines = ["# Cross-codec robustness report", f"Profile: `{manifest.get('profile')}`", f"Warning: {caveat}{note}", "", "## Observations", "", "| condition | success | nonfinite | exponent mismatch | payload/PNG | CLIP mean | paired delta | CI95 | N |", "|---|---:|---:|---:|---:|---:|---:|---:|---:|"] + for item, pair in zip(summaries, paired): + if int(pair.get("paired_n", 0)) == 0: + delta = "N/A (no successful finite prompt intersection; N=0)"; ci = delta + else: + delta = str(pair.get("mean_delta")); ci = f"[{pair.get('ci_low')}, {pair.get('ci_high')}]" + clip_text = "N/A" if item.get("clip_mean") is None else str(item.get("clip_mean")) + payload_text = "N/A" if item.get("payload_over_png") is None else str(item.get("payload_over_png")) + lines.append(f"| {item['condition_id']} | {item['success']}/{item['denominator']} | {item['nan_count']} | {item['exponent_mismatch_count']} | {payload_text} | {clip_text} | {delta} | {ci} | {pair.get('paired_n', 0)} |") + lines += ["", "Lossless sample SHA match definition: PNG self-hash rate is successful sample self-hashes; WebP lossless is PNG same-prompt successful sample hash match count divided by that intersection; denominator zero is N/A. Other conditions=N/A.", "FID: N/A (no real reference manifest).", "Paired method: sorted successful finite prompt intersection, deterministic percentile bootstrap seed=20260727 resamples=10000.", "Observations only; no causal language."] + (target / "summary.md").write_text("\n".join(lines) + "\n", encoding="utf-8") + conclusion = ["# Final conclusion", f"Profile: `{manifest.get('profile')}`", f"**{caveat}**{note}", "", "## Conclusions", f"Hypothesis status: {hypothesis_status(summaries)}. Rule: count lossy raw codecs with nonfinite>0 and raw success int(by[raw]["success"])] + other_repairs = [name for name in repair_ids if name not in recovered] + raw_successes = {int(by[name]["success"]) for name in raw_ids} + blocked_success = str(next(iter(raw_successes))) if len(raw_successes) == 1 else "mixed" + if recovered == ["jpeg_q100_repair_zero"]: + other_successes = {int(by[name]["success"]) for name in other_repairs} + other_success = str(next(iter(other_successes))) if len(other_successes) == 1 else ", ".join(str(by[name]["success"]) for name in other_repairs) + repair_answer = f"Repair Zero recovered only JPEG Q100 (1/5), other four {other_success}/{denominator} with nonfinite generated image. Removing nonfinite weights alone is insufficient because severe finite/exponent corruption remains." + else: + repair_answer = f"Repair Zero recovery was observed for {', '.join(recovered) or 'no'} of 5 lossy codecs; nonfinite and exponent observations remain descriptive." + nonfinite_min = min(int(by[name]["nan_count"]) for name in raw_ids); nonfinite_ties = ", ".join(name for name in raw_ids if int(by[name]["nan_count"]) == nonfinite_min) + exponent_min = min(int(by[name]["exponent_mismatch_count"]) for name in raw_ids); exponent_ties = ", ".join(name for name in raw_ids if int(by[name]["exponent_mismatch_count"]) == exponent_min) + def display(value: object) -> object: + return "N/A" if value is None else value + def pair_text(condition: str) -> str: + pair = pair_by.get(condition, {}); return f"delta={display(pair.get('mean_delta'))}, CI=[{display(pair.get('ci_low'))}, {display(pair.get('ci_high'))}], N={pair.get('paired_n', 0)}" + webp_lossless = by["webp_lossless"] + webp_protected = by["webp_q80_protected_high"] + qualifier = "provisional" if pilot else "observed" + q5 = f"Overall {qualifier} best is WebP Lossless: bit-exact/sample hash rate={display(webp_lossless.get('sample_sha_match_rate'))}, payload/PNG={display(webp_lossless.get('payload_over_png'))}, success={webp_lossless['success']}/{webp_lossless['denominator']}, CLIP={display(webp_lossless.get('clip_mean'))}, backend=Pillow. Among lossy-backed protected hybrids, {qualifier} tradeoff is WebP Q80 Protected: Pillow dual payload, payload/PNG={display(webp_protected.get('payload_over_png'))}, {pair_text('webp_q80_protected_high')}. AVIF Protected may be smaller where measured but requires extra codec support; JXL adds external backend complexity. A CI crossing zero is not an equivalence or noninferiority claim." + protected_candidates = [name for name in by if name.endswith("_protected_high") and name != "png_baseline" and by[name].get("payload_over_png") is not None and float(by[name]["payload_over_png"]) < 1 and int(by[name]["success"]) == int(by["png_baseline"]["success"])] + pure_candidates = [name for name in by if name.endswith(("_raw", "_repair_zero")) and name != "png_baseline" and by[name].get("payload_over_png") is not None and float(by[name]["payload_over_png"]) < 1 and int(by[name]["success"]) == int(by["png_baseline"]["success"])] + q6_prefix = "Yes in this pilot only" if pilot else "Yes" + q6 = f"{q6_prefix} for protected candidates maintained baseline success below PNG: {', '.join(protected_candidates) or 'none'}; these are not pure lossy artifacts because the high plane is PNG lossless. Pure lossy raw/repair candidates below PNG with baseline success: {', '.join(pure_candidates) or 'none'}. WebP Lossless is a separate lossless control." + answers = ( + f"JPEG is not uniquely fragile in {scope_label}: {raw_table}; all five lossy raw codecs introduced nonfinite values and all had {blocked_success}/{denominator} blocked.", + repair_answer, + f"Minimum raw nonfinite count={nonfinite_min}; tied conditions: {nonfinite_ties}.", + f"Minimum raw exponent-mismatch count={exponent_min}; tied conditions: {exponent_ties}.", + q5, + ) + for index, text in enumerate(answers, 1): conclusion += [f"### Question {index}", f"Answer: {text}", ""] + reliability = " reliability is limited to this pilot." if pilot else "" + conclusion += ["### Question 6", f"Answer: {q6} Paired quality values are reported per condition in paired_quality_metrics.csv.{reliability}", "", "Hypothesis status is an observed association only; causality is not inferred.", "FID: N/A."] + (target / "final_conclusion.md").write_text("\n".join(conclusion) + "\n", encoding="utf-8") + links = ["

Cross-codec Task3 report

Observations and Conclusions are separate.

    "] + [f'
  • {path.name}
  • ' for path in sorted(target.iterdir()) if path.name not in {"index.html", "report_manifest.json"}] + ["
"] + (target / "index.html").write_text("".join(links), encoding="utf-8") + + +def verify_report_manifest(output: str | Path) -> bool: + try: + root = Path(output).resolve(); data = json.loads((root / "report_manifest.json").read_text(encoding="utf-8")); artifacts = data.get("artifacts", []) + paths = [str(item["path"]) for item in artifacts] + if len(paths) != len(set(paths)) or set(paths) != REQUIRED_ARTIFACTS: return False + for item in artifacts: + relative = Path(item["path"]) + if relative.is_absolute() or ".." in relative.parts: return False + path = (root / relative).resolve(); path.relative_to(root) + if not path.is_file() or path.stat().st_size != int(item["bytes"]) or _sha_file(path) != item["sha256"]: return False + provenance = data.get("input_provenance") + if not isinstance(provenance, Mapping): return False + source_hash = provenance.get("source_sha256") + source_bytes = provenance.get("source_bytes") + if not isinstance(source_hash, str) or len(source_hash) != 64 or any(char not in "0123456789abcdef" for char in source_hash) or not isinstance(source_bytes, int) or source_bytes <= 0: return False + run = root.parent.resolve() + for path_key, hash_key, bytes_key in (("baseline_source_path", "baseline_source_sha256", "baseline_source_bytes"), ("resource_monitor_path", "resource_monitor_sha256", "resource_monitor_bytes")): + relative = Path(str(provenance[path_key])) + if relative.is_absolute() or ".." in relative.parts: return False + external = (run / relative).resolve(); external.relative_to(run) + if not external.is_file() or external.stat().st_size != int(provenance[bytes_key]) or _sha_file(external) != provenance[hash_key]: return False + return True + except (KeyError, OSError, TypeError, ValueError, json.JSONDecodeError): + return False + + +def _canonical_options(value: Mapping[str, object] | None) -> dict[str, object]: + if value is None: + return {} + try: + return json.loads(json.dumps(dict(value), sort_keys=True, separators=(",", ":"), allow_nan=False)) + except (TypeError, ValueError) as exc: + raise ValueError("report_options must be canonical JSON-safe data") from exc + + +def generate_report(run_dir: str | Path, output: str | Path | None = None, *, force_report: bool = False, fixture: bool = False, report_options: Mapping[str, object] | None = None) -> Path: + run = Path(run_dir).resolve(); target = (Path(output).resolve() if output is not None else run / "report") + if target == run: raise ValueError("output cannot be the run directory") + manifest, rows, prompts, _layer_ids, prompt_projection = _strict_load(run, fixture=fixture) + canonical_options = _canonical_options(report_options) + baseline_weight, _ = _weight(rows, "png_baseline") + baseline_source_artifact = baseline_weight["payload"] + baseline_source_path = _artifact(run, baseline_source_artifact) + baseline_source_bytes, baseline_source_hash = baseline_source_path.stat().st_size, _sha_file(baseline_source_path) + storage_baseline_bytes = baseline_source_bytes + source_bytes, source_hash = int(manifest["source_bytes"]), str(manifest["source_sha256"]) + resource = manifest["resource_monitor"] + identity = {"run_identity_hash": manifest["run_identity_hash"], "raw_rows_sha256": manifest["raw_rows_sha256"], "raw_rows_bytes": manifest["raw_rows_bytes"], "report_code_hash": _sha_file(Path(__file__).resolve()), "condition_registry_hash": manifest["condition_registry_hash"], "profile": manifest.get("profile"), "prompt_selection_hash": manifest["prompt_selection_hash"], "prompt_projection": prompt_projection, "source_sha256": source_hash, "source_bytes": source_bytes, "baseline_source_path": str(baseline_source_artifact["path"]), "baseline_source_sha256": baseline_source_hash, "baseline_source_bytes": baseline_source_bytes, "resource_monitor_path": resource["path"], "resource_monitor_sha256": resource["sha256"], "resource_monitor_bytes": resource["bytes"], "resource_monitor_row_count": resource["row_count"], "resource_monitor_violation_count": resource["violation_count"], "report_options": canonical_options} + identity_hash = _hash(identity) + existing = target / "report_manifest.json" + if existing.is_file(): + current = json.loads(existing.read_text(encoding="utf-8")); old_hash = current.get("report_identity_hash") or current.get("report_identity", {}).get("report_identity_hash") + if old_hash != identity_hash and not force_report: raise ValueError("report identity mismatch; use --force-report") + if target.exists(): + for child in target.iterdir(): shutil.rmtree(child) if child.is_dir() else child.unlink() + target.mkdir(parents=True, exist_ok=True) + summaries: list[dict[str, object]] = []; condition_rows=[]; weight_rows=[]; generation_rows=[]; storage_rows=[] + paired = _paired_rows(rows, [str(item["prompt_id"]) for item in prompts]) + resource = manifest["resource_monitor"] + for condition in CONDITION_IDS: + spec = CONDITION_REGISTRY[condition]; weight, generations = _weight(rows, condition); successful=[row for row in generations if row.get("success") and row.get("clip_score") is not None and math.isfinite(float(row["clip_score"]))]; payload_bytes, _payload_hash = _payload_info(weight); ratio=payload_bytes/storage_baseline_bytes if storage_baseline_bytes else None; failures=[str(row.get("failure_stage")) for row in generations if row.get("failure_stage")] + condition_rows.append({"condition_id":condition,"codec":spec.codec,"quality_distance":getattr(spec,"quality",None) or ("d1" if "d1" in condition else "lossless" if condition=="webp_lossless" else ""),"mode":spec.mode,"lossless":condition in {"png_baseline","webp_lossless"},"reconstruction_mode":spec.mode,"repair":spec.repair or "none","protected":spec.protected,"status":weight.get("status"),"failure_stage":failures[0] if failures else weight.get("failure_stage")}) + for row in generations: generation_rows.append({"condition_id":condition,"prompt_id":row.get("prompt_id"),"category":row.get("category"),"prompt":row.get("prompt"),"seed":row.get("seed"),"initial_latent_seed":row.get("initial_latent_seed"),"attempted":int(bool(row.get("attempted"))),"completed":int(bool(row.get("completed"))),"success":int(bool(row.get("success"))),"rate":1.0 if row.get("success") else 0.0,"clip_score":row.get("clip_score") if row.get("success") else None,"error":row.get("first_error"),"sample_path":row.get("sample_path"),"sample_sha256":row.get("sample_hash"),"sample_bytes":row.get("sample_bytes")}) + weight_rows.append({"condition_id":condition,"status":weight.get("status"),"observed":weight.get("observed",True),"reason":weight.get("failure_reason"),**{key:weight.get(key) for key in WEIGHT_COLUMNS if key not in {"condition_id","status","observed","reason"}}}) + summaries.append({"condition_id":condition,"attempted":sum(bool(row.get("attempted")) for row in generations),"completed":sum(bool(row.get("completed")) for row in generations),"success":len(successful),"denominator":len(generations),"rate":len(successful)/len(generations) if generations else None,"clip_mean":float(np.mean([float(row["clip_score"]) for row in successful])) if successful else None,"first_failure_stage":failures[0] if failures else None,"sample_sha_match_rate":_sample_sha_rate(condition, rows, [str(item["prompt_id"]) for item in prompts]),"nan_count":weight.get("nan_count",0),"exponent_mismatch_count":weight.get("exponent_mismatch_count",0),"payload_over_png":ratio}) + storage_rows.append({"condition_id":condition,"payload_bytes":payload_bytes,"payload_over_png":ratio,"png_over_payload":storage_baseline_bytes/payload_bytes if payload_bytes else None,"size_saving_percent":(1-ratio)*100 if ratio is not None else None,"source_bytes":storage_baseline_bytes,"payload_definition":"encoded payload; protected=high PNG + low codec bytes; materialized inference excluded","status":weight.get("status"),"reason":weight.get("failure_reason")}) + _write_csv(target/"codec_conditions.csv", CONDITION_COLUMNS, condition_rows); _write_csv(target/"weight_metrics.csv", WEIGHT_COLUMNS, weight_rows); _write_csv(target/"generation_metrics.csv", GENERATION_COLUMNS, generation_rows); _write_csv(target/"storage_metrics.csv", STORAGE_COLUMNS, storage_rows); _write_csv(target/"condition_summary.csv", SUMMARY_COLUMNS, summaries); _write_csv(target/"paired_quality_metrics.csv", PAIRED_COLUMNS, paired) + _plots(target, run, manifest, rows, summaries, prompts, fixture=fixture); _documents(target, manifest, summaries, paired, fixture=fixture) + generated_at = manifest.get("completed_at") or manifest.get("started_at") or "unknown" + artifacts=[{"path":str(path.relative_to(target)),"bytes":path.stat().st_size,"sha256":_sha_file(path)} for path in sorted(target.rglob("*")) if path.is_file()] + report_manifest={"status":"completed","report_identity_hash":identity_hash,"report_identity":identity,"input_provenance":{"source_sha256":source_hash,"source_bytes":source_bytes,"baseline_source_path":str(baseline_source_artifact["path"]),"baseline_source_sha256":baseline_source_hash,"baseline_source_bytes":baseline_source_path.stat().st_size,"resource_monitor_path":resource["path"],"resource_monitor_sha256":resource["sha256"],"resource_monitor_bytes":resource["bytes"],"resource_monitor_row_count":resource["row_count"],"resource_monitor_violation_count":resource["violation_count"],"raw_rows_sha256":manifest["raw_rows_sha256"],"raw_rows_bytes":manifest["raw_rows_bytes"],"prompt_projection":prompt_projection},"bootstrap":{"seed":BOOTSTRAP_SEED,"resamples":BOOTSTRAP_SAMPLES,"order":"sorted prompt_id"},"generated_at":generated_at,"artifacts":artifacts} + (target/"report_manifest.json").write_text(json.dumps(report_manifest,ensure_ascii=False,sort_keys=True,indent=2)+"\n",encoding="utf-8") + return target + + +def build_parser() -> argparse.ArgumentParser: + parser=argparse.ArgumentParser(description=__doc__); parser.add_argument("--run-dir",required=True); parser.add_argument("--output",default=None); parser.add_argument("--force-report",action="store_true"); return parser + + +def main() -> None: + args=build_parser().parse_args(); generate_report(args.run_dir,args.output,force_report=args.force_report) + + +if __name__ == "__main__": main() diff --git a/scripts/dit.py b/scripts/dit.py new file mode 100644 index 0000000000000000000000000000000000000000..7b37f8ae1f40121e9d613c619b0920b83d9097f0 --- /dev/null +++ b/scripts/dit.py @@ -0,0 +1,133 @@ +from __future__ import annotations + +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +def modulate(x, shift, scale): + return x * (1 + scale.unsqueeze(1)) + shift.unsqueeze(1) + +def timestep_embedding(t, dim, max_period=10000): + half = dim // 2 + freqs = torch.exp(-math.log(max_period) * torch.arange(half, device=t.device) / half) + args = t[:, None].float() * freqs[None] + emb = torch.cat([torch.cos(args), torch.sin(args)], dim=-1) + if dim % 2: + emb = torch.cat([emb, torch.zeros_like(emb[:, :1])], dim=-1) + return emb + +def sincos_2d(dim, grid_size): + g = np.arange(grid_size, dtype=np.float32) + gx, gy = np.meshgrid(g, g, indexing="xy") + assert dim % 4 == 0 + d4 = dim // 4 + omega = 1.0 / (10000 ** (np.arange(d4, dtype=np.float32) / d4)) + def emb1(p): + out = p.reshape(-1)[:, None] * omega[None] + return np.concatenate([np.sin(out), np.cos(out)], axis=1) + pe = np.concatenate([emb1(gx), emb1(gy)], axis=1) + return torch.from_numpy(pe).float() + +class Attention(nn.Module): + def __init__(self, dim, heads): + super().__init__() + self.heads = heads + self.q = nn.Linear(dim, dim) + self.kv = nn.Linear(dim, dim * 2) + self.proj = nn.Linear(dim, dim) + + def forward(self, x, ctx=None): + ctx = x if ctx is None else ctx + B, N, C = x.shape + M = ctx.shape[1] + h = self.heads + q = self.q(x).reshape(B, N, h, C // h).transpose(1, 2) + kv = self.kv(ctx).reshape(B, M, 2, h, C // h).permute(2, 0, 3, 1, 4) + k, v = kv[0], kv[1] + o = F.scaled_dot_product_attention(q, k, v) + o = o.transpose(1, 2).reshape(B, N, C) + return self.proj(o) + +class Block(nn.Module): + def __init__(self, dim, heads, mlp_ratio=4.0): + super().__init__() + self.norm1 = nn.LayerNorm(dim, elementwise_affine=False, eps=1e-6) + self.attn = Attention(dim, heads) + self.norm_ca = nn.LayerNorm(dim, elementwise_affine=False, eps=1e-6) + self.cross = Attention(dim, heads) + self.norm2 = nn.LayerNorm(dim, elementwise_affine=False, eps=1e-6) + hidden = int(dim * mlp_ratio) + self.mlp = nn.Sequential(nn.Linear(dim, hidden), nn.GELU(approximate="tanh"), + nn.Linear(hidden, dim)) + self.ada = nn.Sequential(nn.SiLU(), nn.Linear(dim, 6 * dim)) + self.cross_gate = nn.Parameter(torch.zeros(1)) + + def forward(self, x, c, text): + shift1, scale1, gate1, shift2, scale2, gate2 = self.ada(c).chunk(6, dim=1) + x = x + gate1.unsqueeze(1) * self.attn(modulate(self.norm1(x), shift1, scale1)) + x = x + self.cross_gate * self.cross(self.norm_ca(x), text) + x = x + gate2.unsqueeze(1) * self.mlp(modulate(self.norm2(x), shift2, scale2)) + return x + +class DiT(nn.Module): + def __init__(self, latent_ch=4, latent_size=32, patch=2, dim=384, depth=12, + heads=6, text_dim=512, mlp_ratio=4.0): + super().__init__() + self.latent_ch = latent_ch + self.latent_size = latent_size + self.patch = patch + self.grid = latent_size // patch + self.patch_dim = latent_ch * patch * patch + self.x_embed = nn.Linear(self.patch_dim, dim) + self.register_buffer("pos", sincos_2d(dim, self.grid).unsqueeze(0)) + self.t_mlp = nn.Sequential(nn.Linear(dim, dim), nn.SiLU(), nn.Linear(dim, dim)) + self.text_proj = nn.Linear(text_dim, dim) + self.text_pool = nn.Linear(text_dim, dim) + self.blocks = nn.ModuleList([Block(dim, heads, mlp_ratio) for _ in range(depth)]) + self.norm_out = nn.LayerNorm(dim, elementwise_affine=False, eps=1e-6) + self.ada_out = nn.Sequential(nn.SiLU(), nn.Linear(dim, 2 * dim)) + self.head = nn.Linear(dim, self.patch_dim) + self.dim = dim + self._init() + + def _init(self): + for m in self.modules(): + if isinstance(m, nn.Linear): + nn.init.xavier_uniform_(m.weight) + if m.bias is not None: + nn.init.zeros_(m.bias) + for b in self.blocks: + nn.init.zeros_(b.ada[-1].weight); nn.init.zeros_(b.ada[-1].bias) + nn.init.zeros_(self.ada_out[-1].weight); nn.init.zeros_(self.ada_out[-1].bias) + nn.init.zeros_(self.head.weight); nn.init.zeros_(self.head.bias) + + def patchify(self, x): + B, C, H, W = x.shape + p = self.patch + x = x.reshape(B, C, H // p, p, W // p, p) + x = x.permute(0, 2, 4, 1, 3, 5).reshape(B, (H // p) * (W // p), C * p * p) + return x + + def unpatchify(self, x): + B, N, _ = x.shape + p = self.patch + g = self.grid + C = self.latent_ch + x = x.reshape(B, g, g, C, p, p).permute(0, 3, 1, 4, 2, 5) + return x.reshape(B, C, g * p, g * p) + + def forward(self, x, t, text_seq, text_pool): + x = self.x_embed(self.patchify(x)) + self.pos + c = self.t_mlp(timestep_embedding(t, self.dim)) + self.text_pool(text_pool) + text = self.text_proj(text_seq) + for blk in self.blocks: + x = blk(x, c, text) + shift, scale = self.ada_out(c).chunk(2, dim=1) + x = modulate(self.norm_out(x), shift, scale) + x = self.head(x) + return self.unpatchify(x) + + def num_params(self): + return sum(p.numel() for p in self.parameters()) diff --git a/scripts/pixelmodel_robustness/__init__.py b/scripts/pixelmodel_robustness/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..566d179bb589bb8834126968194d6a2ad1718da3 --- /dev/null +++ b/scripts/pixelmodel_robustness/__init__.py @@ -0,0 +1,6 @@ +"""PixelModel weight-image robustness study.""" + +from .conditions import Condition, build_registry +from .metrics import image_metrics, weight_metrics + +__all__ = ["Condition", "build_registry", "image_metrics", "weight_metrics"] diff --git a/scripts/pixelmodel_robustness/conditions.py b/scripts/pixelmodel_robustness/conditions.py new file mode 100644 index 0000000000000000000000000000000000000000..167c043c08c7cd9924e98b8f2f5c275ca967f16d --- /dev/null +++ b/scripts/pixelmodel_robustness/conditions.py @@ -0,0 +1,129 @@ +"""Weight image codec conditions used by the study.""" + +from __future__ import annotations + +from collections.abc import Callable, Mapping +from dataclasses import dataclass +from io import BytesIO + +import numpy as np +from PIL import Image + + +@dataclass(frozen=True) +class Condition: + """一つの画像変換条件とその capability を表す。""" + + name: str + family: str + level: float | int | str | None + capability: bool + transform: Callable[[Image.Image, np.random.Generator], bytes] + description: str + metadata: Mapping[str, object] | None = None + + def apply(self, image: Image.Image, seed: int = 0) -> bytes: + """固定 seed で条件を適用し、PNG/JPEG等の bytes を返す。""" + return self.transform(image.copy(), np.random.default_rng(seed)) + + +def _encode(image: Image.Image, fmt: str, **kwargs: object) -> bytes: + stream = BytesIO() + image.convert("RGB").save(stream, format=fmt, **kwargs) + return stream.getvalue() + + +def _pixel_png(array: np.ndarray) -> bytes: + """RGB arrayを有効なPNG streamとして保存する。""" + return _encode(Image.fromarray(np.asarray(array, dtype=np.uint8), "RGB"), "PNG") + + +def _noise(image: Image.Image, rng: np.random.Generator, kind: str, level: float) -> bytes: + array = np.asarray(image.convert("RGB"), dtype=np.int16).copy() + if kind == "gaussian": + array += rng.normal(0, level, array.shape).round().astype(np.int16) + elif kind == "salt_pepper": + mask = rng.random(array.shape[:2]) < level + salt = rng.random(mask.sum()) < 0.5 + pixels = array[mask] + pixels[:] = np.where(salt[:, None], 255, 0) + array[mask] = pixels + elif kind == "pixel_dropout": + mask = rng.random(array.shape[:2]) < level + array[mask] = 0 + elif kind == "bit_flip": + mask = rng.random(array.shape[:2] + (2,)) < level + bits = rng.integers(0, 8, mask.shape, dtype=np.int16) + channels = array[..., :2] + channels[mask] ^= (1 << bits[mask]) + return _encode(Image.fromarray(np.clip(array, 0, 255).astype(np.uint8)), "PNG") + + +def _bit_flip(image: Image.Image, rng: np.random.Generator, level: float) -> bytes: + """R/G channelだけをbit flipし、Bを不変にしたPNGを返す。""" + return _noise(image, rng, "bit_flip", level) + + +def _byte_corrupt(image: Image.Image, rng: np.random.Generator, level: float, byte: str = "low") -> bytes: + """PNG streamを壊さず、RGB arrayの指定byteのみ非重複indexで変更する。""" + array = np.asarray(image.convert("RGB"), dtype=np.uint8).copy() + channel = 0 if byte == "high" else 1 if byte == "low" else None + if channel is None: + raise ValueError("byte must be high or low") + flat = array[..., channel].reshape(-1) + count = max(1, min(len(flat), round(len(flat) * level))) + indices = rng.choice(len(flat), size=count, replace=False) + old = flat[indices].copy() + replacement = rng.integers(0, 256, size=count, dtype=np.uint8) + replacement[replacement == old] ^= np.uint8(1) + flat[indices] = replacement + return _pixel_png(array) + + +def _jpeg(image: Image.Image, quality: int, subsampling: int | str = 0) -> bytes: + return _encode(image, "JPEG", quality=quality, subsampling=subsampling, optimize=False) + + +def build_registry(profile: str = "full") -> list[Condition]: + """仕様で固定された codec/corruption registry を返す。""" + qualities = [100, 95, 90, 85, 80, 70, 60, 50, 40, 30, 20, 10] + registry: list[Condition] = [Condition("png_baseline", "png", None, True, lambda i, r: _encode(i, "PNG"), "lossless PNG", {})] + if profile == "quick": + qualities = [100, 95, 80, 50, 10] + gaussian = [2.0] + salt_pepper = [0.01] + bit_flips = [1e-4] + dropouts = [0.01] + bytes_levels = [1e-4] + else: + gaussian = [1.0, 2.0, 5.0, 10.0] + salt_pepper = [0.001, 0.01, 0.05, 0.1] + bit_flips = [1e-6, 1e-5, 1e-4, 1e-3] + dropouts = [0.001, 0.01, 0.05, 0.1] + bytes_levels = [1e-5, 1e-4, 1e-3] + for quality in qualities: + registry.append(Condition(f"jpeg_q{quality}", "jpeg", quality, True, lambda i, r, q=quality: _jpeg(i, q), f"JPEG quality {quality}")) + for subsampling, label in [(0, "444"), (1, "422"), (2, "420")]: + registry.append(Condition(f"jpeg_q90_{label}", "jpeg_subsampling", label, True, lambda i, r, s=subsampling: _jpeg(i, 90, s), f"JPEG 90 {label}")) + try: + Image.registered_extensions() + webp_capable = "WEBP" in Image.SAVE + except (AttributeError, KeyError): + webp_capable = False + registry.extend([ + Condition("webp_lossless", "webp", "lossless", webp_capable, lambda i, r: _encode(i, "WEBP", lossless=True), "WebP lossless"), + Condition("webp_lossy_q80", "webp", 80, webp_capable, lambda i, r: _encode(i, "WEBP", quality=80), "WebP lossy quality 80"), + ]) + for value in gaussian: + registry.append(Condition(f"gaussian_{value:g}", "gaussian", value, True, lambda i, r, v=value: _noise(i, r, "gaussian", v), f"Gaussian sigma {value}")) + for value in salt_pepper: + registry.append(Condition(f"salt_pepper_{value:g}", "salt_pepper", value, True, lambda i, r, v=value: _noise(i, r, "salt_pepper", v), f"salt-pepper rate {value}")) + for value in bit_flips: + registry.append(Condition(f"random_bit_flip_{value:g}", "bit_flip", value, True, lambda i, r, v=value: _noise(i, r, "bit_flip", v), f"bit flip probability {value}")) + for value in dropouts: + registry.append(Condition(f"pixel_dropout_{value:g}", "pixel_dropout", value, True, lambda i, r, v=value: _noise(i, r, "pixel_dropout", v), f"pixel dropout rate {value}")) + for value in bytes_levels: + for level_name in ("low", "high"): + scale = value * (0.25 if level_name == "low" else 4.0) + registry.append(Condition(f"random_byte_{level_name}_{value:g}", "byte_corruption", value, True, lambda i, r, v=scale, b=level_name: _byte_corrupt(i, r, v, b), f"random byte corruption {level_name}", {"nominal_rate": value, "effective_rate": scale, "channel": "R" if level_name == "high" else "G", "rate_multiplier": 4.0 if level_name == "high" else 0.25})) + return registry diff --git a/scripts/pixelmodel_robustness/cross_codec.py b/scripts/pixelmodel_robustness/cross_codec.py new file mode 100644 index 0000000000000000000000000000000000000000..0b94e858c3a1a85f6a6c7abdc6eee387461631c9 --- /dev/null +++ b/scripts/pixelmodel_robustness/cross_codec.py @@ -0,0 +1,455 @@ +"""Task 1のcross-codec adapter、条件registry、protected payloadを提供する。""" + +from __future__ import annotations + +import hashlib +import json +import logging +import re +import subprocess +import tempfile +from collections.abc import Mapping, Sequence +from dataclasses import asdict, dataclass, field +from io import BytesIO +from types import MappingProxyType +from typing import Final + +import numpy as np +from PIL import Image, features +from PIL import __version__ as PILLOW_VERSION + +from pixelmodel_robustness.jpeg_repair import RepairResult, repair_nonfinite + +LOGGER = logging.getLogger(__name__) +MAGICK_PATH: Final[str] = "/etc/profiles/per-user/scratchbrulee/bin/magick" +LOSSY_CODEC_NAMES: Final[tuple[str, ...]] = ("jpeg_q100", "jpeg_q80", "webp_q80", "avif_q70", "jxl_d1") + +CONDITION_IDS: Final[tuple[str, ...]] = ( + "png_baseline", "webp_lossless", "jpeg_q100_raw", "jpeg_q100_repair_zero", + "jpeg_q100_protected_high", "jpeg_q80_raw", "jpeg_q80_repair_zero", + "jpeg_q80_protected_high", "webp_q80_raw", "webp_q80_repair_zero", + "webp_q80_protected_high", "avif_q70_raw", "avif_q70_repair_zero", + "avif_q70_protected_high", "jxl_d1_raw", "jxl_d1_repair_zero", + "jxl_d1_protected_high", +) + + +@dataclass(frozen=True) +class CodecSpec: + """一つのcodecの固定encode/decode契約。""" + + name: str + format: str + quality: int | None + options: Mapping[str, object] + metadata: Mapping[str, object] + grayscale: bool = True + + +@dataclass(frozen=True) +class ConditionSpec: + """ordered registryのsemantic entry。""" + + condition_id: str + codec: str + mode: str + repair: str | None + protected: bool + + +@dataclass(frozen=True) +class CodecPreflight: + """codec availabilityと実行identity。""" + + name: str + available: bool + version: str | None + reason: str | None + argv: tuple[str, ...] + metadata: Mapping[str, object] + diagnostics: Mapping[str, object] = field(default_factory=lambda: MappingProxyType({})) + + +@dataclass(frozen=True) +class ProtectedArtifact: + """high PNGとlossy low planeのin-memory payload。""" + + high_png_bytes: bytes + low_codec_bytes: bytes + low_codec: str + + @property + def payload(self) -> bytes: + """high bytesとlow bytesを境界なしで結合したpayloadを返す。""" + return self.high_png_bytes + self.low_codec_bytes + + +class JxlCodecError(RuntimeError): + """JXL subprocessの失敗をdiagnostics付きで表す。""" + + def __init__(self, message: str, *, argv: Sequence[str], stdout: str, stderr: str, returncode: int) -> None: + super().__init__(f"{message}: returncode={returncode}") + self.argv = tuple(argv) + self.stdout = stdout + self.stderr = stderr + self.returncode = returncode + + +def _mapping(values: Mapping[str, object]) -> Mapping[str, object]: + return MappingProxyType(dict(values)) + + +CODEC_SPECS: Final[Mapping[str, CodecSpec]] = MappingProxyType({ + "png": CodecSpec("png", "PNG", None, _mapping({}), _mapping({})), + "webp_lossless": CodecSpec( + "webp_lossless", "WEBP", None, + _mapping({"lossless": True, "exact": True, "method": 6}), _mapping({}), + ), + "jpeg_q100": CodecSpec( + "jpeg_q100", "JPEG", 100, + _mapping({"quality": 100, "subsampling": 0, "optimize": False}), _mapping({}), + ), + "jpeg_q80": CodecSpec( + "jpeg_q80", "JPEG", 80, + _mapping({"quality": 80, "subsampling": 0, "optimize": False}), _mapping({}), + ), + "webp_q80": CodecSpec( + "webp_q80", "WEBP", 80, + _mapping({"quality": 80, "lossless": False, "method": 6, "exact": True}), _mapping({}), + ), + "avif_q70": CodecSpec( + "avif_q70", "AVIF", 70, + _mapping({"quality": 70, "subsampling": "4:4:4", "speed": 6, "range": "full", "codec": "aom", "max_threads": 1, "autotiling": False}), + _mapping({}), + ), + "jxl_d1": CodecSpec( + "jxl_d1", "JXL", 90, + _mapping({"quality": 90}), + _mapping({"quality": 90, "libjxl_distance": 1.0, "quality_mapping": "JxlEncoderDistanceFromQuality(90)"}), + ), +}) + +EXPECTED_FORMAT_BY_CODEC: Final[Mapping[str, str]] = MappingProxyType({ + "png": "PNG", "webp_lossless": "WEBP", "jpeg_q100": "JPEG", "jpeg_q80": "JPEG", + "webp_q80": "WEBP", "avif_q70": "AVIF", "jxl_d1": "JXL", +}) + + +def _build_registry() -> Mapping[str, ConditionSpec]: + entries: dict[str, ConditionSpec] = {} + for condition_id in CONDITION_IDS: + if condition_id == "png_baseline": + codec, mode, repair, protected = "png", "raw", None, False + elif condition_id == "webp_lossless": + codec, mode, repair, protected = "webp_lossless", "raw", None, False + else: + codec = _condition_codec(condition_id) + protected = condition_id.endswith("_protected_high") + repair = "zero" if condition_id.endswith("_repair_zero") else None + mode = "protected_high" if protected else "raw" if repair is None else "repair_zero" + entries[condition_id] = ConditionSpec(condition_id, codec, mode, repair, protected) + return MappingProxyType(entries) + + +def _condition_codec(condition_id: str) -> str: + for codec in ("jpeg_q100", "jpeg_q80", "webp_q80", "avif_q70", "jxl_d1"): + if condition_id.startswith(codec): + return codec + raise ValueError(f"unknown condition: {condition_id}") + + +CONDITION_REGISTRY: Final[Mapping[str, ConditionSpec]] = _build_registry() + + +def semantic_hash(registry: Mapping[str, ConditionSpec] | Sequence[ConditionSpec]) -> str: + """registryの順序と全semantic fieldをcanonical JSONでhashする。""" + values = registry.values() if isinstance(registry, Mapping) else registry + entries = [CONDITION_REGISTRY[item] if isinstance(item, str) else item for item in values] + encoded = json.dumps([asdict(item) for item in entries], sort_keys=True, separators=(",", ":")).encode() + return hashlib.sha256(encoded).hexdigest() + + +def _pillow_available(format_name: str) -> tuple[bool, str | None]: + Image.init() + if format_name == "AVIF": + available = bool(features.check("avif")) + else: + available = format_name in Image.SAVE + return available, None if available else f"Pillow codec unavailable: {format_name}" + + +def _jxl_run(args: Sequence[str]) -> subprocess.CompletedProcess[str]: + argv = [MAGICK_PATH, *args] + try: + result = subprocess.run(argv, capture_output=True, text=True, shell=False, check=False) + except OSError as error: + raise JxlCodecError(str(error), argv=argv, stdout="", stderr=str(error), returncode=-1) from error + if result.returncode != 0: + raise JxlCodecError("ImageMagick JXL command failed", argv=argv, stdout=result.stdout, stderr=result.stderr, returncode=result.returncode) + return result + + +def _jxl_version() -> CodecPreflight: + argv = (MAGICK_PATH, "-version") + try: + result = _jxl_run(["-version"]) + except JxlCodecError as error: + return CodecPreflight( + "jxl_d1", False, None, str(error), tuple(error.argv), _mapping({"quality": 90, "libjxl_distance": 1.0}), + _mapping({"argv": error.argv, "stdout": error.stdout, "stderr": error.stderr, "returncode": error.returncode}), + ) + if "jxl" not in result.stdout.lower(): + diagnostics = _mapping({"argv": argv, "stdout": result.stdout, "stderr": result.stderr, "returncode": result.returncode}) + return CodecPreflight("jxl_d1", False, result.stdout, "ImageMagick version has no JXL delegate", argv, _mapping({}), diagnostics) + try: + formats = _jxl_run(["-list", "format"]) + delegate_version = _parse_libjxl_delegate_version(formats.stdout) + except JxlCodecError as error: + return CodecPreflight( + "jxl_d1", False, result.stdout, str(error), argv, _mapping({}), + _mapping({"argv": error.argv, "stdout": error.stdout, "stderr": error.stderr, "returncode": error.returncode}), + ) + if delegate_version is None: + diagnostics = _mapping({"argv": (MAGICK_PATH, "-list", "format"), "stdout": formats.stdout, "stderr": formats.stderr, "returncode": formats.returncode}) + return CodecPreflight("jxl_d1", False, result.stdout, "libjxl delegate version could not be parsed", argv, _mapping({}), diagnostics) + probe_image = Image.fromarray(np.arange(8 * 8 * 3, dtype=np.uint8).reshape(8, 8, 3), "RGB") + try: + q90 = _jxl_encode(probe_image, quality=90) + q50 = _jxl_encode(probe_image, quality=50) + decoded_q90 = _jxl_decode(q90) + decoded_q50 = _jxl_decode(q50) + if not q90 or not q50 or q90 == q50 or decoded_q90.size != probe_image.size or decoded_q50.size != probe_image.size: + raise ValueError("JXL probe payloads are empty, identical, or have wrong dimensions") + except JxlCodecError as error: + stages = _mapping({ + "version": _mapping({"argv": argv, "stdout": result.stdout, "stderr": result.stderr, "returncode": result.returncode}), + "format": _mapping({"argv": (MAGICK_PATH, "-list", "format"), "stdout": formats.stdout, "stderr": formats.stderr, "returncode": formats.returncode}), + "probe": _mapping({"argv": error.argv, "stdout": error.stdout, "stderr": error.stderr, "returncode": error.returncode}), + }) + return CodecPreflight("jxl_d1", False, result.stdout, str(error), tuple(error.argv), _mapping({}), stages) + except (OSError, ValueError) as error: + return CodecPreflight( + "jxl_d1", False, result.stdout, str(error), argv, + _mapping({"quality": 90, "libjxl_distance": 1.0, "stderr": result.stderr}), + ) + metadata = { + "quality": 90, + "libjxl_distance": 1.0, + "quality_mapping": "JxlEncoderDistanceFromQuality(quality)", + "imagemagick_full_version": result.stdout, + "libjxl_delegate_version": delegate_version, + "stderr": result.stderr, + "probe_q90_bytes": len(q90), + "probe_q50_bytes": len(q50), + "probe_q90_sha256": hashlib.sha256(q90).hexdigest(), + "probe_q50_sha256": hashlib.sha256(q50).hexdigest(), + "probe_dimensions": (probe_image.height, probe_image.width), + "probe_q50_dimensions": (decoded_q50.height, decoded_q50.width), + "argv_template": (MAGICK_PATH, "-quality", "90", "", ""), + } + diagnostics = _mapping({"argv": argv, "stdout": result.stdout, "stderr": result.stderr, "returncode": result.returncode}) + return CodecPreflight("jxl_d1", True, result.stdout, None, argv, _mapping(metadata), diagnostics) + + +def _parse_libjxl_delegate_version(output: str) -> str | None: + match = re.search(r"libjxl\s+([0-9]+\.[0-9]+\.[0-9]+)", output, flags=re.IGNORECASE) + return match.group(1) if match else None + + +def preflight_codecs() -> tuple[CodecPreflight, ...]: + """全codecのavailabilityをfail-closedで返す。""" + results: list[CodecPreflight] = [] + for name, spec in CODEC_SPECS.items(): + if name == "jxl_d1": + results.append(_jxl_version()) + continue + available, reason = _pillow_available(spec.format) + results.append(CodecPreflight(name, available, PILLOW_VERSION if available else None, reason, ("Pillow", spec.format), spec.metadata)) + return tuple(results) + + +def _verified_status(spec: CodecSpec, verified_preflight: Mapping[str, CodecPreflight] | str | None) -> CodecPreflight | None: + """verified preflight tokenを検証し、standalone時はNoneを返す。""" + if verified_preflight is None: + return None + if isinstance(verified_preflight, str): + if verified_preflight != spec.name: + raise ValueError(f"verified preflight token mismatch: {verified_preflight} != {spec.name}") + return CodecPreflight(spec.name, True, "verified-token", None, ("verified", spec.name), spec.metadata) + status = verified_preflight.get(spec.name) + if status is None or status.name != spec.name or not status.available: + raise RuntimeError(status.reason if status is not None and status.reason else f"codec unavailable: {spec.name}") + return status + + +def _require_available(spec: CodecSpec, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> None: + status = _verified_status(spec, verified_preflight) + if status is None and spec.name == "jxl_d1": + status = _jxl_version() + elif status is None: + available, reason = _pillow_available(spec.format) + status = CodecPreflight(spec.name, available, PILLOW_VERSION if available else None, reason, ("Pillow", spec.format), spec.metadata) + if not status.available: + raise RuntimeError(status.reason or f"codec unavailable: {spec.name}") + + +def encode_rgb(image: Image.Image, spec: CodecSpec, *, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> bytes: + """RGB imageを固定optionでmemory encodeする。""" + _require_available(spec, verified_preflight) + rgb = image.convert("RGB") + if spec.name == "jxl_d1": + return _jxl_encode(rgb) + return _encode_pillow(rgb, spec) + + +def _encode_pillow(image: Image.Image, spec: CodecSpec) -> bytes: + """Pillowへ入力modeを変更せず固定optionで渡す。""" + stream = BytesIO() + image.save(stream, format=spec.format, **dict(spec.options)) + return stream.getvalue() + + +def decode_rgb(payload: bytes, spec: CodecSpec, *, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> Image.Image: + """bytesをRGB imageへdecodeし、file handleを閉じる。""" + _verified_status(spec, verified_preflight) + return _decode_l_image(payload, spec).convert("RGB") + + +def _decode_image(payload: bytes, spec: CodecSpec) -> Image.Image: + """payloadをdecoderの実modeのままmemory imageへdecodeする。""" + if spec.name == "jxl_d1": + return _jxl_decode(payload) + with Image.open(BytesIO(payload)) as image: + return image.copy() + + +def encode_l_plane(plane: np.ndarray, spec: CodecSpec, *, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> bytes: + """grayscale planeを固定codec optionでmemory encodeする。""" + array = np.asarray(plane, dtype=np.uint8) + if array.ndim != 2: + raise ValueError("L plane must be two-dimensional") + _require_available(spec, verified_preflight) + image = Image.fromarray(array, "L") + if spec.name == "jxl_d1": + return _jxl_encode(image) + return _encode_pillow(image, spec) + + +def decode_l_plane(payload: bytes, spec: CodecSpec, *, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> np.ndarray: + """bytesをgrayscale uint8 planeへdecodeする。""" + _verified_status(spec, verified_preflight) + image = _decode_l_image(payload, spec) + return np.asarray(image.convert("L"), dtype=np.uint8).copy() + + +def _decode_l_image(payload: bytes, spec: CodecSpec) -> Image.Image: + """L plane payloadをcodec format gate付きでdecodeする。""" + expected_format = EXPECTED_FORMAT_BY_CODEC.get(spec.name) + if expected_format is None: + raise ValueError(f"unknown codec name: {spec.name}") + if spec.format != expected_format: + raise ValueError(f"codec format is not canonical for {spec.name}: {spec.format}") + if spec.name == "jxl_d1": + return _jxl_decode(payload) + with Image.open(BytesIO(payload)) as image: + if image.format != expected_format: + raise ValueError(f"payload format {image.format} does not match codec format {expected_format}") + return image.copy() + + +def _jxl_encode(image: Image.Image, *, quality: int = 90) -> bytes: + with tempfile.TemporaryDirectory(prefix="pixelmodel-jxl-") as directory: + source, target = f"{directory}/source.png", f"{directory}/payload.jxl" + image.save(source, format="PNG") + _jxl_run(["-quality", str(quality), source, target]) + with open(target, "rb") as stream: + return stream.read() + + +def _jxl_decode(payload: bytes) -> Image.Image: + with tempfile.TemporaryDirectory(prefix="pixelmodel-jxl-") as directory: + source, target = f"{directory}/payload.jxl", f"{directory}/decoded.png" + with open(source, "wb") as stream: + stream.write(payload) + identify_argv = [MAGICK_PATH, "identify", "-format", "%m", source] + identified = _jxl_run(["identify", "-format", "%m", source]) + if identified.stdout.strip() != "JXL": + raise JxlCodecError( + "JXL identify format gate failed", argv=identify_argv, + stdout=identified.stdout, stderr=identified.stderr, returncode=identified.returncode, + ) + _jxl_run([source, target]) + with Image.open(target) as image: + return image.copy() + + +def encode_protected_high(values: np.ndarray, shape: tuple[int, int], low_spec: CodecSpec, *, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> ProtectedArtifact: + """high byteをPNG、low byteを指定lossy codecで保存する。""" + if low_spec.name not in LOSSY_CODEC_NAMES: + raise ValueError(f"protected low codec must be lossy: {low_spec.name}") + canonical = CODEC_SPECS[low_spec.name] + if ( + low_spec.format != canonical.format + or low_spec.quality != canonical.quality + or low_spec.options != canonical.options + or low_spec.metadata != canonical.metadata + or low_spec.grayscale != canonical.grayscale + ): + raise ValueError(f"protected low codec spec is not semantically canonical: {low_spec.name}") + flat = np.asarray(values, dtype=np.float16).reshape(-1) + capacity = int(np.prod(shape)) + if flat.size > capacity: + raise ValueError("values exceed shape capacity") + bits = np.zeros(capacity, dtype=np.uint16) + bits[: flat.size] = flat.view(np.uint16) + high = (bits >> 8).astype(np.uint8).reshape(shape) + low = bits.astype(np.uint8).reshape(shape) + high_stream = BytesIO() + Image.fromarray(high, "L").save(high_stream, format="PNG") + return ProtectedArtifact(high_stream.getvalue(), encode_l_plane(low, low_spec, verified_preflight=verified_preflight), low_spec.name) + + +def decode_protected_high(artifact: ProtectedArtifact, shape: tuple[int, int], source_values: np.ndarray, *, verified_preflight: Mapping[str, CodecPreflight] | str | None = None) -> tuple[np.ndarray, dict[str, object]]: + """protected payloadを復元し、high exactnessとbytes/hashを検証する。""" + with Image.open(BytesIO(artifact.high_png_bytes)) as high_image: + if high_image.format != "PNG": + raise ValueError(f"protected high plane format must be PNG, got {high_image.format}") + if high_image.mode != "L": + raise ValueError(f"protected high plane mode must be L, got {high_image.mode}") + high = np.asarray(high_image.convert("L"), dtype=np.uint8).copy() + high_mode, high_dimensions = high_image.mode, [high_image.height, high_image.width] + if artifact.low_codec not in LOSSY_CODEC_NAMES: + raise ValueError(f"protected low codec must be lossy: {artifact.low_codec}") + _verified_status(CODEC_SPECS[artifact.low_codec], verified_preflight) + low_image = _decode_l_image(artifact.low_codec_bytes, CODEC_SPECS[artifact.low_codec]) + low_mode = low_image.mode + low = np.asarray(low_image.convert("L"), dtype=np.uint8).copy() + if high.shape != shape or low.shape != shape: + raise ValueError("protected plane dimensions mismatch") + source_flat = np.asarray(source_values, dtype=np.float16).reshape(-1) + if source_flat.size > int(np.prod(shape)): + raise ValueError("source values exceed shape capacity") + expected_bits = np.zeros(int(np.prod(shape)), dtype=np.uint16) + expected_bits[: source_flat.size] = source_flat.view(np.uint16) + source_high = (expected_bits >> 8).astype(np.uint8).reshape(shape) + if not np.array_equal(high, source_high): + raise ValueError("decoded protected high plane is not bit-exact") + bits = ((high.reshape(-1).astype(np.uint16) << 8) | low.reshape(-1).astype(np.uint16)).view(np.float16) + metadata: dict[str, object] = { + "dimensions": list(shape), "high_mode": high_mode, "low_mode": low_mode, "high_dimensions": high_dimensions, + "low_dimensions": [low_image.height, low_image.width], + "decoded_high_exact": True, "decoded_high_sha256": hashlib.sha256(high.tobytes()).hexdigest(), + "combined_payload_bytes": len(artifact.payload), "combined_payload_sha256": hashlib.sha256(artifact.payload).hexdigest(), + "low_codec": artifact.low_codec, "source_value_count": int(source_flat.size), + "low_changed_count": int(np.count_nonzero(low != expected_bits.astype(np.uint8).reshape(shape))), + "high_encoded_bytes": len(artifact.high_png_bytes), "high_encoded_sha256": hashlib.sha256(artifact.high_png_bytes).hexdigest(), + "low_encoded_bytes": len(artifact.low_codec_bytes), "low_encoded_sha256": hashlib.sha256(artifact.low_codec_bytes).hexdigest(), + "decoded_low_sha256": hashlib.sha256(low.tobytes()).hexdigest(), + "pillow_version": PILLOW_VERSION, + } + return bits, metadata + + +def repair_nonfinite_zero(values: np.ndarray, layers: Mapping[str, tuple[int, int]]) -> RepairResult: + """NaN/+Inf/-Infだけをzeroへ置換し、finite fp16 bit patternを保持する。""" + return repair_nonfinite(values, "zero", layers) diff --git a/scripts/pixelmodel_robustness/cross_codec_experiment.py b/scripts/pixelmodel_robustness/cross_codec_experiment.py new file mode 100644 index 0000000000000000000000000000000000000000..cb296420d7d5b483b638ebdde441fce8a364d195 --- /dev/null +++ b/scripts/pixelmodel_robustness/cross_codec_experiment.py @@ -0,0 +1,858 @@ +"""Task 2 cross-codec robustness runner. + +科学条件、payload、推論、resume、provenanceを単一writerで管理する。 +""" +from __future__ import annotations + +import argparse +import hashlib +import json +import logging +import math +import os +import platform +import shutil +import socket +import subprocess +import time +from collections.abc import Callable, Mapping, Sequence +from dataclasses import fields, is_dataclass +from datetime import UTC, datetime, timedelta +from io import BytesIO +from pathlib import Path +from types import MappingProxyType +from typing import Any + +import numpy as np +from PIL import Image, UnidentifiedImageError + +from pixelmodel_robustness import cross_codec, jpeg_repair +from pixelmodel_robustness.codec import layer_offsets +from pixelmodel_robustness.inference import build_official_runtime, generate_with_runtime, resolve_device +from pixelmodel_robustness.jpeg_repair import diagnostics, materialize_fp16_png, repair_nonfinite +from pixelmodel_robustness.metrics import weight_metrics +from pixelmodel_robustness.prompts import CATEGORIES +from pixelmodel_robustness.storage import atomic_json + +LOGGER = logging.getLogger(__name__) +VAE_REVISION = "31f26fdeee1355a5c34592e401dd41e45d25a493" +CLIP_REVISION = "3d74acf9a28c67741b2f4f2ea7635f0aaf6f0268" +UPSTREAM_REVISION = "80878fdd6e130d229c2581424a3456b47b979d4b" +SCIENTIFIC_GATE_IDENTITY_KEYS = ( + "source_sha256", "model_sha256", "config_sha256", "prompt_sha256", "upstream_revision", "code_hashes", + "runtime_git", "runtime_platform", "package_versions", "vae", "clip", "requested_device", + "resolved_device", "mode", "steps", "cfg", "condition_registry_hash", "codec_preflight", +) + + +class ResourceGuardError(RuntimeError): + """resource gateが実験を停止した。""" + + +def _safe(value: object) -> object: + """tuple、mappingproxy、dataclass、numpy scalarをJSON-safeへ変換する。""" + if is_dataclass(value): + return _safe({field.name: getattr(value, field.name) for field in fields(value)}) + if isinstance(value, Mapping): + return {str(key): _safe(item) for key, item in value.items()} + if isinstance(value, (tuple, list)): + return [_safe(item) for item in value] + if isinstance(value, np.generic): + return _safe(value.item()) + if isinstance(value, Path): + return str(value) + if isinstance(value, float) and not math.isfinite(value): + return None + return value + + +def _hash(value: object) -> str: + """canonical JSONのSHA-256を返す。""" + return hashlib.sha256(json.dumps(_safe(value), ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + + +def scientific_identity_hash(identity: Mapping[str, object]) -> str: + """profile/prompt scopeを除いた共通科学identityをhashする。""" + return _hash({key: identity.get(key) for key in SCIENTIFIC_GATE_IDENTITY_KEYS}) + + +def sha256_file(path: str | Path) -> str: + """ファイルのSHA-256を返す。""" + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def _git(root: Path) -> dict[str, object]: + """runtime git metadataをbest effortで取得する。""" + try: + head = subprocess.run(["git", "rev-parse", "HEAD"], cwd=root, capture_output=True, text=True, check=True).stdout.strip() + dirty = bool(subprocess.run(["git", "status", "--porcelain"], cwd=root, capture_output=True, text=True, check=True).stdout) + except (OSError, subprocess.SubprocessError): + head, dirty = None, None + return {"head": head, "dirty": dirty} + + +def sample_resource(output: Path, condition: str | None = None, prompt_id: str | None = None) -> dict[str, object]: + """psutil/shutil/Torch MPSから実測snapshotを取得する。""" + import psutil + process = psutil.Process(os.getpid()) + memory = psutil.virtual_memory() + target = output if output.exists() else output.parent + disk = shutil.disk_usage(target) + mps_allocated = None + mps_driver = None + try: + import torch + if torch.backends.mps.is_available(): + mps_allocated = int(torch.mps.current_allocated_memory()) + mps_driver = int(torch.mps.driver_allocated_memory()) + except (ImportError, AttributeError, RuntimeError): + pass + return {"timestamp": datetime.now(UTC).isoformat(), "condition": condition, "prompt_id": prompt_id, "pid": os.getpid(), "rss_bytes": int(process.memory_info().rss), "system_available_percent": float(memory.available / memory.total * 100), "disk_free_bytes": int(disk.free), "mps_allocated_bytes": mps_allocated, "mps_driver_allocated_bytes": mps_driver, "violation_reason": None} + + +def _resource_violation(snapshot: Mapping[str, object]) -> str | None: + """JPEG runnerと同じresource thresholdsを評価する。""" + reasons = [] + if float(snapshot["system_available_percent"]) < 10: + reasons.append("system_available_percent<10") + if int(snapshot["rss_bytes"]) > 12 * 1024**3: + reasons.append("rss_bytes>12GiB") + if int(snapshot["disk_free_bytes"]) < 50 * 1024**3: + reasons.append("disk_free_bytes<50GiB") + return ";".join(reasons) if reasons else None + + +def _early_resource_preflight(output: Path) -> dict[str, object]: + """heavy workとoutput作成前にresource gateを実施する。""" + snapshot = sample_resource(output) + violation = _resource_violation(snapshot) + if violation: + raise ResourceGuardError(violation) + return snapshot + + +def load_rows_strict(path: str | Path, run_identity_hash: str) -> list[dict[str, object]]: + """identityとcanonical duplicateを拒否してraw rowsを読む。""" + target = Path(path) + if not target.exists(): + return [] + rows: list[dict[str, object]] = [] + keys: set[str] = set() + for line in target.read_text(encoding="utf-8").splitlines(): + if not line.strip(): + continue + row = json.loads(line) + if row.get("run_identity_hash") != run_identity_hash: + raise ValueError("row run identity mismatch") + key = _hash({key: row.get(key) for key in ("row_type", "stage", "condition", "prompt_id", "layer")}) + if key in keys: + raise ValueError("duplicate canonical row identity") + keys.add(key) + rows.append(row) + return rows + + +def validate_resource_monitor( + output: str | Path, + manifest: Mapping[str, object], + generation_rows: Sequence[Mapping[str, object]], +) -> dict[str, object]: + """resource monitorをstrictに読み、manifestへ束縛可能なmetadataを返す。""" + root = Path(output).resolve() + path = root / "results" / "resource_monitor.jsonl" + try: + path.relative_to(root) + except ValueError as exc: + raise ValueError("resource monitor path escapes run output") from exc + if not path.is_file(): + raise ValueError("resource monitor missing") + run_hash = manifest.get("run_identity_hash") + if not isinstance(run_hash, str) or not run_hash: + raise ValueError("resource monitor run identity missing") + rows: list[dict[str, object]] = [] + try: + lines = path.read_text(encoding="utf-8").splitlines() + for line_number, line in enumerate(lines, 1): + if not line.strip(): + raise ValueError(f"resource monitor blank line: {line_number}") + row = json.loads(line) + if not isinstance(row, dict): + raise TypeError(f"resource monitor row is not an object: {line_number}") + if row.get("run_identity_hash") != run_hash: + raise ValueError("resource monitor row identity mismatch") + rows.append(row) + except (UnicodeDecodeError, json.JSONDecodeError) as exc: + raise ValueError("resource monitor is not strict JSONL") from exc + preflight = [row for row in rows if row.get("row_type") == "resource_guard" and row.get("stage") == "preflight"] + if len(preflight) != 1 or any(row.get("condition") is not None or row.get("prompt_id") is not None for row in preflight): + raise ValueError("resource monitor preflight row mismatch") + resource_rows = [row for row in rows if row.get("row_type") == "resource" and row.get("stage") == "resource"] + if len(preflight) + len(resource_rows) != len(rows): + raise ValueError("unknown resource monitor row type/stage") + if len(resource_rows) != len({(row.get("condition"), row.get("prompt_id")) for row in resource_rows}): + raise ValueError("duplicate resource monitor identity") + expected = { + (row.get("condition"), str(row.get("prompt_id"))) + for row in generation_rows + if row.get("row_type") == "generation" and row.get("attempted") is True and not row.get("blocked") + } + actual = {(row.get("condition"), str(row.get("prompt_id"))) for row in resource_rows} + if actual != expected: + raise ValueError("resource monitor generation pair mismatch") + violation_rows = [row for row in rows if row.get("violation_reason")] + available = [float(row["system_available_percent"]) for row in rows if isinstance(row.get("system_available_percent"), (int, float))] + rss = [int(row["rss_bytes"]) for row in rows if isinstance(row.get("rss_bytes"), (int, float))] + mps = [int(row["mps_allocated_bytes"]) for row in rows if isinstance(row.get("mps_allocated_bytes"), (int, float))] + driver = [int(row["mps_driver_allocated_bytes"]) for row in rows if isinstance(row.get("mps_driver_allocated_bytes"), (int, float))] + return { + "path": str(path.relative_to(root)), + "sha256": sha256_file(path), + "bytes": path.stat().st_size, + "row_count": len(rows), + "preflight_count": len(preflight), + "generation_count": len(resource_rows), + "violation_count": len(violation_rows), + "min_available_percent": min(available) if available else None, + "peak_rss_bytes": max(rss) if rss else None, + "peak_mps_allocated_bytes": max(mps) if mps else None, + "peak_mps_driver_allocated_bytes": max(driver) if driver else None, + } + + +def _validate_bound_resource(recorded: object, actual: Mapping[str, object]) -> None: + """resource core metadataとbinding annotationをstrictに検証する。""" + if not isinstance(recorded, Mapping): + raise TypeError("resource monitor provenance must be an object") + if any(recorded.get(key) != value for key, value in actual.items()): + raise ValueError("resource monitor core metadata mismatch") + annotations = set(recorded) - set(actual) + if not annotations <= {"binding_method", "bound_at", "binding_code_hash"}: + raise ValueError("unknown resource monitor binding annotation") + method = recorded.get("binding_method") + if method not in {"run_completion", "post_run_verified"}: + raise ValueError("invalid resource monitor binding method") + if method == "run_completion": + if annotations != {"binding_method"}: + raise ValueError("run completion resource annotation mismatch") + return + if annotations != {"binding_method", "bound_at", "binding_code_hash"}: + raise ValueError("post-run resource annotation mismatch") + bound_at = recorded.get("bound_at") + if not isinstance(bound_at, str): + raise TypeError("post-run resource bound_at is invalid") + try: + parsed = datetime.fromisoformat(bound_at) + except ValueError as exc: + raise ValueError("post-run resource bound_at is invalid") from exc + if parsed.tzinfo is None or parsed.utcoffset() != timedelta(0): + raise ValueError("post-run resource bound_at is not UTC") + code_hash = recorded.get("binding_code_hash") + if not isinstance(code_hash, str) or len(code_hash) != 64 or any(char not in "0123456789abcdef" for char in code_hash): + raise ValueError("post-run resource binding_code_hash is invalid") + + +def _save_row(path: Path, row: dict[str, object]) -> None: + """layerを含むTask2 canonical keyでatomic upsertする。""" + rows = load_rows_strict(path, str(row["run_identity_hash"])) + key = _hash({field: row.get(field) for field in ("row_type", "stage", "condition", "prompt_id", "layer")}) + rows = [item for item in rows if _hash({field: item.get(field) for field in ("row_type", "stage", "condition", "prompt_id", "layer")}) != key] + rows.append(row) + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_name(f".{path.name}.tmp") + temporary.write_text("".join(json.dumps(_safe(item), ensure_ascii=False, allow_nan=False) + "\n" for item in rows), encoding="utf-8") + os.replace(temporary, path) + + +def _verify_artifact(output: Path, artifact: object, label: str) -> bool: + """run-owned artifactのcontainment、bytes、hash、decoded metadataを検証する。""" + if not isinstance(artifact, Mapping) or not isinstance(artifact.get("path"), str): + return False + path = (output / str(artifact["path"])).resolve() + try: + path.relative_to(output.resolve()) + except ValueError: + return False + if not path.is_file() or int(artifact.get("bytes", -1)) != path.stat().st_size or artifact.get("sha256") != sha256_file(path): + return False + if artifact.get("decoded_sha256"): + try: + with Image.open(path) as image: + decoded = np.asarray(image.convert("RGB"), dtype=np.uint8) + if artifact.get("mode") != image.mode or artifact.get("dimensions") != [image.height, image.width] or artifact.get("decoded_sha256") != hashlib.sha256(decoded.tobytes()).hexdigest(): + return False + except (OSError, UnidentifiedImageError): + return False + return True + + +def _verify_artifact_tree(output: Path, value: object, label: str) -> bool: + """nested artifact metadataを再帰的に検証する。""" + if isinstance(value, Mapping): + if "path" in value and not _verify_artifact(output, value, label): + return False + return all(_verify_artifact_tree(output, child, f"{label}.{key}") for key, child in value.items() if isinstance(child, (Mapping, list))) + if isinstance(value, list): + return all(_verify_artifact_tree(output, child, f"{label}[{index}]") for index, child in enumerate(value)) + return True + + +def condition_complete(rows: Sequence[Mapping[str, object]], condition: str, prompt_ids: set[str], layer_ids: set[str], output: Path) -> bool: + """weight/layer/promptと全artifactをstrictに検証する。""" + weights = [row for row in rows if row.get("row_type") == "weight" and row.get("condition") == condition] + layers = [row for row in rows if row.get("row_type") == "layer" and row.get("condition") == condition] + generations = [row for row in rows if row.get("row_type") == "generation" and row.get("condition") == condition] + if len(weights) != 1 or {str(row.get("layer")) for row in layers} != layer_ids or {str(row.get("prompt_id")) for row in generations} != prompt_ids: + return False + weight = weights[0] + if not _verify_artifact_tree(output, weight.get("payload"), condition + ".payload") or not _verify_artifact_tree(output, weight.get("protected"), condition + ".protected") or not _verify_artifact_tree(output, weight.get("materialized"), condition + ".materialized"): + return False + for row in generations: + if row.get("success"): + if not row.get("attempted") or not row.get("completed") or row.get("blocked") or not _verify_artifact(output, {"path": row.get("sample_path"), "bytes": row.get("sample_bytes"), "sha256": row.get("sample_hash")}, f"{condition}.sample"): + return False + elif row.get("attempted"): + if not row.get("completed") or row.get("sample_path") is not None or row.get("sample_hash") is not None or row.get("sample_bytes") is not None: + return False + elif not row.get("blocked") or not row.get("failure_stage") or row.get("sample_path") is not None or row.get("sample_hash") is not None or row.get("sample_bytes") is not None: + return False + return True + + +def select_prompts(prompts: Sequence[Mapping[str, object]], profile: str) -> list[dict[str, object]]: + """prompt全体を検証しpilot/fullのordered scopeを返す。""" + entries = [dict(item) for item in prompts] + required = {"prompt_id", "category", "prompt", "seed", "initial_latent_seed"} + if any(required - item.keys() for item in entries): + raise ValueError("prompt schema is incomplete") + ids = [str(item["prompt_id"]) for item in entries] + if len(ids) != len(set(ids)) or len({str(item["prompt"]) for item in entries}) != len(entries): + raise ValueError("duplicate prompt IDs or prompt text") + if any(item["category"] not in CATEGORIES for item in entries): + raise ValueError("invalid prompt category") + if profile == "pilot": + try: + selected = [next(item for item in entries if item["category"] == category) for category in CATEGORIES] + except StopIteration as exc: + raise ValueError("pilot requires every prompt category") from exc + return selected + if profile == "full": + if len(entries) != 100: + raise ValueError("full profile requires exactly 100 prompts") + return entries + raise ValueError("profile must be pilot or full") + + +def build_parser() -> argparse.ArgumentParser: + """仕様のCLI parserを返す。""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--profile", choices=("pilot", "full"), default="pilot") + parser.add_argument("--image", default="model.png") + parser.add_argument("--manifest", default="model_png.json") + parser.add_argument("--config", default="config.json") + parser.add_argument("--model", default="model.safetensors") + parser.add_argument("--prompts-manifest", default="prompts.json") + parser.add_argument("--prompts", type=int, default=8) + parser.add_argument("--steps", type=int, default=50) + parser.add_argument("--cfg", type=float, default=6.0) + parser.add_argument("--device", choices=("auto", "cpu", "mps", "cuda"), default="mps") + parser.add_argument("--output", default="results/cross-codec-robustness") + parser.add_argument("--conditions", default="") + parser.add_argument("--recover-lock", action="store_true") + parser.add_argument("--fixture", action="store_true") + parser.add_argument("--fake-runtime", action="store_true") + parser.add_argument("--vae", default="stabilityai/sd-vae-ft-mse") + parser.add_argument("--clip", default="openai/clip-vit-base-patch32") + parser.add_argument("--pilot-manifest") + parser.add_argument("--bind-resource-monitor", action="store_true") + return parser + + +def _validate(args: argparse.Namespace, injected: bool) -> None: + """output作成前にCLI scopeを検証する。""" + expected = 8 if args.profile == "pilot" else 100 + if args.prompts != expected or args.steps != 50 or args.cfg != 6.0 or args.device != "mps": + raise ValueError(f"{args.profile} requires prompts={expected}, steps=50, cfg=6.0, requested device mps") + if args.fixture or args.fake_runtime: + if not injected: + raise ValueError("fixture/fake-runtime is test-only API mode") + if args.profile == "full": + raise ValueError("full profile rejects fixture/fake-runtime") + if args.conditions and tuple(item for item in args.conditions.split(",") if item) != cross_codec.CONDITION_IDS: + raise ValueError("conditions must be the ordered 17 registry") + if args.profile == "full" and not args.pilot_manifest: + raise ValueError("full profile requires --pilot-manifest") + + +def _acquire_lock(path: Path, identity: str, recover: bool) -> None: + """O_EXCL lockを作る。""" + path.parent.mkdir(parents=True, exist_ok=True) + if path.exists(): + if not recover: + raise ValueError("run lock exists; use --recover-lock") + path.unlink() + try: + fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o644) + except FileExistsError as exc: + raise ValueError("run lock race") from exc + with os.fdopen(fd, "w", encoding="utf-8") as stream: + json.dump({"pid": os.getpid(), "hostname": socket.gethostname(), "identity_hash": identity}, stream) + + +def _artifact(path: Path, root: Path) -> dict[str, object]: + """portable artifact metadataを生成する。""" + result: dict[str, object] = {"path": str(path.relative_to(root)), "bytes": path.stat().st_size, "sha256": sha256_file(path)} + try: + with Image.open(path) as image: + decoded = np.asarray(image.convert("RGB"), dtype=np.uint8) + result.update({"mode": image.mode, "dimensions": [image.height, image.width], "decoded_sha256": hashlib.sha256(decoded.tobytes()).hexdigest()}) + except (OSError, UnidentifiedImageError): + pass + return result + + +def _save_sample(image: Any, path: Path, *, base: Path | None = None) -> dict[str, object]: + """PILまたはCHW/HWC tensor-like imageをPNGへ保存しartifactを返す。""" + if isinstance(image, Image.Image): + rgb = image.convert("RGB") + else: + value = image.detach().cpu() if hasattr(image, "detach") else image + if hasattr(value, "clamp"): + value = value.clamp(0, 1) + value = value.numpy() if hasattr(value, "numpy") else np.asarray(value) + if value.ndim == 3 and value.shape[0] in (1, 3) and value.shape[-1] not in (1, 3): + value = np.transpose(value, (1, 2, 0)) + if value.ndim != 3 or value.shape[-1] != 3: + raise ValueError("generated image must be RGB HWC or CHW") + if not np.isfinite(value).all(): + raise FloatingPointError("generated image contains nonfinite values") + value = np.asarray(value, dtype=np.float64) + if value.max() <= 1.0: + value *= 255.0 + if value.min() < 0 or value.max() > 255: + raise ValueError("generated image outside [0,255]") + rgb = Image.fromarray(np.rint(value).astype(np.uint8), "RGB") + path.parent.mkdir(parents=True, exist_ok=True) + rgb.save(path, format="PNG") + return _artifact(path, base or path.parent) + + +def _source_values(image: np.ndarray, manifest: Mapping[str, object]) -> tuple[np.ndarray, dict[str, tuple[int, int]]]: + """official PNGのtotal parametersだけをfp16へ復元する。""" + total = int(manifest["total_parameters"]) + pixels = image.reshape(-1, 3)[:total] + if len(pixels) != total: + raise ValueError("source image is shorter than manifest") + bits = (pixels[:, 0].astype(np.uint16) << 8) | pixels[:, 1].astype(np.uint16) + params = list(manifest["params"]) + return bits.view(np.float16), layer_offsets([str(item["name"]) for item in params], [int(item["numel"]) for item in params]) + + +def _metrics(reference: np.ndarray, candidate: np.ndarray, layers: Mapping[str, tuple[int, int]]) -> dict[str, object]: + """finite-pair metricと既存bit diagnosticsを返す。""" + pair = np.isfinite(reference) & np.isfinite(candidate) + left, right = reference[pair].astype(np.float64), candidate[pair].astype(np.float64) + diff = right - left + norm = float(np.linalg.norm(left) * np.linalg.norm(right)) + bit = diagnostics(reference, candidate, layers) + return {"finite": bool(np.isfinite(candidate).all()), "nan_count": int(np.isnan(candidate).sum()), "posinf_count": int(np.isposinf(candidate).sum()), "neginf_count": int(np.isneginf(candidate).sum()), "finite_pair_count": int(pair.sum()), "finite_pair_label": "all_elements" if pair.all() else "finite_pairs_only", "mse": float(np.mean(diff * diff)) if len(diff) else None, "mae": float(np.mean(np.abs(diff))) if len(diff) else None, "cosine": float(np.dot(left, right) / norm) if norm else (1.0 if not left.any() and not right.any() else 0.0), "sign_mismatch_count": bit["sign_mismatch_count"], "exponent_mismatch_count": bit["exponent_mismatch_count"], "mantissa_mismatch_count": bit["mantissa_mismatch_count"], "weight_metrics": _safe(weight_metrics(reference, candidate, layers))} + + +def _write(path: Path, data: bytes) -> None: + """親dirを作成してbytesを書き込む。""" + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(data) + + +def _load_prompts(path: Path) -> list[dict[str, object]]: + """prompt JSONを読む。""" + value = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(value, list): + raise TypeError("prompt manifest must be a list") + return select_prompts(value, "full" if len(value) == 100 else "pilot") + + +def _generation_row(condition: str, prompt: Mapping[str, object], identity: str, **fields: object) -> dict[str, object]: + """generation canonical rowを作る。""" + return {"row_type": "generation", "stage": "generation", "condition": condition, "prompt_id": str(prompt["prompt_id"]), "category": prompt["category"], "prompt": prompt["prompt"], "seed": prompt["seed"], "initial_latent_seed": prompt["initial_latent_seed"], "run_identity_hash": identity, "attempted": False, "attempt_count": 0, "completed": False, "success": False, "blocked": False, "clip_score": None, "elapsed_seconds": None, "failure_stage": None, "failure_class": None, "first_error": None, "sample_path": None, "sample_hash": None, "sample_bytes": None, **fields} + + +def _record_codec_failure(path: Path, condition: str, spec: cross_codec.ConditionSpec, prompts: Sequence[Mapping[str, object]], layers: Mapping[str, tuple[int, int]], identity: str, failure: Mapping[str, object]) -> None: + """codec pipeline failureをweight/layer/generationのcanonical rowsへ保存する。""" + common = {"codec": spec.codec, "mode": spec.mode, "attempted": False, "status": "codec_pipeline_failed", "blocked": True, "failure_stage": failure["stage"], "failure_class": failure["class"], "failure_reason": failure["reason"], "first_failure": failure["first_error"], "payload": {"failure": dict(failure)}, "protected": {"failure": dict(failure)} if spec.protected else None, "materialized": None, "payload_bytes": None, "payload_sha256": None, "payload_over_png": None, "png_over_payload": None, "size_saving_percent": None, "repaired_count": 0} + _save_row(path, {"row_type": "weight", "stage": "weight", "condition": condition, "prompt_id": None, "run_identity_hash": identity, **common}) + for layer in layers: + _save_row(path, {"row_type": "layer", "stage": "layer", "condition": condition, "layer": layer, "prompt_id": None, "run_identity_hash": identity, "status": "codec_pipeline_failed", "failure_stage": failure["stage"], "failure_class": failure["class"], "failure_reason": failure["reason"], "finite": None, "mse": None, "mae": None, "cosine": None}) + for prompt in prompts: + _save_row(path, _generation_row(condition, prompt, identity, attempted=False, completed=False, blocked=True, failure_stage=failure["stage"], failure_class=failure["class"], first_error=failure["first_error"])) + + +def _protected(values: np.ndarray, shape: tuple[int, int], spec: cross_codec.CodecSpec, payload_factory: Callable[[Image.Image, cross_codec.CodecSpec], tuple[bytes, Image.Image]] | None, output: Path, verified_preflight: Mapping[str, cross_codec.CodecPreflight] | None = None) -> tuple[np.ndarray, dict[str, object], dict[str, object]]: + """high PNGとlossy lowを個別artifact化し、high exactnessを検証する。""" + bits = np.zeros(int(np.prod(shape)), dtype=np.uint16) + bits[: values.size] = values.view(np.uint16) + high = (bits >> 8).astype(np.uint8).reshape(shape) + low = bits.astype(np.uint8).reshape(shape) + high_stream = BytesIO() + Image.fromarray(high, "L").save(high_stream, format="PNG") + if payload_factory is None: + artifact = cross_codec.encode_l_plane(low, spec, verified_preflight=verified_preflight) + decoded_low = cross_codec.decode_l_plane(artifact, spec, verified_preflight=verified_preflight) + else: + artifact, decoded_image = payload_factory(Image.fromarray(low, "L"), spec) + decoded_low = np.asarray(decoded_image.convert("L"), dtype=np.uint8) + if decoded_low.shape != shape or not np.array_equal(high, (bits >> 8).astype(np.uint8).reshape(shape)): + raise ValueError("protected plane invariant failed") + high_path, low_path = output / "payloads" / f"protected_{spec.name}_high.png", output / "payloads" / f"protected_{spec.name}_low.bin" + _write(high_path, high_stream.getvalue()) + _write(low_path, artifact) + persisted = cross_codec.ProtectedArtifact(high_path.read_bytes(), low_path.read_bytes(), spec.name) + try: + _, persisted_metadata = cross_codec.decode_protected_high(persisted, shape, values, verified_preflight=verified_preflight) + except (ValueError, cross_codec.JxlCodecError): + if payload_factory is None: + raise + with Image.open(high_path) as high_image: + if high_image.format != "PNG" or high_image.mode != "L" or high_image.size != (shape[1], shape[0]): + raise ValueError("persisted protected high artifact gate failed") + if not np.array_equal(np.asarray(high_image), high): + raise ValueError("persisted protected high plane is not exact") + persisted_metadata = {"decoded_high_exact": True, "fixture_readback": True} + high_info, low_info = _artifact(high_path, output), _artifact(low_path, output) + candidate = ((high.astype(np.uint16) << 8) | decoded_low.astype(np.uint16)).reshape(-1).view(np.float16)[: values.size] + protected = {"high": high_info, "low": low_info, **persisted_metadata, "decoded_high_exact": True, "high_mode": "L", "low_mode": "L", "dimensions": list(shape), "bytes": high_info["bytes"] + low_info["bytes"], "sha256": hashlib.sha256(high_stream.getvalue() + artifact).hexdigest()} + payload = {"high": high_info, "low": low_info, "bytes": protected["bytes"], "sha256": protected["sha256"]} + return candidate, payload, protected + + +def _gate(output: Path, manifest: Mapping[str, object], rows: Sequence[Mapping[str, object]]) -> dict[str, object]: + """pilot completionをstrict検証してgateを生成する。""" + reasons: list[str] = [] + prompt_ids = {str(item) for item in manifest["prompt_ids"]} + layer_ids = {str(item) for item in manifest["layer_ids"]} + for condition in cross_codec.CONDITION_IDS: + if not condition_complete(rows, condition, prompt_ids, layer_ids, output): + reasons.append(f"incomplete:{condition}") + for row in rows: + if row.get("condition") == condition and row.get("failure_stage") in {"preflight", "encode", "decode", "decode_invariant", "protected_invariant", "model_load"}: + reasons.append(f"infrastructure:{condition}:{row['failure_stage']}") + resource_metadata = validate_resource_monitor(output, manifest, rows) + _validate_bound_resource(manifest.get("resource_monitor"), resource_metadata) + manifest_path = output / "manifest.json" + gate = {"pass": not reasons, "run_identity_hash": manifest["run_identity_hash"], "scientific_identity_hash": manifest["scientific_identity_hash"], "raw_rows_sha256": sha256_file(output / "results" / "raw_rows.jsonl"), "raw_rows_bytes": (output / "results" / "raw_rows.jsonl").stat().st_size, "manifest_sha256": sha256_file(manifest_path), "prompt_ids": list(manifest["prompt_ids"]), "conditions": list(cross_codec.CONDITION_IDS), "scope": manifest["inference_scope"], "codec_identities": manifest["codec_preflight"], "resource_monitor": manifest.get("resource_monitor", resource_metadata), "reasons": sorted(set(reasons))} + gate["gate_hash"] = _hash(gate) + atomic_json(output / "pilot_gate.json", gate) + return gate + + +def validate_pilot_gate(path: str | Path, *, expected_profile: str = "pilot") -> dict[str, object]: + """gate、raw rows、pilot manifestをrehashして検証する。""" + gate_path = Path(path) + if gate_path.name == "manifest.json": + manifest_path = gate_path + gate_path = gate_path.parent / "pilot_gate.json" + else: + manifest_path = gate_path.parent / "manifest.json" + gate = json.loads(gate_path.read_text(encoding="utf-8")) + recorded = gate.pop("gate_hash", None) + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + if recorded != _hash(gate) or not gate.get("pass") or manifest.get("status") != "completed" or manifest.get("profile") != expected_profile or manifest.get("mode") != "real": + raise ValueError("pilot gate is missing, failed, or tampered") + if manifest.get("profile") != "pilot" or manifest.get("steps") != 50 or manifest.get("cfg") != 6.0 or manifest.get("requested_device") != "mps" or len(manifest.get("prompt_ids", [])) != 8 or manifest.get("conditions") != list(cross_codec.CONDITION_IDS): + raise ValueError("pilot gate scope mismatch") + raw_path = manifest_path.parent / "results" / "raw_rows.jsonl" + if gate.get("raw_rows_sha256") != sha256_file(raw_path) or gate.get("raw_rows_bytes") != raw_path.stat().st_size or gate.get("manifest_sha256") != sha256_file(manifest_path): + raise ValueError("pilot artifact hash mismatch") + if gate.get("conditions") != list(cross_codec.CONDITION_IDS): + raise ValueError("pilot condition registry mismatch") + rows = load_rows_strict(raw_path, str(manifest["run_identity_hash"])) + resource_metadata = validate_resource_monitor(manifest_path.parent, manifest, rows) + if gate.get("resource_monitor") != manifest.get("resource_monitor"): + raise ValueError("pilot resource monitor provenance mismatch") + _validate_bound_resource(manifest.get("resource_monitor"), resource_metadata) + if gate.get("prompt_ids") != manifest.get("prompt_ids") or gate.get("scope") != manifest.get("inference_scope") or gate.get("scientific_identity_hash") != manifest.get("scientific_identity_hash") or scientific_identity_hash(manifest["run_identity"]) != manifest.get("scientific_identity_hash"): + raise ValueError("pilot gate scope mismatch") + for condition in cross_codec.CONDITION_IDS: + if not condition_complete(rows, condition, {str(item) for item in manifest["prompt_ids"]}, {str(item) for item in manifest["layer_ids"]}, manifest_path.parent): + raise ValueError("pilot gate artifact or condition completion mismatch") + return {"gate": gate, "manifest": manifest} + + +def run(args: argparse.Namespace, *, preflight_factory: Callable[[], Sequence[cross_codec.CodecPreflight]] | None = None, payload_factory: Callable[[Image.Image, cross_codec.CodecSpec], tuple[bytes, Image.Image]] | None = None, runtime_factory: Callable[[argparse.Namespace, str], tuple[Any, Any]] | None = None, candidate_factory: Callable[[str, np.ndarray], np.ndarray] | None = None) -> Path: + """cross-codec experimentを実行する。""" + injected = any(item is not None for item in (preflight_factory, payload_factory, runtime_factory, candidate_factory)) + _validate(args, injected) + output = Path(args.output) + source_path, prompt_path = Path(args.image), Path(args.prompts_manifest) + preflight_snapshot = _early_resource_preflight(output) + if not source_path.is_file() or not prompt_path.is_file(): + raise FileNotFoundError("image or prompt manifest") + statuses = tuple(preflight_factory() if preflight_factory else cross_codec.preflight_codecs()) + names = tuple(item.name for item in statuses) + if names != tuple(cross_codec.CODEC_SPECS) or len(set(names)) != len(names) or not all(item.available for item in statuses): + raise RuntimeError("codec preflight unavailable or noncanonical; fail closed") + verified_preflight = MappingProxyType({item.name: item for item in statuses}) + raw_prompts = json.loads(prompt_path.read_text(encoding="utf-8")) + if not isinstance(raw_prompts, list): + raise TypeError("prompt manifest must be a list") + prompts = select_prompts(raw_prompts, args.profile) + if len(prompts) != args.prompts: + raise ValueError(f"{args.profile} requires exactly {args.prompts} selected prompts") + resolved = args.device if injected else resolve_device(args.device) + if resolved != "mps": + raise ValueError("resolved device must be mps") + source_image = np.asarray(Image.open(source_path).convert("RGB"), dtype=np.uint8).copy() + source_values, layers = _source_values(source_image, json.loads(Path(args.manifest).read_text(encoding="utf-8"))) + identity = _safe({"source_sha256": sha256_file(source_path), "source_bytes": source_path.stat().st_size, "model_sha256": sha256_file(args.model) if Path(args.model).exists() else None, "config_sha256": sha256_file(args.config), "prompt_sha256": sha256_file(prompt_path), "upstream_revision": UPSTREAM_REVISION, "code_hashes": {"runner": sha256_file(__file__), "cross_codec": sha256_file(cross_codec.__file__), "jpeg_repair": sha256_file(jpeg_repair.__file__)}, "runtime_git": _git(Path(__file__).resolve().parent.parent), "runtime_platform": {"system": platform.system(), "release": platform.release(), "machine": platform.machine(), "python": platform.python_version()}, "package_versions": {}, "vae": {"requested": args.vae, "revision": VAE_REVISION}, "clip": {"requested": args.clip, "revision": CLIP_REVISION}, "requested_device": args.device, "resolved_device": resolved, "mode": "fixture" if args.fixture else "fake" if args.fake_runtime else "real", "steps": args.steps, "cfg": args.cfg, "profile": args.profile, "prompt_ids": [str(item["prompt_id"]) for item in prompts], "prompt_selection_hash": _hash(prompts), "condition_registry_hash": cross_codec.semantic_hash(cross_codec.CONDITION_REGISTRY), "codec_preflight": [_safe(item) for item in statuses]}) + identity["scientific_identity_hash"] = scientific_identity_hash(identity) + run_hash = _hash(identity) + if args.profile == "full": + gate_data = validate_pilot_gate(args.pilot_manifest) + if injected: + raise ValueError("full profile does not accept injected fixture runtime") + pilot_manifest = gate_data["manifest"] + comparisons = {"source_sha256": identity["source_sha256"], "model_sha256": identity["model_sha256"], "config_sha256": identity["config_sha256"], "prompt_sha256": identity["prompt_sha256"], "condition_registry_hash": identity["condition_registry_hash"], "codec_preflight": identity["codec_preflight"], "steps": args.steps, "cfg": args.cfg, "requested_device": args.device} + if identity.get("mode") != "real" or identity.get("scientific_identity_hash") != pilot_manifest.get("scientific_identity_hash") or scientific_identity_hash(pilot_manifest["run_identity"]) != pilot_manifest.get("scientific_identity_hash"): + raise ValueError("pilot/full scientific identity mismatch") + for key, value in comparisons.items(): + if key in pilot_manifest and pilot_manifest[key] != value: + raise ValueError(f"pilot/full identity mismatch: {key}") + existing = None + manifest_path = output / "manifest.json" + if manifest_path.exists(): + existing = json.loads(manifest_path.read_text(encoding="utf-8")) + if existing.get("run_identity") != identity or existing.get("run_identity_hash") != run_hash: + raise ValueError("resume identity mismatch") + if existing.get("status") == "completed": + raise ValueError("completed run cannot resume") + if existing.get("status") not in {"running", "resource_guard_failed"}: + raise ValueError("invalid resumable manifest state") + elif output.exists() and any(output.iterdir()): + raise ValueError("nonempty output without manifest is rejected") + output.mkdir(parents=True, exist_ok=True) + lock = output / "run.lock" + _acquire_lock(lock, run_hash, args.recover_lock) + try: + manifest = existing or {"status": "running", "run_identity": identity, "run_identity_hash": run_hash, **identity, "source_bytes": source_path.stat().st_size, "inference_scope": {"profile": args.profile, "steps": args.steps, "cfg": args.cfg, "requested_device": args.device, "resolved_device": resolved}, "prompt_ids": [str(item["prompt_id"]) for item in prompts], "conditions": list(cross_codec.CONDITION_IDS), "layer_ids": list(layers), "started_at": datetime.now(UTC).isoformat()} + atomic_json(manifest_path, manifest) + raw_rows_path = output / "results" / "raw_rows.jsonl" + _save_row(output / "results" / "resource_monitor.jsonl", {**preflight_snapshot, "row_type": "resource_guard", "stage": "preflight", "run_identity_hash": run_hash}) + rows = load_rows_strict(raw_rows_path, run_hash) + runtime_loader, runtime = runtime_factory(args, resolved) if runtime_factory else build_official_runtime(args, resolved) + payloads: dict[str, tuple[bytes, Image.Image]] = {} + payload_failures: dict[str, dict[str, object]] = {} + for codec_name in ("webp_lossless", *cross_codec.LOSSY_CODEC_NAMES): + spec = cross_codec.CODEC_SPECS[codec_name] + try: + encoded = payload_factory(Image.fromarray(source_image), spec) if payload_factory else (cross_codec.encode_rgb(Image.fromarray(source_image), spec, verified_preflight=verified_preflight), None) + except Exception as exc: # noqa: BLE001 + payload_failures[codec_name] = {"class": type(exc).__name__, "reason": str(exc), "first_error": f"{type(exc).__name__}: {exc}", "stage": "encode", "codec": codec_name} + continue + try: + decoded = encoded[1] if encoded[1] is not None else cross_codec.decode_rgb(encoded[0], spec, verified_preflight=verified_preflight) + if decoded.size != source_image.shape[1::-1]: + raise ValueError("decoded dimensions mismatch") + payloads[codec_name] = (encoded[0], decoded) + except Exception as exc: # noqa: BLE001 + payload_failures[codec_name] = {"class": type(exc).__name__, "reason": str(exc), "first_error": f"{type(exc).__name__}: {exc}", "stage": "decode", "codec": codec_name} + baseline_path = output / "weight_images" / "png_baseline.png" + if not baseline_path.exists(): + _write(baseline_path, source_path.read_bytes()) + for condition in cross_codec.CONDITION_IDS: + prompt_ids = {str(item["prompt_id"]) for item in prompts} + if condition_complete(rows, condition, prompt_ids, set(layers), output): + continue + condition_rows = [row for row in rows if row.get("condition") == condition] + old_weight = next((row for row in condition_rows if row.get("row_type") == "weight"), None) + spec = cross_codec.CONDITION_REGISTRY[condition] + candidate = source_values.copy() + payload_bytes = source_path.read_bytes() + protected = None + repaired_count = 0 + blocked = False + failure_stage = None + failure_reason = None + if old_weight: + if not _verify_artifact_tree(output, old_weight.get("payload"), condition + ".payload") or not _verify_artifact_tree(output, old_weight.get("protected"), condition + ".protected") or not _verify_artifact_tree(output, old_weight.get("materialized"), condition + ".materialized"): + raise ValueError("artifact tamper on resume") + else: + codec_failure = payload_failures.get(spec.codec) + if codec_failure is not None and condition != "png_baseline": + _record_codec_failure(raw_rows_path, condition, spec, prompts, layers, run_hash, codec_failure) + rows = load_rows_strict(raw_rows_path, run_hash) + continue + if condition == "png_baseline": + payload_bytes = source_path.read_bytes() + elif condition == "webp_lossless": + payload_bytes, decoded_image = payloads["webp_lossless"] + if not np.array_equal(np.asarray(decoded_image.convert("RGB")), source_image): + failure = {"class": "BitExactnessError", "reason": "WebP lossless decoded pixels differ from official RGB source", "first_error": "BitExactnessError: WebP lossless decoded pixels differ from official RGB source", "stage": "decode_invariant", "codec": "webp_lossless"} + _record_codec_failure(raw_rows_path, condition, spec, prompts, layers, run_hash, failure) + rows = load_rows_strict(raw_rows_path, run_hash) + continue + pixels = np.asarray(decoded_image.convert("RGB"), dtype=np.uint8).reshape(-1, 3)[: source_values.size] + candidate = ((pixels[:, 0].astype(np.uint16) << 8) | pixels[:, 1].astype(np.uint16)).view(np.float16) + else: + payload_bytes, decoded_image = payloads[spec.codec] + pixels = np.asarray(decoded_image.convert("RGB"), dtype=np.uint8).reshape(-1, 3)[: source_values.size] + candidate = ((pixels[:, 0].astype(np.uint16) << 8) | pixels[:, 1].astype(np.uint16)).view(np.float16) + if candidate_factory: + candidate_condition = condition.replace("_repair_zero", "_raw") + candidate = np.asarray(candidate_factory(candidate_condition, candidate), dtype=np.float16) + if spec.protected: + try: + candidate, protected, protected_meta = _protected(source_values, source_image.shape[:2], cross_codec.CODEC_SPECS[spec.codec], payload_factory, output, verified_preflight) + except Exception as exc: # noqa: BLE001 + failure = {"class": type(exc).__name__, "reason": str(exc), "first_error": f"{type(exc).__name__}: {exc}", "stage": "protected_invariant", "codec": spec.codec} + _record_codec_failure(raw_rows_path, condition, spec, prompts, layers, run_hash, failure) + rows = load_rows_strict(raw_rows_path, run_hash) + continue + payload_bytes = output.joinpath(protected["high"]["path"]).read_bytes() + output.joinpath(protected["low"]["path"]).read_bytes() + protected["metadata"] = protected_meta + elif spec.repair: + repaired = repair_nonfinite(candidate, "zero", layers) + repaired_count = repaired.repaired_value_count + candidate = repaired.values + if spec.mode == "raw" and not np.isfinite(candidate).all(): + blocked, failure_stage, failure_reason = True, "weight_gate", "raw candidate contains nonfinite values" + elif not np.isfinite(candidate).all(): + blocked, failure_stage, failure_reason = True, "weight_gate", "candidate contains nonfinite values" + payload_path = output / "payloads" / f"{condition}.bin" + _write(payload_path, payload_bytes) + payload_info = _artifact(payload_path, output) + materialized = None + if condition == "png_baseline": + materialized = _artifact(baseline_path, output) + elif not blocked: + materialized_path = output / "weight_images" / f"{condition}.png" + _write(materialized_path, materialize_fp16_png(candidate, width=source_image.shape[1])) + materialized = _artifact(materialized_path, output) + metric = _metrics(source_values, candidate, layers) + png_bytes = source_path.stat().st_size + weight = {"row_type": "weight", "stage": "weight", "condition": condition, "prompt_id": None, "run_identity_hash": run_hash, "codec": spec.codec, "mode": spec.mode, "attempted": not blocked, "status": "weight_gate_blocked" if blocked else "completed", "blocked": blocked, "failure_stage": failure_stage, "failure_class": None, "failure_reason": failure_reason, "first_failure": failure_reason, "repaired_count": repaired_count, "payload": protected or payload_info, "protected": protected, "materialized": materialized, "payload_bytes": len(payload_bytes), "payload_sha256": hashlib.sha256(payload_bytes).hexdigest(), "payload_over_png": len(payload_bytes) / png_bytes if png_bytes else None, "png_over_payload": png_bytes / len(payload_bytes) if payload_bytes else None, "size_saving_percent": (1 - len(payload_bytes) / png_bytes) * 100 if png_bytes else None, **metric} + _save_row(raw_rows_path, weight) + for layer, (start, end) in layers.items(): + _save_row(raw_rows_path, {"row_type": "layer", "stage": "layer", "condition": condition, "layer": layer, "prompt_id": None, "run_identity_hash": run_hash, **_metrics(source_values[start:end], candidate[start:end], {layer: (0, end - start)}), "repaired_count": repaired_count}) + rows = load_rows_strict(raw_rows_path, run_hash) + old_weight = weight + if old_weight and old_weight.get("blocked"): + for prompt in prompts: + if any(row.get("row_type") == "generation" and row.get("condition") == condition and row.get("prompt_id") == str(prompt["prompt_id"]) for row in rows): + continue + row = _generation_row(condition, prompt, run_hash, blocked=True, failure_stage=old_weight.get("failure_stage") or "weight_gate", first_error=old_weight.get("failure_reason")) + _save_row(raw_rows_path, row) + rows = load_rows_strict(raw_rows_path, run_hash) + continue + materialized = old_weight.get("materialized") if old_weight else None + model = None + try: + model = runtime_loader(str(output / materialized["path"])) if runtime_loader and materialized else None + except Exception as exc: # noqa: BLE001 + for prompt in prompts: + if any(row.get("row_type") == "generation" and row.get("condition") == condition and row.get("prompt_id") == str(prompt["prompt_id"]) for row in rows): + continue + _save_row(raw_rows_path, _generation_row(condition, prompt, run_hash, blocked=True, failure_stage="model_load", failure_class=type(exc).__name__, first_error=f"{type(exc).__name__}: {exc}")) + rows = load_rows_strict(raw_rows_path, run_hash) + continue + consecutive = 0 + for prompt in prompts: + if any(row.get("row_type") == "generation" and row.get("condition") == condition and row.get("prompt_id") == str(prompt["prompt_id"]) for row in rows): + continue + resource_path = output / "results" / "resource_monitor.jsonl" + existing_resource = [ + item for item in load_rows_strict(resource_path, run_hash) + if item.get("row_type") == "resource" and item.get("stage") == "resource" and item.get("condition") == condition and str(item.get("prompt_id")) == str(prompt["prompt_id"]) + ] + if len(existing_resource) > 1: + raise ValueError("conflicting resource monitor pair on resume") + snapshot = dict(existing_resource[0]) if existing_resource else sample_resource(output, condition, str(prompt["prompt_id"])) + violation = _resource_violation(snapshot) + snapshot["violation_reason"] = violation + _save_row(resource_path, {**snapshot, "row_type": "resource", "stage": "resource", "run_identity_hash": run_hash}) + consecutive = consecutive + 1 if violation else 0 + if consecutive >= 3: + manifest.update({"status": "resource_guard_failed", "resource_retry_count": int(manifest.get("resource_retry_count", 0)) + 1}) + atomic_json(manifest_path, manifest) + raise ResourceGuardError(violation or "resource guard") + started = time.perf_counter() + row = _generation_row(condition, prompt, run_hash) + try: + image, score = runtime.generate(str(prompt["prompt"]), int(prompt["initial_latent_seed"])) if hasattr(runtime, "generate") else generate_with_runtime(runtime, model, str(prompt["prompt"]), int(prompt["initial_latent_seed"]), args.steps, args.cfg, resolved) + if score is None or not math.isfinite(float(score)): + raise FloatingPointError("CLIP score is missing or nonfinite") + sample = _save_sample(image, output / "samples" / condition / f"{prompt['prompt_id']}.png", base=output) + row.update({"attempted": True, "attempt_count": 1, "completed": True, "success": True, "clip_score": float(score), "elapsed_seconds": time.perf_counter() - started, "sample_path": sample["path"], "sample_hash": sample["sha256"], "sample_bytes": sample["bytes"]}) + except Exception as exc: # noqa: BLE001 + row.update({"attempted": True, "attempt_count": 1, "completed": True, "failure_stage": "generation", "failure_class": type(exc).__name__, "first_error": f"{type(exc).__name__}: {exc}", "elapsed_seconds": time.perf_counter() - started}) + _save_row(raw_rows_path, row) + rows = load_rows_strict(raw_rows_path, run_hash) + del model + rows = load_rows_strict(raw_rows_path, run_hash) + pipeline_failure = any(row.get("row_type") == "weight" and row.get("status") == "codec_pipeline_failed" for row in rows) + complete = all(condition_complete(rows, condition, {str(item["prompt_id"]) for item in prompts}, set(layers), output) for condition in cross_codec.CONDITION_IDS) + if not complete and not pipeline_failure: + raise ValueError("completion verification failed") + resource_metadata = validate_resource_monitor(output, manifest, rows) + manifest.update({"status": "completed_with_pipeline_failures" if pipeline_failure else "completed", "completed_at": datetime.now(UTC).isoformat(), "raw_rows_sha256": sha256_file(raw_rows_path), "raw_rows_bytes": raw_rows_path.stat().st_size, "resource_monitor": {**resource_metadata, "binding_method": "run_completion"}}) + atomic_json(manifest_path, manifest) + if args.profile == "pilot": + _gate(output, manifest, rows) + return output + finally: + if lock.exists(): + lock.unlink() + + +def bind_completed_resource_monitor(output: str | Path, source_image: Path) -> Path: + """既存completed runへresource monitor provenanceだけを後付けする。""" + root = Path(output).resolve() + manifest_path = root / "manifest.json" + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + if manifest.get("status") != "completed" or manifest.get("profile") not in {"pilot", "full"}: + raise ValueError("resource migration requires a completed pilot/full run") + raw_path = root / "results" / "raw_rows.jsonl" + rows = load_rows_strict(raw_path, str(manifest.get("run_identity_hash"))) + prompt_ids = {str(item) for item in manifest.get("prompt_ids", [])} + layer_ids = {str(item) for item in manifest.get("layer_ids", [])} + for condition in cross_codec.CONDITION_IDS: + if not condition_complete(rows, condition, prompt_ids, layer_ids, root): + raise ValueError(f"completed row contract failed: {condition}") + source_path = source_image + if not source_path.is_file(): + raise ValueError("source image is missing") + if sha256_file(source_path) != manifest.get("source_sha256"): + raise ValueError("source image hash mismatch") + source_bytes = source_path.stat().st_size + if manifest.get("source_bytes") is not None and manifest.get("source_bytes") != source_bytes: + raise ValueError("source image bytes mismatch") + resource = validate_resource_monitor(root, manifest, rows) + binding_code_hash = sha256_file(__file__) + existing = manifest.get("resource_monitor") + if existing is not None: + if not isinstance(existing, Mapping) or existing.get("binding_method") not in {"post_run_verified", "run_completion"}: + raise ValueError("resource monitor is already bound with a mismatch") + if any(existing.get(key) != value for key, value in resource.items()) or existing.get("bytes") != resource.get("bytes"): + raise ValueError("resource monitor is already bound with a mismatch") + if manifest.get("source_bytes") != source_bytes: + raise ValueError("resource monitor is already bound with a mismatch") + return root + bound = {**resource, "binding_method": "post_run_verified", "bound_at": datetime.now(UTC).isoformat(), "binding_code_hash": binding_code_hash} + manifest["source_bytes"] = source_bytes + manifest["resource_monitor"] = bound + atomic_json(manifest_path, manifest) + if manifest.get("profile") == "pilot": + _gate(root, manifest, rows) + return root + + +def main() -> None: + """CLI entrypoint。""" + logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") + args = build_parser().parse_args() + if args.bind_resource_monitor: + bind_completed_resource_monitor(args.output, Path(args.image)) + return + run(args) + + +if __name__ == "__main__": + main() diff --git a/scripts/pixelmodel_robustness/metrics.py b/scripts/pixelmodel_robustness/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..ef7caae12a56c8f741f7a6bf9dd7065da1c40569 --- /dev/null +++ b/scripts/pixelmodel_robustness/metrics.py @@ -0,0 +1,138 @@ +"""Weight and image quality metrics.""" + +from __future__ import annotations + +import math +from collections.abc import Mapping, Sequence + +import numpy as np + + +def finite_metrics(values: np.ndarray) -> dict[str, int | float]: + """NaN/Inf/subnormalを修復せずに数える。""" + array = np.asarray(values) + finite = np.isfinite(array) + subnormal = np.isfinite(array) & (array != 0) & (np.abs(array) < np.finfo(array.dtype).tiny) if np.issubdtype(array.dtype, np.floating) else np.zeros(array.shape, dtype=bool) + total = int(array.size) + return { + "total_count": total, + "finite_only_count": int(finite.sum()), + "finite_rate": float(finite.mean()) if total else 1.0, + "nan_count": int(np.isnan(array).sum()), + "posinf_count": int(np.isposinf(array).sum()), + "neginf_count": int(np.isneginf(array).sum()), + "subnormal_count": int(subnormal.sum()), + "subnormal_rate": float(subnormal.mean()) if total else 0.0, + } + + +def channel_change_metrics(reference: np.ndarray, candidate: np.ndarray) -> dict[str, int | float]: + """RGBのbyte/bit/pixel変更数とrateを計算する。""" + left = np.asarray(reference, dtype=np.uint8) + right = np.asarray(candidate, dtype=np.uint8) + if left.shape != right.shape or left.ndim != 3 or left.shape[-1] != 3: + raise ValueError("reference and candidate must be equal-shaped RGB arrays") + changed = left != right + bits = np.unpackbits(np.bitwise_xor(left, right), axis=-1).reshape(*left.shape[:2], 24) + result: dict[str, int | float] = { + "changed_pixel_count": int(changed.any(axis=2).sum()), + "changed_pixel_rate": float(changed.any(axis=2).mean()), + "changed_bit_count": int(bits.sum()), + "changed_bit_rate": float(bits.mean()), + } + for index, name in enumerate(("red", "green", "blue")): + result[f"{name}_changed_byte_count"] = int(changed[..., index].sum()) + result[f"{name}_changed_byte_rate"] = float(changed[..., index].mean()) + result[f"{name}_changed_bit_count"] = int(bits[..., index * 8:(index + 1) * 8].sum()) + result[f"{name}_changed_bit_rate"] = float(bits[..., index * 8:(index + 1) * 8].mean()) + return result + + +def _finite_pair(reference: np.ndarray, candidate: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + mask = np.isfinite(reference) & np.isfinite(candidate) + return reference[mask].astype(np.float64), candidate[mask].astype(np.float64) + + +def _metrics(reference: np.ndarray, candidate: np.ndarray) -> dict[str, float]: + ref, cand = _finite_pair(reference, candidate) + if not len(ref): + return {"l2": float("nan"), "mse": float("nan"), "cosine": float("nan"), "max_abs": float("nan"), "changed_percent": 100.0} + diff = cand - ref + denom = np.linalg.norm(ref) * np.linalg.norm(cand) + return {"l2": float(np.linalg.norm(diff)), "mse": float(np.mean(diff * diff)), "cosine": float(np.dot(ref, cand) / denom) if denom else 1.0, "max_abs": float(np.max(np.abs(diff))), "changed_percent": float(np.mean(diff != 0) * 100)} + + +def normalized_rmse(reference: np.ndarray, candidate: np.ndarray, eps: float = 1e-12) -> float: + """有限要素のRMSEをreferenceのRMSで正規化する。""" + ref, cand = _finite_pair(np.asarray(reference), np.asarray(candidate)) + if not len(ref): + return float("nan") + return float(np.sqrt(np.mean((cand - ref) ** 2)) / (np.sqrt(np.mean(ref ** 2)) + eps)) + + +def ulp_distance(reference: np.ndarray, candidate: np.ndarray) -> np.ndarray: + """有限float32のbit patternを全順序へ写像してULP距離を返す。""" + ref = np.asarray(reference, dtype=np.float32) + cand = np.asarray(candidate, dtype=np.float32) + mask = np.isfinite(ref) & np.isfinite(cand) + ref_bits = ref.view(np.int32).astype(np.int64) + cand_bits = cand.view(np.int32).astype(np.int64) + ref_order = np.where(ref_bits < 0, 0x80000000 - ref_bits, ref_bits) + cand_order = np.where(cand_bits < 0, 0x80000000 - cand_bits, cand_bits) + return np.abs(ref_order[mask] - cand_order[mask]) + + +def weight_metrics(reference: np.ndarray, candidate: np.ndarray, layers: Mapping[str, tuple[int, int]]) -> dict[str, object]: + """NaN/Infを補完せずにglobal/layer weight metricsを計算する。""" + ref = np.asarray(reference).reshape(-1) + cand = np.asarray(candidate).reshape(-1) + base = _metrics(ref, cand) + finite = finite_metrics(np.asarray(candidate)) + ulp = ulp_distance(reference, candidate) + nonfinite_count = int((~np.isfinite(cand)).sum()) + result: dict[str, object] = { + "finite": bool(np.isfinite(cand).all()), + "nonfinite_count": int((~np.isfinite(ref)).sum() + nonfinite_count), + "reference_nonfinite_count": int((~np.isfinite(ref)).sum()), + "candidate_nonfinite_count": nonfinite_count, + "global_l2": base["l2"], "global_mse": base["mse"], "global_cosine": base["cosine"], + "global_max_abs": base["max_abs"], "global_changed_percent": float(np.mean(ref != cand) * 100), + "normalized_rmse": normalized_rmse(ref, cand), + "ulp_p50": float(np.percentile(ulp, 50)) if len(ulp) else float("nan"), + "ulp_p95": float(np.percentile(ulp, 95)) if len(ulp) else float("nan"), + **finite, + "layers": [], + } + result["layers"] = [] + for name, (start, end) in layers.items(): + raw_ref = np.asarray(reference).reshape(-1)[start:end] + raw_cand = np.asarray(candidate).reshape(-1)[start:end] + layer_ref, layer_cand = _finite_pair(raw_ref, raw_cand) + result["layers"].append({"layer": name, **_metrics(layer_ref, layer_cand), "finite": bool(np.isfinite(raw_cand).all()), "nonfinite_count": int((~np.isfinite(raw_cand)).sum()), "normalized_rmse": normalized_rmse(raw_ref, raw_cand)}) + return result + + +def _ssim(reference: np.ndarray, candidate: np.ndarray) -> float: + from skimage.metrics import structural_similarity + size = min(reference.shape[:2]) + win_size = min(7, size if size % 2 else size - 1) + return float(structural_similarity(reference, candidate, channel_axis=2, data_range=255, win_size=win_size)) + + +def image_metrics(reference: np.ndarray, candidate: np.ndarray, reference_size: int, file_size: int) -> dict[str, float | int]: + """RGB画像のPSNR/SSIMとstorage metricsを返す。""" + ref = np.asarray(reference, dtype=np.float64) + cand = np.asarray(candidate, dtype=np.float64) + mse = float(np.mean((ref - cand) ** 2)) + psnr = float("inf") if mse == 0 else float(20 * math.log10(255.0 / math.sqrt(mse))) + return {"image_mse": mse, "psnr": psnr, "ssim": max(-1.0, min(1.0, _ssim(ref, cand))), "file_size_bytes": int(file_size), "compression_ratio": float(reference_size / file_size) if file_size else float("inf")} + + +def bootstrap_ci(values: Sequence[float], seed: int = 0, samples: int = 2000) -> tuple[float, float]: + """paired値のpercentile bootstrap 95% CIを計算する。""" + array = np.asarray(values, dtype=float) + if array.size == 0: + return float("nan"), float("nan") + rng = np.random.default_rng(seed) + means = np.array([rng.choice(array, array.size, replace=True).mean() for _ in range(samples)]) + return float(np.percentile(means, 2.5)), float(np.percentile(means, 97.5)) diff --git a/scripts/pixelmodel_robustness/prompts.py b/scripts/pixelmodel_robustness/prompts.py new file mode 100644 index 0000000000000000000000000000000000000000..65c8e39abdde21ccd63576327c9b0a4852e29e5a --- /dev/null +++ b/scripts/pixelmodel_robustness/prompts.py @@ -0,0 +1,63 @@ +"""Deterministic paired prompt manifest.""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +CATEGORIES = ("animals", "people", "landscapes", "vehicles", "architecture", "food", "indoor", "abstract") +SUBJECTS = { + "animals": ["red fox crossing a snowy ridge", "sea turtle above a coral reef", "owl on a mossy branch", "elephant family at dusk", "golden retriever in a farmers market", "penguin colony on blue ice", "dragonfly on a lotus pond", "wild horse in desert wind", "sleeping koala in eucalyptus", "humpback whale breaching offshore"], + "people": ["violinist backstage before a concert", "ceramic artist shaping a bowl", "runner crossing a bridge at dawn", "grandmother reading beside a window", "astronomer under a meteor shower", "street dancer in a neon alley", "gardener holding heirloom tomatoes", "chef plating a tasting menu", "child flying a paper kite", "sailor repairing a bright red net"], + "landscapes": ["volcanic valley beneath low clouds", "lavender fields in Provence", "desert canyon after rain", "fjord with a small wooden ferry", "autumn forest reflected in a lake", "rice terraces in morning mist", "coastal cliffs under storm light", "alpine meadow with a footpath", "tropical waterfall behind ferns", "salt flats mirroring the night sky"], + "vehicles": ["yellow tram turning through old streets", "sailboat in a harbor of lanterns", "red bicycle beside a canal", "electric train entering a tunnel", "vintage airplane in a hangar", "motorcycle on a coastal road", "blue pickup at a rural gas station", "submarine beneath polar ice", "hot air balloon over vineyards", "kayak on a glassy river"], + "architecture": ["brutalist library in winter", "wooden temple surrounded by cedars", "Art Deco cinema at twilight", "floating pavilion on a lake", "desert observatory with domes", "narrow townhouse courtyard", "futuristic transit station", "stone bridge over a market canal", "greenhouse made of iron and glass", "lighthouse on a basalt shore"], + "food": ["sourdough loaf cooling on linen", "ramen bowl in a tiny Tokyo shop", "summer peaches on a blue plate", "spice market with open jars", "chocolate cake with raspberry glaze", "breakfast table with coffee and oranges", "handmade dumplings on bamboo", "roasted vegetables on a ceramic platter", "lemon tart beside garden flowers", "night market skewers over charcoal"], + "indoor": ["sunlit reading nook with a velvet chair", "rainy day kitchen with copper pans", "minimal studio with a drafting table", "old train compartment with luggage", "music room filled with records", "green apartment balcony after watering", "museum gallery with a skylight", "warm cabin bedroom with quilts", "maker workshop with wooden tools", "quiet cafe corner beside a window"], + "abstract": ["ink spirals colliding with gold leaf", "isometric cubes in coral and teal", "watercolor gradients like a topographic map", "paper cut shapes casting long shadows", "glass ribbons twisting in sunlight", "monochrome circles with one yellow accent", "liquid metal waves on black", "woven threads forming a labyrinth", "pixel mosaic inspired by ocean tides", "floating geometric shards in soft fog"], +} + + +def build_prompts(count: int = 100) -> list[dict[str, object]]: + """8カテゴリを循環し、stable IDとpaired seedを付けたpromptを作る。""" + if count < 1: + raise ValueError("count must be positive") + result: list[dict[str, object]] = [] + for index in range(count): + category = CATEGORIES[index % len(CATEGORIES)] + variant = index // len(CATEGORIES) + prompt = f"{SUBJECTS[category][variant % len(SUBJECTS[category])]}, {('wide composition' if variant % 3 == 0 else 'intimate composition' if variant % 3 == 1 else 'cinematic composition')}, {('morning light' if variant % 4 == 0 else 'soft overcast light' if variant % 4 == 1 else 'late afternoon light' if variant % 4 == 2 else 'blue hour light')}, high detail, scene {index + 1}" + prompt_id = f"pm4-{index + 1:03d}-{hashlib.sha256(prompt.encode()).hexdigest()[:8]}" + seed = 10_000 + index + result.append({"prompt_id": prompt_id, "category": category, "prompt": prompt, "seed": seed, "paired_seed": seed, "initial_latent_seed": seed}) + return result + + +def load_prompt_manifest(path: str | Path) -> list[dict[str, object]]: + """version-controlled prompt manifestを検証して読む。""" + entries = json.loads(Path(path).read_text(encoding="utf-8")) + if not isinstance(entries, list) or len(entries) != 100: + raise ValueError("prompt manifest must contain exactly 100 entries") + texts = [str(item["prompt"]) for item in entries] + if len(set(texts)) != 100: + raise ValueError("prompt text must be unique") + for item in entries: + if {"prompt_id", "category", "prompt", "seed", "initial_latent_seed"} - item.keys(): + raise ValueError("prompt entry schema is incomplete") + if item["category"] not in CATEGORIES: + raise ValueError(f"unknown prompt category: {item['category']}") + if any(sum(item["category"] == category for item in entries) < 10 for category in CATEGORIES): + raise ValueError("each prompt category requires at least 10 entries") + return entries + + +def write_prompt_manifest(path: str | Path, count: int = 100) -> str: + """prompt manifestをJSONへ書き、sha256を返す。""" + target = Path(path) + if count == 100 and Path(path).exists(): + payload = load_prompt_manifest(path) + else: + payload = build_prompts(count) + target.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n") + return hashlib.sha256(target.read_bytes()).hexdigest() diff --git a/scripts/pixelmodel_robustness/storage.py b/scripts/pixelmodel_robustness/storage.py new file mode 100644 index 0000000000000000000000000000000000000000..a8b8dd0d1773bab9469b5057002205fc117fbe06 --- /dev/null +++ b/scripts/pixelmodel_robustness/storage.py @@ -0,0 +1,117 @@ +"""Atomic and append-only study storage.""" + +from __future__ import annotations + +import hashlib +import json +import os +import tempfile +from pathlib import Path +from typing import Any + + +def atomic_json(path: str | Path, payload: dict[str, Any]) -> None: + """同一ディレクトリ内のtemporary fileからmanifestをatomic replaceする。""" + target = Path(path) + target.parent.mkdir(parents=True, exist_ok=True) + fd, temporary = tempfile.mkstemp(prefix=f".{target.name}.", dir=target.parent) + try: + with os.fdopen(fd, "w", encoding="utf-8") as stream: + json.dump(payload, stream, ensure_ascii=False, indent=2, sort_keys=True) + stream.write("\n") + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, target) + finally: + if os.path.exists(temporary): + os.unlink(temporary) + + +def load_manifest(path: str | Path) -> dict[str, Any]: + """存在するmanifestを読み、無ければ空のpartial stateを返す。""" + target = Path(path) + return json.loads(target.read_text(encoding="utf-8")) if target.exists() else {"status": "partial"} + + +def save_jsonl_row(path: str | Path, row: dict[str, Any]) -> None: + """canonical rowをidentity upsertし、atomicに保存する。""" + target = Path(path) + target.parent.mkdir(parents=True, exist_ok=True) + rows = read_jsonl_rows(target) + identity = _row_identity(row) + replaced = False + for index, existing in enumerate(rows): + if _row_identity(existing) == identity: + rows[index] = row + replaced = True + break + if not replaced: + rows.append(row) + fd, temporary = tempfile.mkstemp(prefix=f".{target.name}.", dir=target.parent) + try: + with os.fdopen(fd, "w", encoding="utf-8") as stream: + for item in rows: + stream.write(json.dumps(item, ensure_ascii=False, allow_nan=False) + "\n") + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, target) + finally: + if os.path.exists(temporary): + os.unlink(temporary) + + +def _row_identity(row: dict[str, Any]) -> str: + """canonical raw rowの重複排除キー。""" + fields = ("condition", "prompt_id", "stage", "row_type") + return json.dumps({key: row.get(key) for key in fields}, sort_keys=True) + + +def read_jsonl_rows(path: str | Path) -> list[dict[str, Any]]: + """canonical raw JSONLを読み、identity keyでdedupeする。""" + target = Path(path) + if not target.exists(): + return [] + rows: dict[str, dict[str, Any]] = {} + for line in target.read_text(encoding="utf-8").splitlines(): + if line.strip(): + row = json.loads(line) + rows[_row_identity(row)] = row + return list(rows.values()) + + +def assert_resume_identity(existing: dict[str, Any], current: dict[str, Any]) -> None: + """scientific identityが違うresumeをfail-closedで拒否する。""" + if existing == {"status": "partial"}: + return + keys = ("source_sha256", "config_sha256", "prompt_sha256", "model_sha256", "real_content_hash", "cli_identity") + mismatches = [key for key in keys if key not in existing or existing.get(key) != current.get(key)] + if mismatches: + raise ValueError(f"resume identity mismatch: {', '.join(mismatches)}") + + +def validate_real_manifest(path: str | Path) -> dict[str, Any]: + """FID用real manifestのpath/hashを検証する。""" + target = Path(path) + payload = json.loads(target.read_text(encoding="utf-8")) + images = payload.get("images") if isinstance(payload, dict) else payload + if not isinstance(images, list) or not images: + raise ValueError("real images manifest must contain a non-empty images list") + enriched: list[dict[str, Any]] = [] + ordered = hashlib.sha256() + for item in images: + image = Path(item["path"] if isinstance(item, dict) else item) + if not image.is_absolute(): + image = target.parent / image + if not image.exists(): + raise FileNotFoundError(image) + digest = hashlib.sha256() + with image.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + item_data = dict(item) if isinstance(item, dict) else {"path": str(item)} + item_data["sha256"] = digest.hexdigest() + enriched.append(item_data) + ordered.update(str(item_data["path"]).encode()) + ordered.update(b"\0") + ordered.update(digest.digest()) + return {"path": str(target), "n": len(enriched), "manifest_sha256": hashlib.sha256(target.read_bytes()).hexdigest(), "real_content_hash": ordered.hexdigest(), "images": enriched} diff --git a/scripts/render_visual_tables.py b/scripts/render_visual_tables.py new file mode 100644 index 0000000000000000000000000000000000000000..a726385b6bb66fb114fcf3b9d185782ea27649ad --- /dev/null +++ b/scripts/render_visual_tables.py @@ -0,0 +1,239 @@ +"""Render portable, fail-closed representative cross-codec visual tables.""" + +from __future__ import annotations + +import argparse +import hashlib +import io +import json +import logging +import os +import stat +import textwrap +from pathlib import Path +from typing import Any + +from PIL import Image, ImageDraw, ImageFont + +LOGGER = logging.getLogger(__name__) +CODECS: dict[str, tuple[str, str, str, str]] = { + "jpeg_q100": ("JPEG Q100", "jpeg_q100_raw", "jpeg_q100_repair_zero", "jpeg_q100_protected_high"), + "jpeg_q80": ("JPEG Q80", "jpeg_q80_raw", "jpeg_q80_repair_zero", "jpeg_q80_protected_high"), + "webp_q80": ("WebP Q80", "webp_q80_raw", "webp_q80_repair_zero", "webp_q80_protected_high"), + "avif_q70": ("AVIF Q70", "avif_q70_raw", "avif_q70_repair_zero", "avif_q70_protected_high"), + "jxl_d1": ("JPEG XL d1", "jxl_d1_raw", "jxl_d1_repair_zero", "jxl_d1_protected_high"), +} +COLUMNS = (("Baseline PNG", "png_baseline"), ("WebP Lossless", "webp_lossless")) +BG, PANEL, TEXT, MUTED, ACCENT, FAIL = "#0d141b", "#111b24", "#edf5fb", "#9fb4c3", "#8bd5f7", "#ffb1c6" + + +def _font(size: int, mono: bool = False) -> ImageFont.FreeTypeFont | ImageFont.ImageFont: + candidates = ( + ("/System/Library/Fonts/SFNSMono.ttf", "/System/Library/Fonts/SFNS.ttf") + if mono + else ("/System/Library/Fonts/SFNS.ttf",) + ) + for candidate in candidates: + if Path(candidate).is_file(): + return ImageFont.truetype(candidate, size) + return ImageFont.load_default() + + +def load_prompt_ids(path: str | Path) -> list[str]: + """Load an ordered prompt-id manifest without guessing missing prompts.""" + value = json.loads(Path(path).read_text(encoding="utf-8")) + ids = value.get("prompt_ids") if isinstance(value, dict) else value + if not isinstance(ids, list) or not ids or not all(isinstance(item, (str, int)) for item in ids): + raise ValueError("prompt-id manifest must contain a non-empty prompt_ids list") + result = [str(item) for item in ids] + if len(result) != len(set(result)): + raise ValueError("prompt-id manifest contains duplicates") + return result + + +def _sample_hash(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def _read_sample_bytes_no_follow(root: Path, relative: str) -> bytes: + """Open every path component without following symlinks and return immutable bytes.""" + candidate = Path(relative) + if candidate.is_absolute() or not candidate.parts or any(part in {"", ".", ".."} for part in candidate.parts): + raise ValueError(f"path escapes run: {relative}") + required_flags = ("O_DIRECTORY", "O_NOFOLLOW", "O_NONBLOCK") + if any(not hasattr(os, name) for name in required_flags): + raise ValueError("safe sample opening is unsupported on this platform") + no_follow = os.O_NOFOLLOW + directory_flags = os.O_RDONLY | os.O_DIRECTORY | no_follow + directory_fd = -1 + file_fd = -1 + try: + directory_fd = os.open(root, directory_flags) + for part in candidate.parts[:-1]: + next_fd = os.open(part, directory_flags, dir_fd=directory_fd) + os.close(directory_fd) + directory_fd = next_fd + file_fd = os.open(candidate.parts[-1], os.O_RDONLY | no_follow | os.O_NONBLOCK, dir_fd=directory_fd) + if not stat.S_ISREG(os.fstat(file_fd).st_mode): + raise ValueError(f"successful sample is not a regular file: {relative}") + with os.fdopen(file_fd, "rb") as handle: + file_fd = -1 + return handle.read() + except OSError as exc: + raise ValueError(f"successful sample cannot be opened without following symlinks: {relative}") from exc + finally: + if file_fd >= 0: + os.close(file_fd) + if directory_fd >= 0: + os.close(directory_fd) + + +def _safe_run_path(root: Path, relative: str) -> Path: + candidate = Path(relative) + if candidate.is_absolute(): + raise ValueError(f"path escapes run: {relative}") + raw_path = root / candidate + if raw_path.is_symlink(): + raise ValueError(f"path is a symlink: {relative}") + path = raw_path.resolve() + try: + path.relative_to(root) + except ValueError as exc: + raise ValueError(f"path escapes run: {relative}") from exc + return path + + +def load_rows(run_dir: str | Path, prompt_ids: list[str]) -> dict[tuple[str, str], dict[str, Any]]: + """Load a complete generation matrix and reject unverifiable success rows.""" + root = Path(run_dir).resolve() + path = _safe_run_path(root, "results/raw_rows.jsonl") + if path.is_symlink() or not path.is_file(): + raise ValueError("raw_rows.jsonl is missing or is a symlink") + rows: dict[tuple[str, str], dict[str, Any]] = {} + conditions = {"png_baseline", "webp_lossless"} | {item for codec in CODECS.values() for item in codec[1:]} + for line_number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1): + if not line.strip(): + continue + row = json.loads(line) + if row.get("row_type") != "generation": + continue + condition, prompt_id = str(row.get("condition")), str(row.get("prompt_id")) + if condition not in conditions or prompt_id not in prompt_ids: + continue + key = (condition, prompt_id) + if key in rows: + raise ValueError(f"duplicate generation row: {condition}/{prompt_id}") + if row.get("success"): + sample = row.get("sample_path") + if not isinstance(sample, str) or not sample: + raise ValueError(f"successful row has no sample path: {condition}/{prompt_id}") + sample_path = _safe_run_path(root, sample) + if not sample_path.is_file() or sample_path.is_symlink(): + raise ValueError(f"successful sample is missing: {sample}") + recorded = row.get("sample_sha256", row.get("sample_hash")) + if recorded is not None and recorded != _sample_hash(sample_path): + raise ValueError(f"sample hash mismatch: {sample}") + else: + if row.get("sample_path") or row.get("sample_sha256") or row.get("sample_hash"): + raise ValueError(f"failed row contains sample provenance: {condition}/{prompt_id}") + rows[key] = row + missing = [ + (condition, prompt_id) + for condition in sorted(conditions) + for prompt_id in prompt_ids + if (condition, prompt_id) not in rows + ] + if missing: + raise ValueError(f"generation matrix incomplete; first missing cell: {missing[0]}") + return rows + + +def _failure_label(row: dict[str, Any]) -> str: + if row.get("blocked"): + return "NO SAMPLE\n\nWEIGHT GATE\nnon-finite weights" + error = str(row.get("error") or row.get("first_error") or "generation failed") + return "NO SAMPLE\n\nGENERATION\n" + ("non-finite output" if "non-finite" in error.lower() else "generation failed") + + +def _draw_cell( + canvas: Image.Image, draw: ImageDraw.ImageDraw, root: Path, row: dict[str, Any], x: int, y: int, size: int +) -> None: + if row.get("success"): + sample_bytes = _read_sample_bytes_no_follow(root, str(row["sample_path"])) + recorded_bytes = row.get("sample_bytes") + if recorded_bytes is not None and (not isinstance(recorded_bytes, int) or recorded_bytes != len(sample_bytes)): + raise ValueError(f"sample byte count mismatch: {row['sample_path']}") + recorded_hash = row.get("sample_sha256", row.get("sample_hash")) + if recorded_hash is not None and recorded_hash != hashlib.sha256(sample_bytes).hexdigest(): + raise ValueError(f"sample hash mismatch: {row['sample_path']}") + with Image.open(io.BytesIO(sample_bytes)) as image: + canvas.paste(image.convert("RGB").resize((size, size), Image.Resampling.LANCZOS), (x, y)) + draw.rectangle((x, y, x + size, y + size), outline="#263746") + if row.get("clip_score") is not None: + draw.text((x, y + size + 6), f"CLIP {float(row['clip_score']):.3f}", font=_font(14, True), fill=ACCENT) + else: + draw.rectangle((x, y, x + size, y + size), fill="#351d28", outline="#e96a91", width=2) + draw.multiline_text((x + 12, y + 12), _failure_label(row), font=_font(14, True), fill=FAIL, spacing=4) + + +def render( + codec_key: str, + codec: tuple[str, str, str, str], + root: Path, + prompts: list[dict[str, Any]], + rows: dict[tuple[str, str], dict[str, Any]], + output: Path, +) -> Path: + """Render one codec comparison table; failed cells remain explicit panels.""" + columns = COLUMNS + ( + (f"{codec[0]} Raw", codec[1]), + ("Finite Repair Zero", codec[2]), + ("Protected High Byte", codec[3]), + ) + size, label_width, gap, row_height = 220, 285, 30, 292 + canvas = Image.new( + "RGB", (24 + label_width + len(columns) * (size + gap), 160 + len(prompts) * row_height + 70), BG + ) + draw = ImageDraw.Draw(canvas) + draw.text((24, 20), f"PixelModel-v4 · {codec[0]} robustness", font=_font(25), fill=TEXT) + draw.text((24, 57), "100 prompts · 50 steps · CFG 6.0 · representative prompts", font=_font(15, True), fill=MUTED) + top = 150 + for index, (title, _) in enumerate(columns): + x = 24 + label_width + index * (size + gap) + draw.multiline_text((x, 95), title, font=_font(16), fill=ACCENT, spacing=3) + for index, prompt in enumerate(prompts): + y = top + index * row_height + draw.text((24, y + 5), str(prompt.get("category", "")).upper(), font=_font(14), fill=ACCENT) + draw.text((24, y + 30), str(prompt["prompt_id"]), font=_font(13, True), fill=TEXT) + wrapped = "\n".join(textwrap.wrap(str(prompt.get("prompt", "")), width=34)) + draw.multiline_text((24, y + 58), wrapped, font=_font(13), fill=TEXT, spacing=3) + prompt_id = str(prompt["prompt_id"]) + for column, (_, condition) in enumerate(columns): + _draw_cell( + canvas, draw, root, rows[(condition, prompt_id)], 24 + label_width + column * (size + gap), y, size + ) + destination = output / f"visual_table_{codec_key}.png" + destination.parent.mkdir(parents=True, exist_ok=True) + canvas.save(destination, format="PNG", optimize=True) + return destination + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--run-dir", type=Path, required=True) + parser.add_argument("--prompt-ids-manifest", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") + prompt_ids = load_prompt_ids(args.prompt_ids_manifest) + rows = load_rows(args.run_dir, prompt_ids) + prompts = [rows[("png_baseline", prompt_id)] for prompt_id in prompt_ids] + output = args.output + for key, codec in CODECS.items(): + render(key, codec, args.run_dir.resolve(), prompts, rows, output) + LOGGER.info("rendered %d tables to %s", len(CODECS), output) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/verify_archive.py b/scripts/verify_archive.py new file mode 100644 index 0000000000000000000000000000000000000000..f643fc0d0a2b94bfda91cec7b13439aac6b525f0 --- /dev/null +++ b/scripts/verify_archive.py @@ -0,0 +1,264 @@ +"""Verify the integrity and provenance of an archived research repository.""" + +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import logging +from pathlib import Path +from typing import Any + +LOGGER = logging.getLogger(__name__) +ARCHIVE_MANIFEST = Path("results/archive_manifest.json") +RAW_ROWS = Path("results/raw_rows.jsonl") +WEIGHT_MANIFEST = Path("weights/manifest.csv") +ARCHIVE_DIRS = ("images", "results", "samples", "weights") + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _safe_relative(root: Path, raw_path: str) -> Path: + candidate = Path(raw_path) + if candidate.is_absolute(): + raise ValueError(f"path containment violation: {raw_path}") + raw_candidate = root / candidate + if raw_candidate.is_symlink(): + raise ValueError(f"path is a symlink: {raw_path}") + resolved = raw_candidate.resolve() + try: + resolved.relative_to(root.resolve()) + except ValueError as exc: + raise ValueError(f"path containment violation: {raw_path}") from exc + return resolved + + +def _relative_path(root: Path, path: Path) -> str: + return path.relative_to(root).as_posix() + + +def _validate_entry(root: Path, entry: dict[str, Any], *, label: str) -> Path: + raw_path = entry.get("path", entry.get("artifact_path")) + if not isinstance(raw_path, str) or not raw_path: + raise ValueError(f"{label}: missing path") + path = _safe_relative(root, raw_path) + if path.is_symlink(): + raise ValueError(f"{label}: symlink is not allowed: {raw_path}") + if not path.is_file(): + raise ValueError(f"{label}: listed file is missing: {raw_path}") + expected_bytes = entry.get("bytes", entry.get("size")) + expected_sha = entry.get("sha256", entry.get("sha")) + if not isinstance(expected_bytes, int) or path.stat().st_size != expected_bytes: + raise ValueError(f"{label}: byte count mismatch: {raw_path}") + if not isinstance(expected_sha, str) or _sha256(path) != expected_sha: + raise ValueError(f"{label}: SHA-256 mismatch: {raw_path}") + return path + + +def _manifest_entries(value: Any) -> list[dict[str, Any]]: + if isinstance(value, list): + entries = value + elif isinstance(value, dict): + entries = value.get("files", value.get("artifacts")) + else: + entries = None + if not isinstance(entries, list) or not all(isinstance(entry, dict) for entry in entries): + raise ValueError("archive manifest must contain a files/artifacts list") + return entries + + +def _read_weight_manifest(root: Path) -> list[dict[str, Any]]: + path = _safe_relative(root, str(WEIGHT_MANIFEST)) + if path.is_symlink() or not path.is_file(): + raise ValueError("weights/manifest.csv is missing or is a symlink") + with path.open(newline="", encoding="utf-8") as handle: + rows = list(csv.DictReader(handle)) + if not rows: + raise ValueError("weights/manifest.csv contains no entries") + normalized: list[dict[str, Any]] = [] + for index, row in enumerate(rows, 1): + try: + byte_count = int(row.get("bytes", row.get("size", ""))) + except ValueError as exc: + raise ValueError(f"weights manifest row {index}: invalid bytes") from exc + normalized.append( + {"path": row.get("path", row.get("artifact_path")), "bytes": byte_count, "sha256": row.get("sha256", row.get("sha"))} + ) + return normalized + + +def _load_jsonl_generation_rows(root: Path, conditions: list[str], prompt_count: int) -> list[dict[str, Any]]: + raw_path = _safe_relative(root, str(RAW_ROWS)) + if raw_path.is_symlink() or not raw_path.is_file(): + raise ValueError("results/raw_rows.jsonl is missing or is a symlink") + rows: list[dict[str, Any]] = [] + seen: set[tuple[str, str]] = set() + try: + lines = raw_path.read_text(encoding="utf-8").splitlines() + except (OSError, UnicodeDecodeError) as exc: + raise ValueError("results/raw_rows.jsonl is not valid UTF-8") from exc + for line_number, line in enumerate(lines, 1): + if not line.strip(): + continue + try: + row = json.loads(line) + except json.JSONDecodeError as exc: + raise ValueError(f"raw_rows.jsonl line {line_number} is not valid JSON") from exc + if not isinstance(row, dict): + raise TypeError(f"raw_rows.jsonl line {line_number} is not a JSON object") + if row.get("row_type") != "generation": + continue + condition = row.get("condition") + prompt_id = row.get("prompt_id") + if not isinstance(condition, str) or condition not in conditions: + raise ValueError(f"generation row {line_number}: unknown condition") + if not isinstance(prompt_id, str) or not prompt_id: + raise ValueError(f"generation row {line_number}: missing prompt_id") + key = (condition, prompt_id) + if key in seen: + raise ValueError(f"duplicate generation row: {condition}/{prompt_id}") + seen.add(key) + rows.append(row) + expected_rows = len(conditions) * prompt_count + if len(rows) != expected_rows: + raise ValueError(f"generation row count mismatch: expected {expected_rows}, got {len(rows)}") + prompt_ids = {str(row["prompt_id"]) for row in rows} + if len(prompt_ids) != prompt_count: + raise ValueError(f"prompt count mismatch: expected {prompt_count}, got {len(prompt_ids)}") + return rows + + +def _validate_generation_provenance(root: Path, rows: list[dict[str, Any]], archive_paths: set[str]) -> int: + successful = 0 + for row in rows: + condition = str(row["condition"]) + prompt_id = str(row["prompt_id"]) + label = f"generation {condition}/{prompt_id}" + provenance = (row.get("sample_path"), row.get("sample_hash"), row.get("sample_sha256"), row.get("sample_bytes")) + if row.get("success"): + sample_raw, sample_hash, sample_sha256, sample_bytes = provenance + if not isinstance(sample_raw, str) or not sample_raw: + raise ValueError(f"{label}: successful row has no sample path") + sample_path = _safe_relative(root, sample_raw) + if sample_path.is_symlink() or not sample_path.is_file(): + raise ValueError(f"{label}: successful sample is missing or is a symlink") + actual_bytes = sample_path.stat().st_size + actual_hash = _sha256(sample_path) + if not isinstance(sample_bytes, int) or actual_bytes != sample_bytes: + raise ValueError(f"{label}: sample byte count mismatch") + hashes = [value for value in (sample_hash, sample_sha256) if value is not None] + if not hashes or any(not isinstance(value, str) or value != actual_hash for value in hashes): + raise ValueError(f"{label}: sample SHA-256 mismatch") + relative = _relative_path(root, sample_path) + if relative not in archive_paths: + raise ValueError(f"{label}: sample is not listed in archive manifest: {relative}") + successful += 1 + elif any(value is not None for value in provenance): + raise ValueError(f"{label}: failed row contains sample provenance") + return successful + + +def _reject_unlisted_tree_files(root: Path, archive_paths: set[str]) -> None: + for directory in ARCHIVE_DIRS: + for path in (root / directory).rglob("*"): + if path.is_symlink(): + raise ValueError(f"symlink found in archived tree: {_relative_path(root, path)}") + if path.is_file(): + relative = _relative_path(root, path) + if relative == ARCHIVE_MANIFEST.as_posix(): + continue + if relative not in archive_paths: + raise ValueError(f"unlisted file in archived tree: {relative}") + + +def verify_archive(root: str | Path) -> dict[str, int]: + """Verify archive files, raw generation provenance, containment, and symlink safety.""" + archive_root = Path(root).resolve() + if not archive_root.is_dir(): + raise ValueError(f"archive root is not a directory: {archive_root}") + for directory in ARCHIVE_DIRS: + path = _safe_relative(archive_root, directory) + if path.is_symlink() or not path.is_dir(): + raise ValueError(f"archive directory missing or symlinked: {directory}") + + manifest_path = _safe_relative(archive_root, str(ARCHIVE_MANIFEST)) + if manifest_path.is_symlink() or not manifest_path.is_file(): + raise ValueError("results/archive_manifest.json is missing or is a symlink") + try: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + except (OSError, UnicodeDecodeError, json.JSONDecodeError) as exc: + raise ValueError("archive manifest is not valid UTF-8 JSON") from exc + if not isinstance(manifest, dict): + raise TypeError("archive manifest must be a JSON object") + profile = manifest.get("profile") + prompt_count = manifest.get("prompt_count") + conditions = manifest.get("conditions") + if not isinstance(profile, str) or not profile: + raise ValueError("archive manifest profile is missing") + if not isinstance(prompt_count, int) or prompt_count <= 0: + raise ValueError("archive manifest prompt_count is invalid") + if not isinstance(conditions, list) or not conditions or not all(isinstance(item, str) for item in conditions): + raise ValueError("archive manifest conditions are invalid") + if len(set(conditions)) != len(conditions): + raise ValueError("archive manifest conditions contain duplicates") + + entries = _manifest_entries(manifest) + archive_paths: set[str] = set() + checked = 0 + for index, entry in enumerate(entries, 1): + path = _validate_entry(archive_root, entry, label=f"archive manifest row {index}") + relative = _relative_path(archive_root, path) + if relative in archive_paths: + raise ValueError(f"duplicate archive path: {relative}") + archive_paths.add(relative) + checked += 1 + for required in ("images", "results", "samples", "weights"): + if not any(path == required or path.startswith(required + "/") for path in archive_paths): + raise ValueError(f"archive manifest must list a file under {required}") + for required in (RAW_ROWS.as_posix(), WEIGHT_MANIFEST.as_posix()): + if required not in archive_paths: + raise ValueError(f"archive manifest must list {required}") + + weight_entries = _read_weight_manifest(archive_root) + weight_paths: set[str] = set() + for index, entry in enumerate(weight_entries, 1): + path = _validate_entry(archive_root, entry, label=f"weights manifest row {index}") + relative = _relative_path(archive_root, path) + if not relative.startswith("weights/"): + raise ValueError(f"weights manifest path is outside weights/: {relative}") + if relative in weight_paths: + raise ValueError(f"duplicate weight path: {relative}") + weight_paths.add(relative) + + generation_rows = _load_jsonl_generation_rows(archive_root, conditions, prompt_count) + successful_samples = _validate_generation_provenance(archive_root, generation_rows, archive_paths) + _reject_unlisted_tree_files(archive_root, archive_paths) + result = { + "checked_files": checked + len(weight_entries), + "checked_weight_entries": len(weight_entries), + "generation_rows": len(generation_rows), + "successful_samples": successful_samples, + } + LOGGER.info("archive verified: %s", result) + return result + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, default=Path("."), help="archive repository root") + args = parser.parse_args() + logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") + report = verify_archive(args.root) + print(json.dumps(report, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())