|
@@ -0,0 +1,129 @@ |
|
|
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
""" |
|
|
|
|
|
Created on Thu Mar 19 18:13:56 2020 |
|
|
|
|
|
|
|
|
|
|
|
@author: ljia |
|
|
|
|
|
""" |
|
|
|
|
|
from gklearn.utils import dummy_node |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def construct_node_map_from_solver(solver, node_map, solution_id): |
|
|
|
|
|
node_map.clear() |
|
|
|
|
|
num_nodes_g = node_map.num_source_nodes() |
|
|
|
|
|
num_nodes_h = node_map.num_target_nodes() |
|
|
|
|
|
|
|
|
|
|
|
# add deletions and substitutions |
|
|
|
|
|
for row in range(0, num_nodes_g): |
|
|
|
|
|
col = solver.get_assigned_col(row, solution_id) |
|
|
|
|
|
if col >= num_nodes_h: |
|
|
|
|
|
node_map.add_assignment(row, dummy_node()) |
|
|
|
|
|
else: |
|
|
|
|
|
node_map.add_assignment(row, col) |
|
|
|
|
|
|
|
|
|
|
|
# insertions. |
|
|
|
|
|
for col in range(0, num_nodes_h): |
|
|
|
|
|
if solver.get_assigned_row(col, solution_id) >= num_nodes_g: |
|
|
|
|
|
node_map.add_assignment(dummy_node(), col) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def options_string_to_options_map(options_string): |
|
|
|
|
|
"""Transforms an options string into an options map. |
|
|
|
|
|
|
|
|
|
|
|
Parameters |
|
|
|
|
|
---------- |
|
|
|
|
|
options_string : string |
|
|
|
|
|
Options string of the form "[--<option> <arg>] [...]". |
|
|
|
|
|
|
|
|
|
|
|
Return |
|
|
|
|
|
------ |
|
|
|
|
|
options_map : dict{string : string} |
|
|
|
|
|
Map with one key-value pair (<option>, <arg>) for each option contained in the string. |
|
|
|
|
|
""" |
|
|
|
|
|
if options_string == '': |
|
|
|
|
|
return |
|
|
|
|
|
options_map = {} |
|
|
|
|
|
words = [] |
|
|
|
|
|
tokenize(options_string, ' ', words) |
|
|
|
|
|
expect_option_name = True |
|
|
|
|
|
for word in words: |
|
|
|
|
|
if expect_option_name: |
|
|
|
|
|
is_opt_name, word = is_option_name(word) |
|
|
|
|
|
if is_opt_name: |
|
|
|
|
|
option_name = word |
|
|
|
|
|
if option_name in options_map: |
|
|
|
|
|
raise Exception('Multiple specification of option "' + option_name + '".') |
|
|
|
|
|
options_map[option_name] = '' |
|
|
|
|
|
else: |
|
|
|
|
|
raise Exception('Invalid options "' + options_string + '". Usage: options = "[--<option> <arg>] [...]"') |
|
|
|
|
|
else: |
|
|
|
|
|
is_opt_name, word = is_option_name(word) |
|
|
|
|
|
if is_opt_name: |
|
|
|
|
|
raise Exception('Invalid options "' + options_string + '". Usage: options = "[--<option> <arg>] [...]"') |
|
|
|
|
|
else: |
|
|
|
|
|
options_map[option_name] = word |
|
|
|
|
|
expect_option_name = not expect_option_name |
|
|
|
|
|
return options_map |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def tokenize(sentence, sep, words): |
|
|
|
|
|
"""Separates a sentence into words separated by sep (unless contained in single quotes). |
|
|
|
|
|
|
|
|
|
|
|
Parameters |
|
|
|
|
|
---------- |
|
|
|
|
|
sentence : string |
|
|
|
|
|
The sentence that should be tokenized. |
|
|
|
|
|
|
|
|
|
|
|
sep : string |
|
|
|
|
|
The separator. Must be different from "'". |
|
|
|
|
|
|
|
|
|
|
|
words : list[string] |
|
|
|
|
|
The obtained words. |
|
|
|
|
|
""" |
|
|
|
|
|
outside_quotes = True |
|
|
|
|
|
word_length = 0 |
|
|
|
|
|
pos_word_start = 0 |
|
|
|
|
|
for pos in range(0, len(sentence)): |
|
|
|
|
|
if sentence[pos] == '\'': |
|
|
|
|
|
if not outside_quotes and pos < len(sentence) - 1: |
|
|
|
|
|
if sentence[pos + 1] != sep: |
|
|
|
|
|
raise Exception('Sentence contains closing single quote which is followed by a char different from ' + sep + '.') |
|
|
|
|
|
word_length += 1 |
|
|
|
|
|
outside_quotes = not outside_quotes |
|
|
|
|
|
elif outside_quotes and sentence[pos] == sep: |
|
|
|
|
|
if word_length > 0: |
|
|
|
|
|
words.append(sentence[pos_word_start:pos_word_start + word_length]) |
|
|
|
|
|
pos_word_start = pos + 1 |
|
|
|
|
|
word_length = 0 |
|
|
|
|
|
else: |
|
|
|
|
|
word_length += 1 |
|
|
|
|
|
if not outside_quotes: |
|
|
|
|
|
raise Exception('Sentence contains unbalanced single quotes.') |
|
|
|
|
|
if word_length > 0: |
|
|
|
|
|
words.append(sentence[pos_word_start:pos_word_start + word_length]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_option_name(word): |
|
|
|
|
|
"""Checks whether a word is an option name and, if so, removes the leading dashes. |
|
|
|
|
|
|
|
|
|
|
|
Parameters |
|
|
|
|
|
---------- |
|
|
|
|
|
word : string |
|
|
|
|
|
Word. |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
------ |
|
|
|
|
|
True if word is of the form "--<option>". |
|
|
|
|
|
|
|
|
|
|
|
word : string |
|
|
|
|
|
The word without the leading dashes. |
|
|
|
|
|
""" |
|
|
|
|
|
if word[0] == '\'': |
|
|
|
|
|
word = word[1:len(word) - 2] |
|
|
|
|
|
return False, word |
|
|
|
|
|
if len(word) < 3: |
|
|
|
|
|
return False, word |
|
|
|
|
|
if word[0] == '-' and word[1] == '-' and word[2] != '-': |
|
|
|
|
|
word = word[2:] |
|
|
|
|
|
return True, word |
|
|
|
|
|
return False, word |