Example #1
0
def run_skrafl():
    """ Build a DAWG from the files listed """
    # This creates a DAWG from the full database of 'Beygingarlýsing íslensks nútímamáls' (BIN)
    # (except abbreviations, 'skammstafanir', and proper names, 'sérnöfn'), but
    # filtered according to filter_skrafl() (see comment above) and with a few two-letter
    # words added according to Icelandic Scrabble rules
    # Output is about 2.2 million words, generating 102,668 graph nodes
    print(u"Starting DAWG build for skraflhjalp/netskrafl.appspot.com")
    db = DawgBuilder()
    t0 = time.time()
    # "isl" specifies Icelandic sorting order - modify this for other languages
    db.build(
        ["ordalistimax15.sorted.txt"], # Input files to be merged
        "ordalisti", # Output file - full name will be ordalisti.text.dawg
        "resources", # Subfolder of input and output files
        "isl", # Identifier of locale to use for sorting order
        filter_skrafl) # Word filter function to apply
    t1 = time.time()
    print("Build took {0:.2f} seconds".format(t1 - t0))

    dawg = DawgDictionary()
    fpath = os.path.abspath(os.path.join("resources", "ordalisti.text.dawg"))
    t0 = time.time()
    dawg.load(fpath)
    t1 = time.time()

    print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

    t0 = time.time()
    dawg.store_pickle(os.path.abspath(os.path.join("resources", "ordalisti.dawg.pickle")))
    t1 = time.time()

    print("DAWG pickle file stored in {0:.2f} seconds".format(t1 - t0))
Example #2
0
def run_bin():
    """ Build a DAWG from the files listed """
    # This creates a DAWG from the full database of Icelandic words in
    # 'Beygingarlýsing íslensks nútímamáls' (BIN).
    # The words in ordalisti.add.txt are added to BIN, and words in
    # ordalisti.remove.txt (known errors) are removed.
    print(u"Starting DAWG build for Reynir")
    db = DawgBuilder()
    t0 = time.time()
    db.build(
        ["ordalisti.sorted.txt"], # Input files to be merged
        "ordalisti", # Output file - full name will be ordalisti.text.dawg
        "resources", # Subfolder of input and output files
        nofilter # Word filter function to apply
    )
    t1 = time.time()
    print("Build took {0:.2f} seconds".format(t1 - t0))

    # Test loading of DAWG
    dawg = DawgDictionary()
    fpath = os.path.abspath(os.path.join("resources", "ordalisti.text.dawg"))
    t0 = time.time()
    dawg.load(fpath)
    t1 = time.time()

    print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

    # Store DAWG as a Python cPickle file
    t0 = time.time()
    dawg.store_pickle(os.path.abspath(os.path.join("resources", "ordalisti.dawg.pickle")))
    t1 = time.time()

    print("DAWG pickle file stored in {0:.2f} seconds".format(t1 - t0))

    print("DAWG builder run complete")
Example #3
0
def run_skrafl():
    """ Build a DAWG from the files listed """
    # This creates a DAWG from the full database of Icelandic words in
    # 'Beygingarlýsing íslensks nútímamáls' (BIN), except abbreviations,
    # 'skammstafanir', and proper names, 'sérnöfn'.
    # The words in ordalisti.add.txt are added to BIN, and words in
    # ordalisti.remove.txt (known errors) are removed.
    # The result is about 2.3 million words, generating >100,000 graph nodes
    print("Starting DAWG build for skraflhjalp/netskrafl.appspot.com")
    db = DawgBuilder()
    t0 = time.time()
    db.build(
        ["ordalistimax15.sorted.txt", "ordalisti.add.txt"
         ],  # Input files to be merged
        "ordalisti",  # Output file - full name will be ordalisti.text.dawg
        "resources",  # Subfolder of input and output files
        filter_skrafl,  # Word filter function to apply
        "ordalisti.remove.txt",  # Words to remove
    )
    t1 = time.time()
    print("Build took {0:.2f} seconds".format(t1 - t0))

    # Test loading of DAWG
    dawg = DawgDictionary()
    fpath = os.path.abspath(os.path.join("resources", "ordalisti.text.dawg"))
    t0 = time.time()
    dawg.load(fpath)
    t1 = time.time()

    print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

    # Store DAWG as a Python cPickle file
    t0 = time.time()
    dawg.store_pickle(
        os.path.abspath(os.path.join("resources", "ordalisti.dawg.pickle")))
    t1 = time.time()

    print("DAWG pickle file stored in {0:.2f} seconds".format(t1 - t0))

    print("DAWG builder run complete")
