/src/tesseract/src/ccstruct/dppoint.h
Line | Count | Source |
1 | | /********************************************************************** |
2 | | * File: dppoint.h |
3 | | * Description: Simple generic dynamic programming class. |
4 | | * Author: Ray Smith |
5 | | * Created: Wed Mar 25 18:57:01 PDT 2009 |
6 | | * |
7 | | * (C) Copyright 2009, Google Inc. |
8 | | ** Licensed under the Apache License, Version 2.0 (the "License"); |
9 | | ** you may not use this file except in compliance with the License. |
10 | | ** You may obtain a copy of the License at |
11 | | ** http://www.apache.org/licenses/LICENSE-2.0 |
12 | | ** Unless required by applicable law or agreed to in writing, software |
13 | | ** distributed under the License is distributed on an "AS IS" BASIS, |
14 | | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
15 | | ** See the License for the specific language governing permissions and |
16 | | ** limitations under the License. |
17 | | * |
18 | | **********************************************************************/ |
19 | | |
20 | | #ifndef TESSERACT_CCSTRUCT_DPPOINT_H_ |
21 | | #define TESSERACT_CCSTRUCT_DPPOINT_H_ |
22 | | |
23 | | #include <cstdint> |
24 | | |
25 | | namespace tesseract { |
26 | | |
27 | | // A simple class to provide a dynamic programming solution to a class of |
28 | | // 1st-order problems in which the cost is dependent only on the current |
29 | | // step and the best cost to that step, with a possible special case |
30 | | // of using the variance of the steps, and only the top choice is required. |
31 | | // Useful for problems such as finding the optimal cut points in a fixed-pitch |
32 | | // (vertical or horizontal) situation. |
33 | | // Skeletal Example: |
34 | | // DPPoint* array = new DPPoint[width]; |
35 | | // for (int i = 0; i < width; i++) { |
36 | | // array[i].AddLocalCost(cost_at_i) |
37 | | // } |
38 | | // DPPoint* best_end = DPPoint::Solve(..., array); |
39 | | // while (best_end != nullptr) { |
40 | | // int cut_index = best_end - array; |
41 | | // best_end = best_end->best_prev(); |
42 | | // } |
43 | | // delete [] array; |
44 | | class DPPoint { |
45 | | public: |
46 | | // The cost function evaluates the total cost at this (excluding this's |
47 | | // local_cost) and if it beats this's total_cost, then |
48 | | // replace the appropriate values in this. |
49 | | using CostFunc = int64_t (DPPoint::*)(const DPPoint *); |
50 | | |
51 | | DPPoint() |
52 | 0 | : local_cost_(0) |
53 | 0 | , total_cost_(INT32_MAX) |
54 | 0 | , total_steps_(1) |
55 | 0 | , best_prev_(nullptr) |
56 | 0 | , n_(0) |
57 | 0 | , sig_x_(0) |
58 | 0 | , sig_xsq_(0) {} |
59 | | |
60 | | // Solve the dynamic programming problem for the given array of points, with |
61 | | // the given size and cost function. |
62 | | // Steps backwards are limited to being between min_step and max_step |
63 | | // inclusive. |
64 | | // The return value is the tail of the best path. |
65 | | static DPPoint *Solve(int min_step, int max_step, bool debug, CostFunc cost_func, int size, |
66 | | DPPoint *points); |
67 | | |
68 | | // A CostFunc that takes the variance of step into account in the cost. |
69 | | int64_t CostWithVariance(const DPPoint *prev); |
70 | | |
71 | | // Accessors. |
72 | 0 | int total_cost() const { |
73 | 0 | return total_cost_; |
74 | 0 | } |
75 | 0 | int Pathlength() const { |
76 | 0 | return total_steps_; |
77 | 0 | } |
78 | 0 | const DPPoint *best_prev() const { |
79 | 0 | return best_prev_; |
80 | 0 | } |
81 | 0 | void AddLocalCost(int new_cost) { |
82 | 0 | local_cost_ += new_cost; |
83 | 0 | } |
84 | | |
85 | | private: |
86 | | // Code common to different cost functions. |
87 | | |
88 | | // Update the other members if the cost is lower. |
89 | | void UpdateIfBetter(int64_t cost, int32_t steps, const DPPoint *prev, int32_t n, int32_t sig_x, |
90 | | int64_t sig_xsq); |
91 | | |
92 | | int32_t local_cost_; // Cost of this point on its own. |
93 | | int32_t total_cost_; // Sum of all costs in best path to here. |
94 | | // During cost calculations local_cost is excluded. |
95 | | int32_t total_steps_; // Number of steps in best path to here. |
96 | | const DPPoint *best_prev_; // Pointer to prev point in best path from here. |
97 | | // Information for computing the variance part of the cost. |
98 | | int32_t n_; // Number of steps in best path to here for variance. |
99 | | int32_t sig_x_; // Sum of step sizes for computing variance. |
100 | | int64_t sig_xsq_; // Sum of squares of steps for computing variance. |
101 | | }; |
102 | | |
103 | | } // namespace tesseract. |
104 | | |
105 | | #endif // TESSERACT_CCSTRUCT_DPPOINT_H_ |