]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/beam-scoring-problem.hh
Run grand replace for 2015.
[lilypond.git] / lily / include / beam-scoring-problem.hh
index 8026f430612b8f8233f579b5c231cdaf7d2f136d..bbabfde7deca96823ca0477b84500af4f2cc22ca 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1996--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 
   LilyPond is free software: you can redistribute it and/or modify
 #ifndef BEAM_SCORING_PROBLEM_HH
 #define BEAM_SCORING_PROBLEM_HH
 
+#include "beam.hh"
 #include "interval.hh"
-#include "lily-proto.hh" 
-#include "std-vector.hh" 
-#include "stem-info.hh" 
+#include "lily-guile.hh"
+#include "lily-proto.hh"
 #include "main.hh"  //  DEBUG_BEAM_SCORING
+#include "std-vector.hh"
+#include "stem-info.hh"
 
-// Unused for now.
-enum Scorers {
+enum Scorers
+{
   // Should be ordered by increasing expensiveness.
   ORIGINAL_DISTANCE,
-  SLOPES,
+  SLOPE_IDEAL,
+  SLOPE_MUSICAL,
+  SLOPE_DIRECTION,
+  HORIZONTAL_INTER,
   FORBIDDEN,
   STEM_LENGTHS,
+  COLLISIONS,
   NUM_SCORERS,
 };
 
@@ -41,7 +47,6 @@ struct Beam_configuration
 {
   Interval y;
   Real demerits;
-
 #if DEBUG_BEAM_SCORING
   string score_card_;
 #endif
@@ -51,20 +56,21 @@ struct Beam_configuration
   Beam_configuration ();
   bool done () const;
   void add (Real demerit, const string &reason);
-  static Beam_configuration* new_config(Interval start,
-                                        Interval offset);
+  static Beam_configuration *new_config (Interval start,
+                                         Interval offset);
 };
 
 // Comparator for a queue of Beam_configuration*.
 class Beam_configuration_less
 {
-  bool operator() (Beam_configuration* const& l, Beam_configuration* const& r)
+public:
+  bool operator () (Beam_configuration *const &l, Beam_configuration *const &r)
   {
-    return l->demerits < r->demerits;
+    // Invert
+    return l->demerits > r->demerits;
   }
 };
 
-
 struct Beam_quant_parameters
 {
   Real SECONDARY_BEAM_DEMERIT;
@@ -83,38 +89,48 @@ struct Beam_quant_parameters
   Real HINT_DIRECTION_PENALTY;
   Real IDEAL_SLOPE_FACTOR;
   Real ROUND_TO_ZERO_SLOPE;
+  Real COLLISION_PENALTY;
+  Real COLLISION_PADDING;
+  Real HORIZONTAL_INTER_QUANT_PENALTY;
+  Real STEM_COLLISION_FACTOR;
 
   void fill (Grob *him);
 };
 
+struct Beam_collision
+{
+  Real x_;
+  Interval y_;
+  Real base_penalty_;
 
+  // Need to add beam_config->y to get actual offsets.
+  Interval beam_y_;
+};
 
 /*
   Parameters for a single beam.  Precomputed to save time in
   scoring individual configurations.
 
-  TODO - use trailing _ on data members.
   */
 class Beam_scoring_problem
 {
 public:
-  Beam_scoring_problem (Grob *me, Drul_array<Real> ys);
-  Drul_array<Real> solve() const;
+  Beam_scoring_problem (Grob *me, Drul_array<Real> ys, bool);
+  Drul_array<Real> solve () const;
 
 private:
-  Grob *beam;
+  Spanner *beam_;
 
-  Interval unquanted_y;
-  
-  Real staff_space;
-  Real beam_thickness;
-  Real line_thickness;
-  Real musical_dy;
+  Interval unquanted_y_;
+  bool align_broken_intos_;
+  bool do_initial_slope_calculations_;
 
-  Interval x_span;
-  
-  vector<Stem_info> stem_infos;
+  Real staff_space_;
+  Real beam_thickness_;
+  Real line_thickness_;
+  Real musical_dy_;
+  int normal_stem_count_;
+  Real x_span_;
 
   /*
     Do stem computations.  These depend on YL and YR linearly, so we can
@@ -124,27 +140,58 @@ private:
     affine linear in YL and YR. If YL == YR == 0, then we might have
     stem_y != 0.0, when we're cross staff.
   */
-  vector<Real> base_lengths;
-  vector<Real> stem_xpositions;
-  
-  Grob *common[2];
-  bool is_xstaff;
-  bool is_knee;
-
-  Beam_quant_parameters parameters;
-
-  Real staff_radius;
-  Drul_array<int> edge_beam_counts;
-  Drul_array<Direction> edge_dirs;
-  Real beam_translation;
-
-  void init_stems ();
+  vector<Stem_info> stem_infos_;
+  vector<Real> chord_start_y_;
+  vector<Interval> head_positions_;
+  vector<Slice> beam_multiplicity_;
+  vector<bool> is_normal_;
+  vector<Real> base_lengths_;
+  vector<Real> stem_xpositions_;
+  vector<Real> stem_ypositions_;
+
+  bool is_xstaff_;
+  bool is_knee_;
+
+  Beam_quant_parameters parameters_;
+
+  Real staff_radius_;
+  Drul_array<int> edge_beam_counts_;
+  Drul_array<Direction> edge_dirs_;
+
+  // Half-open intervals, representing allowed positions for the beam,
+  // starting from close to the notehead to the direction of the stem
+  // end.  This is used for quickly weeding out invalid
+  // Beam_configurations.
+  Drul_array<Interval> quant_range_;
+  Real beam_translation_;
+  vector<Beam_collision> collisions_;
+  vector<Beam_segment> segments_;
+
+  vsize first_normal_index ();
+  vsize last_normal_index ();
+
+  void init_instance_variables (Grob *me, Drul_array<Real> ys, bool align_broken_intos);
+  void add_collision (Real x, Interval y, Real factor);
+  void no_visible_stem_positions ();
+  void least_squares_positions ();
+  Real calc_concaveness ();
+  void slope_damping ();
+  void shift_region_to_valid ();
+
+  void one_scorer (Beam_configuration *config) const;
+  Beam_configuration *force_score (SCM inspect_quants,
+                                   const vector<Beam_configuration *> &configs) const;
+  Real y_at (Real x, Beam_configuration const *c) const;
 
   // Scoring functions:
   void score_forbidden_quants (Beam_configuration *config) const;
-  void score_slopes_dy (Beam_configuration *config) const;
-  void score_stem_lengths (Beam_configuration* config) const;
-  void generate_quants(vector<Beam_configuration*>* scores) const;
+  void score_horizontal_inter_quants (Beam_configuration *config) const;
+  void score_slope_ideal (Beam_configuration *config) const;
+  void score_slope_direction (Beam_configuration *config) const;
+  void score_slope_musical (Beam_configuration *config) const;
+  void score_stem_lengths (Beam_configuration *config) const;
+  void generate_quants (vector<Beam_configuration *> *scores) const;
+  void score_collisions (Beam_configuration *config) const;
 };
 
 #endif /* BEAM_SCORING_PROBLEM_HH */