Example #4
0
def run_skrafl():
    """ Build a DAWG from the files listed """
    # This creates a DAWG from the full database of Icelandic words in
    # 'Beygingarlýsing íslensks nútímamáls' (BIN), except abbreviations,
    # 'skammstafanir', and proper names, 'sérnöfn'.
    # The words in ordalisti.add.txt are added to BIN, and words in
    # ordalisti.remove.txt (known errors) are removed.
    # The result is about 2.3 million words, generating >100,000 graph nodes
    print(u"Starting DAWG build for skraflhjalp/netskrafl.appspot.com")
    db = DawgBuilder()
    t0 = time.time()
    db.build(
        ["ordalistimax15.sorted.txt", "ordalisti.add.txt"], # Input files to be merged
        "ordalisti", # Output file - full name will be ordalisti.text.dawg
        "resources", # Subfolder of input and output files
        filter_skrafl, # Word filter function to apply
        "ordalisti.remove.txt" # Words to remove
    )
    t1 = time.time()
    print("Build took {0:.2f} seconds".format(t1 - t0))

    # Test loading of DAWG
    dawg = DawgDictionary()
    fpath = os.path.abspath(os.path.join("resources", "ordalisti.text.dawg"))
    t0 = time.time()
    dawg.load(fpath)
    t1 = time.time()

    print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

    # Store DAWG as a Python cPickle file
    t0 = time.time()
    dawg.store_pickle(os.path.abspath(os.path.join("resources", "ordalisti.dawg.pickle")))
    t1 = time.time()

    print("DAWG pickle file stored in {0:.2f} seconds".format(t1 - t0))

    # Process list of common words

    print(u"Starting DAWG build for list of common words")
    db = DawgBuilder()
    t0 = time.time()
    # "isl"/"is_IS" specifies Icelandic sorting order - modify this for other languages
    db.build(
        ["ordalisti.algeng.sorted.txt"], # Input files to be merged
        "algeng", # Output file - full name will be algeng.text.dawg
        "resources", # Subfolder of input and output files
        filter_common # Word filter function to apply
    )
    t1 = time.time()
    print("Build took {0:.2f} seconds".format(t1 - t0))

    # Test loading of DAWG for common words
    dawg = DawgDictionary()
    fpath = os.path.abspath(os.path.join("resources", "algeng.text.dawg"))
    t0 = time.time()
    dawg.load(fpath)
    t1 = time.time()

    print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

    # Store common words DAWG in a Python cPickle file
    t0 = time.time()
    dawg.store_pickle(os.path.abspath(os.path.join("resources", "algeng.dawg.pickle")))
    t1 = time.time()

    print("DAWG pickle file stored in {0:.2f} seconds".format(t1 - t0))

    print("DAWG builder run complete")
