From bf35196abc040ab4a300810f8db6d8106db2bb6d Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sat, 3 Jun 2006 01:29:01 +0000 Subject: [PATCH] * buildscripts/output-distance.py (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 | 4 + buildscripts/output-distance.py | 113 ++++++++++++++++++++----- lily/figured-bass-position-engraver.cc | 17 +++- lily/slur-engraver.cc | 3 + 4 files changed, 114 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8e1b98e913..0f352fd289 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2006-06-03 Han-Wen Nienhuys + * 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. diff --git a/buildscripts/output-distance.py b/buildscripts/output-distance.py index bebafe7559..6f5258a192 100644 --- a/buildscripts/output-distance.py +++ b/buildscripts/output-distance.py @@ -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 += '%f' % d e = '%s' % e + html += e + e = '%d' % c + for s in (link.output_expression_details_string (), + link.orphan_details_string (), + link.geo_details_string ()): + e += "%s" % s + + + e = '%s' % e + html += e + original = self.original_name html = ''' @@ -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) diff --git a/lily/figured-bass-position-engraver.cc b/lily/figured-bass-position-engraver.cc index 502b30d6c1..4e4f63af08 100644 --- a/lily/figured-bass-position-engraver.cc +++ b/lily/figured-bass-position-engraver.cc @@ -23,10 +23,11 @@ class Figured_bass_position_engraver : public Engraver Spanner *bass_figure_alignment_; Spanner *positioner_; vector support_; - + vector 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::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); diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 0e649fe566..dca3a3dc90 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -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; } -- 2.39.5