From 3ceff805891cf10ec39e1fa03e099e5915cd0756 Mon Sep 17 00:00:00 2001 From: Halleluyah Oludele Date: Sun, 2 Aug 2026 23:49:33 +0100 Subject: [PATCH] build(bench): commit go.sum, add explicit-edge mode, ignore __pycache__ Three fixes to the benchmark module. bench/go.mod shipped without a go.sum, so the module did not resolve in an editor even though run.py builds fine (it copies the extractor to a scratch module and tidies there). Committing go.sum makes the checked-in module self-consistent. extract.go gains -oracle, which drives pdftable through StrategyExplicit with caller-supplied row and column boundaries. That is the exact shape a layout-model hybrid takes: the model supplies the grid, pdftable fills the cells from the text layer and keeps exact coordinates. Worth having plumbed even though the experiment that motivated it is not ready -- deriving trustworthy boundaries from ICDAR ground truth needs edge clustering and a verified Y origin, and without those the harness measures itself rather than the extractor. __pycache__ was committed by accident and is now ignored. --- .gitignore | 4 ++ bench/go.mod | 14 +++++ bench/go.sum | 24 ++++++++ .../__pycache__/score.cpython-313.pyc | Bin 11002 -> 0 bytes bench/icdar2013/extract.go | 55 +++++++++++++++--- 5 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 bench/go.sum delete mode 100644 bench/icdar2013/__pycache__/score.cpython-313.pyc diff --git a/.gitignore b/.gitignore index 392691f..e0817fd 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,7 @@ go.work.sum # OS .DS_Store Thumbs.db + +# Python bytecode from the benchmark harness +__pycache__/ +*.pyc diff --git a/bench/go.mod b/bench/go.mod index f592b91..e3dfbdb 100644 --- a/bench/go.mod +++ b/bench/go.mod @@ -8,4 +8,18 @@ go 1.25.0 require github.com/hallelx2/pdftable v0.0.0 +require ( + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/hhrutter/lzw v1.0.0 // indirect + github.com/hhrutter/pkcs7 v0.2.2 // indirect + github.com/hhrutter/tiff v1.0.3 // indirect + github.com/mattn/go-runewidth v0.0.23 // indirect + github.com/pdfcpu/pdfcpu v0.12.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/image v0.39.0 // indirect + golang.org/x/text v0.36.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) + replace github.com/hallelx2/pdftable => ../ diff --git a/bench/go.sum b/bench/go.sum new file mode 100644 index 0000000..eb36f86 --- /dev/null +++ b/bench/go.sum @@ -0,0 +1,24 @@ +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0= +github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo= +github.com/hhrutter/pkcs7 v0.2.2 h1:xMoifoVWah1LNym3C0pomEiLmyJyVIBXt/8oTPyPz+8= +github.com/hhrutter/pkcs7 v0.2.2/go.mod h1:aEzKz0+ZAlz7YaEMY47jDHL14hVWD6iXt0AgqgAvWgE= +github.com/hhrutter/tiff v1.0.3 h1:POV5xITOE1Lt5FvP24ylft0LyCmHmc8GkJ1SVlvUyk0= +github.com/hhrutter/tiff v1.0.3/go.mod h1:zZDLVY4cp9za2FLrryAaGszwWYAUM6DrRiBR0l//mxA= +github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= +github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/pdfcpu/pdfcpu v0.12.1 h1:HwoN72zJCj+pPbfMDChYBTZrT7SY0VwgUzqeaId3I20= +github.com/pdfcpu/pdfcpu v0.12.1/go.mod h1:7KPpVLMavcpliPrtN6o7Kuk3cFtYq8nii3SJnnsK7ps= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/image v0.39.0 h1:skVYidAEVKgn8lZ602XO75asgXBgLj9G/FE3RbuPFww= +golang.org/x/image v0.39.0/go.mod h1:sIbmppfU+xFLPIG0FoVUTvyBMmgng1/XAMhQ2ft0hpA= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/bench/icdar2013/__pycache__/score.cpython-313.pyc b/bench/icdar2013/__pycache__/score.cpython-313.pyc deleted file mode 100644 index 678893b881b408e4e6e8b011f5628f8909821861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11002 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 erpB|jDiUey_