Example #5
0
    def run(self, fname, relpath):
        """ Load a DawgDictionary and test its functionality """

        print("DawgDictionary tester")
        print("Author: Vilhjalmur Thorsteinsson")
        print

        self._dawg = DawgDictionary()
        fpath = os.path.abspath(os.path.join(relpath, fname + ".text.dawg"))
        t0 = time.time()
        self._dawg.load(fpath)
        t1 = time.time()

        print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

        t0 = time.time()
        self._dawg.store_pickle(os.path.abspath(os.path.join(relpath, fname + ".dawg.pickle")))
        t1 = time.time()

        print("DAWG pickle file stored in {0:.2f} seconds".format(t1 - t0))

        print("Checking a set of random words:")
        self._test_true(u"abbadísarinnar")
        self._test_true(u"absintufyllirí")
        self._test_false(u"absolútt")
        self._test_true(u"aborri")
        self._test_true(u"eipaði")
        self._test_true(u"geipaði")
        self._test_false(u"eipeði")
        self._test_false(u"abs")
        self._test_true(u"halló")
        self._test_true(u"blús")
        # self._test_true(u"hraðskákmótin") # Not in BÍN
        # self._test_true(u"jólahraðskákmótið") # Longer than 15 letters
        self._test_true(u"nafnskírteinið")
        self._test_false(u"abstraktmálarið")
        self._test_true(u"abstraktmálari")
        self._test_false(u"abstraktmálar")
        self._test_false(u"abstraktmála")
        self._test_true(u"prófun")
        self._test_true(u"upphitun")
        self._test_false(u"")
        self._test_false(u"abo550")
        self._test_false(u"ertðu")
        self._test_false(u"sértðu")
        self._test_false(u"vextu")
        self._test_true(u"sértu")
        self._test_true(u"dren")
        self._test_true(u"drenið")
        self._test_true(u"drensins")
        self._test_true(u"álínis")
        self._test_false(u"réttleganna")
        self._test_false(u"meistarleganna")
        self._test_false(u"hjálpsamligana")
        self._test_true(u"bitla")
        self._test_true(u"friðla")
        self._test_true(u"fræla")
        self._test_true(u"geistla")
        self._test_true(u"greppla")
        self._test_true(u"hógla")
        self._test_true(u"hretla")
        self._test_true(u"hrumla")
        self._test_true(u"hæfla")
        self._test_true(u"jagla")
        self._test_true(u"mörla")
        self._test_true(u"níðla")
        self._test_true(u"ógjörla")
        self._test_true(u"ragla")
        self._test_true(u"rangla")
        self._test_true(u"síðla")
        self._test_true(u"sjóla")
        self._test_true(u"skopla")
        self._test_true(u"skrifla")
        self._test_true(u"snæla")
        self._test_true(u"spéla")
        self._test_true(u"smásmugula")
        self._test_true(u"safala")
        self._test_true(u"strangla")
        self._test_true(u"strikla")
        self._test_true(u"sumla")
        self._test_true(u"tæpla")
        self._test_true(u"vesalla")
        self._test_true(u"vesla")
        self._test_true(u"vitla")
        self._test_true(u"vígla")
        self._test_true(u"vísla")
        self._test_true(u"þolla")
        self._test_true(u"þrifla")

        # All two-letter words accepted by the Icelandic Scrabble(tm)-like game
        # at ordaleikur.appspot.com
        smallwords = [
            u"að", u"af", u"ak", u"al", u"an", u"ar", u"as", u"at", u"ax",
            u"áa", u"áð", u"ái", u"ál", u"ám", u"án", u"ár", u"ás", u"át",
            u"bí", u"bú", u"bý", u"bæ",
            u"dá", u"do", u"dó", u"dý",
            u"eð", u"ef", u"eg", u"ei", u"ek", u"el", u"em", u"en", u"er", u"et", u"ex", u"ey",
            u"ég", u"él", u"ét",
            u"fa", u"fá", u"fé", u"fæ",
            u"gá",
            u"ha", u"há", u"hí", u"hó", u"hý", u"hæ",
            u"ið", u"il", u"im",
            u"íð", u"íl", u"ím", u"ís",
            u"já", u"jó", u"jú",
            u"ká", u"ku", u"kú",
            u"la", u"lá", u"lé", u"ló", u"lý", u"læ",
            u"má", u"mi", u"mó", u"mý",
            u"ná", u"né", u"nó", u"nú", u"ný", u"næ",
            u"of", u"og", u"ok", u"op", u"or",
            u"óa", u"óð", u"óf", u"ói", u"ók", u"ól", u"óm", u"ón", u"óp", u"ós", u"óx",
            u"pí", u"pu", u"pú",
            u"rá", u"re", u"ré", u"rí", u"ró", u"rú", u"rý", u"ræ",
            u"sá", u"sé", u"sí", u"so", u"sú", u"sý", u"sæ",
            u"tá", u"te", u"té", u"ti", u"tí", u"tó", u"tý",
            u"um", u"un",
            u"úa", u"úð", u"úf", u"úi", u"úr", u"út",
            u"vá", u"vé", u"ví", u"vó",
            u"yl", u"ym", u"yr", u"ys",
            u"ýf", u"ýg", u"ýi", u"ýk", u"ýl", u"ýr", u"ýs", u"ýt",
            u"þá", u"þó", u"þú", u"þý",
            u"æð", u"æf", u"æg", u"æi", u"æl", u"æp", u"ær", u"æs", u"æt",
            u"öl", u"ör", u"ös", u"öt", u"öx"]

        print("Checking small words:")

        # Check all possible two-letter combinations, allowing only those in the list
        for first in Alphabet.order:
            for second in Alphabet.order:
                word = first + second
                if word in smallwords:
                    self._test_true(word)
                else:
                    self._test_false(word)

        print("Finding permutations:")
        t0 = time.time()
        word = u"einstök"
        permlist = self._dawg.find_permutations(word)
        t1 = time.time()
        print(u"Permutations of \"{0}\":".format(word))
        cnt = 0
        for word in permlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} permutations found in {1:.2f} seconds".format(cnt, t1 - t0))
        print
        t0 = time.time()
        word = u"pr?óf"
        permlist = self._dawg.find_permutations(word)
        t1 = time.time()
        print(u"Permutations of \"{0}\":".format(word))
        cnt = 0
        for word in permlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} permutations found in {1:.2f} seconds".format(cnt, t1 - t0))
        print

        print("Finding matches:")
        t0 = time.time()
        word = u"e??st??"
        mlist = self._dawg.find_matches(word)
        t1 = time.time()
        print(u"Matches of \"{0}\":".format(word))
        cnt = 0
        for word in mlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} matches found in {1:.2f} seconds".format(cnt, t1 - t0))
        print

        t0 = time.time()
        word = u"f?r??t??n"
        mlist = self._dawg.find_matches(word)
        t1 = time.time()
        print(u"Matches of \"{0}\":".format(word))
        cnt = 0
        for word in mlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} matches found in {1:.2f} seconds".format(cnt, t1 - t0))
        print

        word = u"??"
        mlist = self._dawg.find_matches(word)

        print(u"{0} two-letter words found; should be {1}".format(len(mlist), len(smallwords)))
        cnt = 0
        for word in mlist:
            if word not in smallwords:
                print (u"{0} in match result but not in smallwords".format(word))
        print

        print(u"Test finished")

        self._dawg = None
