diff --git a/__pycache__/inference_svm_model.cpython-310.pyc b/__pycache__/inference_svm_model.cpython-310.pyc index 6400d9adcfcc2823b70d1c1900995d20657e24dd..94cea998ff725fc4f569011bb7d3144896c19dbd 100644 Binary files a/__pycache__/inference_svm_model.cpython-310.pyc and b/__pycache__/inference_svm_model.cpython-310.pyc differ diff --git a/__pycache__/mineru_single.cpython-310.pyc b/__pycache__/mineru_single.cpython-310.pyc index 87f54f87498e3e498b40ce7993b6566924462d07..d34eda5c56477b9af517fa1a9bb81e8eb98321ff 100644 Binary files a/__pycache__/mineru_single.cpython-310.pyc and b/__pycache__/mineru_single.cpython-310.pyc differ diff --git a/__pycache__/topic_extraction_upgrade.cpython-310.pyc b/__pycache__/topic_extraction_upgrade.cpython-310.pyc index 5f9f23b0ba1748a4fa7bba4f81c533dcf69baad5..ab19005b9ff6a5b4e23e8621e387e3b353e52862 100644 Binary files a/__pycache__/topic_extraction_upgrade.cpython-310.pyc and b/__pycache__/topic_extraction_upgrade.cpython-310.pyc differ diff --git a/__pycache__/worker.cpython-310.pyc b/__pycache__/worker.cpython-310.pyc index 7ffdc4ca6f57352faa14a41155d34ff91233f428..dc2626a8c2f518057435d1fcb3bc9f7448f310f0 100644 Binary files a/__pycache__/worker.cpython-310.pyc and b/__pycache__/worker.cpython-310.pyc differ diff --git a/input_output/output/final_output.md b/input_output/output/final_output.md index 5e3b6f16053b88dea9ebd373f7b063ed370ea0bc..1c057d2e2c77781fa59a0edae0ec48b48c972d0b 100644 --- a/input_output/output/final_output.md +++ b/input_output/output/final_output.md @@ -1,6 +1,6 @@ # A Level Mathematics -![Image of two origami pine cones, one brown and one tan.](images/img_1.png) +![Two origami pinecones, one brown and one tan, on a purple background.](images/img_1.png) # Specification @@ -8,9 +8,61 @@ Pearson Edexcel Level 3 Advanced GCE in Mathematics (9MA0) # Summary of Pearson Edexcel Level 3 Advanced GCE in Mathematics Specification Issue 4 changes. -![HAS TO BE PROCESSED - two column table](images/img_2.png) - -![Image description unavailable](images/img_3.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_2.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_2.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_2.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_2.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_2.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_2.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_2.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_2.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_2.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_2.png_rows/row_9/col_0.png) +![Row 10 Col 0](images/img_2.png_rows/row_10/col_0.png) +![Row 11 Col 0](images/img_2.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_2.png_rows/row_12/col_0.png) +![Row 13 Col 0](images/img_2.png_rows/row_13/col_0.png) +![Row 14 Col 0](images/img_2.png_rows/row_14/col_0.png) +![Row 15 Col 0](images/img_2.png_rows/row_15/col_0.png) +![Row 16 Col 0](images/img_2.png_rows/row_16/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_3.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_3.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_3.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_3.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_3.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_3.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_3.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_3.png_rows/row_4/col_0.png) +![Row 4 Col 1](images/img_3.png_rows/row_4/col_1.png) +![Row 5 Col 0](images/img_3.png_rows/row_5/col_0.png) +![Row 5 Col 1](images/img_3.png_rows/row_5/col_1.png) +![Row 6 Col 0](images/img_3.png_rows/row_6/col_0.png) +![Row 6 Col 1](images/img_3.png_rows/row_6/col_1.png) +![Row 7 Col 0](images/img_3.png_rows/row_7/col_0.png) +![Row 7 Col 1](images/img_3.png_rows/row_7/col_1.png) +![Row 8 Col 0](images/img_3.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_3.png_rows/row_9/col_0.png) +![Row 9 Col 1](images/img_3.png_rows/row_9/col_1.png) +![Row 10 Col 0](images/img_3.png_rows/row_10/col_0.png) +![Row 10 Col 1](images/img_3.png_rows/row_10/col_1.png) +![Row 11 Col 0](images/img_3.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_3.png_rows/row_12/col_0.png) +![Row 13 Col 0](images/img_3.png_rows/row_13/col_0.png) +![Row 13 Col 1](images/img_3.png_rows/row_13/col_1.png) +![Row 14 Col 0](images/img_3.png_rows/row_14/col_0.png) +![Row 14 Col 1](images/img_3.png_rows/row_14/col_1.png) +![Row 15 Col 0](images/img_3.png_rows/row_15/col_0.png) +![Row 15 Col 1](images/img_3.png_rows/row_15/col_1.png) +![Row 16 Col 0](images/img_3.png_rows/row_16/col_0.png) +![Row 16 Col 1](images/img_3.png_rows/row_16/col_1.png) +![Row 17 Col 0](images/img_3.png_rows/row_17/col_0.png) +![Row 17 Col 1](images/img_3.png_rows/row_17/col_1.png) +![Row 18 Col 0](images/img_3.png_rows/row_18/col_0.png) +![Row 18 Col 1](images/img_3.png_rows/row_18/col_1.png) +![Row 19 Col 0](images/img_3.png_rows/row_19/col_0.png) Earlier issues show previous changes. @@ -101,7 +153,7 @@ The Pearson Edexcel Level 3 Advanced GCE in Mathematics consists of three extern Students must complete all assessment in May/June in any single year. -![The image describes the structure of the Pure Mathematics papers, including content overview. It does not contain a specific question number or part.](images/img_4.png) +![Paper 1 and Paper 2 information, including paper codes and content overview.](images/img_4.png) # Assessment overview @@ -109,7 +161,7 @@ Paper 1 and Paper 2 may contain questions on any topics from the Pure Mathematic Students must answer all questions. Calculators can be used in the assessment.. -![Paper 3: Statistics and Mechanics (*Paper code: 9MA0/03)](images/img_5.png) +![Paper 3 Statistics and Mechanics (*Paper code: 9MA0/03)](images/img_5.png) \*See Appendix 8: Codes for a description of this code and all other codes relevant to this qualification. @@ -147,15 +199,32 @@ These overarching themes are inherent throughout the content and students are re A Level Mathematics students must use the mathematical notation set out in the booklet Mathematical Formulae and Statistical Tables and be able to recall the mathematical formulae and identities set out in Appendix 1. -![HAS TO BE PROCESSED - two column table](images/img_6.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_6.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_6.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_6.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_6.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_6.png_rows/row_4/col_0.png) Overarching theme 2: Mathematical problem solving -![HAS TO BE PROCESSED - two column table](images/img_8.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_8.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_8.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_8.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_8.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_8.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_8.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_8.png_rows/row_6/col_0.png) Overarching theme 3: Mathematical modelling -![HAS TO BE PROCESSED - two column table](images/img_7.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_7.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_7.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_7.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_7.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_7.png_rows/row_4/col_0.png) # Use of data in statistics @@ -175,41 +244,154 @@ The data set can be downloaded from our website, qualifications.pearson.com. Thi To support the co-teaching of this qualification with the AS Mathematics qualification, common content has been highlighted in bold.. -![HAS TO BE PROCESSED - three column table](images/img_9.png) - -![HAS TO BE PROCESSED - three column table](images/img_10.png) - -![HAS TO BE PROCESSED - three column table](images/img_11.png) - -![HAS TO BE PROCESSED - three column table](images/img_12.png) - -![HAS TO BE PROCESSED - three column table](images/img_13.png) - -![HAS TO BE PROCESSED - three column table](images/img_14.png) - -![Topics 3.3, 3.4 and 4.1 Mark Scheme](images/img_15.png) - -![HAS TO BE PROCESSED - three column table](images/img_16.png) - -![Content and Guidance for Trigonometry, sections 5.1, 5.2, 5.3, and 5.4.](images/img_17.png) - -![HAS TO BE PROCESSED - three column table](images/img_18.png) - -![HAS TO BE PROCESSED - two column table](images/img_19.png) - -![HAS TO BE PROCESSED - three column table](images/img_20.png) - -![Topics 7.1, 7.2, 7.3 Content](images/img_21.png) - -![HAS TO BE PROCESSED - three column table](images/img_22.png) - -![HAS TO BE PROCESSED - three column table](images/img_23.png) - -![HAS TO BE PROCESSED - three column table](images/img_24.png) - -![HAS TO BE PROCESSED - three column table](images/img_25.png) - -![HAS TO BE PROCESSED - three column table](images/img_26.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_9.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_9.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_9.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_9.png_rows/row_1/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_10.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_10.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_10.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_10.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_10.png_rows/row_3/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_11.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_11.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_11.png_rows/row_1/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_12.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_12.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_12.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_12.png_rows/row_1/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_13.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_13.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_13.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_13.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_13.png_rows/row_2/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_14.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_14.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_14.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_14.png_rows/row_1/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_15.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_15.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_15.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_15.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_15.png_rows/row_2/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_16.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_16.png_rows/row_0/col_1.png) +![Row 0 Col 2](images/img_16.png_rows/row_0/col_2.png) +![Row 1 Col 0](images/img_16.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_16.png_rows/row_1/col_1.png) +![Row 1 Col 2](images/img_16.png_rows/row_1/col_2.png) +![Row 2 Col 0](images/img_16.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_16.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_16.png_rows/row_3/col_0.png) +![Row 3 Col 1](images/img_16.png_rows/row_3/col_1.png) +![Row 4 Col 0](images/img_16.png_rows/row_4/col_0.png) +![Row 4 Col 1](images/img_16.png_rows/row_4/col_1.png) +![Row 5 Col 0](images/img_16.png_rows/row_5/col_0.png) +![Row 5 Col 1](images/img_16.png_rows/row_5/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_17.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_17.png_rows/row_0/col_1.png) +![Row 0 Col 2](images/img_17.png_rows/row_0/col_2.png) +![Row 1 Col 0](images/img_17.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_17.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_17.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_17.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_17.png_rows/row_3/col_0.png) +![Row 3 Col 1](images/img_17.png_rows/row_3/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_18.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_18.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_18.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_18.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_18.png_rows/row_3/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_19.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_19.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_19.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_19.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_19.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_19.png_rows/row_5/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_20.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_20.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_20.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_20.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_20.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_20.png_rows/row_2/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_21.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_21.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_21.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_21.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_21.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_21.png_rows/row_3/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_22.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_22.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_22.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_22.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_22.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_22.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_22.png_rows/row_4/col_0.png) +![Row 4 Col 1](images/img_22.png_rows/row_4/col_1.png) +![Row 5 Col 0](images/img_22.png_rows/row_5/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_23.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_23.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_23.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_23.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_23.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_23.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_23.png_rows/row_4/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_24.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_24.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_24.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_24.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_24.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_24.png_rows/row_3/col_0.png) +![Row 3 Col 1](images/img_24.png_rows/row_3/col_1.png) +![Row 4 Col 0](images/img_24.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_24.png_rows/row_5/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_25.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_25.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_25.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_25.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_25.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_25.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_25.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_25.png_rows/row_5/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_26.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_26.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_26.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_26.png_rows/row_1/col_1.png) # Assessment information @@ -238,23 +420,71 @@ All the Pure Mathematics content is assumed knowledge for Paper 3 and may be tes To support the co-teaching of this qualification with the AS Mathematics qualification, common content has been highlighted in bold.. -![Topics 1 and 2, Content 1.1 and 2.1](images/img_27.png) - -![HAS TO BE PROCESSED - three column table](images/img_28.png) - -![HAS TO BE PROCESSED - three column table](images/img_29.png) - -![HAS TO BE PROCESSED - three column table](images/img_30.png) - -![HAS TO BE PROCESSED - three column table](images/img_31.png) - -![HAS TO BE PROCESSED - three column table](images/img_32.png) - -![HAS TO BE PROCESSED - two column table](images/img_33.png) - -![HAS TO BE PROCESSED - three column table](images/img_34.png) - -![HAS TO BE PROCESSED - three column table](images/img_35.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_27.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_27.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_27.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_27.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_27.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_27.png_rows/row_2/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_28.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_28.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_28.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_28.png_rows/row_1/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_29.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_29.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_29.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_29.png_rows/row_1/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_30.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_30.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_30.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_30.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_30.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_30.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_30.png_rows/row_3/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_31.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_31.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_31.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_31.png_rows/row_1/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_32.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_32.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_32.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_32.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_32.png_rows/row_2/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_33.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_33.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_33.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_33.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_33.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_33.png_rows/row_5/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_34.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_34.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_34.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_34.png_rows/row_2/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_35.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_35.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_35.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_35.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_35.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_35.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_35.png_rows/row_4/col_0.png) +![Row 4 Col 1](images/img_35.png_rows/row_4/col_1.png) # Assessment information @@ -278,12 +508,20 @@ A sample paper and mark scheme for this paper can be found in the Pearson Edexce # Assessment Objectives -![HAS TO BE PROCESSED - two column table](images/img_36.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_36.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_36.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_36.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_36.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_36.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_36.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_36.png_rows/row_3/col_0.png) +![Row 3 Col 1](images/img_36.png_rows/row_3/col_1.png) Further guidance on the interpretation of these assessment objectives is given in Appendix 4. # Breakdown of Assessment Objectives -![The image shows a table with assessment objectives for GCE A Level papers. It includes percentages for AO1, AO2, and AO3.](images/img_37.png) +![Assessment Objectives for GCE A Level papers.](images/img_37.png) NB: Totals have been rounded either up or down. # 3 Administration and general information @@ -543,29 +781,164 @@ $$ The tables below set out the notation that must be used in A Level Mathematics examinations. Students will be expected to understand this notation without need for. further explanation. -![HAS TO BE PROCESSED - two column table](images/img_38.png) - -![HAS TO BE PROCESSED - two column table](images/img_39.png) - -![HAS TO BE PROCESSED - two column table](images/img_40.png) - -![HAS TO BE PROCESSED - two column table](images/img_41.png) - -![HAS TO BE PROCESSED - two column table](images/img_45.png) - -![Image description unavailable](images/img_44.png) - -![Q6 Part 6.1, 6.2, 6.3, 6.4](images/img_43.png) - -![HAS TO BE PROCESSED - two column table](images/img_42.png) - -![HAS TO BE PROCESSED - two column table](images/img_47.png) - -![HAS TO BE PROCESSED - two column table](images/img_46.png) - -![HAS TO BE PROCESSED - two column table](images/img_49.png) - -![HAS TO BE PROCESSED - two column table](images/img_48.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_38.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_38.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_38.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_38.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_38.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_38.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_38.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_38.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_38.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_38.png_rows/row_9/col_0.png) +![Row 10 Col 0](images/img_38.png_rows/row_10/col_0.png) +![Row 11 Col 0](images/img_38.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_38.png_rows/row_12/col_0.png) +![Row 13 Col 0](images/img_38.png_rows/row_13/col_0.png) +![Row 14 Col 0](images/img_38.png_rows/row_14/col_0.png) +![Row 15 Col 0](images/img_38.png_rows/row_15/col_0.png) +![Row 16 Col 0](images/img_38.png_rows/row_16/col_0.png) +![Row 17 Col 0](images/img_38.png_rows/row_17/col_0.png) +![Row 18 Col 0](images/img_38.png_rows/row_18/col_0.png) +![Row 19 Col 0](images/img_38.png_rows/row_19/col_0.png) +![Row 20 Col 0](images/img_38.png_rows/row_20/col_0.png) +![Row 21 Col 0](images/img_38.png_rows/row_21/col_0.png) +![Row 22 Col 0](images/img_38.png_rows/row_22/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_39.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_39.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_39.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_39.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_39.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_39.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_39.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_39.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_39.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_39.png_rows/row_9/col_0.png) +![Row 10 Col 0](images/img_39.png_rows/row_10/col_0.png) +![Row 11 Col 0](images/img_39.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_39.png_rows/row_12/col_0.png) +![Row 13 Col 0](images/img_39.png_rows/row_13/col_0.png) +![Row 14 Col 0](images/img_39.png_rows/row_14/col_0.png) +![Row 15 Col 0](images/img_39.png_rows/row_15/col_0.png) +![Row 16 Col 0](images/img_39.png_rows/row_16/col_0.png) +![Row 17 Col 0](images/img_39.png_rows/row_17/col_0.png) +![Row 18 Col 0](images/img_39.png_rows/row_18/col_0.png) +![Row 19 Col 0](images/img_39.png_rows/row_19/col_0.png) +![Row 20 Col 0](images/img_39.png_rows/row_20/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_40.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_40.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_40.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_40.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_40.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_40.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_40.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_40.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_40.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_40.png_rows/row_9/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_41.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_41.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_41.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_41.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_41.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_41.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_41.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_41.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_41.png_rows/row_8/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_45.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_45.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_45.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_45.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_45.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_45.png_rows/row_2/col_1.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_44.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_44.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_44.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_44.png_rows/row_3/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_43.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_43.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_43.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_43.png_rows/row_3/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_42.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_42.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_42.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_42.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_42.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_42.png_rows/row_5/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_47.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_47.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_47.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_47.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_47.png_rows/row_4/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_46.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_46.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_46.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_46.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_46.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_46.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_46.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_46.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_46.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_46.png_rows/row_9/col_0.png) +![Row 10 Col 0](images/img_46.png_rows/row_10/col_0.png) +![Row 11 Col 0](images/img_46.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_46.png_rows/row_12/col_0.png) +![Row 13 Col 0](images/img_46.png_rows/row_13/col_0.png) +![Row 14 Col 0](images/img_46.png_rows/row_14/col_0.png) +![Row 15 Col 0](images/img_46.png_rows/row_15/col_0.png) +![Row 16 Col 0](images/img_46.png_rows/row_16/col_0.png) +![Row 17 Col 0](images/img_46.png_rows/row_17/col_0.png) +![Row 18 Col 0](images/img_46.png_rows/row_18/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_49.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_49.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_49.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_49.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_49.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_49.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_49.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_49.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_49.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_49.png_rows/row_9/col_0.png) +![Row 10 Col 0](images/img_49.png_rows/row_10/col_0.png) +![Row 11 Col 0](images/img_49.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_49.png_rows/row_12/col_0.png) + +**Extracted table cells:** +![Row 0 Col 0](images/img_48.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_48.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_48.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_48.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_48.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_48.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_48.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_48.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_48.png_rows/row_8/col_0.png) +![Row 9 Col 0](images/img_48.png_rows/row_9/col_0.png) +![Row 10 Col 0](images/img_48.png_rows/row_10/col_0.png) +![Row 11 Col 0](images/img_48.png_rows/row_11/col_0.png) +![Row 12 Col 0](images/img_48.png_rows/row_12/col_0.png) +![Row 13 Col 0](images/img_48.png_rows/row_13/col_0.png) +![Row 14 Col 0](images/img_48.png_rows/row_14/col_0.png) # Appendix 3: Use of calculators @@ -578,7 +951,8 @@ The use of technology permeates the study of A Level Mathematics. Calculators us In addition, students must be told these regulations before sitting an examination: -![HAS TO BE PROCESSED - two column table](images/img_50.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_50.png_rows/row_0/col_0.png) Advice: $\ast_{\mathsf{a n}}$ invigilator may give a student a replacement calculator. @@ -588,13 +962,29 @@ The following tables outline in detail the strands and elements of each Assessme .A 'strand' is a discrete bullet point that is formally part of an assessment objective . An 'element' is an ability that the assessment objective does not formally separate, but that could be discretely targeted or credited. -![HAS TO BE PROCESSED - two column table](images/img_51.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_51.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_51.png_rows/row_1/col_0.png) -![HAS TO BE PROCESSED - two column table](images/img_52.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_52.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_52.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_52.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_52.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_52.png_rows/row_4/col_0.png) AO3: Solve problems within mathematics and in other contexts -![HAS TO BE PROCESSED - two column table](images/img_53.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_53.png_rows/row_0/col_0.png) +![Row 1 Col 0](images/img_53.png_rows/row_1/col_0.png) +![Row 2 Col 0](images/img_53.png_rows/row_2/col_0.png) +![Row 3 Col 0](images/img_53.png_rows/row_3/col_0.png) +![Row 4 Col 0](images/img_53.png_rows/row_4/col_0.png) +![Row 5 Col 0](images/img_53.png_rows/row_5/col_0.png) +![Row 6 Col 0](images/img_53.png_rows/row_6/col_0.png) +![Row 7 Col 0](images/img_53.png_rows/row_7/col_0.png) +![Row 8 Col 0](images/img_53.png_rows/row_8/col_0.png) # Assessment Objectives coverage @@ -764,8 +1154,15 @@ A wide range of information to support the delivery and assessment of the Extend # Appendix 8: Codes -![The image contains information about different types of codes and their uses. It includes discount codes, regulated qualifications framework codes, subject codes, and paper codes. It does not contain question numbers or parts. -Description of the image.](images/img_54.png) +**Extracted table cells:** +![Row 0 Col 0](images/img_54.png_rows/row_0/col_0.png) +![Row 0 Col 1](images/img_54.png_rows/row_0/col_1.png) +![Row 1 Col 0](images/img_54.png_rows/row_1/col_0.png) +![Row 1 Col 1](images/img_54.png_rows/row_1/col_1.png) +![Row 2 Col 0](images/img_54.png_rows/row_2/col_0.png) +![Row 2 Col 1](images/img_54.png_rows/row_2/col_1.png) +![Row 3 Col 0](images/img_54.png_rows/row_3/col_0.png) +![Row 3 Col 1](images/img_54.png_rows/row_3/col_1.png) \*https://www.gov.uk/government/publications/key-stage-4-qualifications-discount-codesand-point-scores # Edexcel, BTEC and LCCI qualifications diff --git a/input_output/output/images/img_15.png_rows/row_0/col_0.png b/input_output/output/images/img_15.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..07e92d3d4896ce937f1e5782e9d06ab289bdbfaf Binary files /dev/null and b/input_output/output/images/img_15.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_15.png_rows/row_0/col_1.png b/input_output/output/images/img_15.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0ed14732d76945b6d87027872c44d1294a55e5 Binary files /dev/null and b/input_output/output/images/img_15.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_15.png_rows/row_1/col_0.png b/input_output/output/images/img_15.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..16746135d02d76403d7ec85c31278cf4bcebb97b Binary files /dev/null and b/input_output/output/images/img_15.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_15.png_rows/row_2/col_0.png b/input_output/output/images/img_15.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2ba1294e2f408ef63515082862e41e5da5df49 Binary files /dev/null and b/input_output/output/images/img_15.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_15.png_rows/row_2/col_1.png b/input_output/output/images/img_15.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0d9f538fac95baf72307da8cfb33717608b3b1 Binary files /dev/null and b/input_output/output/images/img_15.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_17.png_rows/row_0/col_0.png b/input_output/output/images/img_17.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..75cf6af5bfc97f1e9cf7e78f77dc232929a2d822 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_17.png_rows/row_0/col_1.png b/input_output/output/images/img_17.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f32c9badda695415521c860d6d30465319772c Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_17.png_rows/row_0/col_2.png b/input_output/output/images/img_17.png_rows/row_0/col_2.png new file mode 100644 index 0000000000000000000000000000000000000000..47e497e30cb420488e259425f825e8a86a4be4a6 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_0/col_2.png differ diff --git a/input_output/output/images/img_17.png_rows/row_1/col_0.png b/input_output/output/images/img_17.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..18badb90924b08fb59c67b0bf6f89001d9de1c5e Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_17.png_rows/row_1/col_1.png b/input_output/output/images/img_17.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7849c2219a018146ebe5fe38adc893260defea5 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_17.png_rows/row_2/col_0.png b/input_output/output/images/img_17.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1ad2fcc29169b5c70e6298750c0b1b83670c43 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_17.png_rows/row_2/col_1.png b/input_output/output/images/img_17.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0eae79a8b54916fab6e943ff26fb1e6e5db1e4 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_17.png_rows/row_3/col_0.png b/input_output/output/images/img_17.png_rows/row_3/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0732583e28d02f28f3bb7cee11d3dae71fc31b15 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_17.png_rows/row_3/col_1.png b/input_output/output/images/img_17.png_rows/row_3/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0366c7a6fe78f482f5adf418a2aea192c09a57f8 Binary files /dev/null and b/input_output/output/images/img_17.png_rows/row_3/col_1.png differ diff --git a/input_output/output/images/img_21.png_rows/row_0/col_0.png b/input_output/output/images/img_21.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..54e835fc7fda8b76658eb9732756c4f0a2e31fe1 Binary files /dev/null and b/input_output/output/images/img_21.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_21.png_rows/row_0/col_1.png b/input_output/output/images/img_21.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a800de22d2e8583dd9f72a5de826d64cc6934548 Binary files /dev/null and b/input_output/output/images/img_21.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_21.png_rows/row_1/col_0.png b/input_output/output/images/img_21.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6995e9eda17f7344e635d8fa6a665553967e67bf Binary files /dev/null and b/input_output/output/images/img_21.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_21.png_rows/row_1/col_1.png b/input_output/output/images/img_21.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cb83b1971ce1cd6af17c8ebf6077966235aaf6d4 Binary files /dev/null and b/input_output/output/images/img_21.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_21.png_rows/row_2/col_0.png b/input_output/output/images/img_21.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..10356ac1f58485a3c71facfd31aeab0abc7d3d02 Binary files /dev/null and b/input_output/output/images/img_21.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_21.png_rows/row_3/col_0.png b/input_output/output/images/img_21.png_rows/row_3/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0159a2d1a73906347ce9906b8c218736134e8f54 Binary files /dev/null and b/input_output/output/images/img_21.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_27.png_rows/row_0/col_0.png b/input_output/output/images/img_27.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..542e040e2ab5230775c46b07faaf56a875c2c71d Binary files /dev/null and b/input_output/output/images/img_27.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_27.png_rows/row_0/col_1.png b/input_output/output/images/img_27.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bae682b04e93a5bf3289a55e64227d252b3f3da2 Binary files /dev/null and b/input_output/output/images/img_27.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_27.png_rows/row_1/col_0.png b/input_output/output/images/img_27.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..31fe1e1b68010cd2c40d910196866d8632d0c781 Binary files /dev/null and b/input_output/output/images/img_27.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_27.png_rows/row_1/col_1.png b/input_output/output/images/img_27.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..564af1f7ec0b600300da698270ca7cc5a3891598 Binary files /dev/null and b/input_output/output/images/img_27.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_27.png_rows/row_2/col_0.png b/input_output/output/images/img_27.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4a388a3a0663a27fffe8086e97dad12b23f2152e Binary files /dev/null and b/input_output/output/images/img_27.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_27.png_rows/row_2/col_1.png b/input_output/output/images/img_27.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1f77be6f3aa1f5c738808cd3031ab759c6d986ff Binary files /dev/null and b/input_output/output/images/img_27.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_0/col_0.png b/input_output/output/images/img_3.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..980da4c11a4fe8e564b33ca1cdadd89ae9ac06f8 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_0/col_1.png b/input_output/output/images/img_3.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d21866cb84528af7ff523000d78216d0fee9a3 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_1/col_0.png b/input_output/output/images/img_3.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ce404b400bc6c282b79019b29ef493ea2edb7a86 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_1/col_1.png b/input_output/output/images/img_3.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b206f6467b8516168d26348a32c0d51daebfc5b7 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_10/col_0.png b/input_output/output/images/img_3.png_rows/row_10/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b12b7168019ff9d403103fa5da5fe8c01233414d Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_10/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_10/col_1.png b/input_output/output/images/img_3.png_rows/row_10/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..73c2d431b8576a7c636b4ee0dbac1c63f2bcca06 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_10/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_11/col_0.png b/input_output/output/images/img_3.png_rows/row_11/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..001c892651527d093633b1274bc27d09ab613f02 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_11/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_12/col_0.png b/input_output/output/images/img_3.png_rows/row_12/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6b133fc0df43474b04a7ccf294b6db67b3e77193 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_12/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_13/col_0.png b/input_output/output/images/img_3.png_rows/row_13/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea85c9e364b78c3702ea139252919e7fd018a6e Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_13/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_13/col_1.png b/input_output/output/images/img_3.png_rows/row_13/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b02a886ca8e566f388fb015f777ca512d79a2967 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_13/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_14/col_0.png b/input_output/output/images/img_3.png_rows/row_14/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c57dc9c6f0310dd37ac34f604e560f5641530a71 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_14/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_14/col_1.png b/input_output/output/images/img_3.png_rows/row_14/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a51cce7d758d7e0a782b1e5e486ef9770e9c8759 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_14/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_15/col_0.png b/input_output/output/images/img_3.png_rows/row_15/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d73cfffba570bc38025e777febd2758be67a580d Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_15/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_15/col_1.png b/input_output/output/images/img_3.png_rows/row_15/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d8168b3745ece0bf44042863926280bbbe65d6ee Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_15/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_16/col_0.png b/input_output/output/images/img_3.png_rows/row_16/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..703341690187999467b482234e415741e4f7ea5d Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_16/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_16/col_1.png b/input_output/output/images/img_3.png_rows/row_16/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7179d193c1611e54a56a3ebb1b67cc35917271 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_16/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_17/col_0.png b/input_output/output/images/img_3.png_rows/row_17/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..31e3bc5eb0022ee30b62eca735e8f23693868597 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_17/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_17/col_1.png b/input_output/output/images/img_3.png_rows/row_17/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..af5b4a6b6f533c8c493d99d0e33d89bb112d49cd Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_17/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_18/col_0.png b/input_output/output/images/img_3.png_rows/row_18/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..45438358a95ee4abd45614bd757f7e209d32d6d7 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_18/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_18/col_1.png b/input_output/output/images/img_3.png_rows/row_18/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9634c8fbb3b3246d4f1bdda632be4f1da7f367ee Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_18/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_19/col_0.png b/input_output/output/images/img_3.png_rows/row_19/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..82369b2b9512ffbd7d5dd59e043845876fe3c191 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_19/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_2/col_0.png b/input_output/output/images/img_3.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..67985cbd2c651c7e65d0e37e3181c9658fac4e86 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_2/col_1.png b/input_output/output/images/img_3.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a6f79c812b0cd4c98f8b0d080de38e3baa5368 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_3/col_0.png b/input_output/output/images/img_3.png_rows/row_3/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6d923eb5966b74708038e64dbd98a0339cf4144e Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_4/col_0.png b/input_output/output/images/img_3.png_rows/row_4/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e1bd1ca199a91df8e8d921c66b70cef563226d19 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_4/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_4/col_1.png b/input_output/output/images/img_3.png_rows/row_4/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..96983d1c3c58d759a2c10a8a0f3e63db98d54f8c Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_4/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_5/col_0.png b/input_output/output/images/img_3.png_rows/row_5/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..7c555c1b902bd0b86eb38c1fbeea718c1a8b58d3 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_5/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_5/col_1.png b/input_output/output/images/img_3.png_rows/row_5/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6945babdc0b5d47876c7be6c7875338e05bb81 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_5/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_6/col_0.png b/input_output/output/images/img_3.png_rows/row_6/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea5bf189a564cdd606e10f6e7d8cf1e46546b73 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_6/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_6/col_1.png b/input_output/output/images/img_3.png_rows/row_6/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..58cc8c9652fe2bbf49cf19023b6ae59a9db58de2 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_6/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_7/col_0.png b/input_output/output/images/img_3.png_rows/row_7/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f180e534df8fc445b152531f151c42b3de956c Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_7/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_7/col_1.png b/input_output/output/images/img_3.png_rows/row_7/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0a4f314bd1a74c94d92df8f2231fd9c8656a7a Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_7/col_1.png differ diff --git a/input_output/output/images/img_3.png_rows/row_8/col_0.png b/input_output/output/images/img_3.png_rows/row_8/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d079dc951f475bd30f8174350b8e69f7f72a1b9b Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_8/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_9/col_0.png b/input_output/output/images/img_3.png_rows/row_9/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..46bd26e482b5c7a6f3110789d4a53bd62245993b Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_9/col_0.png differ diff --git a/input_output/output/images/img_3.png_rows/row_9/col_1.png b/input_output/output/images/img_3.png_rows/row_9/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d4aed17f8d75eb16329af4c6e0dd097d1f426485 Binary files /dev/null and b/input_output/output/images/img_3.png_rows/row_9/col_1.png differ diff --git a/input_output/output/images/img_36.png_rows/row_0/col_0.png b/input_output/output/images/img_36.png_rows/row_0/col_0.png index 8ca18179dbccd67cab231d7b20c5b4b969ebf297..98c850c5e12fc9011366d720ab4dec0488e9d65c 100644 Binary files a/input_output/output/images/img_36.png_rows/row_0/col_0.png and b/input_output/output/images/img_36.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_36.png_rows/row_0/col_1.png b/input_output/output/images/img_36.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..466361239cc59615b27dd47373d10d2edbaf09b5 Binary files /dev/null and b/input_output/output/images/img_36.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_36.png_rows/row_1/col_0.png b/input_output/output/images/img_36.png_rows/row_1/col_0.png index c65df7b21377e5ba1e4a44c3c93fac4440b8a634..acd5bb21b06135a8e1b375b0515524b3a6aac5fd 100644 Binary files a/input_output/output/images/img_36.png_rows/row_1/col_0.png and b/input_output/output/images/img_36.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_36.png_rows/row_1/col_1.png b/input_output/output/images/img_36.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..17d763ebbaf052be8a6b2031e096d6cbfb807542 Binary files /dev/null and b/input_output/output/images/img_36.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_36.png_rows/row_2/col_0.png b/input_output/output/images/img_36.png_rows/row_2/col_0.png index 638d0025a088e250c1b4960fc9aaf5b5d3bc465c..86a22f32fa4181a02765f50bc471c07427ad747b 100644 Binary files a/input_output/output/images/img_36.png_rows/row_2/col_0.png and b/input_output/output/images/img_36.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_36.png_rows/row_2/col_1.png b/input_output/output/images/img_36.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6877d23c81cfb316f1780a4bb313d3c6a0536f78 Binary files /dev/null and b/input_output/output/images/img_36.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_36.png_rows/row_3/col_0.png b/input_output/output/images/img_36.png_rows/row_3/col_0.png index 1cf0dcf6ba4f67043c7cd6d58898fec1a76468cc..1d7067d9eb3bf32451ed683715bacbc5f5f8f2d4 100644 Binary files a/input_output/output/images/img_36.png_rows/row_3/col_0.png and b/input_output/output/images/img_36.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_36.png_rows/row_3/col_1.png b/input_output/output/images/img_36.png_rows/row_3/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff05ec5ad6d32e0e13c74d9ce8283f91c44cb3c Binary files /dev/null and b/input_output/output/images/img_36.png_rows/row_3/col_1.png differ diff --git a/input_output/output/images/img_43.png_rows/row_0/col_0.png b/input_output/output/images/img_43.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3aa18102fe2990433f1fd5277611bca3a1e593 Binary files /dev/null and b/input_output/output/images/img_43.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_43.png_rows/row_1/col_0.png b/input_output/output/images/img_43.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..dc08eafcf45b34396dc57d1583af436e64c7d686 Binary files /dev/null and b/input_output/output/images/img_43.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_43.png_rows/row_2/col_0.png b/input_output/output/images/img_43.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fb08ea8862170afe5d69c8e726758188f117bbdc Binary files /dev/null and b/input_output/output/images/img_43.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_43.png_rows/row_3/col_0.png b/input_output/output/images/img_43.png_rows/row_3/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..09beaee92ab603330e1561430b4cf09e87e8f5dd Binary files /dev/null and b/input_output/output/images/img_43.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_44.png_rows/row_0/col_0.png b/input_output/output/images/img_44.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..079c095e5e497a299354fda8ea33c70d4ce22303 Binary files /dev/null and b/input_output/output/images/img_44.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_44.png_rows/row_1/col_0.png b/input_output/output/images/img_44.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a7fc4b6172fc18454ba8897734dfe4a7730e3572 Binary files /dev/null and b/input_output/output/images/img_44.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_44.png_rows/row_2/col_0.png b/input_output/output/images/img_44.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..eab8bcec0fd787cd3d35d14027f57c0f342810cf Binary files /dev/null and b/input_output/output/images/img_44.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_44.png_rows/row_3/col_0.png b/input_output/output/images/img_44.png_rows/row_3/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..451e67f1793bb93302b7d24db7c0934127099882 Binary files /dev/null and b/input_output/output/images/img_44.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_45.png_rows/row_0/col_0.png b/input_output/output/images/img_45.png_rows/row_0/col_0.png index ada3e99534019dfba86b5eafadc289923fd5e031..ae2bf711dfa5bbd6c0ac8401c9a6965b9dbc5c7e 100644 Binary files a/input_output/output/images/img_45.png_rows/row_0/col_0.png and b/input_output/output/images/img_45.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_45.png_rows/row_0/col_1.png b/input_output/output/images/img_45.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9155e75dd00d3a17deec53c147f1029b2d25e316 Binary files /dev/null and b/input_output/output/images/img_45.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_45.png_rows/row_1/col_0.png b/input_output/output/images/img_45.png_rows/row_1/col_0.png index 59f817b27cec53fbc31e9b3711d0001ec04a474f..e83cd535686fe875a68ced47ee56f9311b8044eb 100644 Binary files a/input_output/output/images/img_45.png_rows/row_1/col_0.png and b/input_output/output/images/img_45.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_45.png_rows/row_1/col_1.png b/input_output/output/images/img_45.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..89fe7892304821a238007c18b0681e5cd8f28395 Binary files /dev/null and b/input_output/output/images/img_45.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_45.png_rows/row_2/col_0.png b/input_output/output/images/img_45.png_rows/row_2/col_0.png index e0b6bd760940cbae4d778e81fc8f931fe8c4f789..0e59137921091b9656c8885b12922b2b56258972 100644 Binary files a/input_output/output/images/img_45.png_rows/row_2/col_0.png and b/input_output/output/images/img_45.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_45.png_rows/row_2/col_1.png b/input_output/output/images/img_45.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7b353c02d2aeb4c8c88e558397f169d56f59d0 Binary files /dev/null and b/input_output/output/images/img_45.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_54.png_rows/row_0/col_0.png b/input_output/output/images/img_54.png_rows/row_0/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ff33e0b9d3b259b936f8e62506e894036a5b8d4f Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_0/col_0.png differ diff --git a/input_output/output/images/img_54.png_rows/row_0/col_1.png b/input_output/output/images/img_54.png_rows/row_0/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f0f1232bbf57a75f4f7b059efa1b791c566436 Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_0/col_1.png differ diff --git a/input_output/output/images/img_54.png_rows/row_1/col_0.png b/input_output/output/images/img_54.png_rows/row_1/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0c3b7733441d72211e2cdcdae0518e256b707cd4 Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_1/col_0.png differ diff --git a/input_output/output/images/img_54.png_rows/row_1/col_1.png b/input_output/output/images/img_54.png_rows/row_1/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c4962d7688b7c96b77c27e3669aa0a8af00438ba Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_1/col_1.png differ diff --git a/input_output/output/images/img_54.png_rows/row_2/col_0.png b/input_output/output/images/img_54.png_rows/row_2/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..839eb68049325b9cc2c3594f5d43d23d8ab2b30c Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_2/col_0.png differ diff --git a/input_output/output/images/img_54.png_rows/row_2/col_1.png b/input_output/output/images/img_54.png_rows/row_2/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e113c212be7b72007caf1682b16816eb467fcb Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_2/col_1.png differ diff --git a/input_output/output/images/img_54.png_rows/row_3/col_0.png b/input_output/output/images/img_54.png_rows/row_3/col_0.png new file mode 100644 index 0000000000000000000000000000000000000000..02fa1715c67dc6744ccb21c24f7a40890a746196 Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_3/col_0.png differ diff --git a/input_output/output/images/img_54.png_rows/row_3/col_1.png b/input_output/output/images/img_54.png_rows/row_3/col_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2a17c0b7a7f2e8e676c8b83311d307159ec25085 Binary files /dev/null and b/input_output/output/images/img_54.png_rows/row_3/col_1.png differ diff --git a/input_output/outputs/images/img_1.png b/input_output/outputs/images/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..536381b7677df6e381daf32bd3dae49bc1c9396f Binary files /dev/null and b/input_output/outputs/images/img_1.png differ diff --git a/input_output/outputs/images/img_10.png b/input_output/outputs/images/img_10.png new file mode 100644 index 0000000000000000000000000000000000000000..150dde1dae1774fc40b94f4db06fae4367b4eaed Binary files /dev/null and b/input_output/outputs/images/img_10.png differ diff --git a/input_output/outputs/images/img_11.png b/input_output/outputs/images/img_11.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ffa759df80398192db92a27b41b6971cfd8274 Binary files /dev/null and b/input_output/outputs/images/img_11.png differ diff --git a/input_output/outputs/images/img_12.png b/input_output/outputs/images/img_12.png new file mode 100644 index 0000000000000000000000000000000000000000..9970d23e9ac329f010eacce45684e773367971cb Binary files /dev/null and b/input_output/outputs/images/img_12.png differ diff --git a/input_output/outputs/images/img_13.png b/input_output/outputs/images/img_13.png new file mode 100644 index 0000000000000000000000000000000000000000..6ddea5c750a2073af579e8ccfcb41ec97137462d Binary files /dev/null and b/input_output/outputs/images/img_13.png differ diff --git a/input_output/outputs/images/img_14.png b/input_output/outputs/images/img_14.png new file mode 100644 index 0000000000000000000000000000000000000000..754d612eec7443e4c79b438f2da9f65ac55d3d9b Binary files /dev/null and b/input_output/outputs/images/img_14.png differ diff --git a/input_output/outputs/images/img_15.png b/input_output/outputs/images/img_15.png new file mode 100644 index 0000000000000000000000000000000000000000..62265fabd71cebd0cbbc3a95a72223af0dae9d3a Binary files /dev/null and b/input_output/outputs/images/img_15.png differ diff --git a/input_output/outputs/images/img_16.png b/input_output/outputs/images/img_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f8f61c781d1af176af1a1d208c308730a77e63 Binary files /dev/null and b/input_output/outputs/images/img_16.png differ diff --git a/input_output/outputs/images/img_17.png b/input_output/outputs/images/img_17.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0c5a6a6deaa2548ad97f53e5747d11d8bc21cc Binary files /dev/null and b/input_output/outputs/images/img_17.png differ diff --git a/input_output/outputs/images/img_18.png b/input_output/outputs/images/img_18.png new file mode 100644 index 0000000000000000000000000000000000000000..477396d69ba38c7ed708c1385864cafd922d1827 Binary files /dev/null and b/input_output/outputs/images/img_18.png differ diff --git a/input_output/outputs/images/img_19.png b/input_output/outputs/images/img_19.png new file mode 100644 index 0000000000000000000000000000000000000000..8129a372a50354bbb0c31cfd35e60b0d5c5442f2 Binary files /dev/null and b/input_output/outputs/images/img_19.png differ diff --git a/input_output/outputs/images/img_2.png b/input_output/outputs/images/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..11a5446cb0892b231730b8a6d9d262511f789dfc Binary files /dev/null and b/input_output/outputs/images/img_2.png differ diff --git a/input_output/outputs/images/img_20.png b/input_output/outputs/images/img_20.png new file mode 100644 index 0000000000000000000000000000000000000000..cdff005c1726624012e65ef41a73583310c168b3 Binary files /dev/null and b/input_output/outputs/images/img_20.png differ diff --git a/input_output/outputs/images/img_21.png b/input_output/outputs/images/img_21.png new file mode 100644 index 0000000000000000000000000000000000000000..be5654992ea9eeb595a0b518041592ed94d8c1d8 Binary files /dev/null and b/input_output/outputs/images/img_21.png differ diff --git a/input_output/outputs/images/img_22.png b/input_output/outputs/images/img_22.png new file mode 100644 index 0000000000000000000000000000000000000000..3006672c401f342a74b9094002f0cb90deae2a65 Binary files /dev/null and b/input_output/outputs/images/img_22.png differ diff --git a/input_output/outputs/images/img_23.png b/input_output/outputs/images/img_23.png new file mode 100644 index 0000000000000000000000000000000000000000..2baa70803cef6e98985736e198a56d44a40626ab Binary files /dev/null and b/input_output/outputs/images/img_23.png differ diff --git a/input_output/outputs/images/img_24.png b/input_output/outputs/images/img_24.png new file mode 100644 index 0000000000000000000000000000000000000000..f21e9711639a5ae0acd518eb9ff3b0ad95e18ebf Binary files /dev/null and b/input_output/outputs/images/img_24.png differ diff --git a/input_output/outputs/images/img_25.png b/input_output/outputs/images/img_25.png new file mode 100644 index 0000000000000000000000000000000000000000..a90ac42ae9986fb54db8c0dac074c9a2c5af3573 Binary files /dev/null and b/input_output/outputs/images/img_25.png differ diff --git a/input_output/outputs/images/img_26.png b/input_output/outputs/images/img_26.png new file mode 100644 index 0000000000000000000000000000000000000000..28db5fa7ebb46819d5129d7afd1eac8f398c862f Binary files /dev/null and b/input_output/outputs/images/img_26.png differ diff --git a/input_output/outputs/images/img_27.png b/input_output/outputs/images/img_27.png new file mode 100644 index 0000000000000000000000000000000000000000..9c631015fa075ded8a2d91eebb3fb6afd1c69836 Binary files /dev/null and b/input_output/outputs/images/img_27.png differ diff --git a/input_output/outputs/images/img_28.png b/input_output/outputs/images/img_28.png new file mode 100644 index 0000000000000000000000000000000000000000..6af117b59207c1ed6f5f47828e097dcf42aed539 Binary files /dev/null and b/input_output/outputs/images/img_28.png differ diff --git a/input_output/outputs/images/img_29.png b/input_output/outputs/images/img_29.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4c9c02344ce09dc7d290320c642f0e341238d3 Binary files /dev/null and b/input_output/outputs/images/img_29.png differ diff --git a/input_output/outputs/images/img_3.png b/input_output/outputs/images/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d29b74edc283edbf455af86ff442572d3ad00a Binary files /dev/null and b/input_output/outputs/images/img_3.png differ diff --git a/input_output/outputs/images/img_30.png b/input_output/outputs/images/img_30.png new file mode 100644 index 0000000000000000000000000000000000000000..3250e2fc874639f030b04d017a99fce4a792cc41 Binary files /dev/null and b/input_output/outputs/images/img_30.png differ diff --git a/input_output/outputs/images/img_31.png b/input_output/outputs/images/img_31.png new file mode 100644 index 0000000000000000000000000000000000000000..bec7bb6d80922f098aafaff1b72d4f798d1a44a2 Binary files /dev/null and b/input_output/outputs/images/img_31.png differ diff --git a/input_output/outputs/images/img_32.png b/input_output/outputs/images/img_32.png new file mode 100644 index 0000000000000000000000000000000000000000..494f5450af1d6b9b56de5860ef5ef883113efa83 Binary files /dev/null and b/input_output/outputs/images/img_32.png differ diff --git a/input_output/outputs/images/img_33.png b/input_output/outputs/images/img_33.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a6f78cc3ca75cdc639d805c7380effb4b91fd6 Binary files /dev/null and b/input_output/outputs/images/img_33.png differ diff --git a/input_output/outputs/images/img_34.png b/input_output/outputs/images/img_34.png new file mode 100644 index 0000000000000000000000000000000000000000..4dcfe87d0103452fe0fcad0df9316045e845c58f Binary files /dev/null and b/input_output/outputs/images/img_34.png differ diff --git a/input_output/outputs/images/img_35.png b/input_output/outputs/images/img_35.png new file mode 100644 index 0000000000000000000000000000000000000000..026cd950b90ad3e05ff8b0a393efc55bad1f5521 Binary files /dev/null and b/input_output/outputs/images/img_35.png differ diff --git a/input_output/outputs/images/img_36.png b/input_output/outputs/images/img_36.png new file mode 100644 index 0000000000000000000000000000000000000000..ee97e74f167d853bf62060b149263c79b60d46fe Binary files /dev/null and b/input_output/outputs/images/img_36.png differ diff --git a/input_output/outputs/images/img_37.png b/input_output/outputs/images/img_37.png new file mode 100644 index 0000000000000000000000000000000000000000..94e2579e900fded1fe5ac6dc75111d3a7d825ae0 Binary files /dev/null and b/input_output/outputs/images/img_37.png differ diff --git a/input_output/outputs/images/img_38.png b/input_output/outputs/images/img_38.png new file mode 100644 index 0000000000000000000000000000000000000000..ee15cc5964f07b3a03a5faff29e076d841e8dd39 Binary files /dev/null and b/input_output/outputs/images/img_38.png differ diff --git a/input_output/outputs/images/img_39.png b/input_output/outputs/images/img_39.png new file mode 100644 index 0000000000000000000000000000000000000000..b804e5897b9c1d3ebad372de8a85ddb4fc548f66 Binary files /dev/null and b/input_output/outputs/images/img_39.png differ diff --git a/input_output/outputs/images/img_4.png b/input_output/outputs/images/img_4.png new file mode 100644 index 0000000000000000000000000000000000000000..fe78680f1d5ef4c57a670b4284146e1e899e2f70 Binary files /dev/null and b/input_output/outputs/images/img_4.png differ diff --git a/input_output/outputs/images/img_40.png b/input_output/outputs/images/img_40.png new file mode 100644 index 0000000000000000000000000000000000000000..830c806fbd1cebea44359c4e67ce99cfd95c3ada Binary files /dev/null and b/input_output/outputs/images/img_40.png differ diff --git a/input_output/outputs/images/img_41.png b/input_output/outputs/images/img_41.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb5d43976565a977da899edcb1e1e0aaf1c9e04 Binary files /dev/null and b/input_output/outputs/images/img_41.png differ diff --git a/input_output/outputs/images/img_42.png b/input_output/outputs/images/img_42.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2c0cdec04aff15f08d1524ef3b0e3609c4269a Binary files /dev/null and b/input_output/outputs/images/img_42.png differ diff --git a/input_output/outputs/images/img_43.png b/input_output/outputs/images/img_43.png new file mode 100644 index 0000000000000000000000000000000000000000..0655978f1234de759453433bd829f5c596e8b3d9 Binary files /dev/null and b/input_output/outputs/images/img_43.png differ diff --git a/input_output/outputs/images/img_44.png b/input_output/outputs/images/img_44.png new file mode 100644 index 0000000000000000000000000000000000000000..8d26f19ff8c2e34be16244cad4963618a46359d6 Binary files /dev/null and b/input_output/outputs/images/img_44.png differ diff --git a/input_output/outputs/images/img_45.png b/input_output/outputs/images/img_45.png new file mode 100644 index 0000000000000000000000000000000000000000..a44fc5141c171c9b1c596c514b1f1a16df15cc37 Binary files /dev/null and b/input_output/outputs/images/img_45.png differ diff --git a/input_output/outputs/images/img_46.png b/input_output/outputs/images/img_46.png new file mode 100644 index 0000000000000000000000000000000000000000..c19673dc995b0b91b72f3001fe5625e5d85690fb Binary files /dev/null and b/input_output/outputs/images/img_46.png differ diff --git a/input_output/outputs/images/img_47.png b/input_output/outputs/images/img_47.png new file mode 100644 index 0000000000000000000000000000000000000000..c36630e3d37689a6b3d8ae3aa88c184e6a7ccd5c Binary files /dev/null and b/input_output/outputs/images/img_47.png differ diff --git a/input_output/outputs/images/img_48.png b/input_output/outputs/images/img_48.png new file mode 100644 index 0000000000000000000000000000000000000000..148a965564be536e6bb380280abcb4fe3577a68b Binary files /dev/null and b/input_output/outputs/images/img_48.png differ diff --git a/input_output/outputs/images/img_49.png b/input_output/outputs/images/img_49.png new file mode 100644 index 0000000000000000000000000000000000000000..da78c1b16143b9442399028c0e0e90b86a69cad3 Binary files /dev/null and b/input_output/outputs/images/img_49.png differ diff --git a/input_output/outputs/images/img_5.png b/input_output/outputs/images/img_5.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f15b2926b355a6ba83bbcbf10590899f80dc45 Binary files /dev/null and b/input_output/outputs/images/img_5.png differ diff --git a/input_output/outputs/images/img_50.png b/input_output/outputs/images/img_50.png new file mode 100644 index 0000000000000000000000000000000000000000..155983a8d2f61c901e0e0b63c1d4bd1708945cf6 Binary files /dev/null and b/input_output/outputs/images/img_50.png differ diff --git a/input_output/outputs/images/img_51.png b/input_output/outputs/images/img_51.png new file mode 100644 index 0000000000000000000000000000000000000000..6a45da2ae580bba3c8339505a09ffd42a989d105 Binary files /dev/null and b/input_output/outputs/images/img_51.png differ diff --git a/input_output/outputs/images/img_52.png b/input_output/outputs/images/img_52.png new file mode 100644 index 0000000000000000000000000000000000000000..c688469cfcca6ffde50062f6e245b8b1a9ee3712 Binary files /dev/null and b/input_output/outputs/images/img_52.png differ diff --git a/input_output/outputs/images/img_53.png b/input_output/outputs/images/img_53.png new file mode 100644 index 0000000000000000000000000000000000000000..aad87cc05336dd2927554a12a77c59b1c4bcc631 Binary files /dev/null and b/input_output/outputs/images/img_53.png differ diff --git a/input_output/outputs/images/img_54.png b/input_output/outputs/images/img_54.png new file mode 100644 index 0000000000000000000000000000000000000000..a272db349c70dac9f51d1173f0df3fb6fe38c86e Binary files /dev/null and b/input_output/outputs/images/img_54.png differ diff --git a/input_output/outputs/images/img_6.png b/input_output/outputs/images/img_6.png new file mode 100644 index 0000000000000000000000000000000000000000..d1136c6ec94dcede46ceebc1a50675767ca50e50 Binary files /dev/null and b/input_output/outputs/images/img_6.png differ diff --git a/input_output/outputs/images/img_7.png b/input_output/outputs/images/img_7.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3ea2a7627df08a54824b945fe822cfe168400f Binary files /dev/null and b/input_output/outputs/images/img_7.png differ diff --git a/input_output/outputs/images/img_8.png b/input_output/outputs/images/img_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b04bff99059820c3397a20fdbbadf5558dda64ab Binary files /dev/null and b/input_output/outputs/images/img_8.png differ diff --git a/input_output/outputs/images/img_9.png b/input_output/outputs/images/img_9.png new file mode 100644 index 0000000000000000000000000000000000000000..a64e0f1ac48c6edc180e2f128347a94bda760de6 Binary files /dev/null and b/input_output/outputs/images/img_9.png differ diff --git a/mineru_test_local.py b/mineru_test_local.py index 7e7b8d00e22add6cd63583c6a88772f9abbc11c7..59f1c92367badccc2bdef9426ac2234257640e10 100644 --- a/mineru_test_local.py +++ b/mineru_test_local.py @@ -30,7 +30,7 @@ logger.setLevel(logging.INFO) def call_gemini_for_table_classification(image_data: bytes) -> str: """ - Returns one of: "TWO_COLUMN", "THREE_COLUMN", "NO_TABLE". + Returns "TWO_COLUMN", "THREE_COLUMN", or "NO_TABLE". """ if genai is None or types is None: logger.warning("Gemini libraries not available. Defaulting to NO_TABLE.") @@ -42,14 +42,12 @@ The three-column 'table' image include such key features: - Headers like 'Topics', 'Content', 'Guidelines' - Numbered sections (e.g., 8.4, 9.1) - Educational curriculum-style structure - The two-column 'table' image include such key features: - Two columns header columns - Headers like 'Subject content' and 'Additional information' - Numbered sections (e.g., 2.1, 3.4) - Educational curriculum-style structure - Bullet description in 'Additional information' - If the image is a relevant table with 2 columns, respond with 'TWO_COLUMN'. If the image is a relevant table with 3 columns, respond with 'THREE_COLUMN'. If the image does not show a table at all, respond with 'NO_TABLE'. @@ -58,6 +56,7 @@ TWO_COLUMN THREE_COLUMN NO_TABLE """ + client = genai.Client(api_key="AIzaSyDtoakpXa2pjJwcQB6TJ5QaXHNSA5JxcrU") response = client.models.generate_content( model="gemini-2.0-flash", @@ -86,42 +85,59 @@ NO_TABLE else: return "NO_TABLE" + def call_gemini_for_image_description(image_data: bytes) -> str: - client = genai.Client(api_key="AIzaSyDtoakpXa2pjJwcQB6TJ5QaXHNSA5JxcrU") - response = client.models.generate_content( - model="gemini-2.0-flash", - config=types.GenerateContentConfig(temperature=0.), - contents=[ - { - "parts": [ - {"text": """The provided image is a part of a question paper or markscheme. - Extract all the necessary information from the image to be able to identify the question. - To identify the question, we only need the following: question number and question part. - Don't include redundant information. - For example, if image contains text like: "Q1 Part A Answer: Life on earth was created by diety..." - you should return just "Q1 Part A Mark Scheme" - If there is no text on this image, return the description of the image. 20 words max. - If there are not enough data, consider information from the surrounding context. - Additionally, if the image contains a truncated part, you must describe it and mark as a - part of some another image that goes before or after current image. - If the image is of a multiple-choice question’s options, then modify your answer by appending - 'MCQ: A [option] B [option] C [option] D [option]' (replacing [option] with the actual options). - Otherwise, follow the above instructions strictly. - """}, - { - "inline_data": { - "mime_type": "image/jpeg", - "data": base64.b64encode(image_data).decode('utf-8') + """ + Get a short textual description from Gemini. + """ + if genai is None or types is None: + logger.warning("Gemini libraries not available. Returning fallback description.") + return "Image description unavailable" + + prompt_text = """The provided image is a part of a question paper or markscheme. +Extract all the necessary information from the image to be able to identify the question. +To identify the question, we only need the following: question number and question part. +Don't include redundant information. +For example, if image contains text like: "Q1 Part A Answer: Life on earth was created by diety..." +you should return just "Q1 Part A Mark Scheme" +If there is no text on this image, return the description of the image. 20 words max. +If there are not enough data, consider information from the surrounding context. +Additionally, if the image contains a truncated part, you must describe it and mark as a +part of some another image that goes before or after current image. +If the image is of a multiple-choice question’s options, then modify your answer by appending +'MCQ: A [option] B [option] C [option] D [option]' (replacing [option] with the actual options). +Otherwise, follow the above instructions strictly. +""" + + try: + client = genai.Client(api_key="AIzaSyDtoakpXa2pjJwcQB6TJ5QaXHNSA5JxcrU") + response = client.models.generate_content( + model="gemini-2.0-flash", + config=types.GenerateContentConfig(temperature=0.), + contents=[ + { + "parts": [ + {"text": prompt_text}, + { + "inline_data": { + "mime_type": "image/jpeg", + "data": base64.b64encode(image_data).decode('utf-8') + } } - } - ] - } - ] - ) + ] + } + ] + ) + return response.text.strip() if (response and response.text) else "Image description unavailable" + + except Exception as e: + logger.error(f"Error getting image description: {str(e)}") + return "Image description unavailable" - description = response.text.strip() if (response and response.text) else "Image description unavailable" - return description +# ------------------------------------------------------------------- +# DataWriter base class +# ------------------------------------------------------------------- class DataWriter: """ Base class for handling extracted images. @@ -132,36 +148,49 @@ class DataWriter: def post_process(self, key: str, md_content: str) -> str: raise NotImplementedError + +# ------------------------------------------------------------------- +# LocalImageWriter +# ------------------------------------------------------------------- class LocalImageWriter(DataWriter): - # def __init__(self, output_folder: str, svm_model: SVMModel): + """ + Writes extracted images to a local folder, then calls Gemini for: + - table classification + - or a normal short alt-text description + Then replaces the original placeholders in MD with these references. + Finally, for table images, runs TableExtractor and replaces that line + with references to each row/cell image. + """ def __init__(self, output_folder: str): self.output_folder = output_folder - # self.svm_model = svm_model - self.descriptions = {} - """ - self.descriptions structure: - { - "{local_id_or_path}": { - "data": bytes, - "relative_path": str, # relative path to the saved image - "description": "", # gemini description - "table_classification": "TWO_COLUMN" / "THREE_COLUMN" / "NO_TABLE" - "final_alt": "" # final alt text for the MD - } - } - """ os.makedirs(self.output_folder, exist_ok=True) + self.images_dir = os.path.join(self.output_folder, "images") os.makedirs(self.images_dir, exist_ok=True) + self.descriptions = {} + """ + self.descriptions: { + "{extracted_path}": { + "data": bytes, + "relative_path": str, + "description": "", + "table_classification": "TWO_COLUMN"/"THREE_COLUMN"/"NO_TABLE", + "final_alt": "" + } + } + """ self._img_count = 0 def write(self, path: str, data: bytes) -> None: - # pred = self.svm_model.classify_image(data) - # if pred == 0: - # logger.info(f"[SVM] Skipping blank/irrelevant image: {path}") - # return - + """ + Saves images locally (no SVM check here). + If you want SVM, add the code: + pred = self.svm_model.classify_image(data) + if pred == 0: + logger.info(f"Skipping blank image: {path}") + return + """ self._img_count += 1 local_filename = f"img_{self._img_count}.png" local_path = os.path.join(self.images_dir, local_filename) @@ -173,7 +202,7 @@ class LocalImageWriter(DataWriter): self.descriptions[path] = { "data": data, - "relative_path": rel_path_for_md, # e.g. "images/img_1.png" + "relative_path": rel_path_for_md, "description": "", "table_classification": "NO_TABLE", "final_alt": "" @@ -181,46 +210,51 @@ class LocalImageWriter(DataWriter): def post_process(self, key: str, md_content: str) -> str: """ - 1) Gemini classification (table vs no_table). - 2) If table => alt = "HAS TO BE PROCESSED - two/three column table". - Else => normal Gemini-based description. - 3) Replace all ![]({key}{path}) with ![final_alt](relative_local_path). - 4) For any "HAS TO BE PROCESSED" images, run TableExtractor. + 1) Classify each image with Gemini to see if it's a 2/3-col table or not. + 2) If NO_TABLE => call gemini_for_image_description + 3) Build final alt text + 4) Replace ![]({key}{path}) with ![alt](relative_path) + 5) For any "HAS TO BE PROCESSED" images => run TableExtractor + and replace that single line with references to each extracted cell. """ if not self.descriptions: return md_content - max_workers = len(self.descriptions) - with concurrent.futures.ThreadPoolExecutor(max_workers=max(max_workers, 1)) as executor: - future_to_path = { + # A) Table classification + logger.info("Starting Gemini table classification for each local image...") + with concurrent.futures.ThreadPoolExecutor(max_workers=len(self.descriptions)) as executor: + future_map = { executor.submit(call_gemini_for_table_classification, info['data']): p for p, info in self.descriptions.items() } - for future in concurrent.futures.as_completed(future_to_path): - path = future_to_path[future] + for fut in concurrent.futures.as_completed(future_map): + path = future_map[fut] try: - classification = future.result() + classification = fut.result() self.descriptions[path]['table_classification'] = classification except Exception as e: - logger.error(f"[Gemini Table Classification Error for {path}]: {str(e)}") + logger.error(f"[Gemini Table Classification Error] {path}: {e}") self.descriptions[path]['table_classification'] = "NO_TABLE" - with concurrent.futures.ThreadPoolExecutor(max_workers=max(max_workers, 1)) as executor: - fut_map = {} + # B) Normal gemini-based description if "NO_TABLE" + logger.info("Starting Gemini question-based description for non-table images...") + with concurrent.futures.ThreadPoolExecutor(max_workers=len(self.descriptions)) as executor: + fut_map2 = {} for path, info in self.descriptions.items(): if info['table_classification'] == "NO_TABLE": fut = executor.submit(call_gemini_for_image_description, info['data']) - fut_map[fut] = path + fut_map2[fut] = path - for fut in concurrent.futures.as_completed(fut_map): - path = fut_map[fut] + for fut in concurrent.futures.as_completed(fut_map2): + path = fut_map2[fut] try: desc = fut.result() self.descriptions[path]['description'] = desc except Exception as e: - logger.error(f"[Gemini Description Error for {path}]: {str(e)}") + logger.error(f"[Gemini Description Error] {path}: {e}") self.descriptions[path]['description'] = "Image description unavailable" + # C) Build final alt text for path, info in self.descriptions.items(): classification = info['table_classification'] if classification == "TWO_COLUMN": @@ -228,24 +262,25 @@ class LocalImageWriter(DataWriter): elif classification == "THREE_COLUMN": final_alt = "HAS TO BE PROCESSED - three column table" else: - # normal gemini-based description final_alt = info['description'] or "Image description unavailable" info['final_alt'] = final_alt + # D) Replace placeholders in the MD for path, info in self.descriptions.items(): - old_md_tag = f"![]({key}{path})" - new_md_tag = f"![{info['final_alt']}]({info['relative_path']})" - md_content = md_content.replace(old_md_tag, new_md_tag) + old_md = f"![]({key}{path})" + new_md = f"![{info['final_alt']}]({info['relative_path']})" + md_content = md_content.replace(old_md, new_md) + # E) For table images => run TableExtractor => replace the single line with references to row cells md_content = self._process_table_images_in_markdown(md_content) - return md_content def _process_table_images_in_markdown(self, md_content: str) -> str: """ - Finds images with alt text like: - ![HAS TO BE PROCESSED - (two|three) column table](images/img_1.png) - Then runs TableExtractor with specific params. Saves each row as a separate image in a subfolder next to the original. + 1) Find images with alt text "HAS TO BE PROCESSED - (two|three) column table" + 2) For each, run TableExtractor, generate row/cell images + 3) Build a snippet of lines referencing each cell image + 4) Replace the single "HAS TO BE PROCESSED" line with that snippet """ pattern = r"!\[HAS TO BE PROCESSED - (two|three) column table\]\(([^)]+)\)" matches = re.findall(pattern, md_content, flags=re.IGNORECASE) @@ -253,64 +288,132 @@ class LocalImageWriter(DataWriter): return md_content for (col_type, image_path) in matches: - logger.info(f"Detected table image in MD: {image_path}, columns={col_type}") - abs_image_path = os.path.join(self.output_folder, image_path) + logger.info(f"Detected table image in MD => {image_path}, columns={col_type}") + abs_image_path = os.path.join(self.output_folder, image_path) try: + # 1) Create TableExtractor with different parameters if col_type.lower() == 'two': - # For two-column tables extractor = TableExtractor( - padding=0, + padding=1, skip_header=True, merge_two_col_rows=True, enable_subtopic_merge=True, subtopic_threshold=0.2 ) else: - # For three-column tables extractor = TableExtractor( - padding=0, + padding=1, skip_header=True, + merge_two_col_rows=False, - enable_subtopic_merge=False + enable_subtopic_merge=False, + subtopic_threshold=0.2, ) + # 2) Extract row bounding boxes row_boxes = extractor.process_image(abs_image_path) - + # 3) Save each row/cell out_folder = abs_image_path + "_rows" os.makedirs(out_folder, exist_ok=True) - extractor.save_extracted_cells(abs_image_path, row_boxes, out_folder) logger.info(f"Table extraction done for {image_path}, saved to {out_folder}") + # 4) Build snippet lines for each row/cell image + snippet_lines = ["**Extracted table cells:**"] + for i, row in enumerate(row_boxes): + row_dir = os.path.join(out_folder, f"row_{i}") + for j, _ in enumerate(row): + cell_filename = f"col_{j}.png" + cell_abs_path = os.path.join(row_dir, cell_filename) + # Make a relative path from self.output_folder + cell_rel_path = os.path.relpath(cell_abs_path, self.output_folder) + snippet_lines.append(f"![Row {i} Col {j}]({cell_rel_path})") + + # Turn the snippet into a single string + new_snippet = "\n".join(snippet_lines) + + # 5) Replace the original single line + old_line = f"![HAS TO BE PROCESSED - {col_type} column table]({image_path})" + md_content = md_content.replace(old_line, new_snippet) + except Exception as e: logger.error(f"Error processing table image {image_path}: {e}") return md_content + class LocalPDFProcessor: def __init__(self, output_folder: str): self.output_folder = output_folder os.makedirs(self.output_folder, exist_ok=True) - # self.svm_model = SVMModel() - logger.info("Classification (SVM) model initialized successfully") - with open("/home/user/magic-pdf.json", "r") as f: config = json.load(f) - # self.ocr_enable = False self.layout_mode = config["layout-config"]["model"] self.formula_enable = config["formula-config"]["enable"] self.table_enable = False self.language = "en" - def cleanup_gpu(self): gc.collect() torch.cuda.empty_cache() logger.info("GPU memory cleaned up.") + def _parse_contents_section(self, markdown_content: str) -> tuple: + """ + Returns (start_page, end_page) for "2 Subject content..." section + """ + # Find Specification followed by Contents + spec_match = re.search(r'Specification', markdown_content, re.IGNORECASE) + if not spec_match: + logger.warning("'Specification' keyword not found") + return None, None + + contents_header = re.search(r'Contents', markdown_content[spec_match.end():], re.IGNORECASE) + if not contents_header: + logger.warning("'Contents' section not found after Specification") + return None, None + + # Extract contents lines + contents_text = markdown_content[spec_match.end() + contents_header.end():] + lines = [line.strip() for line in contents_text.split('\n') if line.strip()] + + # Find target section and next main section + target_section = None + next_section = None + for line in lines: + if re.match(r'^2\s+Subject content and assessment information', line): + page_match = re.search(r'(\d+)\s*$', line) + if page_match: + target_section = int(page_match.group(1)) + elif re.match(r'^3\s+', line) and target_section: + page_match = re.search(r'(\d+)\s*$', line) + if page_match: + next_section = int(page_match.group(1)) + break + + if not target_section or not next_section: + logger.warning("Could not determine page range from Contents") + return None, None + + return target_section, next_section + + def _extract_relevant_pages(self, markdown_content: str, start_page: int, end_page: int) -> str: + """ + Split markdown by page breaks (form feed character) and extract range + """ + pages = markdown_content.split('\x0c') # PDF page separator + if len(pages) < end_page: + logger.error("PDF has fewer pages than required by Contents") + return markdown_content + + # Convert to 0-based index (PDF pages are 1-based in Contents) + start_idx = start_page - 1 + end_idx = end_page - 1 + return '\x0c'.join(pages[start_idx:end_idx]) + def process(self, pdf_path: str) -> str: logger.info(f"Processing local PDF: {pdf_path}") try: @@ -326,17 +429,21 @@ class LocalPDFProcessor: formula_enable=self.formula_enable, table_enable=self.table_enable ) - logger.info("doc_analyze complete. Extracting images...") - # image_writer = LocalImageWriter(self.output_folder, self.svm_model) image_writer = LocalImageWriter(self.output_folder) pipe_result = inference.pipe_ocr_mode(image_writer, lang=self.language) md_content = pipe_result.get_markdown("local-unique-prefix/") - final_markdown = image_writer.post_process("local-unique-prefix/", md_content) - # Save final .md file + # New logic: Extract relevant pages based on Contents + start_page, end_page = self._parse_contents_section(final_markdown) + if start_page and end_page: + logger.info(f"Extracting pages {start_page}-{end_page-1} based on Contents") + final_markdown = self._extract_relevant_pages(final_markdown, start_page, end_page) + else: + logger.warning("Using full markdown content as page range detection failed") + md_path = os.path.join(self.output_folder, "final_output.md") with open(md_path, "w", encoding="utf-8") as f: f.write(final_markdown) @@ -349,7 +456,7 @@ class LocalPDFProcessor: if __name__ == "__main__": input_pdf = "/home/user/app/input_output/a-level-pearson-mathematics-specification.pdf" - output_dir = "/home/user/app/input_output/output" + output_dir = "/home/user/app/input_output/outputs" processor = LocalPDFProcessor(output_folder=output_dir) md_result = processor.process(input_pdf) \ No newline at end of file