2 break.cc -- implement Break_algorithm
4 source file of the GNU LilyPond music typesetter
6 (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "score-column.hh"
11 #include "paper-def.hh"
12 #include "spring-spacer.hh"
14 #include "line-of-score.hh"
15 #include "paper-score.hh"
16 #include "paper-column.hh"
17 #include "cpu-timer.hh"
18 #include "command-request.hh"
21 Col_stats::str () const
26 else if (count_i_
== 1)
27 s
= _f ("1 line (of %.0f columns)", (Real
)cols_i_
/count_i_
);
29 s
= _f ("%d lines (with an average of %.1f columns)",
30 count_i_
, (Real
)cols_i_
/count_i_
);
35 Col_stats::add (Line_of_cols
const& line
)
38 cols_i_
+= line
.size ();
42 Col_stats::Col_stats ()
48 /* **************************************************************** */
52 Break_algorithm::find_break_indices () const
54 Line_of_cols
all (pscore_l_
->col_l_arr_
);
57 for (int i
=0; i
< all
.size (); i
++)
58 if (all
[i
]->breakable_b ())
62 while (retval
.size () >2)
70 Break_algorithm::find_breaks () const
72 Line_of_cols
all (pscore_l_
->col_l_arr_
);
75 for (int i
=0; i
< all
.size (); i
++)
76 if (all
[i
]->breakable_b ())
81 while (retval
.size () >2)
92 Break_algorithm::generate_spacing_problem (Line_of_cols curline
, Interval line
) const
95 Spring_spacer
* sp
= dynamic_cast<Spring_spacer
*> ((*get_line_spacer
) ());
97 sp
->paper_l_
= pscore_l_
->paper_l_
;
98 sp
->add_column (curline
[0], true, line
[LEFT
]);
99 for (int i
=1; i
< curline
.size ()-1; i
++)
100 sp
->add_column (curline
[i
]);
102 if (line
.length () > 0)
104 sp
->add_column (curline
.top (), true, line
[RIGHT
]);
105 sp
->energy_normalisation_f_
= sqr (line
.length ());
108 sp
->add_column (curline
.top ());
114 Break_algorithm::Break_algorithm ()
122 Break_algorithm::set_pscore (Paper_score
*s
)
125 linelength
= s
->paper_l_
->linewidth_f ();
130 Break_algorithm::feasible (Line_of_cols curline
) const
135 for (int i
=0; i
< curline
.size (); i
++)
137 if (i
&& i
< curline
.size () -1
138 && ((dynamic_cast<Score_column
*>(curline
[i
]))->break_penalty_i () >= Break_req::FORCE
))
145 Break_algorithm::problem_OK () const
147 if (pscore_l_
->col_l_arr_
.empty ())
148 error (_("score does not have any columns"));
153 Break_algorithm::OK () const
157 Array
<Column_x_positions
>
158 Break_algorithm::solve () const
162 Array
<Column_x_positions
> h
= do_solve ();
164 if (approx_stats_
.count_i_
)
165 *mlog
<< '\n' << _f ("approximated %s", approx_stats_
.str ()) << endl
;
166 if (exact_stats_
.count_i_
)
167 *mlog
<< _f ("calculated %s exactly", exact_stats_
.str ()) << endl
;
168 *mlog
<< _f ("elapsed time %.2f seconds", timer
.read ()) << endl
;
174 Break_algorithm::do_set_pscore ()