+vector<Tie_configuration_variation>
+Tie_formatting_problem::generate_extremal_tie_variations (Ties_configuration const &ties) const
+{
+ vector<Tie_configuration_variation> vars;
+ Direction d = DOWN;
+ do
+ {
+ if (boundary (ties, d, 0).dir_ == d
+ && !boundary (specifications_, d, 0).has_manual_position_)
+ for (int i = 1; i <= details_.multi_tie_region_size_; i++)
+ {
+ Tie_configuration_variation var;
+ var.index_ = (d == DOWN) ? 0 : ties.size () - 1;
+ var.suggestion_ = get_configuration (boundary (ties, d, 0).position_
+ + d * i, d,
+ boundary (ties, d, 0).column_ranks_,
+ true);
+ vars.push_back (var);
+ }
+ }
+ while (flip (&d) != DOWN);
+
+ return vars;
+}
+
+vector<Tie_configuration_variation>
+Tie_formatting_problem::generate_single_tie_variations (Ties_configuration const &ties) const
+{
+ vector<Tie_configuration_variation> vars;
+
+ int sz = details_.single_tie_region_size_;
+ if (specifications_[0].has_manual_position_)
+ sz = 1;
+ for (int i = 0; i < sz; i ++)
+ {
+ Direction d = LEFT;
+ do
+ {
+ if (i == 0
+ && ties[0].dir_ == d)
+ continue;
+
+ int p = ties[0].position_ + i * d;
+
+ if (!specifications_[0].has_manual_dir_
+ || d == specifications_[0].manual_dir_)
+ {
+ Tie_configuration_variation var;
+ var.index_ = 0;
+ var.suggestion_ = get_configuration (p,
+ d, specifications_[0].column_ranks_,
+ !specifications_[0].has_manual_delta_y_);
+ vars.push_back (var);
+ }
+ }
+ while (flip (&d) != LEFT);
+ }
+ return vars;
+}
+
+
+vector<Tie_configuration_variation>
+Tie_formatting_problem::generate_collision_variations (Ties_configuration const &ties) const