File size: 4,700 Bytes
79ae023
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""API lifecycle across every endpoint group."""


class TestBackendsApi:
    def test_status(self, vitis_client):
        r = vitis_client.get("/api/vitis/backends/status")
        assert r.status_code == 200
        body = r.json()
        assert body["hardware_present"] is False
        names = {b["name"]: b for b in body["backends"]}
        assert names["vitis_emulated"]["emulated"] is True
        assert names["vitis_hw"]["available"] is False

    def test_devices(self, vitis_client):
        r = vitis_client.get("/api/vitis/backends/devices")
        assert {d["name"] for d in r.json()["devices"]} == \
            {"versal-ai-edge", "zynq-ultrascale"}


class TestHilApi:
    def test_run_report_lifecycle(self, vitis_client):
        r = vitis_client.post("/api/vitis/hil/run", json={
            "n_sequences": 1, "frames_per_sequence": 6, "width_bits": 10,
            "run_ablation": True})
        assert r.status_code == 200
        run = r.json()
        assert run["verdict"]["decision"] in (
            "REGRESSION", "PASS", "INSUFFICIENT_EVIDENCE")
        assert run["ablation"]["attribution"]

        rid = run["run_id"]
        assert vitis_client.get(f"/api/vitis/hil/runs/{rid}").status_code == 200
        listing = vitis_client.get("/api/vitis/hil/runs").json()["runs"]
        assert any(x["run_id"] == rid for x in listing)
        assert vitis_client.get("/api/vitis/hil/runs/nope").status_code == 404

    def test_sweep(self, vitis_client):
        r = vitis_client.post("/api/vitis/hil/sweep", json={
            "n_sequences": 1, "frames_per_sequence": 6, "widths": [8, 12]})
        assert r.status_code == 200
        assert len(r.json()["points"]) == 2

    def test_validation(self, vitis_client):
        assert vitis_client.post("/api/vitis/hil/run", json={
            "width_bits": 4, "int_bits": 4}).status_code == 400
        assert vitis_client.post("/api/vitis/hil/run", json={
            "device": "cray-1"}).status_code == 400


class TestIspAugmentApi:
    def test_isp_lifecycle(self, vitis_client):
        r = vitis_client.post("/api/vitis/isp/run", json={
            "n_frames": 1, "include_previews": False})
        assert r.status_code == 200
        run = r.json()
        assert run["throughput"]["modeled_not_measured"] is True
        rid = run["run_id"]
        assert vitis_client.get(f"/api/vitis/isp/runs/{rid}").status_code == 200
        assert vitis_client.post("/api/vitis/isp/run", json={
            "stages": ["defrag"]}).status_code == 400
        assert vitis_client.get("/api/vitis/isp/stages").json()["stages"]

    def test_augment_lifecycle(self, vitis_client):
        r = vitis_client.get("/api/vitis/augment/recipes")
        assert len(r.json()["augmentations"]) == 7
        r = vitis_client.post("/api/vitis/augment/generate", json={
            "n_variants": 2, "include_thumbnails": False})
        assert r.status_code == 200
        batch = r.json()
        assert all(v["evaluation_only"] for v in batch["variants"])
        bid = batch["run_id"]
        assert vitis_client.get(
            f"/api/vitis/augment/batches/{bid}").status_code == 200
        variants = vitis_client.get("/api/vitis/augment/variants").json()
        assert len(variants["variants"]) >= 2
        assert vitis_client.post("/api/vitis/augment/generate", json={
            "backend": "vitis_hw"}).status_code == 400


class TestTemporalApi:
    def test_temporal_lifecycle(self, vitis_client):
        engines = vitis_client.get("/api/vitis/temporal/engines").json()["engines"]
        assert len(engines) == 2
        r = vitis_client.post("/api/vitis/temporal/run", json={
            "n_sequences": 1, "frames_per_sequence": 10})
        assert r.status_code == 200
        run = r.json()
        assert set(run["results"]) == {"reference", "vitis_emulated"}
        assert "ranking_agrees" in run["backend_agreement"]
        rid = run["run_id"]
        assert vitis_client.get(
            f"/api/vitis/temporal/runs/{rid}").status_code == 200
        assert vitis_client.post("/api/vitis/temporal/run", json={
            "engines": ["skynet"]}).status_code == 400


class TestPrdApi:
    def test_prd_listing_and_content(self, vitis_client):
        listing = vitis_client.get("/api/vitis/prd").json()["prds"]
        assert {p["id"] for p in listing} == {
            "vitis-hil-regression", "vitis-isp-preprocessing",
            "vitis-temporal-stability"}
        assert all(p["available"] for p in listing)
        doc = vitis_client.get("/api/vitis/prd/vitis-hil-regression").json()
        assert "Value Proposition" in doc["markdown"]
        assert vitis_client.get("/api/vitis/prd/nope").status_code == 404