]> git.donarmstrong.com Git - lilypond.git/commitdiff
* buildscripts/output-distance.py
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 3 Jun 2006 01:29:01 +0000 (01:29 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 3 Jun 2006 01:29:01 +0000 (01:29 +0000)
(SystemLink.output_expression_change_count): keep track of changed
details, and dump in details html page.

* lily/figured-bass-position-engraver.cc (acknowledge_slur):
add slurs and ties to support too.

* buildscripts/output-distance.py (main): set dest_dir
argument. Add --max-count option.

ChangeLog
buildscripts/output-distance.py
lily/figured-bass-position-engraver.cc
lily/slur-engraver.cc

index 8e1b98e9138447154f7615849bfd599d5c1a73aa..0f352fd289e2c0572410fad506a992a1ad9efdc2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2006-06-03  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
+       * buildscripts/output-distance.py
+       (SystemLink.output_expression_change_count): keep track of changed
+       details, and dump in details html page.
        * input/regression/figured-bass-staff.ly: add note about setting
        properties in Staff context.
 
index bebafe755935243f014c1812ef4f301023a1c33d..6f5258a192f86d892f324d27db829e64756b8bbe 100644 (file)
@@ -79,10 +79,10 @@ class GrobSignature:
 
     def __repr__ (self):
         return '%s: (%.2f,%.2f), (%.2f,%.2f)\n' % (self.name,
-                                                 self.bbox[0][0],
-                                                 self.bbox[0][1],
-                                                 self.bbox[1][0],
-                                                 self.bbox[1][1])
+                                                   self.bbox[0][0],
+                                                   self.bbox[0][1],
+                                                   self.bbox[1][0],
+                                                   self.bbox[1][1])
                                                  
     def axis_centroid (self, axis):
         return apply (sum, self.bbox[axis])  / 2 
@@ -101,9 +101,12 @@ class GrobSignature:
         
     def expression_distance (self, other):
         if self.output_expression == other.output_expression:
-            return 0.0
+            return 0
         else:
-            return OUTPUT_EXPRESSION_PENALTY
+            return 1
+
+################################################################
+# single System.
 
 class SystemSignature:
     def __init__ (self, grob_sigs):
@@ -140,6 +143,9 @@ class SystemSignature:
     def grobs (self):
         return reduce (lambda x,y: x+y, self.grob_dict.values(), [])
 
+################################################################
+## comparison of systems.
+
 class SystemLink:
     def __init__ (self, system1, system2):
         self.system1 = system1
@@ -148,6 +154,20 @@ class SystemLink:
         self.link_list_dict = {}
         self.back_link_dict = {}
 
+
+        ## pairs
+        self.orphans = []
+
+        ## pair -> distance
+        self.geo_distances = {}
+
+        ## pairs
+        self.expression_changed = []
+
+        self._geometric_distance = None
+        self._expression_change_count = None
+        self._orphan_count = None
+        
         for g in system1.grobs ():
 
             ## skip empty bboxes.
@@ -160,33 +180,69 @@ class SystemLink:
             self.link_list_dict[closest].append (g)
             self.back_link_dict[g] = closest
 
-    def geometric_distance (self):
-        d = 0.0
+
+    def calc_geometric_distance (self):
+        total = 0.0
         for (g1,g2) in self.back_link_dict.items ():
             if g2:
-                # , scale
-                d += g1.bbox_distance (g2)
+                d = g1.bbox_distance (g2)
+                if d:
+                    self.geo_distances[(g1,g2)] = d
 
-        return d
+                total += d
+
+        self._geometric_distance = total
     
-    def orphan_distance (self):
-        d = 0
-        for (g1,g2) in self.back_link_dict.items ():
+    def calc_orphan_count (self):
+        count = 0
+        for (g1, g2) in self.back_link_dict.items ():
             if g2 == None:
-                d += ORPHAN_GROB_PENALTY
-        return d
+                self.orphans.append ((g1, None))
+                
+                count += 1
+
+        self._orphan_count = count
     
-    def output_exp_distance (self):
+    def calc_output_exp_distance (self):
         d = 0
         for (g1,g2) in self.back_link_dict.items ():
             if g2:
                 d += g1.expression_distance (g2)
 
-        return d
+        self._expression_change_count = d
 