Example #6
0
    def run(self, fname, relpath):
        """ Load a DawgDictionary and test its functionality """

        print("DawgDictionary tester")
        print("Author: Vilhjalmur Thorsteinsson")
        print

        self._dawg = DawgDictionary()
        fpath = os.path.abspath(os.path.join(relpath, fname + ".dawg.pickle"))
        t0 = time.time()
        self._dawg.load_pickle(fpath)
        t1 = time.time()

        print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

        print("Checking a set of random words:")
        self._test_true(u"abbadísarinnar")
        self._test_true(u"absintufyllirí")
        self._test_false(u"absolútt")
        self._test_true(u"aborri")
        self._test_true(u"eipaði")
        self._test_true(u"geipaði")
        self._test_false(u"eipeði")
        self._test_false(u"abs")
        self._test_true(u"halló")
        self._test_true(u"blús")
        # self._test_true(u"hraðskákmótin") # Not in BÍN
        # self._test_true(u"jólahraðskákmótið") # Longer than 15 letters
        self._test_true(u"nafnskírteinið")
        self._test_false(u"abstraktmálarið")
        self._test_true(u"abstraktmálari")
        self._test_false(u"abstraktmálar")
        self._test_false(u"abstraktmála")
        self._test_true(u"prófun")
        self._test_true(u"upphitun")
        self._test_false(u"")
        self._test_false(u"abo550")
        self._test_false(u"ertðu")
        self._test_false(u"sértðu")
        self._test_false(u"vextu")
        self._test_true(u"sértu")
        self._test_true(u"dren")
        self._test_true(u"drenið")
        self._test_true(u"drensins")
        self._test_true(u"álínis")
        self._test_false(u"réttleganna")
        self._test_false(u"meistarleganna")
        self._test_false(u"hjálpsamligana")

        self._test_true(u"bitla")
        self._test_true(u"friðla")
        self._test_true(u"fræla")
        self._test_true(u"geistla")
        self._test_true(u"greppla")
        self._test_true(u"hógla")
        self._test_true(u"hretla")
        self._test_true(u"hrumla")
        self._test_true(u"hæfla")
        self._test_true(u"jagla")
        self._test_true(u"mörla")
        self._test_true(u"níðla")
        self._test_true(u"ógjörla")
        self._test_true(u"ragla")
        self._test_true(u"rangla")
        self._test_true(u"síðla")
        self._test_true(u"sjóla")
        self._test_true(u"skopla")
        self._test_true(u"skrifla")
        self._test_true(u"snæla")
        self._test_true(u"spéla")
        self._test_true(u"smásmugula")
        self._test_true(u"safala")
        self._test_true(u"strangla")
        self._test_true(u"strikla")
        self._test_true(u"sumla")
        self._test_true(u"tæpla")
        self._test_true(u"vesalla")
        self._test_true(u"vesla")
        self._test_true(u"vitla")
        self._test_true(u"vígla")
        self._test_true(u"vísla")
        self._test_true(u"þolla")
        self._test_true(u"þrifla")

        self._test_false(u"eystðu")
        self._test_false(u"blæstðu")
        self._test_false(u"botnfrýstðu")
        self._test_false(u"áttðu")
        self._test_false(u"endurkýstðu")
        self._test_false(u"frýstðu")
        self._test_false(u"gaddfrýstðu")
        self._test_false(u"gagnfrýstðu")
        self._test_false(u"gýstðu")
        self._test_false(u"grandlestðu")
        self._test_false(u"helfrýstðu")
        self._test_false(u"hnýstðu")
        self._test_false(u"hralestðu")
        self._test_true(u"hraðlestu")
        self._test_false(u"innblæstðu")
        self._test_false(u"kýstðu")
        self._test_false(u"kanntðu")
        self._test_false(u"lestðu")
        self._test_false(u"ljóslestðu")
        self._test_false(u"marglestðu")
        self._test_false(u"máttðu")
        self._test_false(u"mislestðu")
        self._test_false(u"moldeystðu")
        self._test_false(u"manstðu")
        self._test_false(u"muntðu")
        self._test_false(u"ofrístðu")
        self._test_false(u"rístðu")
        self._test_false(u"sandblæstðu")
        self._test_false(u"skaltðu")
        self._test_false(u"stokkfrýstðu")
        self._test_false(u"anntðu")
        self._test_false(u"uppeystðu")
        self._test_false(u"uppblæstðu")
        self._test_false(u"úteystðu")
        self._test_false(u"vextðu")
        self._test_false(u"ertðu")
        self._test_false(u"sértðu")
        self._test_false(u"viltðu")
        self._test_false(u"veistðu")
        self._test_false(u"þaullestðu")
        self._test_false(u"þinglestðu")
        self._test_false(u"þrautlestðu")
        self._test_false(u"þarftðu")
        self._test_false(u"þurreystðu")

        # All two-letter words on the official list of the
        # Icelandic Skrafl society
        smallwords = [
            u"að", u"af", u"ak", u"al", u"an", u"ar", u"as", u"at", u"ax",
            u"áa", u"áð", u"ái", u"ál", u"ám", u"án", u"ár", u"ás", u"át",
            u"bí", u"bú", u"bý", u"bæ",
            u"dá", u"do", u"dó", u"dý",
            u"eð", u"ef", u"eg", u"ei", u"ek", u"el", u"em", u"en", u"er", u"es", u"et", u"ex", u"ey",
            u"ég", u"él", u"ét",
            u"fa", u"fá", u"fé", u"fæ",
            u"gá",
            u"ha", u"há", u"hí", u"hó", u"hý", u"hæ",
            u"ið", u"il", u"im",
            u"íð", u"íl", u"ím", u"ís",
            u"já", u"je", u"jó", u"jú",
            u"ká", u"ku", u"kú",
            u"la", u"lá", u"lé", u"ló", u"lú", u"lý", u"læ",
            u"má", u"mi", u"mó", u"mý",
            u"ná", u"né", u"nó", u"nú", u"ný", u"næ",
            u"of", u"og", u"oj", u"ok", u"op", u"or",
            u"óa", u"óð", u"óf", u"ói", u"ók", u"ól", u"óm", u"ón", u"óp", u"ós", u"óx",
            u"pí", u"pu", u"pú", u"pæ",
            u"rá", u"re", u"ré", u"rí", u"ró", u"rú", u"rý", u"ræ",
            u"sá", u"sé", u"sí", u"so", u"sú", u"sý", u"sæ",
            u"tá", u"te", u"té", u"ti", u"tí", u"tó", u"tý",
            u"um", u"un",
            u"úa", u"úð", u"úf", u"úi", u"úr", u"út",
            u"vá", u"vé", u"ví", u"vó",
            u"yl", u"ym", u"yr", u"ys",
            u"ýf", u"ýg", u"ýi", u"ýk", u"ýl", u"ýr", u"ýs", u"ýt",
            u"þá", u"þó", u"þú", u"þý",
            u"æð", u"æf", u"æg", u"æi", u"æl", u"æp", u"ær", u"æs", u"æt",
            u"öl", u"ör", u"ös", u"öt", u"öx"]

        print("Checking small words:")

        # Check all possible two-letter combinations, allowing only those in the list
        for first in Alphabet.order:
            for second in Alphabet.order:
                word = first + second
                if word in smallwords:
                    self._test_true(word)
                else:
                    self._test_false(word)

        print("Finding permutations:")
        t0 = time.time()
        word = u"einstök"
        permlist = self._dawg.find_permutations(word)
        t1 = time.time()
        print(u"Permutations of \"{0}\":".format(word))
        cnt = 0
        for word in permlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} permutations found in {1:.2f} seconds".format(cnt, t1 - t0))
        print
        t0 = time.time()
        word = u"pr?óf"
        permlist = self._dawg.find_permutations(word)
        t1 = time.time()
        print(u"Permutations of \"{0}\":".format(word))
        cnt = 0
        for word in permlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} permutations found in {1:.2f} seconds".format(cnt, t1 - t0))
        print

        print("Finding matches:")
        t0 = time.time()
        word = u"e??st??"
        mlist = self._dawg.find_matches(word)
        t1 = time.time()
        print(u"Matches of \"{0}\":".format(word))
        cnt = 0
        for word in mlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} matches found in {1:.2f} seconds".format(cnt, t1 - t0))
        print

        t0 = time.time()
        word = u"f?r??t??n"
        mlist = self._dawg.find_matches(word)
        t1 = time.time()
        print(u"Matches of \"{0}\":".format(word))
        cnt = 0
        for word in mlist:
            print(u"\"{0}\"".format(word)),
            cnt += 1
            if cnt % 6 == 0:
                print
        print
        print(u"{0} matches found in {1:.2f} seconds".format(cnt, t1 - t0))
        print

        word = u"??"
        mlist = self._dawg.find_matches(word)

        print(u"{0} two-letter words found; should be {1}".format(len(mlist), len(smallwords)))
        for word in mlist:
            if word not in smallwords:
                print (u"{0} in match result but not in smallwords".format(word))
        print

        print(u"Test finished")

        self._dawg = None
