#include "p-score.hh"
#include "p-col.hh"
+String
+Col_stats::str() const {
+ String s(count_i_);
+ s += " lines";
+ if (count_i_)
+ s += String(Real(cols_i_)/count_i_, ", (with an average of %.1f columns)");
+
+ return s;
+}
+
+void
+Col_stats::add(Line_of_cols const& line)
+{
+ count_i_++;
+ cols_i_ += line.size();
+}
+
+
+Col_stats::Col_stats()
+{
+ count_i_ =0;
+ cols_i_ =0;
+}
+
+/* **************************************************************** */
+
+Line_of_cols
+Break_algorithm::all_cols()const
+{
+ Line_of_cols retval;
+ for (PCursor<PCol*> c(pscore_l_->col_p_list_.top());
+ c.ok(); c++) {
+
+ retval.push(c);
+ }
+ return retval;
+}
+
+Array<int>
+Break_algorithm::find_break_indices() const
+{
+ Line_of_cols all(all_cols());
+ Array<int> retval;
+
+ for (int i=0; i < all.size(); i++)
+ if (all[i]->breakable_b())
+ retval.push(i);
+
+ if ( linelength <=0)
+ while ( retval.size() >2)
+ retval.del(1);
+
+ return retval;
+}
+
/// return all breakable columns
Line_of_cols
Break_algorithm::find_breaks() const
{
+ Line_of_cols all(all_cols());
Line_of_cols retval;
- for (iter_top(pscore_l_->col_p_list_,c); c.ok(); c++) {
- if (c->breakable_b())
- retval.push(c);
- }
+
+ for (int i=0; i < all.size(); i++)
+ if (all[i]->breakable_b())
+ retval.push(all[i]);
+
+
if ( linelength <=0)
while ( retval.size() >2)
retval.del(1);
return retval;
}
+
+
+
+
Line_spacer*
Break_algorithm::generate_spacing_problem(Line_of_cols curline)const
{
Line_spacer * sp= (*get_line_spacer)();
+
sp->paper_l_ = pscore_l_->paper_l_;
sp->add_column(curline[0], true, 0.0);
for (int i=1; i< curline.size()-1; i++)
sp->add_column(curline.top(), true, linelength);
else
sp->add_column(curline.top());
- return sp;
-}
-Col_hpositions
-Break_algorithm::stupid_solution(Line_of_cols curline)const
-{
- Line_spacer *sp =generate_spacing_problem(curline);
- Col_hpositions colhpos;
- colhpos.cols = curline;
- colhpos.energy = INFTY_f;
- colhpos.ugh_b_ = true;
- colhpos.config = sp->default_solution();
- delete sp;
- return colhpos;
+ sp->prepare();
+ return sp;
}
-/// construct an appropriate Spacing_problem and solve it.
-Col_hpositions
-Break_algorithm::solve_line(Line_of_cols curline) const
+Break_algorithm::Break_algorithm()
{
- Line_spacer *sp = generate_spacing_problem(curline);
- sp->prepare();
-
- Array<Real> the_sol=sp->solve();
- Col_hpositions col_hpos;
- col_hpos.cols = curline;
- col_hpos.energy = the_sol.pop();
- col_hpos.config = the_sol;
- col_hpos.error_col_l_arr_ = sp->error_pcol_l_arr();
- col_hpos.OK();
- delete sp;
-
- return col_hpos;
+ pscore_l_ = 0;
+ get_line_spacer =0;
+ linelength = 0;
}
-Break_algorithm::Break_algorithm(PScore&s)
+void
+Break_algorithm::set_pscore(PScore*s)
{
- pscore_l_ = &s;
- get_line_spacer =0;
- linelength = s.paper_l_->linewidth_f();
+ pscore_l_ = s;
+ linelength = s->paper_l_->linewidth_f();
+ do_set_pscore();
}
bool
return do_solve();
}
+void
+Break_algorithm::do_set_pscore()
+{
+
+}
+
+void
+Break_algorithm::print_stats()const
+{
+ if (approx_stats_.count_i_)
+ *mlog << "\nApproximated: " << approx_stats_.str() << "\n";
+ if (exact_stats_.count_i_)
+ *mlog << "Calculated exactly: " << exact_stats_.str() << "\n";
+}