+    def output_expression_details_string (self):
+        return ', '.join ([g1.name for g1 in self.expression_changed])
+    
+    def geo_details_string (self):
+        results = [(d, g1,g2) for ((g1, g2), d) in self.geo_distances.items()]
+        results.sort ()
+        results.reverse ()
+        
+        return ', '.join (['%s: %f' % (g1.name, d) for (d, g1, g2) in results])
+
+    def orphan_details_string (self):
+        return ', '.join (['%s-None' % g1.name for (g1,g2) in self.orphans if g2==None])
+
+    def geometric_distance (self):
+        if self._geometric_distance == None:
+            self.calc_geometric_distance ()
+        return self._geometric_distance
+    
+    def orphan_count (self):
+        if self._orphan_count == None:
+            self.calc_orphan_count ()
+            
+        return self._orphan_count
+    
+    def output_expression_change_count (self):
+        if self._expression_change_count == None:
+            self.calc_output_exp_distance ()
+        return self._expression_change_count
+        
     def distance (self):
-        return (self.output_exp_distance (),
-                self.orphan_distance (),
+        return (self.output_expression_change_count (),
+                self.orphan_count (),
                 self.geometric_distance ())
     
 def read_signature_file (name):
@@ -199,6 +255,9 @@ def read_signature_file (name):
     return sig
 
 
+################################################################
+# different systems of a .ly file.
+
 class FileLink:
     def __init__ (self):
         self.original_name = ''
@@ -325,8 +384,19 @@ class FileLink:
                 e += '<td>%f</td>' % d
             
             e = '<tr>%s</tr>' % e
+
             html += e
 
+            e = '<td>%d</td>' % c
+            for s in (link.output_expression_details_string (),
+                      link.orphan_details_string (),
+                      link.geo_details_string ()):
+                e += "<td>%s</td>" % s
+
+            
+            e = '<tr>%s</tr>' % e
+            html += e
+            
         original = self.original_name
         html = '''<html>
 <head>
@@ -652,9 +722,10 @@ def test_basic_compare ():
 
 
 def run_tests ():
-    do_clean = 0
     dir = 'output-distance-test'
 
+    do_clean = not os.path.exists (dir)
+
     print 'test results in ', dir
     if do_clean:
         system ('rm -rf ' + dir)
index 502b30d6c15c7e56b2c1c1d746acb6a856039cc3..4e4f63af0877ccb351ec2c2ab813da76cf4b9bbe 100644 (file)
@@ -23,10 +23,11 @@ class Figured_bass_position_engraver : public Engraver
   Spanner *bass_figure_alignment_;
   Spanner *positioner_;
   vector<Grob*> support_;
-
+  vector<Grob*> span_support_;
 protected:
   DECLARE_ACKNOWLEDGER (note_column);
   DECLARE_ACKNOWLEDGER (slur);
+  DECLARE_END_ACKNOWLEDGER (slur);
   DECLARE_ACKNOWLEDGER (tie);
   DECLARE_ACKNOWLEDGER (bass_figure_alignment);
   DECLARE_END_ACKNOWLEDGER (bass_figure_alignment);
@@ -78,10 +79,18 @@ Figured_bass_position_engraver::acknowledge_note_column (Grob_info info)
 }
 
 
+void
+Figured_bass_position_engraver::acknowledge_end_slur (Grob_info info)
+{
+  vector<Grob*>::iterator i = find (span_support_.begin (), span_support_.end (),
+                                   info.grob ());
+  span_support_.erase (i);
+}
+
 void
 Figured_bass_position_engraver::acknowledge_slur (Grob_info info)
 {
-  support_.push_back (info.grob ());
+  span_support_.push_back (info.grob ());
 }
 
 void
@@ -95,6 +104,8 @@ Figured_bass_position_engraver::stop_translation_timestep ()
 {
   if (positioner_)
     {
+      for (vsize i = 0; i < span_support_.size (); i++)
+       Side_position_interface::add_support (positioner_, span_support_[i]);
       for (vsize i = 0; i < support_.size (); i++)
        Side_position_interface::add_support (positioner_, support_[i]);
     }
@@ -119,6 +130,8 @@ Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info inf
 
 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,note_column);
 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
+ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
+
 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,tie);
 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
index 0e649fe566165944aad7131a8f9edb4eacff558a..dca3a3dc90cca5d63abd5b52f4107490b9280958 100644 (file)
@@ -156,6 +156,7 @@ Slur_engraver::process_music ()
       if (slurs_.size () == 0)
        events_[STOP]->origin ()->warning (_ ("can't end slur"));
 
+      
       end_slurs_ = slurs_;
       slurs_.clear ();
     }
@@ -187,6 +188,8 @@ Slur_engraver::process_music ()
 void
 Slur_engraver::stop_translation_timestep ()
 {
+  for (vsize i = 0; i < end_slurs_.size (); i++)
+    announce_end_grob (end_slurs_[i], SCM_EOL);
   end_slurs_.clear ();
   events_[START] = events_[STOP] = 0;
 }