{"record":{"id":"a070cbf06c2ca56c","repo":"PaddlePaddle/PaddleOCR","slug":"if-shear-is-a-single-number-it-must-be-positive","errorCode":null,"errorMessage":"If shear is a single number, it must be positive.","messagePattern":"If shear is a single number, it must be positive\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ppocr/data/imaug/abinet_aug.py","lineNumber":113,"sourceCode":"            ), \"translate should be a list or tuple and it must be of length 2.\"\n            for t in translate:\n                if not (0.0 <= t <= 1.0):\n                    raise ValueError(\"translation values should be between 0 and 1\")\n        self.translate = translate\n\n        if scale is not None:\n            assert (\n                isinstance(scale, (tuple, list)) and len(scale) == 2\n            ), \"scale should be a list or tuple and it must be of length 2.\"\n            for s in scale:\n                if s <= 0:\n                    raise ValueError(\"scale values should be positive\")\n        self.scale = scale\n\n        if shear is not None:\n            if isinstance(shear, numbers.Number):\n                if shear < 0:\n                    raise ValueError(\n                        \"If shear is a single number, it must be positive.\"\n                    )\n                self.shear = [shear]\n            else:\n                assert isinstance(shear, (tuple, list)) and (\n                    len(shear) == 2\n                ), \"shear should be a list or tuple and it must be of length 2.\"\n                self.shear = shear\n        else:\n            self.shear = shear\n\n    def _get_inverse_affine_matrix(self, center, angle, translate, scale, shear):\n        # https://github.com/pytorch/vision/blob/v0.4.0/torchvision/transforms/functional.py#L717\n        from numpy import sin, cos, tan\n\n        if isinstance(shear, numbers.Number):\n            shear = [shear, 0]\n","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/PaddlePaddle/PaddleOCR/blob/2661c7c0ef5c613e8f93c6e93b2e052399f0f854/ppocr/data/imaug/abinet_aug.py#L95-L131","documentation":"In CVRandomAffine, when shear is a single number it must be >= 0, otherwise ValueError at construction. (Negative shear is still reachable by passing a 2-element tuple/list, since only the single-number form enforces positivity.) This mirrors torchvision's RandomAffine shear semantics.","triggerScenarios":"CVRandomAffine(degrees=0, shear=-10) — a single negative number; intending a shear range like (-10, 10) but passing only -10.","commonSituations":"Porting torchvision configs where negative shear ranges are common; sign typos; forgetting that a single number means fixed magnitude, not a symmetric range.","solutions":["Pass a non-negative single value, e.g. shear=10 (meaning magnitude up to 10 degrees).","Or pass a 2-tuple to get a directional/ranged shear: shear=(-10, 10) — tuples are allowed to contain negatives.","Double-check units: shear is in degrees, not radians."],"exampleFix":"# before\nCVRandomAffine(degrees=0, shear=-10)      # ValueError\n# after\nCVRandomAffine(degrees=0, shear=(-10, 10))  # ranged shear accepts negatives","handlingStrategy":"validation","validationCode":"import numbers\n\ndef valid_shear(s) -> bool:\n    if s is None:\n        return True\n    if isinstance(s, numbers.Number):\n        return s >= 0\n    return isinstance(s, (tuple, list)) and len(s) == 2","typeGuard":"def is_valid_shear(v) -> bool:\n    import numbers\n    if isinstance(v, numbers.Number):\n        return v >= 0\n    return isinstance(v, (tuple, list)) and len(v) == 2","tryCatchPattern":null,"preventionTips":["For symmetric negative ranges always pass a 2-tuple, e.g. shear=(-10, 10)","Single numbers mean non-negative magnitude only","Units are degrees, not radians"],"tags":["data-augmentation","abinet","affine","shear","valueerror"],"backgroundTag":null,"analyzedSha":"2661c7c0ef5c613e8f93c6e93b2e052399f0f854","analyzedAt":"2026-08-14T20:17:30.180Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}