Example #7
0
class DawgTester:

    def __init__(self):
        self._dawg = None

    def _test(self, word):
        print(u"\"{0}\" is {1}found".format(word, u"" if word in self._dawg else u"not "))

    def _test_true(self, word):
        if word not in self._dawg:
            print(u"Error: \"{0}\" was not found".format(word))

    def _test_false(self, word):
        if word in self._dawg:
            # Tests the __contains__ operator
            print(u"Error: \"{0}\" was found".format(word))

    def run(self, fname, relpath):
        """ Load a DawgDictionary and test its functionality """

        print("DawgDictionary tester")
        print("Author: Vilhjalmur Thorsteinsson")
        print()

        self._dawg = DawgDictionary()
        fpath = os.path.abspath(os.path.join(relpath, fname + ".dawg.pickle"))
        t0 = time.time()
        self._dawg.load_pickle(fpath)
        t1 = time.time()

        print("DAWG loaded in {0:.2f} seconds".format(t1 - t0))

        print("Checking a set of random words:")
        self._test_true(u"abbadísarinnar")
        self._test_true(u"absintufyllirí")
        self._test_false(u"absolútt")
        self._test_true(u"aborri")
        self._test_true(u"eipaði")
        self._test_true(u"geipaði")
        self._test_false(u"eipeði")
        self._test_false(u"abs")
        self._test_true(u"halló")
        self._test_true(u"blús")
        # self._test_true(u"hraðskákmótin") # Not in BÍN
        # self._test_true(u"jólahraðskákmótið") # Longer than 15 letters
        self._test_true(u"nafnskírteinið")
        self._test_false(u"abstraktmálarið")
        self._test_true(u"abstraktmálari")
        self._test_false(u"abstraktmálar")
        self._test_false(u"abstraktmála")
        self._test_true(u"prófun")
        self._test_true(u"upphitun")
        self._test_false(u"")
        self._test_false(u"abo550")
        self._test_false(u"ertðu")
        self._test_false(u"sértðu")
        # self._test_false(u"vextu") # Seems to be allowed
        self._test_true(u"sértu")
        self._test_true(u"dren")
        self._test_true(u"drenið")
        self._test_true(u"drensins")
        self._test_true(u"álínis")
        self._test_false(u"réttleganna")
        self._test_false(u"meistarleganna")
        self._test_false(u"hjálpsamligana")

        self._test_true(u"bitla")
        self._test_true(u"friðla")
        self._test_true(u"fræla")
        self._test_true(u"geistla")
        self._test_true(u"greppla")
        self._test_true(u"hógla")
        self._test_true(u"hretla")
        self._test_true(u"hrumla")
        self._test_true(u"hæfla")
        self._test_true(u"jagla")
        self._test_true(u"mörla")
        self._test_true(u"níðla")
        self._test_true(u"ógjörla")
        self._test_true(u"ragla")
        self._test_true(u"rangla")
        self._test_true(u"síðla")
        self._test_true(u"sjóla")
        self._test_true(u"skopla")
        self._test_true(u"skrifla")
        self._test_true(u"snæla")
        self._test_true(u"spéla")
        self._test_true(u"smásmugula")
        self._test_true(u"safala")
        self._test_true(u"strangla")
        self._test_true(u"strikla")
        self._test_true(u"sumla")
        self._test_true(u"tæpla")
        self._test_true(u"vesalla")
        self._test_true(u"vesla")
        self._test_true(u"vitla")
        self._test_true(u"vígla")
        self._test_true(u"vísla")
        self._test_true(u"þolla")
        self._test_true(u"þrifla")

        self._test_false(u"eystðu")
        self._test_false(u"blæstðu")
        self._test_false(u"botnfrýstðu")
        self._test_false(u"áttðu")
        self._test_false(u"endurkýstðu")
        self._test_false(u"frýstðu")
        self._test_false(u"gaddfrýstðu")
        self._test_false(u"gagnfrýstðu")
        self._test_false(u"gýstðu")
        self._test_false(u"grandlestðu")
        self._test_false(u"helfrýstðu")
        self._test_false(u"hnýstðu")
        self._test_false(u"hralestðu")
        self._test_true(u"hraðlestu")
        self._test_false(u"innblæstðu")
        self._test_false(u"kýstðu")
        self._test_false(u"kanntðu")
        self._test_false(u"lestðu")
        self._test_false(u"ljóslestðu")
        self._test_false(u"marglestðu")
        self._test_false(u"máttðu")
        self._test_false(u"mislestðu")
        self._test_false(u"moldeystðu")
        self._test_false(u"manstðu")
        self._test_false(u"muntðu")
        self._test_false(u"ofrístðu")
        self._test_false(u"rístðu")
        self._test_false(u"sandblæstðu")
        self._test_false(u"skaltðu")
        self._test_false(u"stokkfrýstðu")
        self._test_false(u"anntðu")
        self._test_false(u"uppeystðu")
        self._test_false(u"uppblæstðu")
        self._test_false(u"úteystðu")
        self._test_false(u"vextðu")
        self._test_false(u"ertðu")
        self._test_false(u"sértðu")
        self._test_false(u"viltðu")
        self._test_false(u"veistðu")
        self._test_false(u"þaullestðu")
        self._test_false(u"þinglestðu")
        self._test_false(u"þrautlestðu")
        self._test_false(u"þarftðu")
        self._test_false(u"þurreystðu")

        self._test_true(u"ertu")
        self._test_true(u"vertu")
        self._test_true(u"sértu")
        self._test_true(u"varstu")
        self._test_true(u"verðurðu")
        self._test_true(u"varðstu")

        # All two-letter words on the official list of the
        # Icelandic Skrafl society
        smallwords = [
            u"að", u"af", u"ak", u"al", u"an", u"ar", u"as", u"at", u"ax",
            u"áa", u"áð", u"ái", u"ál", u"ám", u"án", u"ár", u"ás", u"át",
            u"bí", u"bú", u"bý", u"bæ",
            u"dá", u"do", u"dó", u"dý",
            u"eð", u"ef", u"eg", u"ei", u"ek", u"el", u"em", u"en", u"er", u"es", u"et", u"ex", u"ey",
            u"ég", u"él", u"ét",
            u"fa", u"fá", u"fé", u"fæ",
            u"gá",
            u"ha", u"há", u"hí", u"hó", u"hý", u"hæ",
            u"ið", u"il", u"im",
            u"íð", u"íl", u"ím", u"ís",
            u"já", u"je", u"jó", u"jú",
            u"ká", u"ku", u"kú",
            u"la", u"lá", u"lé", u"ló", u"lú", u"lý", u"læ",
            u"má", u"mi", u"mó", u"mý",
            u"ná", u"né", u"nó", u"nú", u"ný", u"næ",
            u"of", u"og", u"oj", u"ok", u"op", u"or",
            u"óa", u"óð", u"óf", u"ói", u"ók", u"ól", u"óm", u"ón", u"óp", u"ós", u"óx",
            u"pí", u"pu", u"pú", u"pæ",
            u"rá", u"re", u"ré", u"rí", u"ró", u"rú", u"rý", u"ræ",
            u"sá", u"sé", u"sí", u"so", u"sú", u"sý", u"sæ",
            u"tá", u"te", u"té", u"ti", u"tí", u"tó", u"tý",
            u"um", u"un",
            u"úa", u"úð", u"úf", u"úi", u"úr", u"út",
            u"vá", u"vé", u"ví", u"vó",
            u"yl", u"ym", u"yr", u"ys",
            u"ýf", u"ýg", u"ýi", u"ýk", u"ýl", u"ýr", u"ýs", u"ýt",
            u"þá", u"þó", u"þú", u"þý",
            u"æð", u"æf", u"æg", u"æi", u"æl", u"æp", u"ær", u"æs", u"æt",
            u"öl", u"ör", u"ös", u"öt", u"öx"]

        print("Checking small words:")

        # Check all possible two-letter combinations, allowing only those in the list
        for first in Alphabet.order:
            for second in Alphabet.order:
                word = first + second
                if word in smallwords:
                    self._test_true(word)
                else:
                    self._test_false(word)

        print("Finding permutations:")
        t0 = time.time()
        word = u"einstök"
        permlist = self._dawg.find_permutations(word)
        t1 = time.time()
        print(u"Permutations of \"{0}\":".format(word))
        cnt = 0
        for word in permlist:
            print(u"\"{0}\"".format(word), end=" ")
            cnt += 1
            if cnt % 6 == 0:
                print()
        print()
        print(u"{0} permutations found in {1:.2f} seconds".format(cnt, t1 - t0))
        print()
        t0 = time.time()
        word = u"pr?óf"
        permlist = self._dawg.find_permutations(word)
        t1 = time.time()
        print(u"Permutations of \"{0}\":".format(word))
        cnt = 0
        for word in permlist:
            print(u"\"{0}\"".format(word), end=" ")
            cnt += 1
            if cnt % 6 == 0:
                print()
        print()
        print(u"{0} permutations found in {1:.2f} seconds".format(cnt, t1 - t0))
        print()

        print("Finding matches:")
        t0 = time.time()
        word = u"e??st??"
        mlist = self._dawg.find_matches(word)
        t1 = time.time()
        print(u"Matches of \"{0}\":".format(word))
        cnt = 0
        for word in mlist:
            print(u"\"{0}\"".format(word), end=" ")
            cnt += 1
            if cnt % 6 == 0:
                print()
        print()
        print(u"{0} matches found in {1:.2f} seconds".format(cnt, t1 - t0))
        print()

        t0 = time.time()
        word = u"f?r??t??n"
        mlist = self._dawg.find_matches(word)
        t1 = time.time()
        print(u"Matches of \"{0}\":".format(word))
        cnt = 0
        for word in mlist:
            print(u"\"{0}\"".format(word), end=" ")
            cnt += 1
            if cnt % 6 == 0:
                print()
        print()
        print(u"{0} matches found in {1:.2f} seconds".format(cnt, t1 - t0))
        print()

        word = u"??"
        mlist = self._dawg.find_matches(word)

        print(u"{0} two-letter words found; should be {1}".format(len(mlist), len(smallwords)))
        for word in mlist:
            if word not in smallwords:
                print(u"{0} in match result but not in smallwords".format(word))
        print()

        print(u"Test finished")

        self._dawg = None