示例#1
0
def test_errors():
    schema = SchemaDict(
        {
            "a": Tensor((None, None), dtype=int, max_shape=(20, 20)),
            "b": Sequence(
                dtype=SchemaDict(
                    {"e": Tensor((None,), max_shape=(10,), dtype=BBox(dtype=float))}
                )
            ),
            "c": Sequence(
                dtype=SchemaDict({"d": Sequence((), dtype=Tensor((5, 5), dtype=float))})
            ),
        }
    )
    ds = hub.Dataset("./nested_seq", shape=(5,), mode="w", schema=schema)

    # Invalid schema
    with pytest.raises(ValueError):
        ds["b", 0, "e", 1]

    # Too many indices
    with pytest.raises(IndexError):
        ds["c", 0, "d", 1, 1, 0, 0, 0]
    with pytest.raises(IndexError):
        ds["c", :2, "d"][0, 1, 1, 0, 0, 0]
    ob = ds["c", :2, "d"][0, 2:5, 1, 0, 0]
    assert str(ob[1]) == "ObjectView(subpath='/c/d', indexes=0, slice=[3, 1, 0, 0])"
    with pytest.raises(IndexError):
        ob[1, 0]

    # Key Errors
    # wrong key
    with pytest.raises(KeyError):
        ds["b", "c"]
    # too many keys
    with pytest.raises(KeyError):
        ds["c", "d", "e"]
    with pytest.raises(KeyError):
        ds["c", "d"]["e"]
示例#2
0
def test_objectview():
    schema = SchemaDict({
        "a":
        Tensor((20, 20), dtype=int, max_shape=(20, 20)),
        "b":
        Sequence(dtype=BBox(dtype=float)),
        "c":
        Sequence(dtype=SchemaDict(
            {"d": Sequence((), dtype=Tensor((5, 5), dtype=float))})),
        "e":
        Sequence(dtype={
            "f": {
                "g": Tensor(5, dtype=int),
                "h": Tensor((), dtype=int)
            }
        }),
    })
    ds = hub.Dataset("./nested_seq", shape=(5, ), mode="w", schema=schema)

    # dataset view to objectview
    dv = ds[3:5]
    dv["c", 0] = {"d": 5 * np.ones((2, 2, 5, 5))}
    assert (dv[0, "c", 0, "d", 0].compute() == 5 * np.ones((5, 5))).all()

    # dataset view unsqueezed
    with pytest.raises(IndexError):
        dv["c", "d"].compute()

    # dataset unsqueezed
    with pytest.raises(IndexError):
        ds["c", "d"].compute()

    # tensorview to object view
    # sequence of tensor
    ds["b", 0] = 0.5 * np.ones((5, 4))
    tv = ds["b", 0]
    tv[0] = 0.3 * np.ones((4, ))
    assert (tv[0].compute() == 0.3 * np.ones((4, ))).all()

    # ds to object view
    assert (ds[3, "c", "d"].compute() == 5 * np.ones((2, 2, 5, 5))).all()

    # Sequence of schemadicts
    ds[0, "e"] = {"f": {"g": np.ones((3, 5)), "h": np.array([42, 25, 15])}}
    with pytest.raises(KeyError):
        ds[0, "e", 1].compute()
    assert (ds[0, "e", "f", "h"].compute() == np.array([42, 25, 15])).all()

    # With dataset view
    dv[0, "e"] = {"f": {"g": np.ones((3, 5)), "h": np.array([1, 25, 1])}}
    # dv[0, "e", 1]["f", "h"] = 25
    assert (dv[0, "e", "f", "h"].compute() == np.array([1, 25, 1])).all()

    # If not lazy mode all slices should be stable
    ds.lazy = False
    assert ds[0, "e", 0, "f", "h"] == 42
    with pytest.raises(KeyError):
        ds[0, "e", 1]["f", "h"] == 25
    ds.lazy = True

    # make an objectview
    ov = ds["c", "d"]
    with pytest.raises(IndexError):
        ov.compute()
    assert (ov[3].compute() == 5 * np.ones((2, 2, 5, 5))).all()
    # ov[3, 1] = 2 * np.ones((2, 5, 5))
    assert (ov[3][0, 0].compute() == 5 * np.ones((5, 5))).all()
    assert (ov[3][1].compute() == 5 * np.ones((2, 5, 5))).all()