2 constrained-breaking.hh -- declare a line breaker that
3 supports limits on the number of systems
5 source file of the GNU LilyPond music typesetter
7 (c) 2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #ifndef CONSTRAINED_BREAKING_HH
11 #define CONSTRAINED_BREAKING_HH
13 #include "break-algorithm.hh"
14 #include "lily-guile.hh"
18 Real extent_; /* Y-extent of the system */
19 Real padding_; /* compulsory space after this system (if we're not last on a page) */
20 Real space_; /* spring length (stretches over extent_ but not over padding_) */
23 SCM break_permission_;
37 break_permission_ = ly_symbol2scm ("allow");
38 page_permission_ = ly_symbol2scm ("allow");
39 turn_permission_ = ly_symbol2scm ("allow");
47 Helper to trace back an optimal path
49 struct Constrained_break_node
51 /* the number of bars in all the systems before this one
55 /* unlike the Gourlay breaker, this is the sum of all demerits up to,
56 * and including, this line */
58 struct Line_details details_;
60 Constrained_break_node ()
63 demerits_ = infinity_f;
68 printf ("prev break %d, demerits %f\n", prev_, demerits_);
73 A dynamic programming solution to breaking scores into lines
75 class Constrained_breaking : public Break_algorithm
78 vector<Column_x_positions> solve ();
79 Constrained_breaking ();
80 Constrained_breaking (vector<vsize> const &start_col_posns);
82 vector<Column_x_positions> get_solution(vsize start, vsize end, vsize sys_count);
83 vector<Line_details> get_details (vsize start, vsize end, vsize sys_count);
84 int get_max_systems (vsize start, vsize end);
85 int get_min_systems (vsize start, vsize end);
87 void resize (vsize systems);
93 /* the (i,j)th entry is the configuration for breaking between
95 vector<Line_details> lines_;
98 /* the [i](j,k)th entry is the score for fitting the first k bars onto the
99 first j systems, starting at the i'th allowed starting column */
100 vector<vector<Constrained_break_node> > state_;
102 vector<vsize> start_; /* the columns at which we might be asked to start breaking */
103 vector<vsize> starting_breakpoints_; /* the corresponding index in breaks_ */
106 vector<vsize> breaks_;
108 Column_x_positions space_line (vsize start_col, vsize end_col);
109 void prepare_solution (vsize start, vsize end, vsize sys_count, vsize *rank, vsize *brk);
111 Real combine_demerits (Real force, Real prev_force);
113 bool calc_subproblem(vsize start, vsize systems, vsize max_break_index);
115 #endif /* CONSTRAINED_BREAKING_HH */