]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.1.1
authorfred <fred>
Sun, 24 Mar 2002 19:52:41 +0000 (19:52 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:52:41 +0000 (19:52 +0000)
lily/break.cc

index 8d3779e4da1eb7bdf842b343b9b2e4164e30d657..1ef5c4bc6f48b41b63831e14c942e0b9c4889e82 100644 (file)
 #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++)
@@ -44,46 +107,24 @@ Break_algorithm::generate_spacing_problem(Line_of_cols curline)const
        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
@@ -124,3 +165,17 @@ Break_algorithm::solve()const
     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";
+}