X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fconstrained-breaking.hh;h=ff60adf34cadea06f2726be8a1750d778268a153;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=57e71984a4fc9e05be09d38fb03773d33420d475;hpb=7056ec0726ed866fcf12f6f0fcdbdd00a00733fc;p=lilypond.git diff --git a/lily/include/constrained-breaking.hh b/lily/include/constrained-breaking.hh index 57e71984a4..ff60adf34c 100644 --- a/lily/include/constrained-breaking.hh +++ b/lily/include/constrained-breaking.hh @@ -4,91 +4,140 @@ source file of the GNU LilyPond music typesetter - (c) 2006 Han-Wen Nienhuys + (c) 2006--2008 Joe Neeman */ #ifndef CONSTRAINED_BREAKING_HH #define CONSTRAINED_BREAKING_HH -#include "break-algorithm.hh" +#include "lily-guile.hh" +#include "matrix.hh" +#include "prob.hh" -/** +struct Line_details { + Real force_; + Interval extent_; /* Y-extent of the system */ + + Real padding_; /* compulsory space after this system (if we're not + last on a page) */ + Real bottom_padding_; + Real space_; /* spring length */ + Real inverse_hooke_; + + SCM break_permission_; + SCM page_permission_; + SCM turn_permission_; + Real break_penalty_; + Real page_penalty_; + Real turn_penalty_; + + bool title_; + + Line_details () + { + force_ = infinity_f; + padding_ = 0; + bottom_padding_ = 0; + space_ = 0; + inverse_hooke_ = 1; + break_permission_ = ly_symbol2scm ("allow"); + page_permission_ = ly_symbol2scm ("allow"); + turn_permission_ = ly_symbol2scm ("allow"); + break_penalty_ = 0; + page_penalty_ = 0; + turn_penalty_ = 0; + title_ = false; + } + + Line_details (Prob *pb) + { + force_ = 0; + extent_ = unsmob_stencil (pb->get_property ("stencil")) ->extent (Y_AXIS); + padding_ = robust_scm2double (pb->get_property ("next-padding"), 0); + bottom_padding_ = 0; + space_ = robust_scm2double (pb->get_property ("next-space"), 1.0); + inverse_hooke_ = 1.0; + break_permission_ = ly_symbol2scm ("allow"); + page_permission_ = pb->get_property ("page-break-permission"); + turn_permission_ = pb->get_property ("page-turn-permission"); + break_penalty_ = 0; + page_penalty_ = robust_scm2double (pb->get_property ("page-break-penalty"), 0); + turn_penalty_ = robust_scm2double (pb->get_property ("page-turn-penalty"), 0); + title_ = to_boolean (pb->get_property ("is-title")); + } +}; + +/* Helper to trace back an optimal path */ struct Constrained_break_node { - /** the number of bars in all the systems before this one - */ + /* the number of bars in all the systems before this one + */ int prev_; - /** unlike the Gourlay breaker, this is the sum of all demerits up to, + /* unlike the Gourlay breaker, this is the sum of all demerits up to, * and including, this line */ Real demerits_; - Real force_; - Real penalty_; - Column_x_positions line_config_; + struct Line_details details_; Constrained_break_node () { prev_ = -1; demerits_ = infinity_f; - force_ = infinity_f; - penalty_ = 0; - line_config_.satisfies_constraints_ = false; } void print () const { - printf ("prev break %d, demerits %f\n", - prev_, demerits_); + printf ("prev break %d, demerits %f\n", prev_, demerits_); } }; -/** +/* A dynamic programming solution to breaking scores into lines */ -class Constrained_breaking : public Break_algorithm +class Constrained_breaking { public: - std::vector solve (); - Constrained_breaking (); - Constrained_breaking (std::vector const &start_col_posns); + vector solve (vsize start, vsize end, vsize sys_count); + vector best_solution (vsize start, vsize end); + vector line_details (vsize start, vsize end, vsize sys_count); - std::vector get_solution(int start, int end, int sys_count); - Real get_demerits (int start, int end, int sys_count); - Real get_force (int start, int end, int sys_count); - Real get_penalty (int start, int end, int sys_count); - int get_max_systems (int start, int end); - int get_min_systems (int start, int end); + Constrained_breaking (Paper_score *ps); + Constrained_breaking (Paper_score *ps, vector const &start_col_posns); - /* get the page penalty of system number sys with the given breaking */ - Real get_page_penalty (int start, int end, int sys_count, int sys); + int max_system_count (vsize start, vsize end); + int min_system_count (vsize start, vsize end); - int systems_; private: - int valid_systems_; + Paper_score *pscore_; + vsize valid_systems_; + vsize systems_; + bool ragged_right_; + bool ragged_last_; - /* the (i,j)th entry is the column configuration for breaking - between columns i and j */ - std::vector cols_; - int cols_rank_; + /* the (i,j)th entry is the configuration for breaking between + columns i and j */ + Matrix lines_; /* the [i](j,k)th entry is the score for fitting the first k bars onto the - first j systems, starting at the i'th allowed starting column */ - std::vector > state_; + first j systems, starting at the i'th allowed starting column */ + vector > state_; - vector start_; /* the columns at which we might be asked to start breaking */ - vector starting_breakpoints_; /* the corresponding index in breaks_ */ + vector start_; /* the columns at which we might be asked to start breaking */ + vector starting_breakpoints_; /* the corresponding index in breaks_ */ vector all_; - std::vector breaks_; + vector breaks_; + + void initialize (); + void resize (vsize systems); - void prepare_solution (vsize start, int end, int sys_count, int *rank, int *brk); + Column_x_positions space_line (vsize start_col, vsize end_col); + vsize prepare_solution (vsize start, vsize end, vsize sys_count); - void combine_demerits (Column_x_positions const &, Column_x_positions const &, - Real *force, Real *pen, Real *dem) const; + Real combine_demerits (Real force, Real prev_force); - bool calc_subproblem(int start, int systems, int max_break_index); - void resize (); + bool calc_subproblem(vsize start, vsize systems, vsize max_break_index); }; #endif /* CONSTRAINED_BREAKING_HH */