From 078ec456dae2837594d643412081e688599949cd Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 17 Nov 2015 12:55:31 +0000 Subject: [PATCH 01/51] ENH Add feature set selection flag for entity recognizer. Updates in test parameters scripts. --- scripts_morph/morph_script_test_parameters.py | 551 +++++++++--------- scripts_ner/entity_script_test_parameters.py | 466 ++++++++------- src/entity_recognizer/EntityFeatures.cpp | 172 +++--- src/entity_recognizer/EntityOptions.cpp | 10 + src/entity_recognizer/EntityOptions.h | 2 + 5 files changed, 625 insertions(+), 576 deletions(-) diff --git a/scripts_morph/morph_script_test_parameters.py b/scripts_morph/morph_script_test_parameters.py index 177349a..e9b298d 100644 --- a/scripts_morph/morph_script_test_parameters.py +++ b/scripts_morph/morph_script_test_parameters.py @@ -3,6 +3,7 @@ import os import subprocess import time +import itertools dir = os.path.abspath( os.path.dirname(__file__) ) @@ -28,6 +29,30 @@ sys.exit() +timestr = time.strftime("%Y%m%d-%H%M%S") +OutputLogFilenamePrefix = "*T**__LANGUAGE__*turbo_morphtagger_run" +OutputLogFilenameSufix = timestr +OutputLog_Folder = [os.path.join(dir, '..','data_local','morph_log')] + +TrainFiles_Folder = [os.path.join(dir, '..','data_local','morph_data')] +DevFiles_Folder = [os.path.join(dir, '..','data_local','morph_data')] +TestFiles_Folder = [os.path.join(dir, '..','data_local','morph_data')] +ModelFiles_Folder = [os.path.join(dir, '..','data_local','morph_models')] +PredictionFiles_Folder = [os.path.join(dir, '..','data_local','morph_out')] + +TrainFiles_template = '*__LANGUAGE__*-ud-train.conllu' +DevFiles_template = '*__LANGUAGE__*-ud-dev.conllu' +TestFiles_template = '*__LANGUAGE__*-ud-test.conllu' +ModelFiles_template = '*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*' +PredictionFiles_template = '*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.pred' + +TrainFiles = [] +DevFiles = [] +TestFiles = [] +ModelFiles = [] +PredictionFiles = [] + + Languages = ['basque', 'bulgarian', 'croatian', @@ -38,18 +63,7 @@ 'greek', 'hungarian', 'italian', -'swedish' -] - -TrainFiles_template = [os.path.join(dir, '..','data_local','morph_data','*__LANGUAGE__*-ud-train.conllu')] #Replace *__LANGUAGE__* by Languages[i] -DevFiles_template = [os.path.join(dir, '..','data_local','morph_data','*__LANGUAGE__*-ud-dev.conllu')] #Replace *__LANGUAGE__* by Languages[i] -ModelFiles_template = [os.path.join(dir, '..','data_local','morph_models','*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*')] #Replace '*__LANGUAGE__*','__MARKOV_ORDER__*' '*__FEATURES__*', '*__REGCONST__*', '*__PREFIX__*', '*__SUFFIX__*' -PredictionFiles_template = [os.path.join(dir, '..','data_local','morph_out','*T**__LANGUAGE__*-train-dev.morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.predicted')] -TrainFiles = [] -DevFiles = [] -ModelFiles = [] -PredictionFiles = [] - +'swedish'] MorphFeatureSelection = ['0'] #['0', '1', '2'] #--morph_tagger_large_feature_set=0 TrainAlgorithm = ['svm_mira'] #--train_algorithm=svm_mira TrainRegularizationConstant = ['0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 @@ -60,279 +74,286 @@ SuffixLength = ['3'] #['0','2','3'] #--suffix_length=3 #--logtostderr -OutputDesiredPrefix = "*T*turbo_morphological_tagger_run" -OutputFolderBenchmarks = [os.path.join(dir, '..','data_local','morph_log')] - -print OutputFolderBenchmarks[0] -if not os.path.exists(OutputFolderBenchmarks[0]): - os.makedirs(OutputFolderBenchmarks[0]) - if RUNNING_TEST == 1: - TrainFiles_template[0] = TrainFiles_template[0].replace('*T*', "TEST_") - DevFiles_template[0] = DevFiles_template[0].replace('*T*', "TEST_") - ModelFiles_template[0] = ModelFiles_template[0].replace('*T*', "TEST_") - PredictionFiles_template[0] = PredictionFiles_template[0].replace('*T*', "TEST_") - OutputDesiredPrefix = OutputDesiredPrefix.replace('*T*', "TEST_") + ModelFiles_template = ModelFiles_template.replace('*T*', "TEST_") + PredictionFiles_template = PredictionFiles_template.replace('*T*', "TEST_") + OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*T*', "TEST_") +else: + ModelFiles_template = ModelFiles_template.replace('*T*', "") + PredictionFiles_template = PredictionFiles_template.replace('*T*', "") + OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*T*', "") + +if len(Languages) == 1: + OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*__LANGUAGE__*', Languages[0]) else: - TrainFiles_template[0] = TrainFiles_template[0].replace('*T*', "") - DevFiles_template[0] = DevFiles_template[0].replace('*T*', "") - ModelFiles_template[0] = ModelFiles_template[0].replace('*T*', "") - PredictionFiles_template[0] = PredictionFiles_template[0].replace('*T*', "") - OutputDesiredPrefix = OutputDesiredPrefix.replace('*T*', "") + OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*__LANGUAGE__*', "") + +if not os.path.exists(OutputLog_Folder[0]): + os.makedirs(OutputLog_Folder[0]) +for language in Languages: + temp_folder = ModelFiles_Folder[0].replace('*__LANGUAGE__*', language) + if not os.path.exists(temp_folder): + os.makedirs(temp_folder) + temp_folder = PredictionFiles_Folder[0].replace('*__LANGUAGE__*', language) + if not os.path.exists(temp_folder): + os.makedirs(temp_folder) + +csv = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".csv") ,"wb") +log = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".log") ,"wb") +err = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".err") ,"wb") +pylog = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".pylog") ,"wb") -timestr = time.strftime("%Y%m%d-%H%M%S") -csv = open( os.path.join( OutputFolderBenchmarks[0],OutputDesiredPrefix+timestr+".csv") ,"wb") -log = open( os.path.join( OutputFolderBenchmarks[0],OutputDesiredPrefix+timestr+".log") ,"wb") -err = open( os.path.join( OutputFolderBenchmarks[0],OutputDesiredPrefix+timestr+".err") ,"wb") -pylog = open( os.path.join( OutputFolderBenchmarks[0],OutputDesiredPrefix+timestr+".pylog") ,"wb") +for i in range(len(TrainFiles_Folder)) : + TrainFiles.append(os.path.join( TrainFiles_Folder[i], TrainFiles_template)) +for i in range(len(DevFiles_Folder)) : + DevFiles.append(os.path.join( DevFiles_Folder[i], DevFiles_template)) +for i in range(len(TestFiles_Folder)) : + TestFiles.append(os.path.join( TestFiles_Folder[i], TestFiles_template)) +for i in range(len(ModelFiles_Folder)) : + ModelFiles.append(os.path.join( ModelFiles_Folder[i], ModelFiles_template)) +for i in range(len(PredictionFiles_Folder)) : + PredictionFiles.append(os.path.join( PredictionFiles_Folder[i], PredictionFiles_template)) string_to_write="" -string_to_write=string_to_write+"Program, Language, Features, Markov Order, Train Algorithm, Regularization Constant, Train Epochs, Form cutoff, Prefix Length, Suffix Length" -#string_to_write=string_to_write+", "+"Training time" #Commented for Windows execution; turn on in Linux environment +string_to_write=string_to_write+"Program; Language; Features; Markov Order; Train Algorithm; Regularization Constant; Train Epochs; Form cutoff; Prefix Length; Suffix Length" +#string_to_write=string_to_write+"; "+"Training time" #Commented for Windows execution; turn on in Linux environment if NumberOfRuns == 1: - #string_to_write=string_to_write+", "+"Run(Test) time" #Commented for Windows execution; turn on in Linux environment - string_to_write=string_to_write+", "+"CorrectPredict" - string_to_write=string_to_write+", "+"Accuracy" - string_to_write=string_to_write+", "+"Speed (token/sec)" + #string_to_write=string_to_write+"; "+"Run(Test) time" #Commented for Windows execution; turn on in Linux environment + string_to_write=string_to_write+"; "+"CorrectPredict" + string_to_write=string_to_write+"; "+"Accuracy" + string_to_write=string_to_write+"; "+"Speed (token/sec)" else: for i in range(NumberOfRuns): - #string_to_write=string_to_write+", "+"Run(Test) time["+str(i)+"]" #Commented for Windows execution; turn on in Linux environment - string_to_write=string_to_write+", "+"CorrectPredict["+str(i)+"]" - string_to_write=string_to_write+", "+"Accuracy["+str(i)+"]" - string_to_write=string_to_write+", "+"Speed["+str(i)+"] (token/sec)" + #string_to_write=string_to_write+"; "+"Run(Test) time["+str(i)+"]" #Commented for Windows execution; turn on in Linux environment + string_to_write=string_to_write+"; "+"CorrectPredict["+str(i)+"]" + string_to_write=string_to_write+"; "+"Accuracy["+str(i)+"]" + string_to_write=string_to_write+"; "+"Speed["+str(i)+"] (token/sec)" string_to_write=string_to_write+"\n" csv.write(string_to_write) - -for program in Programs: - for language in Languages: - for features in MorphFeatureSelection: - for sequence_model_type in SequenceModelType: - for train_algorithm in TrainAlgorithm: - for train_regularization_constant in TrainRegularizationConstant: - for train_epochs in TrainEpochs: - for form_cutoff in FormCutoff: - for prefix_length in PrefixLength: - for suffix_length in SuffixLength: - - TrainFile = TrainFiles_template[0] - TrainFile = TrainFile.replace('*__LANGUAGE__*', language) - DevFile = DevFiles_template[0] - DevFile = DevFile.replace('*__LANGUAGE__*', language) - - ModelFile = ModelFiles_template[0] - ModelFile = ModelFile.replace('*__LANGUAGE__*', language) - ModelFile = ModelFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - ModelFile = ModelFile.replace('*__FEATURES__*', features) - ModelFile = ModelFile.replace('*__REGCONST__*', train_regularization_constant) - ModelFile = ModelFile.replace('*__PREFIX__*', prefix_length) - ModelFile = ModelFile.replace('*__SUFFIX__*', suffix_length) - - PredictionFile = PredictionFiles_template[0] - PredictionFile = PredictionFile.replace('*__LANGUAGE__*', language) - PredictionFile = PredictionFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - PredictionFile = PredictionFile.replace('*__FEATURES__*', features) - PredictionFile = PredictionFile.replace('*__REGCONST__*', train_regularization_constant) - PredictionFile = PredictionFile.replace('*__PREFIX__*', prefix_length) - PredictionFile = PredictionFile.replace('*__SUFFIX__*', suffix_length) - - #TRAIN - command = [] - #command.append("time -p") #Commented for Windows execution; turn on in Linux environment - command.append(program) - command.append("--train") - command.append("--file_train="+TrainFile) - command.append("--file_model="+ModelFile) - command.append("--train_algorithm="+train_algorithm) - command.append("--train_regularization_constant="+train_regularization_constant) - command.append("--train_epochs="+train_epochs) - command.append("--sequence_model_type="+sequence_model_type) - command.append("--form_cutoff="+form_cutoff) - command.append("--prefix_length="+prefix_length) - command.append("--suffix_length="+suffix_length) - command.append("--morph_tagger_large_feature_set="+features) - command.append("--logtostderr") +for program, language, features, sequence_model_type, train_algorithm, train_regularization_constant, train_epochs, form_cutoff, prefix_length, suffix_length in itertools.product(Programs, Languages, MorphFeatureSelection, SequenceModelType, TrainAlgorithm, TrainRegularizationConstant, TrainEpochs, FormCutoff, PrefixLength, SuffixLength): + TrainFile = TrainFiles[0] + TrainFile = TrainFile.replace('*__LANGUAGE__*', language) + + DevFile = DevFiles[0] + DevFile = DevFile.replace('*__LANGUAGE__*', language) + + TestFile = TestFiles[0] + TestFile = TestFile.replace('*__LANGUAGE__*', language) + + ModelFile = ModelFiles[0] + ModelFile = ModelFile.replace('*__LANGUAGE__*', language) + ModelFile = ModelFile.replace('*__MARKOV_ORDER__*', sequence_model_type) + ModelFile = ModelFile.replace('*__FEATURES__*', features) + ModelFile = ModelFile.replace('*__REGCONST__*', train_regularization_constant) + ModelFile = ModelFile.replace('*__PREFIX__*', prefix_length) + ModelFile = ModelFile.replace('*__SUFFIX__*', suffix_length) + + PredictionFile = PredictionFiles[0] + PredictionFile = PredictionFile.replace('*__LANGUAGE__*', language) + PredictionFile = PredictionFile.replace('*__MARKOV_ORDER__*', sequence_model_type) + PredictionFile = PredictionFile.replace('*__FEATURES__*', features) + PredictionFile = PredictionFile.replace('*__REGCONST__*', train_regularization_constant) + PredictionFile = PredictionFile.replace('*__PREFIX__*', prefix_length) + PredictionFile = PredictionFile.replace('*__SUFFIX__*', suffix_length) + + #TRAIN + command = [] + #command.append("time -p") #Commented for Windows execution; turn on in Linux environment + command.append(program) + command.append("--train") + command.append("--file_train="+TrainFile) + command.append("--file_model="+ModelFile) + command.append("--train_algorithm="+train_algorithm) + command.append("--train_regularization_constant="+train_regularization_constant) + command.append("--train_epochs="+train_epochs) + command.append("--sequence_model_type="+sequence_model_type) + command.append("--form_cutoff="+form_cutoff) + command.append("--prefix_length="+prefix_length) + command.append("--suffix_length="+suffix_length) + command.append("--morph_tagger_large_feature_set="+features) + command.append("--logtostderr") + + print "Executing: " + sys.stdout.flush() - print "Executing: " - sys.stdout.flush() + print ' '.join(command) + sys.stdout.flush() + pylog.write(' '.join(command) + "\n") + log.write( ' '.join(command) + "\n") + err.write( ' '.join(command) + "\n") + #run program + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout__output,stderr_output) = process.communicate() + print "Finished executing: " + ' '.join(command) + sys.stdout.flush() + + # print "- - - * * * - - -" + stdout__output = stdout__output.splitlines() + for line in stdout__output: + log.write(line + "\n") + # print line.rstrip("\n") + + # print "- - - * * * - - -" + stderr_output = stderr_output.splitlines() + for line in stderr_output: + err.write(line + "\n") + # print line.rstrip("\n") + where=line.find("Training took ") + if where != -1: + print line[where:] + sys.stdout.flush() + training_time = float(line[where+len("Training took "):len(line)-len(" sec.")]) + print "Training time = "+str(training_time)+" seconds\n" + sys.stdout.flush() + pylog.write("Training time = "+str(training_time)+" seconds\n") + log.write( "Training time = "+str(training_time)+" seconds\n") + err.write( "Training time = "+str(training_time)+" seconds\n") - print ' '.join(command) - sys.stdout.flush() - pylog.write(' '.join(command) + "\n") - log.write( ' '.join(command) + "\n") - err.write( ' '.join(command) + "\n") - #run program - process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout__output,stderr_output) = process.communicate() - print "Finished executing: " + ' '.join(command) - sys.stdout.flush() - - # print "- - - * * * - - -" - stdout__output = stdout__output.splitlines() - for line in stdout__output: - log.write(line + "\n") - # print line.rstrip("\n") - - # print "- - - * * * - - -" - stderr_output = stderr_output.splitlines() - for line in stderr_output: - err.write(line + "\n") - # print line.rstrip("\n") - where=line.find("Training took ") - if where != -1: - print line[where:] - sys.stdout.flush() - training_time = float(line[where+len("Training took "):len(line)-len(" sec.")]) - print "Training time = "+str(training_time)+" seconds\n" - sys.stdout.flush() - pylog.write("Training time = "+str(training_time)+" seconds\n") - log.write( "Training time = "+str(training_time)+" seconds\n") - err.write( "Training time = "+str(training_time)+" seconds\n") + if line[0:4]=="real": + train_time = float(line[5:]) + print "time of execution = "+str(train_time)+" seconds\n" + sys.stdout.flush() + pylog.write("time of execution = "+str(train_time)+" seconds\n") + log.write( "time of execution = "+str(train_time)+" seconds\n") + err.write( "time of execution = "+str(train_time)+" seconds\n") + # print line + + #TEST + command = [] + #command.append("time -p") #Commented for Windows execution; turn on in Linux environment + command.append(program) + command.append("--test") + command.append("--evaluate") + command.append("--file_model="+ModelFile) + command.append("--file_test="+DevFile) + command.append("--file_prediction="+PredictionFile) + command.append("--logtostderr") - if line[0:4]=="real": - train_time = float(line[5:]) - print "time of execution = "+str(train_time)+" seconds\n" - sys.stdout.flush() - pylog.write("time of execution = "+str(train_time)+" seconds\n") - log.write( "time of execution = "+str(train_time)+" seconds\n") - err.write( "time of execution = "+str(train_time)+" seconds\n") - # print line - - #TEST - command = [] - #command.append("time -p") #Commented for Windows execution; turn on in Linux environment - command.append(program) - command.append("--test") - command.append("--evaluate") - command.append("--file_model="+ModelFile) - command.append("--file_test="+DevFile) - command.append("--file_prediction="+PredictionFile) - command.append("--logtostderr") + print "Executing: " + sys.stdout.flush() - print "Executing: " - sys.stdout.flush() - - #warm-up X iterations - for iteration in range(0,NumberWarmUps): - print "Warm-up #" + str(iteration+1) +": " + ' '.join(command) - sys.stdout.flush() - pylog.write("Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") - log.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") - err.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") - #run program - process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout__output,stderr_output) = process.communicate() - print "Finished executing: " + ' '.join(command) - sys.stdout.flush() - - test_time=[] - correct_predictions=[] - accuracy=[] - tagspeed=[] - for iteration in range(NumberOfRuns): - print "\n" - pylog.write("\n") - log.write( "\n") - err.write( "\n") - if NumberOfRuns > 1: - print "\n**** ITER "+str(iteration)+" ****\n" - sys.stdout.flush() - pylog.write("\n**** ITER "+str(iteration)+" ****\n") - log.write( "\n**** ITER "+str(iteration)+" ****\n") - err.write( "\n**** ITER "+str(iteration)+" ****\n") - print ' '.join(command) - sys.stdout.flush() - pylog.write(' '.join(command) + "\n") - log.write( ' '.join(command) + "\n") - err.write( ' '.join(command) + "\n") - #run program - process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout__output,stderr_output) = process.communicate() - print "Finished executing: " + ' '.join(command) - sys.stdout.flush() - - # print "- - - * * * - - -" - stdout__output = stdout__output.splitlines() - for line in stdout__output: - log.write(line + "\n") - # print line.rstrip("\n") - # print "- - - * * * - - -" - stderr_output = stderr_output.splitlines() - for line in stderr_output: - err.write(line + "\n") - # print line.rstrip("\n") - where=line.find("Correct predictions:") - if where != -1: - print line[where:] - sys.stdout.flush() - correct_predictions.append( line[where+len("Correct predictions: "):] ) - print "Correct predictions: "+correct_predictions[iteration]+"\n" - sys.stdout.flush() - pylog.write("Correct predictions: "+correct_predictions[iteration]+"\n") - log.write( "Correct predictions: "+correct_predictions[iteration]+"\n") - err.write( "Correct predictions: "+correct_predictions[iteration]+"\n") - - where=line.find("Tagging accuracy: ") - if where != -1: - print line[where:] - sys.stdout.flush() - accuracy.append( float(line[where+len("Tagging accuracy: "):]) ) - print "Tagging accuracy = "+str(accuracy[iteration])+"\n" - sys.stdout.flush() - pylog.write("Tagging accuracy = "+str(accuracy[iteration])+"\n") - log.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") - err.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") - - where=line.find("Tagging speed: ") - if where != -1: - print line[where:] - sys.stdout.flush() - tagspeed.append( float(line[where+len("Tagging speed: "):len(line) - len(" tokens per second.")]) ) - print "Tagging speed = "+str(tagspeed[iteration])+"\n" - sys.stdout.flush() - pylog.write("Tagging speed = "+str(tagspeed[iteration])+"\n") - log.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") - err.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") - - if line[0:4]=="real": - test_time.append( float(line[5:]) ) - print "time of execution = "+str(test_time[iteration])+" seconds\n" - sys.stdout.flush() - pylog.write("time of execution = "+str(test_time[iteration])+" seconds\n") - log.write( "time of execution = "+str(test_time[iteration])+" seconds\n") - err.write( "time of execution = "+str(test_time[iteration])+" seconds\n") - # print line - - string_to_write="" - string_to_write=string_to_write+program - string_to_write=string_to_write+","+language - string_to_write=string_to_write+","+features - string_to_write=string_to_write+","+sequence_model_type - string_to_write=string_to_write+","+train_algorithm - string_to_write=string_to_write+","+train_regularization_constant - string_to_write=string_to_write+","+train_epochs - string_to_write=string_to_write+","+form_cutoff - string_to_write=string_to_write+","+prefix_length - string_to_write=string_to_write+","+suffix_length - - #string_to_write=string_to_write+","+str(train_time) #Commented for Windows execution; turn on in Linux environment + #warm-up X iterations + for iteration in range(0,NumberWarmUps): + print "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + sys.stdout.flush() + pylog.write("Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") + log.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") + err.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") + #run program + process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout__output,stderr_output) = process.communicate() + print "Finished executing: " + ' '.join(command) + sys.stdout.flush() - for i in range(NumberOfRuns): - #string_to_write=string_to_write+","+str(test_time[i]) #Commented for Windows execution; turn on in Linux environment - string_to_write=string_to_write+","+str(correct_predictions[i]) - string_to_write=string_to_write+","+str(accuracy[i]) - string_to_write=string_to_write+","+str(tagspeed[i]) - string_to_write=string_to_write+"\n" - - csv.write(string_to_write) + test_time=[] + correct_predictions=[] + accuracy=[] + tagspeed=[] + for iteration in range(NumberOfRuns): + print "\n" + pylog.write("\n") + log.write( "\n") + err.write( "\n") + if NumberOfRuns > 1: + print "\n**** ITER "+str(iteration)+" ****\n" + sys.stdout.flush() + pylog.write("\n**** ITER "+str(iteration)+" ****\n") + log.write( "\n**** ITER "+str(iteration)+" ****\n") + err.write( "\n**** ITER "+str(iteration)+" ****\n") + print ' '.join(command) + sys.stdout.flush() + pylog.write(' '.join(command) + "\n") + log.write( ' '.join(command) + "\n") + err.write( ' '.join(command) + "\n") + #run program + process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout__output,stderr_output) = process.communicate() + print "Finished executing: " + ' '.join(command) + sys.stdout.flush() + + # print "- - - * * * - - -" + stdout__output = stdout__output.splitlines() + for line in stdout__output: + log.write(line + "\n") + # print line.rstrip("\n") + # print "- - - * * * - - -" + stderr_output = stderr_output.splitlines() + for line in stderr_output: + err.write(line + "\n") + # print line.rstrip("\n") + where=line.find("Correct predictions:") + if where != -1: + print line[where:] + sys.stdout.flush() + correct_predictions.append( line[where+len("Correct predictions: "):] ) + print "Correct predictions: "+correct_predictions[iteration]+"\n" + sys.stdout.flush() + pylog.write("Correct predictions: "+correct_predictions[iteration]+"\n") + log.write( "Correct predictions: "+correct_predictions[iteration]+"\n") + err.write( "Correct predictions: "+correct_predictions[iteration]+"\n") + + where=line.find("Tagging accuracy: ") + if where != -1: + print line[where:] + sys.stdout.flush() + accuracy.append( float(line[where+len("Tagging accuracy: "):]) ) + print "Tagging accuracy = "+str(accuracy[iteration])+"\n" + sys.stdout.flush() + pylog.write("Tagging accuracy = "+str(accuracy[iteration])+"\n") + log.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") + err.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") + + where=line.find("Tagging speed: ") + if where != -1: + print line[where:] + sys.stdout.flush() + tagspeed.append( float(line[where+len("Tagging speed: "):len(line) - len(" tokens per second.")]) ) + print "Tagging speed = "+str(tagspeed[iteration])+"\n" + sys.stdout.flush() + pylog.write("Tagging speed = "+str(tagspeed[iteration])+"\n") + log.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") + err.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") + + if line[0:4]=="real": + test_time.append( float(line[5:]) ) + print "time of execution = "+str(test_time[iteration])+" seconds\n" + sys.stdout.flush() + pylog.write("time of execution = "+str(test_time[iteration])+" seconds\n") + log.write( "time of execution = "+str(test_time[iteration])+" seconds\n") + err.write( "time of execution = "+str(test_time[iteration])+" seconds\n") + # print line + + string_to_write="" + string_to_write=string_to_write+program + string_to_write=string_to_write+";"+language + string_to_write=string_to_write+";"+features + string_to_write=string_to_write+";"+sequence_model_type + string_to_write=string_to_write+";"+train_algorithm + string_to_write=string_to_write+";"+train_regularization_constant + string_to_write=string_to_write+";"+train_epochs + string_to_write=string_to_write+";"+form_cutoff + string_to_write=string_to_write+";"+prefix_length + string_to_write=string_to_write+";"+suffix_length + + #string_to_write=string_to_write+";"+str(train_time) #Commented for Windows execution; turn on in Linux environment + + for i in range(NumberOfRuns): + #string_to_write=string_to_write+";"+str(test_time[i]) #Commented for Windows execution; turn on in Linux environment + string_to_write=string_to_write+";"+str(correct_predictions[i]) + string_to_write=string_to_write+";"+str(accuracy[i]) + string_to_write=string_to_write+";"+str(tagspeed[i]) + string_to_write=string_to_write+"\n" + + csv.write(string_to_write) - csv.flush() - log.flush() - pylog.flush() - err.flush() + csv.flush() + log.flush() + pylog.flush() + err.flush() #CLOSING csv.close() diff --git a/scripts_ner/entity_script_test_parameters.py b/scripts_ner/entity_script_test_parameters.py index 7766015..c79db56 100644 --- a/scripts_ner/entity_script_test_parameters.py +++ b/scripts_ner/entity_script_test_parameters.py @@ -3,6 +3,7 @@ import os import subprocess import time +import itertools dir = os.path.abspath( os.path.dirname(__file__) ) @@ -44,8 +45,8 @@ DevFiles_template = '*__LANGUAGE__*_dev.conll.ner' TestFiles_template = '*__LANGUAGE__*_test.conll.ner' GazetteersFiles_template = '*__LANGUAGE__*_all_gazetteers.txt' -ModelFiles_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*' -PredictionFiles_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.pred' +ModelFiles_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*' +PredictionFiles_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.pred' TrainFiles = [] DevFiles = [] @@ -58,13 +59,14 @@ Languages = [# 'basque', 'bulgarian','croatian', 'czech', 'danish', 'finnish', 'greek', 'hungarian', 'italian', 'swedish', 'english'] TrainAlgorithm = ['svm_mira'] #--train_algorithm=svm_mira -TrainRegularizationConstant = ['10','1','0.1','0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 -TrainEpochs = ['5', '50'] #--train_epochs=20 -SequenceModelType = ['0','1','2'] #--sequence_model_type=0 -FormCutoff = ['0'] #--form_cutoff=0 -PrefixLength = ['0','3'] #['0','2','3'] #--prefix_length=3 -SuffixLength = ['0','3'] #['0','2','3'] #--suffix_length=3 +TrainRegularizationConstant = ['0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 +TrainEpochs = ['50'] #--train_epochs=20 +SequenceModelType = ['1'] #['0','1','2'] #--sequence_model_type=0 +FormCutoff = ['0', '1'] #--form_cutoff=0 +PrefixLength = ['3'] #['0','2','3'] #--prefix_length=3 +SuffixLength = ['3'] #['0','2','3'] #--suffix_length=3 EntityTaggingScheme = ['bio'] +EntityFeatureSelection = ['0', '1', '2'] #['0', '1', '2'] #--entity_recognizer_large_feature_set=0 #--logtostderr @@ -112,7 +114,7 @@ PredictionFiles.append(os.path.join( PredictionFiles_Folder[i], PredictionFiles_template)) string_to_write="" -string_to_write=string_to_write+"Program; Language; Markov Order; Train Algorithm; Regularization Constant; Train Epochs; Form cutoff; Prefix Length; Suffix Length" +string_to_write=string_to_write+"Program; Language; Features; Markov Order; Train Algorithm; Regularization Constant; Train Epochs; Form cutoff; Prefix Length; Suffix Length" #string_to_write=string_to_write+"; "+"Training time" #Commented for Windows execution; turn on in Linux environment if NumberOfRuns == 1: #string_to_write=string_to_write+"; "+"Run(Test) time" #Commented for Windows execution; turn on in Linux environment @@ -128,239 +130,233 @@ string_to_write=string_to_write+"\n" csv.write(string_to_write) - -for program in Programs: - for language in Languages: - for sequence_model_type in SequenceModelType: - for train_algorithm in TrainAlgorithm: - for train_regularization_constant in TrainRegularizationConstant: - for train_epochs in TrainEpochs: - for form_cutoff in FormCutoff: - for prefix_length in PrefixLength: - for suffix_length in SuffixLength: - for tagging_scheme in EntityTaggingScheme: - - TrainFile = TrainFiles[0] - TrainFile = TrainFile.replace('*__LANGUAGE__*', language) - DevFile = DevFiles[0] - DevFile = DevFile.replace('*__LANGUAGE__*', language) - - TestFile = TestFiles[0] - TestFile = TestFile.replace('*__LANGUAGE__*', language) - - GazetteersFile = GazetteersFiles[0] - GazetteersFile = GazetteersFile.replace('*__LANGUAGE__*', language) - - ModelFile = ModelFiles[0] - ModelFile = ModelFile.replace('*__LANGUAGE__*', language) - ModelFile = ModelFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - ModelFile = ModelFile.replace('*__REGCONST__*', train_regularization_constant) - ModelFile = ModelFile.replace('*__PREFIX__*', prefix_length) - ModelFile = ModelFile.replace('*__SUFFIX__*', suffix_length) - - PredictionFile = PredictionFiles[0] - PredictionFile = PredictionFile.replace('*__LANGUAGE__*', language) - PredictionFile = PredictionFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - PredictionFile = PredictionFile.replace('*__REGCONST__*', train_regularization_constant) - PredictionFile = PredictionFile.replace('*__PREFIX__*', prefix_length) - PredictionFile = PredictionFile.replace('*__SUFFIX__*', suffix_length) - - #TRAIN - command = [] - #command.append("time -p") #Commented for Windows execution; turn on in Linux environment - command.append(program) - command.append("--train") - command.append("--file_train="+TrainFile) - command.append("--file_model="+ModelFile) - command.append("--entity_file_gazetteer="+GazetteersFile) - command.append("--train_algorithm="+train_algorithm) - command.append("--train_regularization_constant="+train_regularization_constant) - command.append("--sequence_model_type="+sequence_model_type) - command.append("--entity_tagging_scheme="+tagging_scheme) - command.append("--train_epochs="+train_epochs) - command.append("--form_cutoff="+form_cutoff) - command.append("--prefix_length="+prefix_length) - command.append("--suffix_length="+suffix_length) - command.append("--logtostderr") +for program, language, features, sequence_model_type, train_algorithm, train_regularization_constant, train_epochs, form_cutoff, prefix_length, suffix_length, tagging_scheme in itertools.product(Programs, Languages, EntityFeatureSelection, SequenceModelType, TrainAlgorithm, TrainRegularizationConstant, TrainEpochs, FormCutoff, PrefixLength, SuffixLength, EntityTaggingScheme): + TrainFile = TrainFiles[0] + TrainFile = TrainFile.replace('*__LANGUAGE__*', language) + + DevFile = DevFiles[0] + DevFile = DevFile.replace('*__LANGUAGE__*', language) + + TestFile = TestFiles[0] + TestFile = TestFile.replace('*__LANGUAGE__*', language) + + GazetteersFile = GazetteersFiles[0] + GazetteersFile = GazetteersFile.replace('*__LANGUAGE__*', language) + + ModelFile = ModelFiles[0] + ModelFile = ModelFile.replace('*__LANGUAGE__*', language) + ModelFile = ModelFile.replace('*__MARKOV_ORDER__*', sequence_model_type) + ModelFile = ModelFile.replace('*__FEATURES__*', features) + ModelFile = ModelFile.replace('*__REGCONST__*', train_regularization_constant) + ModelFile = ModelFile.replace('*__PREFIX__*', prefix_length) + ModelFile = ModelFile.replace('*__SUFFIX__*', suffix_length) + + PredictionFile = PredictionFiles[0] + PredictionFile = PredictionFile.replace('*__LANGUAGE__*', language) + PredictionFile = PredictionFile.replace('*__MARKOV_ORDER__*', sequence_model_type) + PredictionFile = PredictionFile.replace('*__FEATURES__*', features) + PredictionFile = PredictionFile.replace('*__REGCONST__*', train_regularization_constant) + PredictionFile = PredictionFile.replace('*__PREFIX__*', prefix_length) + PredictionFile = PredictionFile.replace('*__SUFFIX__*', suffix_length) + + #TRAIN + command = [] + #command.append("time -p") #Commented for Windows execution; turn on in Linux environment + command.append(program) + command.append("--train") + command.append("--file_train="+TrainFile) + command.append("--file_model="+ModelFile) + command.append("--entity_file_gazetteer="+GazetteersFile) + command.append("--train_algorithm="+train_algorithm) + command.append("--train_regularization_constant="+train_regularization_constant) + command.append("--sequence_model_type="+sequence_model_type) + command.append("--entity_tagging_scheme="+tagging_scheme) + command.append("--train_epochs="+train_epochs) + command.append("--form_cutoff="+form_cutoff) + command.append("--prefix_length="+prefix_length) + command.append("--suffix_length="+suffix_length) + command.append("--entity_recognizer_large_feature_set="+features) + command.append("--logtostderr") - print "Executing: " - sys.stdout.flush() + print "Executing: " + sys.stdout.flush() - print ' '.join(command) - sys.stdout.flush() - pylog.write(' '.join(command) + "\n") - log.write( ' '.join(command) + "\n") - err.write( ' '.join(command) + "\n") - #run program - process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout__output,stderr_output) = process.communicate() - print "Finished executing: " + ' '.join(command) - sys.stdout.flush() - - # print "- - - * * * - - -" - stdout__output = stdout__output.splitlines() - for line in stdout__output: - log.write(line + "\n") - # print line.rstrip("\n") - - # print "- - - * * * - - -" - stderr_output = stderr_output.splitlines() - for line in stderr_output: - err.write(line + "\n") - # print line.rstrip("\n") - where=line.find("Training took ") - if where != -1: - print line[where:] - sys.stdout.flush() - training_time = float(line[where+len("Training took "):len(line)-len(" sec.")]) - print "Training time = "+str(training_time)+" seconds\n" - sys.stdout.flush() - pylog.write("Training time = "+str(training_time)+" seconds\n") - log.write( "Training time = "+str(training_time)+" seconds\n") - err.write( "Training time = "+str(training_time)+" seconds\n") + print ' '.join(command) + sys.stdout.flush() + pylog.write(' '.join(command) + "\n") + log.write( ' '.join(command) + "\n") + err.write( ' '.join(command) + "\n") + #run program + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout__output,stderr_output) = process.communicate() + print "Finished executing: " + ' '.join(command) + sys.stdout.flush() + + # print "- - - * * * - - -" + stdout__output = stdout__output.splitlines() + for line in stdout__output: + log.write(line + "\n") + # print line.rstrip("\n") + + # print "- - - * * * - - -" + stderr_output = stderr_output.splitlines() + for line in stderr_output: + err.write(line + "\n") + # print line.rstrip("\n") + where=line.find("Training took ") + if where != -1: + print line[where:] + sys.stdout.flush() + training_time = float(line[where+len("Training took "):len(line)-len(" sec.")]) + print "Training time = "+str(training_time)+" seconds\n" + sys.stdout.flush() + pylog.write("Training time = "+str(training_time)+" seconds\n") + log.write( "Training time = "+str(training_time)+" seconds\n") + err.write( "Training time = "+str(training_time)+" seconds\n") - if line[0:4]=="real": - train_time = float(line[5:]) - print "time of execution = "+str(train_time)+" seconds\n" - sys.stdout.flush() - pylog.write("time of execution = "+str(train_time)+" seconds\n") - log.write( "time of execution = "+str(train_time)+" seconds\n") - err.write( "time of execution = "+str(train_time)+" seconds\n") - # print line - - #TEST - command = [] - #command.append("time -p") #Commented for Windows execution; turn on in Linux environment - command.append(program) - command.append("--test") - command.append("--evaluate") - command.append("--file_model="+ModelFile) - command.append("--file_test="+TestFile) - command.append("--file_prediction="+PredictionFile) - command.append("--entity_tagging_scheme="+tagging_scheme) - command.append("--logtostderr") + if line[0:4]=="real": + train_time = float(line[5:]) + print "time of execution = "+str(train_time)+" seconds\n" + sys.stdout.flush() + pylog.write("time of execution = "+str(train_time)+" seconds\n") + log.write( "time of execution = "+str(train_time)+" seconds\n") + err.write( "time of execution = "+str(train_time)+" seconds\n") + # print line + + #TEST + command = [] + #command.append("time -p") #Commented for Windows execution; turn on in Linux environment + command.append(program) + command.append("--test") + command.append("--evaluate") + command.append("--file_model="+ModelFile) + command.append("--file_test="+TestFile) + command.append("--file_prediction="+PredictionFile) + command.append("--entity_tagging_scheme="+tagging_scheme) + command.append("--logtostderr") + + print "Executing: " + sys.stdout.flush() + + #warm-up X iterations + for iteration in range(0,NumberWarmUps): + print "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + sys.stdout.flush() + pylog.write("Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") + log.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") + err.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") + #run program + process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout__output,stderr_output) = process.communicate() + print "Finished executing: " + ' '.join(command) + sys.stdout.flush() - print "Executing: " - sys.stdout.flush() - - #warm-up X iterations - for iteration in range(0,NumberWarmUps): - print "Warm-up #" + str(iteration+1) +": " + ' '.join(command) - sys.stdout.flush() - pylog.write("Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") - log.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") - err.write( "Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") - #run program - process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout__output,stderr_output) = process.communicate() - print "Finished executing: " + ' '.join(command) - sys.stdout.flush() - - test_time=[] - correct_predictions=[] - accuracy=[] - tagspeed=[] - for iteration in range(NumberOfRuns): - print "\n" - pylog.write("\n") - log.write( "\n") - err.write( "\n") - if NumberOfRuns > 1: - print "\n**** ITER "+str(iteration)+" ****\n" - sys.stdout.flush() - pylog.write("\n**** ITER "+str(iteration)+" ****\n") - log.write( "\n**** ITER "+str(iteration)+" ****\n") - err.write( "\n**** ITER "+str(iteration)+" ****\n") - print ' '.join(command) - sys.stdout.flush() - pylog.write(' '.join(command) + "\n") - log.write( ' '.join(command) + "\n") - err.write( ' '.join(command) + "\n") - #run program - process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout__output,stderr_output) = process.communicate() - print "Finished executing: " + ' '.join(command) - sys.stdout.flush() - - # print "- - - * * * - - -" - stdout__output = stdout__output.splitlines() - for line in stdout__output: - log.write(line + "\n") - # print line.rstrip("\n") - # print "- - - * * * - - -" - stderr_output = stderr_output.splitlines() - for line in stderr_output: - err.write(line + "\n") - # print line.rstrip("\n") - where=line.find("Correct predictions:") - if where != -1: - print line[where:] - sys.stdout.flush() - correct_predictions.append( line[where+len("Correct predictions: "):] ) - print "Correct predictions: "+correct_predictions[iteration]+"\n" - sys.stdout.flush() - pylog.write("Correct predictions: "+correct_predictions[iteration]+"\n") - log.write( "Correct predictions: "+correct_predictions[iteration]+"\n") - err.write( "Correct predictions: "+correct_predictions[iteration]+"\n") - - where=line.find("Tagging accuracy: ") - if where != -1: - print line[where:] - sys.stdout.flush() - accuracy.append( float(line[where+len("Tagging accuracy: "):]) ) - print "Tagging accuracy = "+str(accuracy[iteration])+"\n" - sys.stdout.flush() - pylog.write("Tagging accuracy = "+str(accuracy[iteration])+"\n") - log.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") - err.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") - - where=line.find("Tagging speed: ") - if where != -1: - print line[where:] - sys.stdout.flush() - tagspeed.append( float(line[where+len("Tagging speed: "):len(line) - len(" tokens per second.")]) ) - print "Tagging speed = "+str(tagspeed[iteration])+"\n" - sys.stdout.flush() - pylog.write("Tagging speed = "+str(tagspeed[iteration])+"\n") - log.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") - err.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") - - if line[0:4]=="real": - test_time.append( float(line[5:]) ) - print "time of execution = "+str(test_time[iteration])+" seconds\n" - sys.stdout.flush() - pylog.write("time of execution = "+str(test_time[iteration])+" seconds\n") - log.write( "time of execution = "+str(test_time[iteration])+" seconds\n") - err.write( "time of execution = "+str(test_time[iteration])+" seconds\n") - # print line - - string_to_write="" - string_to_write=string_to_write+program - string_to_write=string_to_write+";"+language - string_to_write=string_to_write+";"+sequence_model_type - string_to_write=string_to_write+";"+train_algorithm - string_to_write=string_to_write+";"+train_regularization_constant - string_to_write=string_to_write+";"+train_epochs - string_to_write=string_to_write+";"+form_cutoff - string_to_write=string_to_write+";"+prefix_length - string_to_write=string_to_write+";"+suffix_length - - #string_to_write=string_to_write+";"+str(train_time) #Commented for Windows execution; turn on in Linux environment + test_time=[] + correct_predictions=[] + accuracy=[] + tagspeed=[] + for iteration in range(NumberOfRuns): + print "\n" + pylog.write("\n") + log.write( "\n") + err.write( "\n") + if NumberOfRuns > 1: + print "\n**** ITER "+str(iteration)+" ****\n" + sys.stdout.flush() + pylog.write("\n**** ITER "+str(iteration)+" ****\n") + log.write( "\n**** ITER "+str(iteration)+" ****\n") + err.write( "\n**** ITER "+str(iteration)+" ****\n") + print ' '.join(command) + sys.stdout.flush() + pylog.write(' '.join(command) + "\n") + log.write( ' '.join(command) + "\n") + err.write( ' '.join(command) + "\n") + #run program + process=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout__output,stderr_output) = process.communicate() + print "Finished executing: " + ' '.join(command) + sys.stdout.flush() + + # print "- - - * * * - - -" + stdout__output = stdout__output.splitlines() + for line in stdout__output: + log.write(line + "\n") + # print line.rstrip("\n") + # print "- - - * * * - - -" + stderr_output = stderr_output.splitlines() + for line in stderr_output: + err.write(line + "\n") + # print line.rstrip("\n") + where=line.find("Correct predictions:") + if where != -1: + print line[where:] + sys.stdout.flush() + correct_predictions.append( line[where+len("Correct predictions: "):] ) + print "Correct predictions: "+correct_predictions[iteration]+"\n" + sys.stdout.flush() + pylog.write("Correct predictions: "+correct_predictions[iteration]+"\n") + log.write( "Correct predictions: "+correct_predictions[iteration]+"\n") + err.write( "Correct predictions: "+correct_predictions[iteration]+"\n") + + where=line.find("Tagging accuracy: ") + if where != -1: + print line[where:] + sys.stdout.flush() + accuracy.append( float(line[where+len("Tagging accuracy: "):]) ) + print "Tagging accuracy = "+str(accuracy[iteration])+"\n" + sys.stdout.flush() + pylog.write("Tagging accuracy = "+str(accuracy[iteration])+"\n") + log.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") + err.write( "Tagging accuracy = "+str(accuracy[iteration])+"\n") + + where=line.find("Tagging speed: ") + if where != -1: + print line[where:] + sys.stdout.flush() + tagspeed.append( float(line[where+len("Tagging speed: "):len(line) - len(" tokens per second.")]) ) + print "Tagging speed = "+str(tagspeed[iteration])+"\n" + sys.stdout.flush() + pylog.write("Tagging speed = "+str(tagspeed[iteration])+"\n") + log.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") + err.write( "Tagging speed = "+str(tagspeed[iteration])+"\n") + + if line[0:4]=="real": + test_time.append( float(line[5:]) ) + print "time of execution = "+str(test_time[iteration])+" seconds\n" + sys.stdout.flush() + pylog.write("time of execution = "+str(test_time[iteration])+" seconds\n") + log.write( "time of execution = "+str(test_time[iteration])+" seconds\n") + err.write( "time of execution = "+str(test_time[iteration])+" seconds\n") + # print line + + string_to_write="" + string_to_write=string_to_write+program + string_to_write=string_to_write+";"+language + string_to_write=string_to_write+";"+features + string_to_write=string_to_write+";"+sequence_model_type + string_to_write=string_to_write+";"+train_algorithm + string_to_write=string_to_write+";"+train_regularization_constant + string_to_write=string_to_write+";"+train_epochs + string_to_write=string_to_write+";"+form_cutoff + string_to_write=string_to_write+";"+prefix_length + string_to_write=string_to_write+";"+suffix_length + + #string_to_write=string_to_write+";"+str(train_time) #Commented for Windows execution; turn on in Linux environment - for i in range(NumberOfRuns): - #string_to_write=string_to_write+";"+str(test_time[i]) #Commented for Windows execution; turn on in Linux environment - string_to_write=string_to_write+";"+str(correct_predictions[i]) - string_to_write=string_to_write+";"+str(accuracy[i]) - string_to_write=string_to_write+";"+str(tagspeed[i]) - string_to_write=string_to_write+"\n" - - csv.write(string_to_write) + for i in range(NumberOfRuns): + #string_to_write=string_to_write+";"+str(test_time[i]) #Commented for Windows execution; turn on in Linux environment + string_to_write=string_to_write+";"+str(correct_predictions[i]) + string_to_write=string_to_write+";"+str(accuracy[i]) + string_to_write=string_to_write+";"+str(tagspeed[i]) + string_to_write=string_to_write+"\n" + + csv.write(string_to_write) - csv.flush() - log.flush() - pylog.flush() - err.flush() + csv.flush() + log.flush() + pylog.flush() + err.flush() #CLOSING csv.close() diff --git a/src/entity_recognizer/EntityFeatures.cpp b/src/entity_recognizer/EntityFeatures.cpp index 430ec49..7caa553 100644 --- a/src/entity_recognizer/EntityFeatures.cpp +++ b/src/entity_recognizer/EntityFeatures.cpp @@ -33,6 +33,9 @@ void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, EntityInstanceNumeric *entity_sentence = static_cast(sentence); + EntityOptions *options = static_cast(pipe_)-> + GetEntityOptions(); + // Array of form IDs. const vector* word_ids = &entity_sentence->GetFormIds(); @@ -134,43 +137,51 @@ void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, AddFeature(fkey, features); // Lexical features. - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::W, flags, WID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::W, + flags, WID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pW, flags, pWID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pW, + flags, pWID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nW, flags, nWID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nW, + flags, nWID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::ppW, flags, ppWID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::ppW, + flags, ppWID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnW, flags, nnWID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnW, + flags, nnWID); AddFeature(fkey, features); // Gazetteer features. for (int k = 0; k < GIDs.size(); ++k) { uint16_t GID = GIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::G, flags, GID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::G, + flags, GID); AddFeature(fkey, features); } for (int k = 0; k < pGIDs.size(); ++k) { uint16_t pGID = pGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pG, flags, pGID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pG, + flags, pGID); AddFeature(fkey, features); } for (int k = 0; k < nGIDs.size(); ++k) { uint16_t nGID = nGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nG, flags, nGID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nG, + flags, nGID); AddFeature(fkey, features); } for (int k = 0; k < ppGIDs.size(); ++k) { uint16_t ppGID = ppGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::ppG, flags, - ppGID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::ppG, + flags, ppGID); AddFeature(fkey, features); } for (int k = 0; k < nnGIDs.size(); ++k) { uint16_t nnGID = nnGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnG, flags, - nnGID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnG, + flags, nnGID); AddFeature(fkey, features); } @@ -252,16 +263,15 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // of words. If position = N, we need to be careful not to access invalid // memory in arrays. - // Bias feature. - fkey = encoder_.CreateFKey_NONE(EntityFeatureTemplateBigram::BIAS, flags); - AddFeature(fkey, features); - // Add other bigram features. int sentence_length = sentence->size(); EntityInstanceNumeric *entity_sentence = static_cast(sentence); + EntityOptions *options = static_cast(pipe_)-> + GetEntityOptions(); + // Array of form IDs. const vector* word_ids = &entity_sentence->GetFormIds(); @@ -269,77 +279,87 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, const vector* pos_ids = &entity_sentence->GetPosIds(); // Words. - uint16_t WID = (position < sentence_length) ? - (*word_ids)[position] : TOKEN_STOP; // Current word. - // Word on the left. - uint16_t pWID = (position > 0) ? - (*word_ids)[position - 1] : TOKEN_START; - // Word on the right. - uint16_t nWID = (position < sentence_length - 1) ? - (*word_ids)[position + 1] : TOKEN_STOP; - // Word two positions on the left. - uint16_t ppWID = (position > 1) ? - (*word_ids)[position - 2] : TOKEN_START; - // Word two positions on the right. - uint16_t nnWID = (position < sentence_length - 2) ? - (*word_ids)[position + 2] : TOKEN_STOP; + uint16_t WID, pWID, nWID, ppWID, nnWID; + if (options->large_feature_set() >= 1) { + WID = (position < sentence_length) ? + (*word_ids)[position] : TOKEN_STOP; // Current word. + // Word on the left. + pWID = (position > 0) ? + (*word_ids)[position - 1] : TOKEN_START; + // Word on the right. + nWID = (position < sentence_length - 1) ? + (*word_ids)[position + 1] : TOKEN_STOP; + // Word two positions on the left. + ppWID = (position > 1) ? + (*word_ids)[position - 2] : TOKEN_START; + // Word two positions on the right. + nnWID = (position < sentence_length - 2) ? + (*word_ids)[position + 2] : TOKEN_STOP; + } // POS tags. - uint8_t PID = (position < sentence_length) ? - (*pos_ids)[position] : TOKEN_STOP; // Current POS. - // POS on the left. - uint8_t pPID = (position > 0) ? - (*pos_ids)[position - 1] : TOKEN_START; - // POS on the right. - uint8_t nPID = (position < sentence_length - 1) ? - (*pos_ids)[position + 1] : TOKEN_STOP; - // POS two positions on the left. - uint8_t ppPID = (position > 1) ? - (*pos_ids)[position - 2] : TOKEN_START; - // POS two positions on the right. - uint8_t nnPID = (position < sentence_length - 2) ? - (*pos_ids)[position + 2] : TOKEN_STOP; + uint8_t PID, pPID, nPID, ppPID, nnPID; + if (options->large_feature_set() >= 2) { + PID = (position < sentence_length) ? + (*pos_ids)[position] : TOKEN_STOP; // Current POS. + // POS on the left. + pPID = (position > 0) ? + (*pos_ids)[position - 1] : TOKEN_START; + // POS on the right. + nPID = (position < sentence_length - 1) ? + (*pos_ids)[position + 1] : TOKEN_STOP; + // POS two positions on the left. + ppPID = (position > 1) ? + (*pos_ids)[position - 2] : TOKEN_START; + // POS two positions on the right. + nnPID = (position < sentence_length - 2) ? + (*pos_ids)[position + 2] : TOKEN_STOP; + } // Maximum is 255 feature templates. CHECK_LT(EntityFeatureTemplateBigram::COUNT, 256); // Bias feature. - //fkey = encoder_.CreateFKey_NONE(EntityFeatureTemplateBigram::BIAS, flags); - //AddFeature(fkey, features); + fkey = encoder_.CreateFKey_NONE(EntityFeatureTemplateBigram::BIAS, flags); + AddFeature(fkey, features); // Lexical features. - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::W, - flags, WID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::pW, - flags, pWID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nW, - flags, nWID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::ppW, - flags, ppWID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nnW, - flags, nnWID); - AddFeature(fkey, features); + if (options->large_feature_set() >= 1) { + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::W, + flags, WID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::pW, + flags, pWID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nW, + flags, nWID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::ppW, + flags, ppWID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nnW, + flags, nnWID); + AddFeature(fkey, features); + } // POS features. - fkey = encoder_.CreateFKey_P(EntityFeatureTemplateBigram::P, - flags, PID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_PP(EntityFeatureTemplateBigram::PpP, - flags, PID, pPID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_PP(EntityFeatureTemplateBigram::PnP, - flags, PID, nPID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_PPP(EntityFeatureTemplateBigram::PpPppP, - flags, PID, pPID, ppPID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_PPP(EntityFeatureTemplateBigram::PnPnnP, - flags, PID, nPID, nnPID); - AddFeature(fkey, features); + if (options->large_feature_set() >= 2) { + fkey = encoder_.CreateFKey_P(EntityFeatureTemplateBigram::P, + flags, PID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_PP(EntityFeatureTemplateBigram::PpP, + flags, PID, pPID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_PP(EntityFeatureTemplateBigram::PnP, + flags, PID, nPID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_PPP(EntityFeatureTemplateBigram::PpPppP, + flags, PID, pPID, ppPID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_PPP(EntityFeatureTemplateBigram::PnPnnP, + flags, PID, nPID, nnPID); + AddFeature(fkey, features); + } } void EntityFeatures::AddTrigramFeatures(SequenceInstanceNumeric *sentence, diff --git a/src/entity_recognizer/EntityOptions.cpp b/src/entity_recognizer/EntityOptions.cpp index a908c15..4903478 100644 --- a/src/entity_recognizer/EntityOptions.cpp +++ b/src/entity_recognizer/EntityOptions.cpp @@ -34,6 +34,9 @@ DEFINE_string(entity_tagging_scheme, "bio", DEFINE_string(entity_file_gazetteer, "", "Path to a gazetteer file (one entity per line with the " "corresponding class, separated by tabs."); +DEFINE_int32(entity_recognizer_large_feature_set, 2, + "The greater the value, the larger feature set used. Taggers are " + "usually more accurate but slower and have a larger memory footprint."); // Save current option flags to the model file. void EntityOptions::Save(FILE* fs) { @@ -42,6 +45,8 @@ void EntityOptions::Save(FILE* fs) { bool success; success = WriteString(fs, tagging_scheme_name_); CHECK(success); + success = WriteInteger(fs, large_feature_set_); + CHECK(success); } // Load current option flags to the model file. @@ -54,6 +59,10 @@ void EntityOptions::Load(FILE* fs) { CHECK(success); LOG(INFO) << "Setting --entity_tagging_scheme=" << FLAGS_entity_tagging_scheme; + success = ReadInteger(fs, &FLAGS_entity_recognizer_large_feature_set); + CHECK(success); + LOG(INFO) << "Setting --entity_recognizer_large_feature_set=" + << FLAGS_entity_recognizer_large_feature_set; Initialize(); } @@ -73,4 +82,5 @@ void EntityOptions::Initialize() { } else { CHECK(false) << "Unknown entity scheme: " << tagging_scheme_name_; } + large_feature_set_ = FLAGS_entity_recognizer_large_feature_set; } diff --git a/src/entity_recognizer/EntityOptions.h b/src/entity_recognizer/EntityOptions.h index 580c05e..c6c9736 100644 --- a/src/entity_recognizer/EntityOptions.h +++ b/src/entity_recognizer/EntityOptions.h @@ -44,12 +44,14 @@ class EntityOptions : public SequenceOptions { // Get option flags. int tagging_scheme() { return tagging_scheme_; } const std::string &file_gazetteer() { return file_gazetteer_; } + int large_feature_set() { return large_feature_set_; } protected: std::string file_format_; std::string tagging_scheme_name_; std::string file_gazetteer_; int tagging_scheme_; + int large_feature_set_; }; #endif // ENTITY_OPTIONS_H_ From fa1846ec07cf09fd5fe32a80ee6ec63a9ef13fec Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 17 Nov 2015 17:00:09 +0000 Subject: [PATCH 02/51] ENH Add shape features to entity recognizer bigram template and implementation of a flag bitmap to turn on/off combinations of features more easily. --- scripts_morph/morph_script_test_parameters.py | 184 ++++++++-------- scripts_ner/entity_script_test_parameters.py | 206 +++++++++--------- .../EntityFeatureTemplates.h | 5 + src/entity_recognizer/EntityFeatures.cpp | 57 ++++- .../MorphologicalFeatureTemplates.h | 10 +- 5 files changed, 256 insertions(+), 206 deletions(-) diff --git a/scripts_morph/morph_script_test_parameters.py b/scripts_morph/morph_script_test_parameters.py index e9b298d..a6e09dc 100644 --- a/scripts_morph/morph_script_test_parameters.py +++ b/scripts_morph/morph_script_test_parameters.py @@ -7,10 +7,10 @@ dir = os.path.abspath( os.path.dirname(__file__) ) -NumberOfRuns=1 -NumberWarmUps=0 +number_of_runs=1 +number_of_warmups=0 -RUNNING_TEST=1 +running_test=1 if len(sys.argv) == 2: Programs = [sys.argv[1]] @@ -29,31 +29,31 @@ sys.exit() -timestr = time.strftime("%Y%m%d-%H%M%S") -OutputLogFilenamePrefix = "*T**__LANGUAGE__*turbo_morphtagger_run" -OutputLogFilenameSufix = timestr -OutputLog_Folder = [os.path.join(dir, '..','data_local','morph_log')] +timestr = time.strftime("%Y%m%d-%H%M%S") +output_log_filename_prefix = "*T**__LANGUAGE__*turbo_morphtagger_run" +output_log_filename_sufix = timestr +output_log_folder = [os.path.join(dir, '..','data_local','morph_log')] -TrainFiles_Folder = [os.path.join(dir, '..','data_local','morph_data')] -DevFiles_Folder = [os.path.join(dir, '..','data_local','morph_data')] -TestFiles_Folder = [os.path.join(dir, '..','data_local','morph_data')] -ModelFiles_Folder = [os.path.join(dir, '..','data_local','morph_models')] -PredictionFiles_Folder = [os.path.join(dir, '..','data_local','morph_out')] +train_files_Folder = [os.path.join(dir, '..','data_local','morph_data')] +dev_files_Folder = [os.path.join(dir, '..','data_local','morph_data')] +test_files_Folder = [os.path.join(dir, '..','data_local','morph_data')] +model_files_Folder = [os.path.join(dir, '..','data_local','morph_models')] +prediction_files_Folder = [os.path.join(dir, '..','data_local','morph_out')] -TrainFiles_template = '*__LANGUAGE__*-ud-train.conllu' -DevFiles_template = '*__LANGUAGE__*-ud-dev.conllu' -TestFiles_template = '*__LANGUAGE__*-ud-test.conllu' -ModelFiles_template = '*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*' -PredictionFiles_template = '*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.pred' +train_files_template = '*__LANGUAGE__*-ud-train.conllu' +dev_files_template = '*__LANGUAGE__*-ud-dev.conllu' +test_files_template = '*__LANGUAGE__*-ud-test.conllu' +model_files_template = '*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*' +prediction_files_template = '*T**__LANGUAGE__*_morphtagger.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.pred' -TrainFiles = [] -DevFiles = [] -TestFiles = [] -ModelFiles = [] -PredictionFiles = [] +train_files = [] +dev_files = [] +test_files = [] +model_files = [] +prediction_files = [] -Languages = ['basque', +languages = ['basque', 'bulgarian', 'croatian', 'czech', @@ -64,68 +64,68 @@ 'hungarian', 'italian', 'swedish'] -MorphFeatureSelection = ['0'] #['0', '1', '2'] #--morph_tagger_large_feature_set=0 -TrainAlgorithm = ['svm_mira'] #--train_algorithm=svm_mira -TrainRegularizationConstant = ['0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 -TrainEpochs = ['20'] #--train_epochs=20 -SequenceModelType = ['0'] #--sequence_model_type=0 -FormCutoff = ['0'] #--form_cutoff=0 -PrefixLength = ['0'] #['0','2','3'] #--prefix_length=3 -SuffixLength = ['3'] #['0','2','3'] #--suffix_length=3 +morph_features_picker = ['0'] #['0', '1', '2'] #--morph_tagger_large_feature_set=0 +train_algorithms = ['svm_mira'] #--train_algorithm=svm_mira +train_regularization_constants = ['0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 +train_epochs_picker = ['20'] #--train_epochs=20 +sequence_model_types = ['0'] #--sequence_model_type=0 +form_cutoffs = ['0'] #--form_cutoff=0 +prefix_lengths = ['0'] #['0','2','3'] #--prefix_length=3 +suffix_lengths = ['3'] #['0','2','3'] #--suffix_length=3 #--logtostderr -if RUNNING_TEST == 1: - ModelFiles_template = ModelFiles_template.replace('*T*', "TEST_") - PredictionFiles_template = PredictionFiles_template.replace('*T*', "TEST_") - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*T*', "TEST_") +if running_test == 1: + model_files_template = model_files_template.replace('*T*', "TEST_") + prediction_files_template = prediction_files_template.replace('*T*', "TEST_") + output_log_filename_prefix = output_log_filename_prefix.replace('*T*', "TEST_") else: - ModelFiles_template = ModelFiles_template.replace('*T*', "") - PredictionFiles_template = PredictionFiles_template.replace('*T*', "") - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*T*', "") + model_files_template = model_files_template.replace('*T*', "") + prediction_files_template = prediction_files_template.replace('*T*', "") + output_log_filename_prefix = output_log_filename_prefix.replace('*T*', "") -if len(Languages) == 1: - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*__LANGUAGE__*', Languages[0]) +if len(languages) == 1: + output_log_filename_prefix = output_log_filename_prefix.replace('*__LANGUAGE__*', languages[0]) else: - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*__LANGUAGE__*', "") + output_log_filename_prefix = output_log_filename_prefix.replace('*__LANGUAGE__*', "") -if not os.path.exists(OutputLog_Folder[0]): - os.makedirs(OutputLog_Folder[0]) +if not os.path.exists(output_log_folder[0]): + os.makedirs(output_log_folder[0]) -for language in Languages: - temp_folder = ModelFiles_Folder[0].replace('*__LANGUAGE__*', language) +for language in languages: + temp_folder = model_files_Folder[0].replace('*__LANGUAGE__*', language) if not os.path.exists(temp_folder): os.makedirs(temp_folder) - temp_folder = PredictionFiles_Folder[0].replace('*__LANGUAGE__*', language) + temp_folder = prediction_files_Folder[0].replace('*__LANGUAGE__*', language) if not os.path.exists(temp_folder): os.makedirs(temp_folder) -csv = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".csv") ,"wb") -log = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".log") ,"wb") -err = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".err") ,"wb") -pylog = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".pylog") ,"wb") +csv = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".csv") ,"wb") +log = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".log") ,"wb") +err = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".err") ,"wb") +pylog = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".pylog") ,"wb") -for i in range(len(TrainFiles_Folder)) : - TrainFiles.append(os.path.join( TrainFiles_Folder[i], TrainFiles_template)) -for i in range(len(DevFiles_Folder)) : - DevFiles.append(os.path.join( DevFiles_Folder[i], DevFiles_template)) -for i in range(len(TestFiles_Folder)) : - TestFiles.append(os.path.join( TestFiles_Folder[i], TestFiles_template)) -for i in range(len(ModelFiles_Folder)) : - ModelFiles.append(os.path.join( ModelFiles_Folder[i], ModelFiles_template)) -for i in range(len(PredictionFiles_Folder)) : - PredictionFiles.append(os.path.join( PredictionFiles_Folder[i], PredictionFiles_template)) +for i in range(len(train_files_Folder)) : + train_files.append(os.path.join( train_files_Folder[i], train_files_template)) +for i in range(len(dev_files_Folder)) : + dev_files.append(os.path.join( dev_files_Folder[i], dev_files_template)) +for i in range(len(test_files_Folder)) : + test_files.append(os.path.join( test_files_Folder[i], test_files_template)) +for i in range(len(model_files_Folder)) : + model_files.append(os.path.join( model_files_Folder[i], model_files_template)) +for i in range(len(prediction_files_Folder)) : + prediction_files.append(os.path.join( prediction_files_Folder[i], prediction_files_template)) string_to_write="" string_to_write=string_to_write+"Program; Language; Features; Markov Order; Train Algorithm; Regularization Constant; Train Epochs; Form cutoff; Prefix Length; Suffix Length" #string_to_write=string_to_write+"; "+"Training time" #Commented for Windows execution; turn on in Linux environment -if NumberOfRuns == 1: +if number_of_runs == 1: #string_to_write=string_to_write+"; "+"Run(Test) time" #Commented for Windows execution; turn on in Linux environment string_to_write=string_to_write+"; "+"CorrectPredict" string_to_write=string_to_write+"; "+"Accuracy" string_to_write=string_to_write+"; "+"Speed (token/sec)" else: - for i in range(NumberOfRuns): + for i in range(number_of_runs): #string_to_write=string_to_write+"; "+"Run(Test) time["+str(i)+"]" #Commented for Windows execution; turn on in Linux environment string_to_write=string_to_write+"; "+"CorrectPredict["+str(i)+"]" string_to_write=string_to_write+"; "+"Accuracy["+str(i)+"]" @@ -134,39 +134,39 @@ string_to_write=string_to_write+"\n" csv.write(string_to_write) -for program, language, features, sequence_model_type, train_algorithm, train_regularization_constant, train_epochs, form_cutoff, prefix_length, suffix_length in itertools.product(Programs, Languages, MorphFeatureSelection, SequenceModelType, TrainAlgorithm, TrainRegularizationConstant, TrainEpochs, FormCutoff, PrefixLength, SuffixLength): - TrainFile = TrainFiles[0] - TrainFile = TrainFile.replace('*__LANGUAGE__*', language) +for program, language, features, sequence_model_type, train_algorithm, train_regularization_constant, train_epochs, form_cutoff, prefix_length, suffix_length in itertools.product(Programs, languages, morph_features_picker, sequence_model_types, train_algorithms, train_regularization_constants, train_epochs_picker, form_cutoffs, prefix_lengths, suffix_lengths): + train_file = train_files[0] + train_file = train_file.replace('*__LANGUAGE__*', language) - DevFile = DevFiles[0] - DevFile = DevFile.replace('*__LANGUAGE__*', language) + dev_file = dev_files[0] + dev_file = dev_file.replace('*__LANGUAGE__*', language) - TestFile = TestFiles[0] - TestFile = TestFile.replace('*__LANGUAGE__*', language) + test_file = test_files[0] + test_file = test_file.replace('*__LANGUAGE__*', language) - ModelFile = ModelFiles[0] - ModelFile = ModelFile.replace('*__LANGUAGE__*', language) - ModelFile = ModelFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - ModelFile = ModelFile.replace('*__FEATURES__*', features) - ModelFile = ModelFile.replace('*__REGCONST__*', train_regularization_constant) - ModelFile = ModelFile.replace('*__PREFIX__*', prefix_length) - ModelFile = ModelFile.replace('*__SUFFIX__*', suffix_length) + model_file = model_files[0] + model_file = model_file.replace('*__LANGUAGE__*', language) + model_file = model_file.replace('*__MARKOV_ORDER__*', sequence_model_type) + model_file = model_file.replace('*__FEATURES__*', features) + model_file = model_file.replace('*__REGCONST__*', train_regularization_constant) + model_file = model_file.replace('*__PREFIX__*', prefix_length) + model_file = model_file.replace('*__SUFFIX__*', suffix_length) - PredictionFile = PredictionFiles[0] - PredictionFile = PredictionFile.replace('*__LANGUAGE__*', language) - PredictionFile = PredictionFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - PredictionFile = PredictionFile.replace('*__FEATURES__*', features) - PredictionFile = PredictionFile.replace('*__REGCONST__*', train_regularization_constant) - PredictionFile = PredictionFile.replace('*__PREFIX__*', prefix_length) - PredictionFile = PredictionFile.replace('*__SUFFIX__*', suffix_length) + prediction_file = prediction_files[0] + prediction_file = prediction_file.replace('*__LANGUAGE__*', language) + prediction_file = prediction_file.replace('*__MARKOV_ORDER__*', sequence_model_type) + prediction_file = prediction_file.replace('*__FEATURES__*', features) + prediction_file = prediction_file.replace('*__REGCONST__*', train_regularization_constant) + prediction_file = prediction_file.replace('*__PREFIX__*', prefix_length) + prediction_file = prediction_file.replace('*__SUFFIX__*', suffix_length) #TRAIN command = [] #command.append("time -p") #Commented for Windows execution; turn on in Linux environment command.append(program) command.append("--train") - command.append("--file_train="+TrainFile) - command.append("--file_model="+ModelFile) + command.append("--file_train="+train_file) + command.append("--file_model="+model_file) command.append("--train_algorithm="+train_algorithm) command.append("--train_regularization_constant="+train_regularization_constant) command.append("--train_epochs="+train_epochs) @@ -228,16 +228,16 @@ command.append(program) command.append("--test") command.append("--evaluate") - command.append("--file_model="+ModelFile) - command.append("--file_test="+DevFile) - command.append("--file_prediction="+PredictionFile) + command.append("--file_model="+model_file) + command.append("--file_test="+dev_file) + command.append("--file_prediction="+prediction_file) command.append("--logtostderr") print "Executing: " sys.stdout.flush() #warm-up X iterations - for iteration in range(0,NumberWarmUps): + for iteration in range(0,number_of_warmups): print "Warm-up #" + str(iteration+1) +": " + ' '.join(command) sys.stdout.flush() pylog.write("Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") @@ -253,12 +253,12 @@ correct_predictions=[] accuracy=[] tagspeed=[] - for iteration in range(NumberOfRuns): + for iteration in range(number_of_runs): print "\n" pylog.write("\n") log.write( "\n") err.write( "\n") - if NumberOfRuns > 1: + if number_of_runs > 1: print "\n**** ITER "+str(iteration)+" ****\n" sys.stdout.flush() pylog.write("\n**** ITER "+str(iteration)+" ****\n") @@ -341,7 +341,7 @@ #string_to_write=string_to_write+";"+str(train_time) #Commented for Windows execution; turn on in Linux environment - for i in range(NumberOfRuns): + for i in range(number_of_runs): #string_to_write=string_to_write+";"+str(test_time[i]) #Commented for Windows execution; turn on in Linux environment string_to_write=string_to_write+";"+str(correct_predictions[i]) string_to_write=string_to_write+";"+str(accuracy[i]) diff --git a/scripts_ner/entity_script_test_parameters.py b/scripts_ner/entity_script_test_parameters.py index c79db56..c7f3633 100644 --- a/scripts_ner/entity_script_test_parameters.py +++ b/scripts_ner/entity_script_test_parameters.py @@ -7,10 +7,10 @@ dir = os.path.abspath( os.path.dirname(__file__) ) -NumberOfRuns=1 -NumberWarmUps=0 +number_of_runs=1 +number_of_warmups=0 -RUNNING_TEST=1 +running_test=1 if len(sys.argv) == 2: Programs = [sys.argv[1]] @@ -29,100 +29,100 @@ sys.exit() -timestr = time.strftime("%Y%m%d-%H%M%S") -OutputLogFilenamePrefix = "*T**__LANGUAGE__*_turbo_entityrecogn_run" -OutputLogFilenameSufix = timestr -OutputLog_Folder = [os.path.join(dir, '..','ner','logs')] +timestr = time.strftime("%Y%m%d-%H%M%S") +output_log_filename_prefix = "*T**__LANGUAGE__*_turbo_entityrecogn_run" +output_log_filename_sufix = timestr +output_log_folder = [os.path.join(dir, '..','ner','logs')] -TrainFiles_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] -DevFiles_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] -TestFiles_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] -GazetteersFiles_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] -ModelFiles_Folder = [os.path.join(dir, '..','ner','models','*__LANGUAGE__*')] -PredictionFiles_Folder = [os.path.join(dir, '..','ner','results','*__LANGUAGE__*')] - -TrainFiles_template = '*__LANGUAGE__*_train.conll.ner' -DevFiles_template = '*__LANGUAGE__*_dev.conll.ner' -TestFiles_template = '*__LANGUAGE__*_test.conll.ner' -GazetteersFiles_template = '*__LANGUAGE__*_all_gazetteers.txt' -ModelFiles_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*' -PredictionFiles_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_p*__PREFIX__*s*__SUFFIX__*.pred' +train_files_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] +dev_files_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] +test_files_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] +gazetteers_files_Folder = [os.path.join(dir, '..','ner','data','*__LANGUAGE__*')] +model_files_Folder = [os.path.join(dir, '..','ner','models','*__LANGUAGE__*')] +prediction_files_Folder = [os.path.join(dir, '..','ner','results','*__LANGUAGE__*')] + +train_files_template = '*__LANGUAGE__*_train.conll.ner' +dev_files_template = '*__LANGUAGE__*_dev.conll.ner' +test_files_template = '*__LANGUAGE__*_test.conll.ner' +gazetteers_files_template = '*__LANGUAGE__*_all_gazetteers.txt' +model_files_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_fco*__form_cutoffs__*_p*__PREFIX__*s*__SUFFIX__*' +prediction_files_template = '*T**__LANGUAGE__*_entityrecogn.model_mo*__MARKOV_ORDER__*_feat*__FEATURES__*_trc*__REGCONST__*_fco*__form_cutoffs__*_p*__PREFIX__*s*__SUFFIX__*.pred' -TrainFiles = [] -DevFiles = [] -TestFiles = [] -GazetteersFiles = [] -ModelFiles = [] -PredictionFiles = [] +train_files = [] +dev_files = [] +test_files = [] +gazetteers_files = [] +model_files = [] +prediction_files = [] -Languages = [# 'basque', 'bulgarian','croatian', 'czech', 'danish', 'finnish', 'greek', 'hungarian', 'italian', 'swedish', +languages = [# 'basque', 'bulgarian','croatian', 'czech', 'danish', 'finnish', 'greek', 'hungarian', 'italian', 'swedish', 'english'] -TrainAlgorithm = ['svm_mira'] #--train_algorithm=svm_mira -TrainRegularizationConstant = ['0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 -TrainEpochs = ['50'] #--train_epochs=20 -SequenceModelType = ['1'] #['0','1','2'] #--sequence_model_type=0 -FormCutoff = ['0', '1'] #--form_cutoff=0 -PrefixLength = ['3'] #['0','2','3'] #--prefix_length=3 -SuffixLength = ['3'] #['0','2','3'] #--suffix_length=3 -EntityTaggingScheme = ['bio'] -EntityFeatureSelection = ['0', '1', '2'] #['0', '1', '2'] #--entity_recognizer_large_feature_set=0 +train_algorithms = ['svm_mira'] #--train_algorithm=svm_mira +train_regularization_constants = ['0.01'] #['1.0', '0.1', '0.01'] #--train_regularization_constant=0.01 +train_epochs_picker = ['50'] #--train_epochs=20 +sequence_model_types = ['0','1','2'] #--sequence_model_type=0 +form_cutoffs = ['0'] #--form_cutoff=0 +prefix_lengths = ['3'] #['0','2','3'] #--prefix_length=3 +suffix_lengths = ['3'] #['0','2','3'] #--suffix_length=3 +entity_tagging_schemes = ['bio'] +entity_features_picker = ['0', '1', '2', '3', '4', '5', '6', '7'] #['0', '1', '2'] #--entity_recognizer_large_feature_set=0 #--logtostderr -if RUNNING_TEST == 1: - ModelFiles_template = ModelFiles_template.replace('*T*', "TEST_") - PredictionFiles_template = PredictionFiles_template.replace('*T*', "TEST_") - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*T*', "TEST_") +if running_test == 1: + model_files_template = model_files_template.replace('*T*', "TEST_") + prediction_files_template = prediction_files_template.replace('*T*', "TEST_") + output_log_filename_prefix = output_log_filename_prefix.replace('*T*', "TEST_") else: - ModelFiles_template = ModelFiles_template.replace('*T*', "") - PredictionFiles_template = PredictionFiles_template.replace('*T*', "") - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*T*', "") + model_files_template = model_files_template.replace('*T*', "") + prediction_files_template = prediction_files_template.replace('*T*', "") + output_log_filename_prefix = output_log_filename_prefix.replace('*T*', "") -if len(Languages) == 1: - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*__LANGUAGE__*', Languages[0]) +if len(languages) == 1: + output_log_filename_prefix = output_log_filename_prefix.replace('*__LANGUAGE__*', languages[0]) else: - OutputLogFilenamePrefix = OutputLogFilenamePrefix.replace('*__LANGUAGE__*', "") + output_log_filename_prefix = output_log_filename_prefix.replace('*__LANGUAGE__*', "") -if not os.path.exists(OutputLog_Folder[0]): - os.makedirs(OutputLog_Folder[0]) +if not os.path.exists(output_log_folder[0]): + os.makedirs(output_log_folder[0]) -for language in Languages: - temp_folder = ModelFiles_Folder[0].replace('*__LANGUAGE__*', language) +for language in languages: + temp_folder = model_files_Folder[0].replace('*__LANGUAGE__*', language) if not os.path.exists(temp_folder): os.makedirs(temp_folder) - temp_folder = PredictionFiles_Folder[0].replace('*__LANGUAGE__*', language) + temp_folder = prediction_files_Folder[0].replace('*__LANGUAGE__*', language) if not os.path.exists(temp_folder): os.makedirs(temp_folder) -csv = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".csv") ,"wb") -log = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".log") ,"wb") -err = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".err") ,"wb") -pylog = open( os.path.join( OutputLog_Folder[0],OutputLogFilenamePrefix+OutputLogFilenameSufix+".pylog") ,"wb") +csv = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".csv") ,"wb") +log = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".log") ,"wb") +err = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".err") ,"wb") +pylog = open( os.path.join( output_log_folder[0],output_log_filename_prefix+output_log_filename_sufix+".pylog") ,"wb") -for i in range(len(TrainFiles_Folder)) : - TrainFiles.append(os.path.join( TrainFiles_Folder[i], TrainFiles_template)) -for i in range(len(DevFiles_Folder)) : - DevFiles.append(os.path.join( DevFiles_Folder[i], DevFiles_template)) -for i in range(len(TestFiles_Folder)) : - TestFiles.append(os.path.join( TestFiles_Folder[i], TestFiles_template)) -for i in range(len(GazetteersFiles_Folder)) : - GazetteersFiles.append(os.path.join( GazetteersFiles_Folder[i], GazetteersFiles_template)) -for i in range(len(ModelFiles_Folder)) : - ModelFiles.append(os.path.join( ModelFiles_Folder[i], ModelFiles_template)) -for i in range(len(PredictionFiles_Folder)) : - PredictionFiles.append(os.path.join( PredictionFiles_Folder[i], PredictionFiles_template)) +for i in range(len(train_files_Folder)) : + train_files.append(os.path.join( train_files_Folder[i], train_files_template)) +for i in range(len(dev_files_Folder)) : + dev_files.append(os.path.join( dev_files_Folder[i], dev_files_template)) +for i in range(len(test_files_Folder)) : + test_files.append(os.path.join( test_files_Folder[i], test_files_template)) +for i in range(len(gazetteers_files_Folder)) : + gazetteers_files.append(os.path.join( gazetteers_files_Folder[i], gazetteers_files_template)) +for i in range(len(model_files_Folder)) : + model_files.append(os.path.join( model_files_Folder[i], model_files_template)) +for i in range(len(prediction_files_Folder)) : + prediction_files.append(os.path.join( prediction_files_Folder[i], prediction_files_template)) string_to_write="" string_to_write=string_to_write+"Program; Language; Features; Markov Order; Train Algorithm; Regularization Constant; Train Epochs; Form cutoff; Prefix Length; Suffix Length" #string_to_write=string_to_write+"; "+"Training time" #Commented for Windows execution; turn on in Linux environment -if NumberOfRuns == 1: +if number_of_runs == 1: #string_to_write=string_to_write+"; "+"Run(Test) time" #Commented for Windows execution; turn on in Linux environment string_to_write=string_to_write+"; "+"CorrectPredict" string_to_write=string_to_write+"; "+"Accuracy" string_to_write=string_to_write+"; "+"Speed (token/sec)" else: - for i in range(NumberOfRuns): + for i in range(number_of_runs): #string_to_write=string_to_write+"; "+"Run(Test) time["+str(i)+"]" #Commented for Windows execution; turn on in Linux environment string_to_write=string_to_write+"; "+"CorrectPredict["+str(i)+"]" string_to_write=string_to_write+"; "+"Accuracy["+str(i)+"]" @@ -131,43 +131,45 @@ string_to_write=string_to_write+"\n" csv.write(string_to_write) -for program, language, features, sequence_model_type, train_algorithm, train_regularization_constant, train_epochs, form_cutoff, prefix_length, suffix_length, tagging_scheme in itertools.product(Programs, Languages, EntityFeatureSelection, SequenceModelType, TrainAlgorithm, TrainRegularizationConstant, TrainEpochs, FormCutoff, PrefixLength, SuffixLength, EntityTaggingScheme): - TrainFile = TrainFiles[0] - TrainFile = TrainFile.replace('*__LANGUAGE__*', language) +for program, language, sequence_model_type, features, train_algorithm, train_regularization_constant, train_epochs, form_cutoff, prefix_length, suffix_length, tagging_scheme in itertools.product(Programs, languages, sequence_model_types, entity_features_picker, train_algorithms, train_regularization_constants, train_epochs_picker, form_cutoffs, prefix_lengths, suffix_lengths, entity_tagging_schemes): + train_file = train_files[0] + train_file = train_file.replace('*__LANGUAGE__*', language) - DevFile = DevFiles[0] - DevFile = DevFile.replace('*__LANGUAGE__*', language) + dev_file = dev_files[0] + dev_file = dev_file.replace('*__LANGUAGE__*', language) - TestFile = TestFiles[0] - TestFile = TestFile.replace('*__LANGUAGE__*', language) + test_file = test_files[0] + test_file = test_file.replace('*__LANGUAGE__*', language) - GazetteersFile = GazetteersFiles[0] - GazetteersFile = GazetteersFile.replace('*__LANGUAGE__*', language) + gazetteers_file = gazetteers_files[0] + gazetteers_file = gazetteers_file.replace('*__LANGUAGE__*', language) - ModelFile = ModelFiles[0] - ModelFile = ModelFile.replace('*__LANGUAGE__*', language) - ModelFile = ModelFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - ModelFile = ModelFile.replace('*__FEATURES__*', features) - ModelFile = ModelFile.replace('*__REGCONST__*', train_regularization_constant) - ModelFile = ModelFile.replace('*__PREFIX__*', prefix_length) - ModelFile = ModelFile.replace('*__SUFFIX__*', suffix_length) + model_file = model_files[0] + model_file = model_file.replace('*__LANGUAGE__*', language) + model_file = model_file.replace('*__MARKOV_ORDER__*', sequence_model_type) + model_file = model_file.replace('*__FEATURES__*', features) + model_file = model_file.replace('*__REGCONST__*', train_regularization_constant) + model_file = model_file.replace('*__form_cutoffs__*', form_cutoff) + model_file = model_file.replace('*__PREFIX__*', prefix_length) + model_file = model_file.replace('*__SUFFIX__*', suffix_length) - PredictionFile = PredictionFiles[0] - PredictionFile = PredictionFile.replace('*__LANGUAGE__*', language) - PredictionFile = PredictionFile.replace('*__MARKOV_ORDER__*', sequence_model_type) - PredictionFile = PredictionFile.replace('*__FEATURES__*', features) - PredictionFile = PredictionFile.replace('*__REGCONST__*', train_regularization_constant) - PredictionFile = PredictionFile.replace('*__PREFIX__*', prefix_length) - PredictionFile = PredictionFile.replace('*__SUFFIX__*', suffix_length) + prediction_file = prediction_files[0] + prediction_file = prediction_file.replace('*__LANGUAGE__*', language) + prediction_file = prediction_file.replace('*__MARKOV_ORDER__*', sequence_model_type) + prediction_file = prediction_file.replace('*__FEATURES__*', features) + prediction_file = prediction_file.replace('*__REGCONST__*', train_regularization_constant) + prediction_file = prediction_file.replace('*__form_cutoffs__*', form_cutoff) + prediction_file = prediction_file.replace('*__PREFIX__*', prefix_length) + prediction_file = prediction_file.replace('*__SUFFIX__*', suffix_length) #TRAIN command = [] #command.append("time -p") #Commented for Windows execution; turn on in Linux environment command.append(program) command.append("--train") - command.append("--file_train="+TrainFile) - command.append("--file_model="+ModelFile) - command.append("--entity_file_gazetteer="+GazetteersFile) + command.append("--file_train="+train_file) + command.append("--file_model="+model_file) + command.append("--entity_file_gazetteer="+gazetteers_file) command.append("--train_algorithm="+train_algorithm) command.append("--train_regularization_constant="+train_regularization_constant) command.append("--sequence_model_type="+sequence_model_type) @@ -230,9 +232,9 @@ command.append(program) command.append("--test") command.append("--evaluate") - command.append("--file_model="+ModelFile) - command.append("--file_test="+TestFile) - command.append("--file_prediction="+PredictionFile) + command.append("--file_model="+model_file) + command.append("--file_test="+test_file) + command.append("--file_prediction="+prediction_file) command.append("--entity_tagging_scheme="+tagging_scheme) command.append("--logtostderr") @@ -240,7 +242,7 @@ sys.stdout.flush() #warm-up X iterations - for iteration in range(0,NumberWarmUps): + for iteration in range(0,number_of_warmups): print "Warm-up #" + str(iteration+1) +": " + ' '.join(command) sys.stdout.flush() pylog.write("Warm-up #" + str(iteration+1) +": " + ' '.join(command) + "\n") @@ -256,12 +258,12 @@ correct_predictions=[] accuracy=[] tagspeed=[] - for iteration in range(NumberOfRuns): + for iteration in range(number_of_runs): print "\n" pylog.write("\n") log.write( "\n") err.write( "\n") - if NumberOfRuns > 1: + if number_of_runs > 1: print "\n**** ITER "+str(iteration)+" ****\n" sys.stdout.flush() pylog.write("\n**** ITER "+str(iteration)+" ****\n") @@ -344,7 +346,7 @@ #string_to_write=string_to_write+";"+str(train_time) #Commented for Windows execution; turn on in Linux environment - for i in range(NumberOfRuns): + for i in range(number_of_runs): #string_to_write=string_to_write+";"+str(test_time[i]) #Commented for Windows execution; turn on in Linux environment string_to_write=string_to_write+";"+str(correct_predictions[i]) string_to_write=string_to_write+";"+str(accuracy[i]) diff --git a/src/entity_recognizer/EntityFeatureTemplates.h b/src/entity_recognizer/EntityFeatureTemplates.h index 08ff7c0..6646e06 100644 --- a/src/entity_recognizer/EntityFeatureTemplates.h +++ b/src/entity_recognizer/EntityFeatureTemplates.h @@ -72,6 +72,11 @@ struct EntityFeatureTemplateBigram { PpPppP, /* POS trigram on the left */ PnPnnP, /* POS trigram on the right */ PpPnP, /* POS trigram on the center */ + S, /* shape */ + pS, /* shape on the left */ + nS, /* shape on the right */ + ppS, /* shape two positions on the left */ + nnS, /* shape two positions on the right */ COUNT }; }; diff --git a/src/entity_recognizer/EntityFeatures.cpp b/src/entity_recognizer/EntityFeatures.cpp index 7caa553..4c27856 100644 --- a/src/entity_recognizer/EntityFeatures.cpp +++ b/src/entity_recognizer/EntityFeatures.cpp @@ -20,6 +20,7 @@ #include "EntityFeatures.h" #include "SequencePart.h" #include "EntityFeatureTemplates.h" +#include void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, int position) { @@ -73,14 +74,16 @@ void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, entity_sentence->GetGazetteerIds(position + 2) : empty_GIDs; // POS tags. - uint8_t PID = (*pos_ids)[position]; // Current word. + uint8_t PID = (*pos_ids)[position]; // Current POS. // POS on the left. - uint8_t pPID = (position > 0) ? (*pos_ids)[position - 1] : TOKEN_START; + uint8_t pPID = (position > 0) ? + (*pos_ids)[position - 1] : TOKEN_START; // POS on the right. uint8_t nPID = (position < sentence_length - 1) ? (*pos_ids)[position + 1] : TOKEN_STOP; // POS two positions on the left. - uint8_t ppPID = (position > 1) ? (*pos_ids)[position - 2] : TOKEN_START; + uint8_t ppPID = (position > 1) ? + (*pos_ids)[position - 2] : TOKEN_START; // POS two positions on the right. uint8_t nnPID = (position < sentence_length - 2) ? (*pos_ids)[position + 2] : TOKEN_STOP; @@ -271,6 +274,8 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, EntityOptions *options = static_cast(pipe_)-> GetEntityOptions(); + std::bitset<32> *feature_set_bitmap; + feature_set_bitmap = new bitset<32>(options->large_feature_set()); // Array of form IDs. const vector* word_ids = &entity_sentence->GetFormIds(); @@ -280,7 +285,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // Words. uint16_t WID, pWID, nWID, ppWID, nnWID; - if (options->large_feature_set() >= 1) { + if (feature_set_bitmap->test(0)) { WID = (position < sentence_length) ? (*word_ids)[position] : TOKEN_STOP; // Current word. // Word on the left. @@ -299,7 +304,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // POS tags. uint8_t PID, pPID, nPID, ppPID, nnPID; - if (options->large_feature_set() >= 2) { + if (feature_set_bitmap->test(1)) { PID = (position < sentence_length) ? (*pos_ids)[position] : TOKEN_STOP; // Current POS. // POS on the left. @@ -316,6 +321,26 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, (*pos_ids)[position + 2] : TOKEN_STOP; } + + // Word shapes. + uint16_t SID, pSID, nSID, ppSID, nnSID; + if (feature_set_bitmap->test(2)) { + SID = (position < sentence_length) ? + sentence->GetShapeId(position) : TOKEN_STOP; // Current shape. + // Shape on the left. + pSID = (position > 0) ? + sentence->GetShapeId(position - 1) : TOKEN_START; + // Shape on the right. + nSID = (position < sentence_length - 1) ? + sentence->GetShapeId(position + 1) : TOKEN_STOP; + // Shape two positions on the left. + ppSID = (position > 1) ? + sentence->GetShapeId(position - 2) : TOKEN_START; + // Shape two positions on the right. + nnSID = (position < sentence_length - 2) ? + sentence->GetShapeId(position + 2) : TOKEN_STOP; + } + // Maximum is 255 feature templates. CHECK_LT(EntityFeatureTemplateBigram::COUNT, 256); @@ -324,7 +349,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, AddFeature(fkey, features); // Lexical features. - if (options->large_feature_set() >= 1) { + if (feature_set_bitmap->test(0)) { fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::W, flags, WID); AddFeature(fkey, features); @@ -343,7 +368,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, } // POS features. - if (options->large_feature_set() >= 2) { + if (feature_set_bitmap->test(1)) { fkey = encoder_.CreateFKey_P(EntityFeatureTemplateBigram::P, flags, PID); AddFeature(fkey, features); @@ -360,6 +385,24 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, flags, PID, nPID, nnPID); AddFeature(fkey, features); } + + // Shape features. + if (feature_set_bitmap->test(2)) { + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::S, + flags, SID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::pS, + flags, pSID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nS, + flags, nSID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::ppS, + flags, ppSID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nnS, + flags, nnSID); + } } void EntityFeatures::AddTrigramFeatures(SequenceInstanceNumeric *sentence, diff --git a/src/morphological_tagger/MorphologicalFeatureTemplates.h b/src/morphological_tagger/MorphologicalFeatureTemplates.h index 1272f80..c5f1a55 100644 --- a/src/morphological_tagger/MorphologicalFeatureTemplates.h +++ b/src/morphological_tagger/MorphologicalFeatureTemplates.h @@ -52,14 +52,14 @@ struct MorphologicalFeatureTemplateUnigram { P, /* POS */ // 'cpostag' pP, /* POS on the left */ // 'cpostag_minusone' - nP, /* POS on the right */ // 'cpostag_plusone' + nP, /* POS on the right */ // 'cpostag_plusone' ppP, /* POS two positions on the left */ // 'cpostag_minustwo' - nnP, /* POS two positions on the right */ // 'cpostag_plustwo' + nnP, /* POS two positions on the right */ // 'cpostag_plustwo' PpP, /* POS + POS on the left */ // 'cpostag_bigram' - PnP, /* POS + POS on the right */ // + PnP, /* POS + POS on the right */ // PpPppP, /* POS trigram on the left */ // 'cpostag_trigram' - PnPnnP, /* POS trigram on the right */ // - PpPnP, /* POS trigram on the center */ // + PnPnnP, /* POS trigram on the right */ // + PpPnP, /* POS trigram on the center */ // S, /* shape */ pS, /* shape on the left */ From f425e11aece5464797e9edfc093b9b45f6b8d77b Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 24 Nov 2015 13:05:12 +0000 Subject: [PATCH 03/51] BUG FIX Entity recognizer was not populating the pos_alphabet_ TokenDictionary dictionary (error since v2.2.0). MISC Removal of FeatureLabelCache caching_weights_ (weights caching) from Parameters.h. MISC Addition of BuildNames call for Alphabets when in DEBUG mode (for debugging purposes). MISC Gazetteers can now consider both case sensitive/insensitive words. --- src/classifier/Parameters.h | 131 ---------------- src/classifier/Pipe.cpp | 6 - src/entity_recognizer/EntityDictionary.cpp | 143 +++++++++++++++++- .../EntityFeatureTemplates.h | 86 +++++------ .../EntityInstanceNumeric.cpp | 8 +- src/entity_recognizer/EntityOptions.cpp | 2 +- src/parser/DependencyDictionary.cpp | 3 +- src/sequence/SequencePipe.cpp | 21 +-- src/sequence/TokenDictionary.cpp | 5 +- 9 files changed, 199 insertions(+), 206 deletions(-) diff --git a/src/classifier/Parameters.h b/src/classifier/Parameters.h index d526e35..e96f2a6 100644 --- a/src/classifier/Parameters.h +++ b/src/classifier/Parameters.h @@ -24,77 +24,6 @@ #include "SparseLabeledParameterVector.h" #include "Utils.h" -#if USE_WEIGHT_CACHING == 1 -// Structure to define a feature-label pair. -struct FeatureLabelPair { - uint64_t feature; - int label; -}; - -// Structure to define a hash function and a comparison function for FeatureLabelPair. -struct FeatureLabelPairMapper { - template - inline void HashCombine(TSeed value, TSeed *seed) const { - *seed ^= value + 0x9e3779b9 + (*seed << 6) + (*seed >> 2); - } - // Hash function. - inline size_t operator()(const FeatureLabelPair& p) const { - size_t hash = std::hash()(p.feature); - size_t hash_2 = std::hash()(p.label); - - HashCombine(hash_2, &hash); - return hash; - } - // Comparison function. - inline bool operator()(const FeatureLabelPair &p, const FeatureLabelPair &q) const { - return p.feature == q.feature && p.label == q.label; - } -}; - -// Defines a hash-table of FeatureLabelPair keys with values, of double type. -typedef std::unordered_map FeatureLabelPairHashMap; - -// Hash-table for caching FeatureLabelPair keys with corresponding values. -class FeatureLabelCache { -public: - FeatureLabelCache() { - hits_ = 0; - misses_ = 0; - }; - virtual ~FeatureLabelCache() {}; - - int hits() const { return hits_; }; - int misses() const { return misses_; }; - int GetSize() const { return cache_.size(); }; - - void IncrementHits() { hits_ += 1; }; - void IncrementMisses() { misses_ += 1; }; - - // Insert a new pair {key, value} in the hash-table. - void Insert(FeatureLabelPair key, double value) { - cache_.insert({ key, value }); - }; - - // Searches for a given key in the hash-table. - // If found, value is returned in argument 'value'. - // return: true if found, false otherwise. - bool Find(FeatureLabelPair key, double * value) { - FeatureLabelPairHashMap::const_iterator caching_iterator; - caching_iterator = cache_.find(key); - if (caching_iterator != cache_.end()) { - *value = caching_iterator->second; - return true; - }; - return false; - }; - -protected: - FeatureLabelPairHashMap cache_; - uint64_t hits_; - uint64_t misses_; -}; -#endif - // This class implements a feature vector, which is convenient to sum over // binary features, weight them, etc. It just uses the classes // SparseParameterVector and SparseLabeledParameterVector, which allow fast @@ -221,53 +150,6 @@ class Parameters { } } -#if USE_WEIGHT_CACHING == 1 - // Compute the scores corresponding to a set of features, conjoined with - // output labels. The vector scores, provided as output, contains the score - // for each label, with the added functionality - // of using a cache for already computed scores. - void ComputeLabelScoresWithCache(const BinaryFeatures &features, - const vector &labels, - vector *scores) { - FeatureLabelPair caching_key; - double caching_value; - - vector reduced_labels; - vector adjust_new_index_reduced_labels; - - scores->clear(); - scores->resize(labels.size(), 0.0); - vector label_scores(labels.size(), 0.0); - for (int j = 0; j < features.size(); ++j) { - if (!ExistsLabeled(features[j])) continue; - reduced_labels.clear(); - adjust_new_index_reduced_labels.clear(); - - for (int k = 0; k < labels.size(); ++k) { - caching_key = { features[j], labels[k] }; - if (!caching_weights_.Find(caching_key, &caching_value)) { - // Add such label to reduced labels. - reduced_labels.push_back(labels[k]); - adjust_new_index_reduced_labels.push_back(k); - caching_weights_.IncrementMisses(); - } else { - (*scores)[k] += caching_value; - caching_weights_.IncrementHits(); - } - } - if (reduced_labels.size() == 0) continue; - if (!Get(features[j], reduced_labels, &label_scores)) continue; - for (int k = 0; k < reduced_labels.size(); ++k) { - (*scores)[adjust_new_index_reduced_labels[k]] += label_scores[k]; - - caching_key = { features[j], reduced_labels[k] }; - caching_value = label_scores[k]; - caching_weights_.Insert(caching_key, caching_value); - } - } - } -#endif - // Scale the parameter vector by scale_factor. void Scale(double scale_factor) { weights_.Scale(scale_factor); @@ -332,12 +214,6 @@ class Parameters { } } -#if USE_WEIGHT_CACHING == 1 - int GetCachingWeightsHits() const { return caching_weights_.hits(); }; - int GetCachingWeightsMisses() const { return caching_weights_.misses(); }; - int GetCachingWeightsSize() const { return caching_weights_.GetSize(); }; -#endif - protected: // Average the parameters as in averaged perceptron. bool use_average_; @@ -349,13 +225,6 @@ class Parameters { // Weights and averaged weights for the "labeled" features. SparseLabeledParameterVector labeled_weights_; SparseLabeledParameterVector averaged_labeled_weights_; - -public: -#if USE_WEIGHT_CACHING == 1 - // Caches the weights for feature-label pairs : - // FeatureLabelPair = struct {feature; label} . - FeatureLabelCache caching_weights_; -#endif }; #endif /*PARAMETERS_H_*/ diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index 2a71b7b..43f3e50 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -449,12 +449,6 @@ void Pipe::Run() { LOG(INFO) << "Number of instances: " << num_instances; LOG(INFO) << "Time: " << diff_ms(end, start); -#if USE_WEIGHT_CACHING == 1 - LOG(INFO) << "Cache size: " << parameters_->GetCachingWeightsSize() << "\t" - << "Cache hits: " << parameters_->GetCachingWeightsHits() << "\t" - << "Cache misses: " << parameters_->GetCachingWeightsMisses() << endl; -#endif - if (options_->evaluate()) EndEvaluation(); } diff --git a/src/entity_recognizer/EntityDictionary.cpp b/src/entity_recognizer/EntityDictionary.cpp index b87d7af..a45c09c 100644 --- a/src/entity_recognizer/EntityDictionary.cpp +++ b/src/entity_recognizer/EntityDictionary.cpp @@ -20,6 +20,7 @@ #include "EntityOptions.h" #include "EntityPipe.h" #include +#include void EntityDictionary::CreateTagDictionary(SequenceReader *reader) { SequenceDictionary::CreateTagDictionary(reader); @@ -154,6 +155,12 @@ void EntityDictionary::ReadGazetteerFiles() { gazetteer_entity_tag_alphabet_.Insert("L-" + entity_type); gazetteer_entity_tag_alphabet_.Insert("U-" + entity_type); for (int k = 1; k < fields.size(); ++k) { + // Uncomment next 'if's to allow different-case occurences + // to map to the same entry. + if (!FLAGS_form_case_sensitive) { + transform(fields[k].begin(), fields[k].end(), + fields[k].begin(), std::tolower); + } const std::string &word = fields[k]; gazetteer_word_alphabet_.Insert(word); } @@ -184,6 +191,12 @@ void EntityDictionary::ReadGazetteerFiles() { int entity_type_unique_id = gazetteer_entity_tag_alphabet_.Lookup("U-" + entity_type); for (int k = 1; k < fields.size(); ++k) { + // Uncomment next 'if's to allow different-case occurences + // to map to the same entry. + if (!FLAGS_form_case_sensitive) { + transform(fields[k].begin(), fields[k].end(), + fields[k].begin(), std::tolower); + } const std::string &word = fields[k]; int word_id = gazetteer_word_alphabet_.Lookup(word); CHECK_GE(word_id, 0); @@ -223,9 +236,16 @@ void EntityDictionary::ReadGazetteerFiles() { } void EntityTokenDictionary::Initialize(EntityReader *reader) { - this->TokenDictionary::Initialize(reader); + SetTokenDictionaryFlagValues(); + LOG(INFO) << "Creating token dictionary..."; + std::vector form_freqs; + std::vector form_lower_freqs; + std::vector shape_freqs; std::vector pos_freqs; + Alphabet form_alphabet; + Alphabet form_lower_alphabet; + Alphabet shape_alphabet; Alphabet pos_alphabet; std::string special_symbols[NUM_SPECIAL_TOKENS]; @@ -234,9 +254,17 @@ void EntityTokenDictionary::Initialize(EntityReader *reader) { special_symbols[TOKEN_STOP] = kTokenStop; for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + prefix_alphabet_.Insert(special_symbols[i]); + suffix_alphabet_.Insert(special_symbols[i]); + form_alphabet.Insert(special_symbols[i]); + form_lower_alphabet.Insert(special_symbols[i]); + shape_alphabet.Insert(special_symbols[i]); pos_alphabet.Insert(special_symbols[i]); // Counts of special symbols are set to -1: + form_freqs.push_back(-1); + form_lower_freqs.push_back(-1); + shape_freqs.push_back(-1); pos_freqs.push_back(-1); } @@ -249,6 +277,46 @@ void EntityTokenDictionary::Initialize(EntityReader *reader) { int instance_length = instance->size(); for (int i = 0; i < instance_length; ++i) { int id; + + // Add form to alphabet. + std::string form = instance->GetForm(i); + std::string form_lower(form); + transform(form_lower.begin(), form_lower.end(), + form_lower.begin(), ::tolower); + if (!form_case_sensitive) form = form_lower; + id = form_alphabet.Insert(form); + if (id >= form_freqs.size()) { + CHECK_EQ(id, form_freqs.size()); + form_freqs.push_back(0); + } + ++form_freqs[id]; + + // Add lower-case form to the alphabet. + id = form_lower_alphabet.Insert(form_lower); + if (id >= form_lower_freqs.size()) { + CHECK_EQ(id, form_lower_freqs.size()); + form_lower_freqs.push_back(0); + } + ++form_lower_freqs[id]; + + // Add prefix/suffix to alphabet. + std::string prefix = form.substr(0, prefix_length); + id = prefix_alphabet_.Insert(prefix); + int start = form.length() - suffix_length; + if (start < 0) start = 0; + std::string suffix = form.substr(start, suffix_length); + id = suffix_alphabet_.Insert(suffix); + + // Add shape to alphabet. + std::string shape; + GetWordShape(instance->GetForm(i), &shape); + id = shape_alphabet.Insert(shape); + if (id >= shape_freqs.size()) { + CHECK_EQ(id, shape_freqs.size()); + shape_freqs.push_back(0); + } + ++shape_freqs[id]; + // Add POS to alphabet. id = pos_alphabet.Insert(instance->GetPosTag(i)); if (id >= pos_freqs.size()) { @@ -263,6 +331,58 @@ void EntityTokenDictionary::Initialize(EntityReader *reader) { reader->Close(); // Now adjust the cutoffs if necessary. + while (true) { + form_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + form_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = form_alphabet.begin(); + iter != form_alphabet.end(); + ++iter) { + if (form_freqs[iter->second] > form_cutoff) { + form_alphabet_.Insert(iter->first); + } + } + if (form_alphabet_.size() < kMaxFormAlphabetSize) break; + ++form_cutoff; + LOG(INFO) << "Incrementing form cutoff to " << form_cutoff << "..."; + } + + while (true) { + form_lower_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + form_lower_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = form_lower_alphabet.begin(); + iter != form_lower_alphabet.end(); + ++iter) { + if (form_lower_freqs[iter->second] > form_lower_cutoff) { + form_lower_alphabet_.Insert(iter->first); + } + } + if (form_lower_alphabet_.size() < kMaxFormAlphabetSize) break; + ++form_lower_cutoff; + LOG(INFO) << "Incrementing lower-case form cutoff to " + << form_lower_cutoff << "..."; + } + + while (true) { + shape_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + shape_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = shape_alphabet.begin(); + iter != shape_alphabet.end(); + ++iter) { + if (shape_freqs[iter->second] > shape_cutoff) { + shape_alphabet_.Insert(iter->first); + } + } + if (shape_alphabet_.size() < kMaxShapeAlphabetSize) break; + ++shape_cutoff; + LOG(INFO) << "Incrementing shape cutoff to " << shape_cutoff << "..."; + } + while (true) { pos_alphabet_.clear(); for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { @@ -280,6 +400,7 @@ void EntityTokenDictionary::Initialize(EntityReader *reader) { form_alphabet_.StopGrowth(); form_lower_alphabet_.StopGrowth(); + shape_alphabet_.StopGrowth(); lemma_alphabet_.StopGrowth(); prefix_alphabet_.StopGrowth(); suffix_alphabet_.StopGrowth(); @@ -287,6 +408,24 @@ void EntityTokenDictionary::Initialize(EntityReader *reader) { pos_alphabet_.StopGrowth(); cpos_alphabet_.StopGrowth(); - LOG(INFO) << "Number of pos: " << pos_alphabet_.size(); + LOG(INFO) << "Number of forms: " << form_alphabet_.size() << endl + << "Number of lower-case forms: " << form_lower_alphabet_.size() << endl + << "Number of prefixes: " << prefix_alphabet_.size() << endl + << "Number of suffixes: " << suffix_alphabet_.size() << endl + << "Number of word shapes: " << shape_alphabet_.size() << endl + << "Number of pos: " << pos_alphabet_.size(); + + CHECK_LT(form_alphabet_.size(), 0xffff); + CHECK_LT(form_lower_alphabet_.size(), 0xffff); + CHECK_LT(shape_alphabet_.size(), 0xffff); + CHECK_LT(lemma_alphabet_.size(), 0xffff); + CHECK_LT(prefix_alphabet_.size(), 0xffff); + CHECK_LT(suffix_alphabet_.size(), 0xffff); + CHECK_LT(feats_alphabet_.size(), 0xffff); CHECK_LT(pos_alphabet_.size(), 0xff); + CHECK_LT(cpos_alphabet_.size(), 0xff); + +#ifndef NDEBUG + BuildNames(); +#endif } diff --git a/src/entity_recognizer/EntityFeatureTemplates.h b/src/entity_recognizer/EntityFeatureTemplates.h index 6646e06..68302ff 100644 --- a/src/entity_recognizer/EntityFeatureTemplates.h +++ b/src/entity_recognizer/EntityFeatureTemplates.h @@ -29,61 +29,61 @@ struct EntityFeatureTemplateParts { struct EntityFeatureTemplateUnigram { enum types { - BIAS = 0, /* bias */ - W, /* word */ - pW, /* word on the left */ - nW, /* word on the right */ - ppW, /* word two positions on the left */ - nnW, /* word two positions on the right */ - G, /* gazetteer */ - pG, /* gazetteer on the left */ - nG, /* gazetteer on the right */ - ppG, /* gazetteer two positions on the left */ - nnG, /* gazetteer two positions on the right */ - P, /* POS */ - PpP, /* POS + POS on the left */ - PnP, /* POS + POS on the right */ - PpPppP, /* POS trigram on the left */ - PnPnnP, /* POS trigram on the right */ - PpPnP, /* POS trigram on the center */ - S, /* shape */ - pS, /* shape on the left */ - nS, /* shape on the right */ - ppS, /* shape two positions on the left */ - nnS, /* shape two positions on the right */ - A, /* prefix */ - Z, /* suffix */ - FLAG, /* flag indicating presence of special characters */ + BIAS = 0, /* bias */ //WORD + W, /* word */ //WORD + pW, /* word on the left */ //CONTEXT + nW, /* word on the right */ //CONTEXT + ppW, /* word two positions on the left */ //CONTEXT + nnW, /* word two positions on the right */ //CONTEXT + G, /* gazetteer */ //WORD + pG, /* gazetteer on the left */ //CONTEXT + nG, /* gazetteer on the right */ //CONTEXT + ppG, /* gazetteer two positions on the left */ //CONTEXT + nnG, /* gazetteer two positions on the right */ //CONTEXT + P, /* POS */ //WORD + PpP, /* POS + POS on the left */ //CONTEXT + PnP, /* POS + POS on the right */ //CONTEXT + PpPppP, /* POS trigram on the left */ //CONTEXT + PnPnnP, /* POS trigram on the right */ //CONTEXT + PpPnP, /* POS trigram on the center */ //CONTEXT + S, /* shape */ //WORD + pS, /* shape on the left */ //CONTEXT + nS, /* shape on the right */ //CONTEXT + ppS, /* shape two positions on the left */ //CONTEXT + nnS, /* shape two positions on the right */ //CONTEXT + A, /* prefix */ //WORD + Z, /* suffix */ //WORD + FLAG, /* flag indicating presence of special characters */ //WORD COUNT }; }; struct EntityFeatureTemplateBigram { enum types { - BIAS = 0, /* bias */ - W, /* word */ - pW, /* word on the left */ - nW, /* word on the right */ - ppW, /* word two positions on the left */ - nnW, /* word two positions on the right */ - P, /* POS */ - PpP, /* POS + POS on the left */ - PnP, /* POS + POS on the right */ - PpPppP, /* POS trigram on the left */ - PnPnnP, /* POS trigram on the right */ - PpPnP, /* POS trigram on the center */ - S, /* shape */ - pS, /* shape on the left */ - nS, /* shape on the right */ - ppS, /* shape two positions on the left */ - nnS, /* shape two positions on the right */ + BIAS = 0, /* bias */ + W, /* word */ + pW, /* word on the left */ + nW, /* word on the right */ + ppW, /* word two positions on the left */ + nnW, /* word two positions on the right */ + P, /* POS */ + PpP, /* POS + POS on the left */ + PnP, /* POS + POS on the right */ + PpPppP, /* POS trigram on the left */ + PnPnnP, /* POS trigram on the right */ + PpPnP, /* POS trigram on the center */ + S, /* shape */ + pS, /* shape on the left */ + nS, /* shape on the right */ + ppS, /* shape two positions on the left */ + nnS, /* shape two positions on the right */ COUNT }; }; struct EntityFeatureTemplateTrigram { enum types { - BIAS = 0, /* bias */ + BIAS = 0, /* bias */ }; }; diff --git a/src/entity_recognizer/EntityInstanceNumeric.cpp b/src/entity_recognizer/EntityInstanceNumeric.cpp index 881c9db..85729eb 100644 --- a/src/entity_recognizer/EntityInstanceNumeric.cpp +++ b/src/entity_recognizer/EntityInstanceNumeric.cpp @@ -36,7 +36,13 @@ void EntityInstanceNumeric::Initialize(const EntityDictionary &dictionary, if (id < 0) id = TOKEN_UNKNOWN; pos_ids_[i] = id; - dictionary.GetWordGazetteerIds(instance->GetForm(i), + std::string form = instance->GetForm(i); + // Uncomment next 'if's to allow different-case occurences + // to map to the same entry. + if (!FLAGS_form_case_sensitive) { + transform(form.begin(), form.end(), form.begin(), ::tolower); + } + dictionary.GetWordGazetteerIds(form, &gazetteer_ids_[i]); //LOG(INFO) << instance->GetForm(i) << ": " << gazetteer_ids_[i].size(); } diff --git a/src/entity_recognizer/EntityOptions.cpp b/src/entity_recognizer/EntityOptions.cpp index 4903478..4919d04 100644 --- a/src/entity_recognizer/EntityOptions.cpp +++ b/src/entity_recognizer/EntityOptions.cpp @@ -34,7 +34,7 @@ DEFINE_string(entity_tagging_scheme, "bio", DEFINE_string(entity_file_gazetteer, "", "Path to a gazetteer file (one entity per line with the " "corresponding class, separated by tabs."); -DEFINE_int32(entity_recognizer_large_feature_set, 2, +DEFINE_int32(entity_recognizer_large_feature_set, 3, "The greater the value, the larger feature set used. Taggers are " "usually more accurate but slower and have a larger memory footprint."); diff --git a/src/parser/DependencyDictionary.cpp b/src/parser/DependencyDictionary.cpp index 584b2b8..34bf507 100644 --- a/src/parser/DependencyDictionary.cpp +++ b/src/parser/DependencyDictionary.cpp @@ -372,6 +372,7 @@ void DependencyTokenDictionary::Initialize(DependencyReader *reader) { CHECK_LT(pos_alphabet_.size(), 0xff); CHECK_LT(cpos_alphabet_.size(), 0xff); - // TODO: Remove this (only for debugging purposes). +#ifndef NDEBUG BuildNames(); +#endif } diff --git a/src/sequence/SequencePipe.cpp b/src/sequence/SequencePipe.cpp index 0bdba2a..87b2105 100644 --- a/src/sequence/SequencePipe.cpp +++ b/src/sequence/SequencePipe.cpp @@ -74,7 +74,8 @@ void SequencePipe::PreprocessData() { CreateTagDictionary(GetSequenceReader()); } -void SequencePipe::ComputeScores(Instance *instance, Parts *parts, +void SequencePipe::ComputeScores(Instance *instance, + Parts *parts, Features *features, vector *scores) { SequenceInstanceNumeric *sentence = @@ -100,15 +101,9 @@ void SequencePipe::ComputeScores(Instance *instance, Parts *parts, allowed_tags[k] = unigram->tag(); } vector tag_scores; -#if USE_WEIGHT_CACHING == 1 - parameters_->ComputeLabelScoresWithCache(unigram_features, - allowed_tags, - &tag_scores); -#else parameters_->ComputeLabelScores(unigram_features, allowed_tags, &tag_scores); -#endif for (int k = 0; k < index_unigram_parts.size(); ++k) { (*scores)[index_unigram_parts[k]] = tag_scores[k]; } @@ -131,15 +126,9 @@ void SequencePipe::ComputeScores(Instance *instance, Parts *parts, } vector tag_scores; -#if USE_WEIGHT_CACHING == 1 - parameters_->ComputeLabelScoresWithCache(bigram_features, - bigram_tags, - &tag_scores); -#else parameters_->ComputeLabelScores(bigram_features, bigram_tags, &tag_scores); -#endif for (int k = 0; k < index_bigram_parts.size(); ++k) { (*scores)[index_bigram_parts[k]] = tag_scores[k]; } @@ -165,15 +154,9 @@ void SequencePipe::ComputeScores(Instance *instance, Parts *parts, } vector tag_scores; -#if USE_WEIGHT_CACHING == 1 - parameters_->ComputeLabelScoresWithCache(trigram_features, - trigram_tags, - &tag_scores); -#else parameters_->ComputeLabelScores(trigram_features, trigram_tags, &tag_scores); -#endif for (int k = 0; k < index_trigram_parts.size(); ++k) { (*scores)[index_trigram_parts[k]] = tag_scores[k]; } diff --git a/src/sequence/TokenDictionary.cpp b/src/sequence/TokenDictionary.cpp index 0def530..5f6be4d 100644 --- a/src/sequence/TokenDictionary.cpp +++ b/src/sequence/TokenDictionary.cpp @@ -62,8 +62,9 @@ void TokenDictionary::Load(FILE* fs) { if (0 > cpos_alphabet_.Load(fs)) CHECK(false); if (0 > shape_alphabet_.Load(fs)) CHECK(false); - // TODO: Remove this (only for debugging purposes) - //BuildNames(); +#ifndef NDEBUG + BuildNames(); +#endif } void TokenDictionary::Save(FILE* fs) { From 69ac86c886c8c18e18633906551955c5f5b103ac Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 24 Nov 2015 17:09:52 +0000 Subject: [PATCH 04/51] MISC Gazetteers case sensitive/insensitiveness is now dependent of a specific flag, and therefore no longer dependent of the form_case_sensitive flag (as previously). --- src/entity_recognizer/EntityDictionary.cpp | 9 +++------ src/entity_recognizer/EntityDictionary.h | 5 +++++ src/entity_recognizer/EntityInstanceNumeric.cpp | 2 +- src/entity_recognizer/EntityOptions.cpp | 13 +++++++++++-- src/entity_recognizer/EntityOptions.h | 4 +++- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/entity_recognizer/EntityDictionary.cpp b/src/entity_recognizer/EntityDictionary.cpp index a45c09c..83b46e1 100644 --- a/src/entity_recognizer/EntityDictionary.cpp +++ b/src/entity_recognizer/EntityDictionary.cpp @@ -127,6 +127,7 @@ void EntityDictionary::CreateTagDictionary(SequenceReader *reader) { void EntityDictionary::ReadGazetteerFiles() { EntityOptions *options = static_cast(pipe_->GetOptions()); + gazetteer_case_sensitive_ = options->gazetteer_case_sensitive(); gazetteer_word_alphabet_.AllowGrowth(); gazetteer_entity_tag_alphabet_.AllowGrowth(); @@ -155,9 +156,7 @@ void EntityDictionary::ReadGazetteerFiles() { gazetteer_entity_tag_alphabet_.Insert("L-" + entity_type); gazetteer_entity_tag_alphabet_.Insert("U-" + entity_type); for (int k = 1; k < fields.size(); ++k) { - // Uncomment next 'if's to allow different-case occurences - // to map to the same entry. - if (!FLAGS_form_case_sensitive) { + if (!gazetteer_case_sensitive_) { transform(fields[k].begin(), fields[k].end(), fields[k].begin(), std::tolower); } @@ -191,9 +190,7 @@ void EntityDictionary::ReadGazetteerFiles() { int entity_type_unique_id = gazetteer_entity_tag_alphabet_.Lookup("U-" + entity_type); for (int k = 1; k < fields.size(); ++k) { - // Uncomment next 'if's to allow different-case occurences - // to map to the same entry. - if (!FLAGS_form_case_sensitive) { + if (!gazetteer_case_sensitive_) { transform(fields[k].begin(), fields[k].end(), fields[k].begin(), std::tolower); } diff --git a/src/entity_recognizer/EntityDictionary.h b/src/entity_recognizer/EntityDictionary.h index c047473..87087ce 100644 --- a/src/entity_recognizer/EntityDictionary.h +++ b/src/entity_recognizer/EntityDictionary.h @@ -138,11 +138,16 @@ class EntityDictionary : public SequenceDictionary { return allowed_bigrams_[tag + 1][left_tag + 1]; } + const bool gazetteer_case_sensitive() const { + return gazetteer_case_sensitive_; + } + protected: std::vector > allowed_bigrams_; Alphabet gazetteer_word_alphabet_; Alphabet gazetteer_entity_tag_alphabet_; std::vector > gazetteer_word_entity_tags_; + bool gazetteer_case_sensitive_; //stores the value of the corresponding flag }; class EntityTokenDictionary : public TokenDictionary { diff --git a/src/entity_recognizer/EntityInstanceNumeric.cpp b/src/entity_recognizer/EntityInstanceNumeric.cpp index 85729eb..b006d1c 100644 --- a/src/entity_recognizer/EntityInstanceNumeric.cpp +++ b/src/entity_recognizer/EntityInstanceNumeric.cpp @@ -39,7 +39,7 @@ void EntityInstanceNumeric::Initialize(const EntityDictionary &dictionary, std::string form = instance->GetForm(i); // Uncomment next 'if's to allow different-case occurences // to map to the same entry. - if (!FLAGS_form_case_sensitive) { + if (!dictionary.gazetteer_case_sensitive()) { transform(form.begin(), form.end(), form.begin(), ::tolower); } dictionary.GetWordGazetteerIds(form, diff --git a/src/entity_recognizer/EntityOptions.cpp b/src/entity_recognizer/EntityOptions.cpp index 4919d04..e2d4ec1 100644 --- a/src/entity_recognizer/EntityOptions.cpp +++ b/src/entity_recognizer/EntityOptions.cpp @@ -37,6 +37,8 @@ DEFINE_string(entity_file_gazetteer, "", DEFINE_int32(entity_recognizer_large_feature_set, 3, "The greater the value, the larger feature set used. Taggers are " "usually more accurate but slower and have a larger memory footprint."); +DEFINE_bool(entity_gazetteer_case_sensitive, true, + "Distinguish upper/lower case of gazetteers words"); // Save current option flags to the model file. void EntityOptions::Save(FILE* fs) { @@ -47,6 +49,8 @@ void EntityOptions::Save(FILE* fs) { CHECK(success); success = WriteInteger(fs, large_feature_set_); CHECK(success); + success = WriteBool(fs, gazetteer_case_sensitive_); + CHECK(success); } // Load current option flags to the model file. @@ -57,12 +61,16 @@ void EntityOptions::Load(FILE* fs) { bool success; success = ReadString(fs, &FLAGS_entity_tagging_scheme); CHECK(success); - LOG(INFO) << "Setting --entity_tagging_scheme=" << - FLAGS_entity_tagging_scheme; + LOG(INFO) << "Setting --entity_tagging_scheme=" + << FLAGS_entity_tagging_scheme; success = ReadInteger(fs, &FLAGS_entity_recognizer_large_feature_set); CHECK(success); LOG(INFO) << "Setting --entity_recognizer_large_feature_set=" << FLAGS_entity_recognizer_large_feature_set; + success = ReadBool(fs, &FLAGS_entity_gazetteer_case_sensitive); + CHECK(success); + LOG(INFO) << "Setting --entity_gazetteer_case_sensitive=" + << FLAGS_entity_gazetteer_case_sensitive; Initialize(); } @@ -83,4 +91,5 @@ void EntityOptions::Initialize() { CHECK(false) << "Unknown entity scheme: " << tagging_scheme_name_; } large_feature_set_ = FLAGS_entity_recognizer_large_feature_set; + gazetteer_case_sensitive_ = FLAGS_entity_gazetteer_case_sensitive; } diff --git a/src/entity_recognizer/EntityOptions.h b/src/entity_recognizer/EntityOptions.h index c6c9736..1df6856 100644 --- a/src/entity_recognizer/EntityOptions.h +++ b/src/entity_recognizer/EntityOptions.h @@ -44,7 +44,8 @@ class EntityOptions : public SequenceOptions { // Get option flags. int tagging_scheme() { return tagging_scheme_; } const std::string &file_gazetteer() { return file_gazetteer_; } - int large_feature_set() { return large_feature_set_; } + const int large_feature_set() { return large_feature_set_; } + const bool gazetteer_case_sensitive() { return gazetteer_case_sensitive_; } protected: std::string file_format_; @@ -52,6 +53,7 @@ class EntityOptions : public SequenceOptions { std::string file_gazetteer_; int tagging_scheme_; int large_feature_set_; + bool gazetteer_case_sensitive_; }; #endif // ENTITY_OPTIONS_H_ From 829af4fa76c2722c167fe04d54db89ce94c948ef Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 24 Nov 2015 19:23:59 +0000 Subject: [PATCH 05/51] BUG FIX Entity gazetteers case sensitive/insensitiveness flag value was not being loaded correctly. --- src/entity_recognizer/EntityDictionary.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/entity_recognizer/EntityDictionary.h b/src/entity_recognizer/EntityDictionary.h index 87087ce..e58b3a7 100644 --- a/src/entity_recognizer/EntityDictionary.h +++ b/src/entity_recognizer/EntityDictionary.h @@ -71,6 +71,9 @@ class EntityDictionary : public SequenceDictionary { CHECK(success); } } + + success = WriteBool(fs, gazetteer_case_sensitive_); + CHECK(success); } void Load(FILE *fs) { @@ -116,6 +119,9 @@ class EntityDictionary : public SequenceDictionary { allowed_bigrams_[j][k] = allowed; } } + + success = ReadBool(fs, &gazetteer_case_sensitive_); + CHECK(success); } void CreateTagDictionary(SequenceReader *reader); From ba92dfd769e67eb7aa5496b5dd6d7ed74ad4b5ec Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 26 Nov 2015 10:56:49 +0000 Subject: [PATCH 06/51] Code cleanup before merging with master branch. --- src/classifier/Features.h | 4 -- src/entity_recognizer/EntityDictionary.h | 4 +- src/entity_recognizer/EntityFeatures.cpp | 55 ++++++++++++------------ 3 files changed, 29 insertions(+), 34 deletions(-) diff --git a/src/classifier/Features.h b/src/classifier/Features.h index 811c732..363b67f 100644 --- a/src/classifier/Features.h +++ b/src/classifier/Features.h @@ -27,10 +27,6 @@ #include #include -#ifndef USE_WEIGHT_CACHING -#define USE_WEIGHT_CACHING 0 //1 -#endif - // A vector of binary features. Each feature is represented as a 64-bit key. typedef vector BinaryFeatures; diff --git a/src/entity_recognizer/EntityDictionary.h b/src/entity_recognizer/EntityDictionary.h index e58b3a7..5c20ad5 100644 --- a/src/entity_recognizer/EntityDictionary.h +++ b/src/entity_recognizer/EntityDictionary.h @@ -144,8 +144,8 @@ class EntityDictionary : public SequenceDictionary { return allowed_bigrams_[tag + 1][left_tag + 1]; } - const bool gazetteer_case_sensitive() const { - return gazetteer_case_sensitive_; + const bool gazetteer_case_sensitive() const { + return gazetteer_case_sensitive_; } protected: diff --git a/src/entity_recognizer/EntityFeatures.cpp b/src/entity_recognizer/EntityFeatures.cpp index 4c27856..7f7b41e 100644 --- a/src/entity_recognizer/EntityFeatures.cpp +++ b/src/entity_recognizer/EntityFeatures.cpp @@ -76,13 +76,13 @@ void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, // POS tags. uint8_t PID = (*pos_ids)[position]; // Current POS. // POS on the left. - uint8_t pPID = (position > 0) ? + uint8_t pPID = (position > 0) ? (*pos_ids)[position - 1] : TOKEN_START; // POS on the right. uint8_t nPID = (position < sentence_length - 1) ? (*pos_ids)[position + 1] : TOKEN_STOP; // POS two positions on the left. - uint8_t ppPID = (position > 1) ? + uint8_t ppPID = (position > 1) ? (*pos_ids)[position - 2] : TOKEN_START; // POS two positions on the right. uint8_t nnPID = (position < sentence_length - 2) ? @@ -140,38 +140,38 @@ void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, AddFeature(fkey, features); // Lexical features. - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::W, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::W, flags, WID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pW, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pW, flags, pWID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nW, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nW, flags, nWID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::ppW, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::ppW, flags, ppWID); AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnW, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnW, flags, nnWID); AddFeature(fkey, features); // Gazetteer features. for (int k = 0; k < GIDs.size(); ++k) { uint16_t GID = GIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::G, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::G, flags, GID); AddFeature(fkey, features); } for (int k = 0; k < pGIDs.size(); ++k) { uint16_t pGID = pGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pG, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::pG, flags, pGID); AddFeature(fkey, features); } for (int k = 0; k < nGIDs.size(); ++k) { uint16_t nGID = nGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nG, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nG, flags, nGID); AddFeature(fkey, features); } @@ -183,7 +183,7 @@ void EntityFeatures::AddUnigramFeatures(SequenceInstanceNumeric *sentence, } for (int k = 0; k < nnGIDs.size(); ++k) { uint16_t nnGID = nnGIDs[k]; - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnG, + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateUnigram::nnG, flags, nnGID); AddFeature(fkey, features); } @@ -292,7 +292,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, pWID = (position > 0) ? (*word_ids)[position - 1] : TOKEN_START; // Word on the right. - nWID = (position < sentence_length - 1) ? + nWID = (position < sentence_length - 1) ? (*word_ids)[position + 1] : TOKEN_STOP; // Word two positions on the left. ppWID = (position > 1) ? @@ -321,11 +321,10 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, (*pos_ids)[position + 2] : TOKEN_STOP; } - // Word shapes. uint16_t SID, pSID, nSID, ppSID, nnSID; if (feature_set_bitmap->test(2)) { - SID = (position < sentence_length) ? + SID = (position < sentence_length) ? sentence->GetShapeId(position) : TOKEN_STOP; // Current shape. // Shape on the left. pSID = (position > 0) ? @@ -388,20 +387,20 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // Shape features. if (feature_set_bitmap->test(2)) { - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::S, - flags, SID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::pS, - flags, pSID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nS, - flags, nSID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::ppS, - flags, ppSID); - AddFeature(fkey, features); - fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nnS, - flags, nnSID); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::S, + flags, SID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::pS, + flags, pSID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nS, + flags, nSID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::ppS, + flags, ppSID); + AddFeature(fkey, features); + fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nnS, + flags, nnSID); } } From 8fdf1faa852cc9aaed9ae425cbcc7a8ad9cc6bb4 Mon Sep 17 00:00:00 2001 From: davidjacnogueira Date: Fri, 27 Nov 2015 22:37:51 +0000 Subject: [PATCH 07/51] BUG FIX missing line added for adding shape feature in entity features. --- src/entity_recognizer/EntityFeatures.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/entity_recognizer/EntityFeatures.cpp b/src/entity_recognizer/EntityFeatures.cpp index 7f7b41e..91d2cdd 100644 --- a/src/entity_recognizer/EntityFeatures.cpp +++ b/src/entity_recognizer/EntityFeatures.cpp @@ -401,6 +401,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, AddFeature(fkey, features); fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::nnS, flags, nnSID); + AddFeature(fkey, features); } } From 88a02f5ba937cf21cd9f15429a8cdcf1bc80c401 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 16 Mar 2016 16:01:38 +0000 Subject: [PATCH 08/51] BUG FIX Remove occurrence of std::tolower (change to ::tolower). --- src/entity_recognizer/EntityDictionary.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/entity_recognizer/EntityDictionary.cpp b/src/entity_recognizer/EntityDictionary.cpp index 83b46e1..443d5b3 100644 --- a/src/entity_recognizer/EntityDictionary.cpp +++ b/src/entity_recognizer/EntityDictionary.cpp @@ -158,7 +158,7 @@ void EntityDictionary::ReadGazetteerFiles() { for (int k = 1; k < fields.size(); ++k) { if (!gazetteer_case_sensitive_) { transform(fields[k].begin(), fields[k].end(), - fields[k].begin(), std::tolower); + fields[k].begin(), ::tolower); } const std::string &word = fields[k]; gazetteer_word_alphabet_.Insert(word); @@ -192,7 +192,7 @@ void EntityDictionary::ReadGazetteerFiles() { for (int k = 1; k < fields.size(); ++k) { if (!gazetteer_case_sensitive_) { transform(fields[k].begin(), fields[k].end(), - fields[k].begin(), std::tolower); + fields[k].begin(), ::tolower); } const std::string &word = fields[k]; int word_id = gazetteer_word_alphabet_.Lookup(word); @@ -425,4 +425,4 @@ void EntityTokenDictionary::Initialize(EntityReader *reader) { #ifndef NDEBUG BuildNames(); #endif -} +} From 90aa8a41f8ef9c70b05f6477f0b61c20892fa150 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 22 Mar 2016 10:58:16 +0000 Subject: [PATCH 09/51] Update calls to transform to std::transform. --- .../CoreferenceDictionary.cpp | 32 +- src/coreference_resolver/Mention.cpp | 14 +- src/entity_recognizer/EntityDictionary.cpp | 854 +++++++++--------- .../EntityInstanceNumeric.cpp | 4 +- .../MorphologicalDictionary.cpp | 6 +- src/parser/DependencyDictionary.cpp | 6 +- src/parser/DependencyInstanceNumeric.cpp | 6 +- src/sequence/SequenceInstanceNumeric.cpp | 4 +- src/sequence/TokenDictionary.cpp | 6 +- src/tagger/TaggerDictionary.cpp | 4 +- 10 files changed, 468 insertions(+), 468 deletions(-) diff --git a/src/coreference_resolver/CoreferenceDictionary.cpp b/src/coreference_resolver/CoreferenceDictionary.cpp index 9af157f..2fe1a20 100644 --- a/src/coreference_resolver/CoreferenceDictionary.cpp +++ b/src/coreference_resolver/CoreferenceDictionary.cpp @@ -213,7 +213,7 @@ void CoreferenceDictionary::CreateMentionWordDictionaries( // Add head word to alphabet. i = mention->head_index(); std::string form = instance->GetForm(i); - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); id = head_word_alphabet_.Insert(form); if (id >= head_word_freqs.size()) { CHECK_EQ(id, head_word_freqs.size()); @@ -224,7 +224,7 @@ void CoreferenceDictionary::CreateMentionWordDictionaries( // Add first word to alphabet. i = mention->start(); std::string form = instance->GetForm(i); - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); id = first_word_alphabet_.Insert(form); if (id >= first_word_freqs.size()) { CHECK_EQ(id, first_word_freqs.size()); @@ -235,7 +235,7 @@ void CoreferenceDictionary::CreateMentionWordDictionaries( // Add last word to alphabet. i = mention->end(); std::string form = instance->GetForm(i); - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); id = last_word_alphabet_.Insert(form); if (id >= last_word_freqs.size()) { CHECK_EQ(id, last_word_freqs.size()); @@ -247,7 +247,7 @@ void CoreferenceDictionary::CreateMentionWordDictionaries( i = mention->start() - 1; if (i >= 0) { std::string form = instance->GetForm(i); - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); id = previous_word_alphabet_.Insert(form); if (id >= previous_word_freqs.size()) { CHECK_EQ(id, previous_word_freqs.size()); @@ -260,7 +260,7 @@ void CoreferenceDictionary::CreateMentionWordDictionaries( i = mention->end() + 1; if (i < instance->size()) { std::string form = instance->GetForm(i); - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); id = next_word_alphabet_.Insert(form); if (id >= next_word_freqs.size()) { CHECK_EQ(id, next_word_freqs.size()); @@ -418,8 +418,8 @@ void CoreferenceDictionary::CreateWordDictionaries( // Add form to alphabet. std::string form = instance->GetForm(i); std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), form_lower.begin(), - ::tolower); + std::transform(form_lower.begin(), form_lower.end(), form_lower.begin(), + ::tolower); id = word_alphabet_.Insert(form); if (id >= word_freqs.size()) { CHECK_EQ(id, word_freqs.size()); @@ -560,8 +560,8 @@ void CoreferenceDictionary::ReadGenderNumberStatistics() { for (int i = 0; i < words.size(); ++i) { const std::string &word = words[i]; std::string word_lower(word); - transform(word_lower.begin(), word_lower.end(), word_lower.begin(), - ::tolower); + std::transform(word_lower.begin(), word_lower.end(), word_lower.begin(), + ::tolower); int word_id = word_alphabet_.Insert(word); @@ -625,8 +625,8 @@ void CoreferenceDictionary::ReadPronouns() { const std::string &form = fields[0]; const std::string code_flags = fields[1]; std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), form_lower.begin(), - ::tolower); + std::transform(form_lower.begin(), form_lower.end(), form_lower.begin(), + ::tolower); int id = token_dictionary_->GetFormLowerId(form_lower); CHECK_LT(id, 0xffff); if (id < 0) { @@ -673,8 +673,8 @@ void CoreferenceDictionary::ReadPronouns() { const std::string &word = fields[0]; const std::string code_flags = fields[1]; std::string word_lower(word); - transform(word_lower.begin(), word_lower.end(), word_lower.begin(), - ::tolower); + std::transform(word_lower.begin(), word_lower.end(), word_lower.begin(), + ::tolower); int id = word_lower_alphabet_.Lookup(word_lower); if (id < 0) { LOG(INFO) << "Adding unknown pronoun: " @@ -733,8 +733,8 @@ void CoreferenceDictionary::ReadDeterminers() { const std::string &word = fields[0]; const std::string code_flags = fields[1]; std::string word_lower(word); - transform(word_lower.begin(), word_lower.end(), word_lower.begin(), - ::tolower); + std::transform(word_lower.begin(), word_lower.end(), word_lower.begin(), + ::tolower); int id = word_lower_alphabet_.Lookup(word_lower); if (id < 0) { LOG(INFO) << "Adding unknown determiner: " @@ -863,4 +863,4 @@ void CoreferenceDictionary::ReadMentionTags() { } is.close(); } -} +} diff --git a/src/coreference_resolver/Mention.cpp b/src/coreference_resolver/Mention.cpp index 1ebc548..1930586 100644 --- a/src/coreference_resolver/Mention.cpp +++ b/src/coreference_resolver/Mention.cpp @@ -58,8 +58,8 @@ void Mention::ComputeProperties(const CoreferenceDictionary &dictionary, const std::string &word = instance->GetForm(head_index_); std::string word_lower(word); - transform(word_lower.begin(), word_lower.end(), word_lower.begin(), - ::tolower); + std::transform(word_lower.begin(), word_lower.end(), word_lower.begin(), + ::tolower); int id = dictionary.GetWordLowerAlphabet().Lookup(word_lower); //if (id < 0) id = TOKEN_UNKNOWN; int head_word = id; // This uses the extended word dictionary. @@ -106,8 +106,8 @@ void Mention::ComputeProperties(const CoreferenceDictionary &dictionary, if (i >= 0) { const std::string &word = instance->GetForm(i); std::string word_lower(word); - transform(word_lower.begin(), word_lower.end(), word_lower.begin(), - ::tolower); + std::transform(word_lower.begin(), word_lower.end(), word_lower.begin(), + ::tolower); int word_lower_id = dictionary.GetWordLowerAlphabet().Lookup(word_lower); number_ = MentionNumber::UNKNOWN; @@ -141,8 +141,8 @@ void Mention::ComputeProperties(const CoreferenceDictionary &dictionary, for (int i = start_; i <= end_; ++i) { const std::string &word = instance->GetForm(i); std::string word_lower(word); - transform(word_lower.begin(), word_lower.end(), word_lower.begin(), - ::tolower); + std::transform(word_lower.begin(), word_lower.end(), word_lower.begin(), + ::tolower); int id = dictionary.GetWordAlphabet().Lookup(word); //if (id < 0) id = TOKEN_UNKNOWN; phrase.push_back(id); @@ -274,4 +274,4 @@ void Mention::ComputeHead() { if (!ContainsIndex(sentence_->GetHead(i))) head_index_ = i; } if (head_index_ < 0) head_index_ = end_; -} +} diff --git a/src/entity_recognizer/EntityDictionary.cpp b/src/entity_recognizer/EntityDictionary.cpp index 443d5b3..1766d34 100644 --- a/src/entity_recognizer/EntityDictionary.cpp +++ b/src/entity_recognizer/EntityDictionary.cpp @@ -1,428 +1,428 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "EntityDictionary.h" -#include "EntityOptions.h" -#include "EntityPipe.h" -#include -#include - -void EntityDictionary::CreateTagDictionary(SequenceReader *reader) { - SequenceDictionary::CreateTagDictionary(reader); - - // TODO: the SplitEntityTag function should probably be elsewhere and not on - // EntityInstance. - EntityInstance instance; - Alphabet entities; - - // Display information about the entity tags. - LOG(INFO) << "Found " << tag_alphabet_.size() << " entity tags:"; - for (Alphabet::iterator it = tag_alphabet_.begin(); - it != tag_alphabet_.end(); ++it) { - std::string entity_tag = it->first; - LOG(INFO) << entity_tag; - - std::string prefix, entity; - instance.SplitEntityTag(it->first, &prefix, &entity); - if (entity != "") entities.Insert(entity); - } - - LOG(INFO) << "Entities:"; - for (Alphabet::iterator it = entities.begin(); it != entities.end(); ++it) { - LOG(INFO) << it->first; - } - - LOG(INFO) << "Computing allowed bigrams..."; - // Every bigram is allowed by default. - allowed_bigrams_.assign(1 + tag_alphabet_.size(), - std::vector(1 + tag_alphabet_.size(), true)); - // Now add the BIO-like constraints. - for (Alphabet::iterator it = entities.begin(); it != entities.end(); ++it) { - std::string entity = it->first; - LOG(INFO) << "Processing entity " << entity << "..."; - if (static_cast(pipe_)->GetEntityOptions()->tagging_scheme() == - EntityTaggingSchemes::BIO) { - int tag_begin = tag_alphabet_.Lookup("B-" + entity); - int tag_inside = tag_alphabet_.Lookup("I-" + entity); - if (tag_inside < 0) continue; - // An I-tag can only occur after a B-tag or another I-tag of the same - // entity. - for (int left_tag = -1; left_tag < tag_alphabet_.size(); ++left_tag) { - if (left_tag != tag_begin && left_tag != tag_inside) { - allowed_bigrams_[1 + tag_inside][1 + left_tag] = false; - } - } - } else if (static_cast(pipe_)->GetEntityOptions()-> - tagging_scheme() == EntityTaggingSchemes::BILOU) { - int tag_begin = tag_alphabet_.Lookup("B-" + entity); - int tag_inside = tag_alphabet_.Lookup("I-" + entity); - int tag_last = tag_alphabet_.Lookup("L-" + entity); - // I-tags and L-tags can only occur after a B-tag or an I-tag of the same - // entity. - for (int left_tag = -1; left_tag < tag_alphabet_.size(); ++left_tag) { - if (left_tag != tag_begin && left_tag != tag_inside) { - if (tag_inside >= 0) { - allowed_bigrams_[1 + tag_inside][1 + left_tag] = false; - } - if (tag_last >= 0) { - allowed_bigrams_[1 + tag_last][1 + left_tag] = false; - } - } - } - // I-tags and B-tags can only occur before an I-tag or an L-tag of the - // same entity. - for (int right_tag = -1; right_tag < tag_alphabet_.size(); ++right_tag) { - if (right_tag != tag_last && right_tag != tag_inside) { - if (tag_inside >= 0) { - allowed_bigrams_[1 + right_tag][1 + tag_inside] = false; - } - if (tag_begin >= 0) { - allowed_bigrams_[1 + right_tag][1 + tag_begin] = false; - } - } - } - } - } - - tag_alphabet_.BuildNames(); // Just to be able to plot readable information... - int num_allowed_bigrams = 0; - for (int tag = -1; tag < tag_alphabet_.size(); ++tag) { - for (int left_tag = -1; left_tag < tag_alphabet_.size(); ++left_tag) { - if (IsAllowedBigram(left_tag, tag)) { - std::string left_tag_name = (left_tag >= 0) ? - tag_alphabet_.GetName(left_tag) : "START"; - std::string tag_name = (tag >= 0) ? - tag_alphabet_.GetName(tag) : "STOP"; - - LOG(INFO) << "Allowed bigram: " - << left_tag_name - << " -> " - << tag_name; - - ++num_allowed_bigrams; - } - } - } - - LOG(INFO) << "Total allowed bigrams: " << num_allowed_bigrams; - - ReadGazetteerFiles(); -} - -void EntityDictionary::ReadGazetteerFiles() { - EntityOptions *options = - static_cast(pipe_->GetOptions()); - gazetteer_case_sensitive_ = options->gazetteer_case_sensitive(); - - gazetteer_word_alphabet_.AllowGrowth(); - gazetteer_entity_tag_alphabet_.AllowGrowth(); - - if (options->file_gazetteer() != "") { - LOG(INFO) << "Loading gazetteer file " - << options->file_gazetteer() << "..."; - std::ifstream is; - std::string line; - - // Do a first pass just to count the words and create the - // dictionaries. - is.open(options->file_gazetteer().c_str(), ifstream::in); - CHECK(is.good()) << "Could not open " - << options->file_gazetteer() << "."; - if (is.is_open()) { - while (!is.eof()) { - getline(is, line); - if (line == "") continue; // Ignore blank lines. - std::vector fields; - StringSplit(line, " \t", &fields, true); // Break on tabs or spaces. - if (fields.size() < 2) continue; - const std::string &entity_type = fields[0]; - gazetteer_entity_tag_alphabet_.Insert("B-" + entity_type); - gazetteer_entity_tag_alphabet_.Insert("I-" + entity_type); - gazetteer_entity_tag_alphabet_.Insert("L-" + entity_type); - gazetteer_entity_tag_alphabet_.Insert("U-" + entity_type); - for (int k = 1; k < fields.size(); ++k) { - if (!gazetteer_case_sensitive_) { - transform(fields[k].begin(), fields[k].end(), - fields[k].begin(), ::tolower); - } - const std::string &word = fields[k]; - gazetteer_word_alphabet_.Insert(word); - } - } - } - is.close(); - - // Now do the second pass to actually fill in the data. - gazetteer_word_entity_tags_.clear(); - gazetteer_word_entity_tags_.resize(gazetteer_word_alphabet_.size()); - is.open(options->file_gazetteer().c_str(), ifstream::in); - CHECK(is.good()) << "Could not open " - << options->file_gazetteer() << "."; - if (is.is_open()) { - while (!is.eof()) { - getline(is, line); - if (line == "") continue; // Ignore blank lines. - std::vector fields; - StringSplit(line, " \t", &fields, true); // Break on tabs or spaces. - if (fields.size() < 2) continue; - const std::string &entity_type = fields[0]; - int entity_type_begin_id = - gazetteer_entity_tag_alphabet_.Lookup("B-" + entity_type); - int entity_type_inside_id = - gazetteer_entity_tag_alphabet_.Lookup("I-" + entity_type); - int entity_type_last_id = - gazetteer_entity_tag_alphabet_.Lookup("L-" + entity_type); - int entity_type_unique_id = - gazetteer_entity_tag_alphabet_.Lookup("U-" + entity_type); - for (int k = 1; k < fields.size(); ++k) { - if (!gazetteer_case_sensitive_) { - transform(fields[k].begin(), fields[k].end(), - fields[k].begin(), ::tolower); - } - const std::string &word = fields[k]; - int word_id = gazetteer_word_alphabet_.Lookup(word); - CHECK_GE(word_id, 0); - CHECK_LT(word_id, gazetteer_word_entity_tags_.size()); - int entity_type_id = -1; - if (fields.size() == 2) { - entity_type_id = entity_type_unique_id; - } else if (k == 1) { - entity_type_id = entity_type_begin_id; - } else if (k == fields.size() - 1) { - entity_type_id = entity_type_last_id; - } else { - entity_type_id = entity_type_inside_id; - } - int l = -1; - for (l = 0; l < gazetteer_word_entity_tags_[word_id].size(); ++l) { - if (gazetteer_word_entity_tags_[word_id][l] == entity_type_id) { - break; - } - } - if (l == gazetteer_word_entity_tags_[word_id].size()) { - gazetteer_word_entity_tags_[word_id]. - push_back(entity_type_id); - } - } - } - } - is.close(); - } - - gazetteer_word_alphabet_.StopGrowth(); - gazetteer_entity_tag_alphabet_.StopGrowth(); - LOG(INFO) << "Number of gazetteer words: " - << gazetteer_word_alphabet_.size(); - LOG(INFO) << "Number of gazetteer entity tags: " - << gazetteer_entity_tag_alphabet_.size(); -} - -void EntityTokenDictionary::Initialize(EntityReader *reader) { - SetTokenDictionaryFlagValues(); - LOG(INFO) << "Creating token dictionary..."; - - std::vector form_freqs; - std::vector form_lower_freqs; - std::vector shape_freqs; - std::vector pos_freqs; - Alphabet form_alphabet; - Alphabet form_lower_alphabet; - Alphabet shape_alphabet; - Alphabet pos_alphabet; - - std::string special_symbols[NUM_SPECIAL_TOKENS]; - special_symbols[TOKEN_UNKNOWN] = kTokenUnknown; - special_symbols[TOKEN_START] = kTokenStart; - special_symbols[TOKEN_STOP] = kTokenStop; - - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - prefix_alphabet_.Insert(special_symbols[i]); - suffix_alphabet_.Insert(special_symbols[i]); - form_alphabet.Insert(special_symbols[i]); - form_lower_alphabet.Insert(special_symbols[i]); - shape_alphabet.Insert(special_symbols[i]); - pos_alphabet.Insert(special_symbols[i]); - - // Counts of special symbols are set to -1: - form_freqs.push_back(-1); - form_lower_freqs.push_back(-1); - shape_freqs.push_back(-1); - pos_freqs.push_back(-1); - } - - // Go through the corpus and build the dictionaries, - // counting the frequencies. - reader->Open(pipe_->GetOptions()->GetTrainingFilePath()); - EntityInstance *instance = - static_cast(reader->GetNext()); - while (instance != NULL) { - int instance_length = instance->size(); - for (int i = 0; i < instance_length; ++i) { - int id; - - // Add form to alphabet. - std::string form = instance->GetForm(i); - std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), - form_lower.begin(), ::tolower); - if (!form_case_sensitive) form = form_lower; - id = form_alphabet.Insert(form); - if (id >= form_freqs.size()) { - CHECK_EQ(id, form_freqs.size()); - form_freqs.push_back(0); - } - ++form_freqs[id]; - - // Add lower-case form to the alphabet. - id = form_lower_alphabet.Insert(form_lower); - if (id >= form_lower_freqs.size()) { - CHECK_EQ(id, form_lower_freqs.size()); - form_lower_freqs.push_back(0); - } - ++form_lower_freqs[id]; - - // Add prefix/suffix to alphabet. - std::string prefix = form.substr(0, prefix_length); - id = prefix_alphabet_.Insert(prefix); - int start = form.length() - suffix_length; - if (start < 0) start = 0; - std::string suffix = form.substr(start, suffix_length); - id = suffix_alphabet_.Insert(suffix); - - // Add shape to alphabet. - std::string shape; - GetWordShape(instance->GetForm(i), &shape); - id = shape_alphabet.Insert(shape); - if (id >= shape_freqs.size()) { - CHECK_EQ(id, shape_freqs.size()); - shape_freqs.push_back(0); - } - ++shape_freqs[id]; - - // Add POS to alphabet. - id = pos_alphabet.Insert(instance->GetPosTag(i)); - if (id >= pos_freqs.size()) { - CHECK_EQ(id, pos_freqs.size()); - pos_freqs.push_back(0); - } - ++pos_freqs[id]; - } - delete instance; - instance = static_cast(reader->GetNext()); - } - reader->Close(); - - // Now adjust the cutoffs if necessary. - while (true) { - form_alphabet_.clear(); - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - form_alphabet_.Insert(special_symbols[i]); - } - for (Alphabet::iterator iter = form_alphabet.begin(); - iter != form_alphabet.end(); - ++iter) { - if (form_freqs[iter->second] > form_cutoff) { - form_alphabet_.Insert(iter->first); - } - } - if (form_alphabet_.size() < kMaxFormAlphabetSize) break; - ++form_cutoff; - LOG(INFO) << "Incrementing form cutoff to " << form_cutoff << "..."; - } - - while (true) { - form_lower_alphabet_.clear(); - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - form_lower_alphabet_.Insert(special_symbols[i]); - } - for (Alphabet::iterator iter = form_lower_alphabet.begin(); - iter != form_lower_alphabet.end(); - ++iter) { - if (form_lower_freqs[iter->second] > form_lower_cutoff) { - form_lower_alphabet_.Insert(iter->first); - } - } - if (form_lower_alphabet_.size() < kMaxFormAlphabetSize) break; - ++form_lower_cutoff; - LOG(INFO) << "Incrementing lower-case form cutoff to " - << form_lower_cutoff << "..."; - } - - while (true) { - shape_alphabet_.clear(); - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - shape_alphabet_.Insert(special_symbols[i]); - } - for (Alphabet::iterator iter = shape_alphabet.begin(); - iter != shape_alphabet.end(); - ++iter) { - if (shape_freqs[iter->second] > shape_cutoff) { - shape_alphabet_.Insert(iter->first); - } - } - if (shape_alphabet_.size() < kMaxShapeAlphabetSize) break; - ++shape_cutoff; - LOG(INFO) << "Incrementing shape cutoff to " << shape_cutoff << "..."; - } - - while (true) { - pos_alphabet_.clear(); - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - pos_alphabet_.Insert(special_symbols[i]); - } - for (const auto& pos_token : pos_alphabet) { - if (pos_freqs[pos_token.second] > pos_cutoff) { - pos_alphabet_.Insert(pos_token.first); - } - } - if (pos_alphabet_.size() < kMaxPosAlphabetSize) break; - ++pos_cutoff; - LOG(INFO) << "Incrementing POS cutoff to " << pos_cutoff << "..."; - } - - form_alphabet_.StopGrowth(); - form_lower_alphabet_.StopGrowth(); - shape_alphabet_.StopGrowth(); - lemma_alphabet_.StopGrowth(); - prefix_alphabet_.StopGrowth(); - suffix_alphabet_.StopGrowth(); - feats_alphabet_.StopGrowth(); - pos_alphabet_.StopGrowth(); - cpos_alphabet_.StopGrowth(); - - LOG(INFO) << "Number of forms: " << form_alphabet_.size() << endl - << "Number of lower-case forms: " << form_lower_alphabet_.size() << endl - << "Number of prefixes: " << prefix_alphabet_.size() << endl - << "Number of suffixes: " << suffix_alphabet_.size() << endl - << "Number of word shapes: " << shape_alphabet_.size() << endl - << "Number of pos: " << pos_alphabet_.size(); - - CHECK_LT(form_alphabet_.size(), 0xffff); - CHECK_LT(form_lower_alphabet_.size(), 0xffff); - CHECK_LT(shape_alphabet_.size(), 0xffff); - CHECK_LT(lemma_alphabet_.size(), 0xffff); - CHECK_LT(prefix_alphabet_.size(), 0xffff); - CHECK_LT(suffix_alphabet_.size(), 0xffff); - CHECK_LT(feats_alphabet_.size(), 0xffff); - CHECK_LT(pos_alphabet_.size(), 0xff); - CHECK_LT(cpos_alphabet_.size(), 0xff); - -#ifndef NDEBUG - BuildNames(); -#endif +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "EntityDictionary.h" +#include "EntityOptions.h" +#include "EntityPipe.h" +#include +#include + +void EntityDictionary::CreateTagDictionary(SequenceReader *reader) { + SequenceDictionary::CreateTagDictionary(reader); + + // TODO: the SplitEntityTag function should probably be elsewhere and not on + // EntityInstance. + EntityInstance instance; + Alphabet entities; + + // Display information about the entity tags. + LOG(INFO) << "Found " << tag_alphabet_.size() << " entity tags:"; + for (Alphabet::iterator it = tag_alphabet_.begin(); + it != tag_alphabet_.end(); ++it) { + std::string entity_tag = it->first; + LOG(INFO) << entity_tag; + + std::string prefix, entity; + instance.SplitEntityTag(it->first, &prefix, &entity); + if (entity != "") entities.Insert(entity); + } + + LOG(INFO) << "Entities:"; + for (Alphabet::iterator it = entities.begin(); it != entities.end(); ++it) { + LOG(INFO) << it->first; + } + + LOG(INFO) << "Computing allowed bigrams..."; + // Every bigram is allowed by default. + allowed_bigrams_.assign(1 + tag_alphabet_.size(), + std::vector(1 + tag_alphabet_.size(), true)); + // Now add the BIO-like constraints. + for (Alphabet::iterator it = entities.begin(); it != entities.end(); ++it) { + std::string entity = it->first; + LOG(INFO) << "Processing entity " << entity << "..."; + if (static_cast(pipe_)->GetEntityOptions()->tagging_scheme() == + EntityTaggingSchemes::BIO) { + int tag_begin = tag_alphabet_.Lookup("B-" + entity); + int tag_inside = tag_alphabet_.Lookup("I-" + entity); + if (tag_inside < 0) continue; + // An I-tag can only occur after a B-tag or another I-tag of the same + // entity. + for (int left_tag = -1; left_tag < tag_alphabet_.size(); ++left_tag) { + if (left_tag != tag_begin && left_tag != tag_inside) { + allowed_bigrams_[1 + tag_inside][1 + left_tag] = false; + } + } + } else if (static_cast(pipe_)->GetEntityOptions()-> + tagging_scheme() == EntityTaggingSchemes::BILOU) { + int tag_begin = tag_alphabet_.Lookup("B-" + entity); + int tag_inside = tag_alphabet_.Lookup("I-" + entity); + int tag_last = tag_alphabet_.Lookup("L-" + entity); + // I-tags and L-tags can only occur after a B-tag or an I-tag of the same + // entity. + for (int left_tag = -1; left_tag < tag_alphabet_.size(); ++left_tag) { + if (left_tag != tag_begin && left_tag != tag_inside) { + if (tag_inside >= 0) { + allowed_bigrams_[1 + tag_inside][1 + left_tag] = false; + } + if (tag_last >= 0) { + allowed_bigrams_[1 + tag_last][1 + left_tag] = false; + } + } + } + // I-tags and B-tags can only occur before an I-tag or an L-tag of the + // same entity. + for (int right_tag = -1; right_tag < tag_alphabet_.size(); ++right_tag) { + if (right_tag != tag_last && right_tag != tag_inside) { + if (tag_inside >= 0) { + allowed_bigrams_[1 + right_tag][1 + tag_inside] = false; + } + if (tag_begin >= 0) { + allowed_bigrams_[1 + right_tag][1 + tag_begin] = false; + } + } + } + } + } + + tag_alphabet_.BuildNames(); // Just to be able to plot readable information... + int num_allowed_bigrams = 0; + for (int tag = -1; tag < tag_alphabet_.size(); ++tag) { + for (int left_tag = -1; left_tag < tag_alphabet_.size(); ++left_tag) { + if (IsAllowedBigram(left_tag, tag)) { + std::string left_tag_name = (left_tag >= 0) ? + tag_alphabet_.GetName(left_tag) : "START"; + std::string tag_name = (tag >= 0) ? + tag_alphabet_.GetName(tag) : "STOP"; + + LOG(INFO) << "Allowed bigram: " + << left_tag_name + << " -> " + << tag_name; + + ++num_allowed_bigrams; + } + } + } + + LOG(INFO) << "Total allowed bigrams: " << num_allowed_bigrams; + + ReadGazetteerFiles(); +} + +void EntityDictionary::ReadGazetteerFiles() { + EntityOptions *options = + static_cast(pipe_->GetOptions()); + gazetteer_case_sensitive_ = options->gazetteer_case_sensitive(); + + gazetteer_word_alphabet_.AllowGrowth(); + gazetteer_entity_tag_alphabet_.AllowGrowth(); + + if (options->file_gazetteer() != "") { + LOG(INFO) << "Loading gazetteer file " + << options->file_gazetteer() << "..."; + std::ifstream is; + std::string line; + + // Do a first pass just to count the words and create the + // dictionaries. + is.open(options->file_gazetteer().c_str(), ifstream::in); + CHECK(is.good()) << "Could not open " + << options->file_gazetteer() << "."; + if (is.is_open()) { + while (!is.eof()) { + getline(is, line); + if (line == "") continue; // Ignore blank lines. + std::vector fields; + StringSplit(line, " \t", &fields, true); // Break on tabs or spaces. + if (fields.size() < 2) continue; + const std::string &entity_type = fields[0]; + gazetteer_entity_tag_alphabet_.Insert("B-" + entity_type); + gazetteer_entity_tag_alphabet_.Insert("I-" + entity_type); + gazetteer_entity_tag_alphabet_.Insert("L-" + entity_type); + gazetteer_entity_tag_alphabet_.Insert("U-" + entity_type); + for (int k = 1; k < fields.size(); ++k) { + if (!gazetteer_case_sensitive_) { + std::transform(fields[k].begin(), fields[k].end(), + fields[k].begin(), ::tolower); + } + const std::string &word = fields[k]; + gazetteer_word_alphabet_.Insert(word); + } + } + } + is.close(); + + // Now do the second pass to actually fill in the data. + gazetteer_word_entity_tags_.clear(); + gazetteer_word_entity_tags_.resize(gazetteer_word_alphabet_.size()); + is.open(options->file_gazetteer().c_str(), ifstream::in); + CHECK(is.good()) << "Could not open " + << options->file_gazetteer() << "."; + if (is.is_open()) { + while (!is.eof()) { + getline(is, line); + if (line == "") continue; // Ignore blank lines. + std::vector fields; + StringSplit(line, " \t", &fields, true); // Break on tabs or spaces. + if (fields.size() < 2) continue; + const std::string &entity_type = fields[0]; + int entity_type_begin_id = + gazetteer_entity_tag_alphabet_.Lookup("B-" + entity_type); + int entity_type_inside_id = + gazetteer_entity_tag_alphabet_.Lookup("I-" + entity_type); + int entity_type_last_id = + gazetteer_entity_tag_alphabet_.Lookup("L-" + entity_type); + int entity_type_unique_id = + gazetteer_entity_tag_alphabet_.Lookup("U-" + entity_type); + for (int k = 1; k < fields.size(); ++k) { + if (!gazetteer_case_sensitive_) { + std::transform(fields[k].begin(), fields[k].end(), + fields[k].begin(), ::tolower); + } + const std::string &word = fields[k]; + int word_id = gazetteer_word_alphabet_.Lookup(word); + CHECK_GE(word_id, 0); + CHECK_LT(word_id, gazetteer_word_entity_tags_.size()); + int entity_type_id = -1; + if (fields.size() == 2) { + entity_type_id = entity_type_unique_id; + } else if (k == 1) { + entity_type_id = entity_type_begin_id; + } else if (k == fields.size() - 1) { + entity_type_id = entity_type_last_id; + } else { + entity_type_id = entity_type_inside_id; + } + int l = -1; + for (l = 0; l < gazetteer_word_entity_tags_[word_id].size(); ++l) { + if (gazetteer_word_entity_tags_[word_id][l] == entity_type_id) { + break; + } + } + if (l == gazetteer_word_entity_tags_[word_id].size()) { + gazetteer_word_entity_tags_[word_id]. + push_back(entity_type_id); + } + } + } + } + is.close(); + } + + gazetteer_word_alphabet_.StopGrowth(); + gazetteer_entity_tag_alphabet_.StopGrowth(); + LOG(INFO) << "Number of gazetteer words: " + << gazetteer_word_alphabet_.size(); + LOG(INFO) << "Number of gazetteer entity tags: " + << gazetteer_entity_tag_alphabet_.size(); +} + +void EntityTokenDictionary::Initialize(EntityReader *reader) { + SetTokenDictionaryFlagValues(); + LOG(INFO) << "Creating token dictionary..."; + + std::vector form_freqs; + std::vector form_lower_freqs; + std::vector shape_freqs; + std::vector pos_freqs; + Alphabet form_alphabet; + Alphabet form_lower_alphabet; + Alphabet shape_alphabet; + Alphabet pos_alphabet; + + std::string special_symbols[NUM_SPECIAL_TOKENS]; + special_symbols[TOKEN_UNKNOWN] = kTokenUnknown; + special_symbols[TOKEN_START] = kTokenStart; + special_symbols[TOKEN_STOP] = kTokenStop; + + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + prefix_alphabet_.Insert(special_symbols[i]); + suffix_alphabet_.Insert(special_symbols[i]); + form_alphabet.Insert(special_symbols[i]); + form_lower_alphabet.Insert(special_symbols[i]); + shape_alphabet.Insert(special_symbols[i]); + pos_alphabet.Insert(special_symbols[i]); + + // Counts of special symbols are set to -1: + form_freqs.push_back(-1); + form_lower_freqs.push_back(-1); + shape_freqs.push_back(-1); + pos_freqs.push_back(-1); + } + + // Go through the corpus and build the dictionaries, + // counting the frequencies. + reader->Open(pipe_->GetOptions()->GetTrainingFilePath()); + EntityInstance *instance = + static_cast(reader->GetNext()); + while (instance != NULL) { + int instance_length = instance->size(); + for (int i = 0; i < instance_length; ++i) { + int id; + + // Add form to alphabet. + std::string form = instance->GetForm(i); + std::string form_lower(form); + std::transform(form_lower.begin(), form_lower.end(), + form_lower.begin(), ::tolower); + if (!form_case_sensitive) form = form_lower; + id = form_alphabet.Insert(form); + if (id >= form_freqs.size()) { + CHECK_EQ(id, form_freqs.size()); + form_freqs.push_back(0); + } + ++form_freqs[id]; + + // Add lower-case form to the alphabet. + id = form_lower_alphabet.Insert(form_lower); + if (id >= form_lower_freqs.size()) { + CHECK_EQ(id, form_lower_freqs.size()); + form_lower_freqs.push_back(0); + } + ++form_lower_freqs[id]; + + // Add prefix/suffix to alphabet. + std::string prefix = form.substr(0, prefix_length); + id = prefix_alphabet_.Insert(prefix); + int start = form.length() - suffix_length; + if (start < 0) start = 0; + std::string suffix = form.substr(start, suffix_length); + id = suffix_alphabet_.Insert(suffix); + + // Add shape to alphabet. + std::string shape; + GetWordShape(instance->GetForm(i), &shape); + id = shape_alphabet.Insert(shape); + if (id >= shape_freqs.size()) { + CHECK_EQ(id, shape_freqs.size()); + shape_freqs.push_back(0); + } + ++shape_freqs[id]; + + // Add POS to alphabet. + id = pos_alphabet.Insert(instance->GetPosTag(i)); + if (id >= pos_freqs.size()) { + CHECK_EQ(id, pos_freqs.size()); + pos_freqs.push_back(0); + } + ++pos_freqs[id]; + } + delete instance; + instance = static_cast(reader->GetNext()); + } + reader->Close(); + + // Now adjust the cutoffs if necessary. + while (true) { + form_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + form_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = form_alphabet.begin(); + iter != form_alphabet.end(); + ++iter) { + if (form_freqs[iter->second] > form_cutoff) { + form_alphabet_.Insert(iter->first); + } + } + if (form_alphabet_.size() < kMaxFormAlphabetSize) break; + ++form_cutoff; + LOG(INFO) << "Incrementing form cutoff to " << form_cutoff << "..."; + } + + while (true) { + form_lower_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + form_lower_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = form_lower_alphabet.begin(); + iter != form_lower_alphabet.end(); + ++iter) { + if (form_lower_freqs[iter->second] > form_lower_cutoff) { + form_lower_alphabet_.Insert(iter->first); + } + } + if (form_lower_alphabet_.size() < kMaxFormAlphabetSize) break; + ++form_lower_cutoff; + LOG(INFO) << "Incrementing lower-case form cutoff to " + << form_lower_cutoff << "..."; + } + + while (true) { + shape_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + shape_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = shape_alphabet.begin(); + iter != shape_alphabet.end(); + ++iter) { + if (shape_freqs[iter->second] > shape_cutoff) { + shape_alphabet_.Insert(iter->first); + } + } + if (shape_alphabet_.size() < kMaxShapeAlphabetSize) break; + ++shape_cutoff; + LOG(INFO) << "Incrementing shape cutoff to " << shape_cutoff << "..."; + } + + while (true) { + pos_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + pos_alphabet_.Insert(special_symbols[i]); + } + for (const auto& pos_token : pos_alphabet) { + if (pos_freqs[pos_token.second] > pos_cutoff) { + pos_alphabet_.Insert(pos_token.first); + } + } + if (pos_alphabet_.size() < kMaxPosAlphabetSize) break; + ++pos_cutoff; + LOG(INFO) << "Incrementing POS cutoff to " << pos_cutoff << "..."; + } + + form_alphabet_.StopGrowth(); + form_lower_alphabet_.StopGrowth(); + shape_alphabet_.StopGrowth(); + lemma_alphabet_.StopGrowth(); + prefix_alphabet_.StopGrowth(); + suffix_alphabet_.StopGrowth(); + feats_alphabet_.StopGrowth(); + pos_alphabet_.StopGrowth(); + cpos_alphabet_.StopGrowth(); + + LOG(INFO) << "Number of forms: " << form_alphabet_.size() << endl + << "Number of lower-case forms: " << form_lower_alphabet_.size() << endl + << "Number of prefixes: " << prefix_alphabet_.size() << endl + << "Number of suffixes: " << suffix_alphabet_.size() << endl + << "Number of word shapes: " << shape_alphabet_.size() << endl + << "Number of pos: " << pos_alphabet_.size(); + + CHECK_LT(form_alphabet_.size(), 0xffff); + CHECK_LT(form_lower_alphabet_.size(), 0xffff); + CHECK_LT(shape_alphabet_.size(), 0xffff); + CHECK_LT(lemma_alphabet_.size(), 0xffff); + CHECK_LT(prefix_alphabet_.size(), 0xffff); + CHECK_LT(suffix_alphabet_.size(), 0xffff); + CHECK_LT(feats_alphabet_.size(), 0xffff); + CHECK_LT(pos_alphabet_.size(), 0xff); + CHECK_LT(cpos_alphabet_.size(), 0xff); + +#ifndef NDEBUG + BuildNames(); +#endif } diff --git a/src/entity_recognizer/EntityInstanceNumeric.cpp b/src/entity_recognizer/EntityInstanceNumeric.cpp index b006d1c..d2cc9c4 100644 --- a/src/entity_recognizer/EntityInstanceNumeric.cpp +++ b/src/entity_recognizer/EntityInstanceNumeric.cpp @@ -40,10 +40,10 @@ void EntityInstanceNumeric::Initialize(const EntityDictionary &dictionary, // Uncomment next 'if's to allow different-case occurences // to map to the same entry. if (!dictionary.gazetteer_case_sensitive()) { - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); } dictionary.GetWordGazetteerIds(form, &gazetteer_ids_[i]); //LOG(INFO) << instance->GetForm(i) << ": " << gazetteer_ids_[i].size(); } -} +} diff --git a/src/morphological_tagger/MorphologicalDictionary.cpp b/src/morphological_tagger/MorphologicalDictionary.cpp index 55d33ed..d0e9f13 100644 --- a/src/morphological_tagger/MorphologicalDictionary.cpp +++ b/src/morphological_tagger/MorphologicalDictionary.cpp @@ -125,8 +125,8 @@ void MorphologicalTokenDictionary::Initialize(MorphologicalReader *reader) { std::string form = instance->GetForm(i); int form_length = static_cast(form.length()); std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), - form_lower.begin(), ::tolower); + std::transform(form_lower.begin(), form_lower.end(), + form_lower.begin(), ::tolower); if (!form_case_sensitive) form = form_lower; id = form_alphabet.Insert(form); if (id >= form_freqs.size()) { @@ -337,4 +337,4 @@ void MorphologicalTokenDictionary::Initialize(MorphologicalReader *reader) { //CHECK_LT(feats_alphabet_.size(), 0xffff); CHECK_LT(pos_alphabet_.size(), 0xff); CHECK_LT(cpos_alphabet_.size(), 0xff); -} +} diff --git a/src/parser/DependencyDictionary.cpp b/src/parser/DependencyDictionary.cpp index 34bf507..390a70e 100644 --- a/src/parser/DependencyDictionary.cpp +++ b/src/parser/DependencyDictionary.cpp @@ -175,8 +175,8 @@ void DependencyTokenDictionary::Initialize(DependencyReader *reader) { // Add form to alphabet. std::string form = instance->GetForm(i); std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), - form_lower.begin(), ::tolower); + std::transform(form_lower.begin(), form_lower.end(), + form_lower.begin(), ::tolower); if (!form_case_sensitive) form = form_lower; id = form_alphabet.Insert(form); if (id >= form_freqs.size()) { @@ -375,4 +375,4 @@ void DependencyTokenDictionary::Initialize(DependencyReader *reader) { #ifndef NDEBUG BuildNames(); #endif -} +} diff --git a/src/parser/DependencyInstanceNumeric.cpp b/src/parser/DependencyInstanceNumeric.cpp index 770a4f6..cdab4e8 100644 --- a/src/parser/DependencyInstanceNumeric.cpp +++ b/src/parser/DependencyInstanceNumeric.cpp @@ -53,8 +53,8 @@ void DependencyInstanceNumeric::Initialize( for (i = 0; i < length; i++) { std::string form = instance->GetForm(i); std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), form_lower.begin(), - ::tolower); + std::transform(form_lower.begin(), form_lower.end(), form_lower.begin(), + ::tolower); if (!form_case_sensitive) form = form_lower; id = token_dictionary->GetFormId(form); CHECK_LT(id, 0xffff); @@ -143,4 +143,4 @@ void DependencyInstanceNumeric::Initialize( relations_[i] = dictionary.GetLabelAlphabet().Lookup( instance->GetDependencyRelation(i)); } -} +} diff --git a/src/sequence/SequenceInstanceNumeric.cpp b/src/sequence/SequenceInstanceNumeric.cpp index 6817424..13d2a45 100644 --- a/src/sequence/SequenceInstanceNumeric.cpp +++ b/src/sequence/SequenceInstanceNumeric.cpp @@ -52,7 +52,7 @@ void SequenceInstanceNumeric::Initialize(const SequenceDictionary &dictionary, for (i = 0; i < length; i++) { std::string form = instance->GetForm(i); if (!form_case_sensitive) { - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); } id = token_dictionary->GetFormId(form); CHECK_LT(id, 0xffff); @@ -120,4 +120,4 @@ bool SequenceInstanceNumeric::IsPunctuation(char c) { } return false; //return (c == '\'') || (c == '-') || (c == '&') || (c == '/'); -} +} diff --git a/src/sequence/TokenDictionary.cpp b/src/sequence/TokenDictionary.cpp index 5f6be4d..aa86241 100644 --- a/src/sequence/TokenDictionary.cpp +++ b/src/sequence/TokenDictionary.cpp @@ -141,8 +141,8 @@ void TokenDictionary::Initialize(SequenceReader *reader) { // Add form to alphabet. std::string form = instance->GetForm(i); std::string form_lower(form); - transform(form_lower.begin(), form_lower.end(), - form_lower.begin(), ::tolower); + std::transform(form_lower.begin(), form_lower.end(), + form_lower.begin(), ::tolower); if (!form_case_sensitive) form = form_lower; id = form_alphabet.Insert(form); if (id >= form_freqs.size()) { @@ -262,4 +262,4 @@ void TokenDictionary::Initialize(SequenceReader *reader) { CHECK_LT(feats_alphabet_.size(), 0xffff); CHECK_LT(pos_alphabet_.size(), 0xff); CHECK_LT(cpos_alphabet_.size(), 0xff); -} +} diff --git a/src/tagger/TaggerDictionary.cpp b/src/tagger/TaggerDictionary.cpp index b69a5b1..f4c163b 100644 --- a/src/tagger/TaggerDictionary.cpp +++ b/src/tagger/TaggerDictionary.cpp @@ -40,7 +40,7 @@ void TaggerDictionary::CreateTagDictionary(SequenceReader *reader) { int id; string form = instance->GetForm(i); if (!form_case_sensitive) { - transform(form.begin(), form.end(), form.begin(), ::tolower); + std::transform(form.begin(), form.end(), form.begin(), ::tolower); } int word_id = token_dictionary_->GetFormId(form); //CHECK_GE(word_id, 0); @@ -92,4 +92,4 @@ void TaggerDictionary::CreateTagDictionary(SequenceReader *reader) { } } LOG(INFO) << "Number of unknown word tags: " << unknown_word_tags_.size(); -} +} From cc4b11942c54c7b595906a10cd964fe97ee2de02 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 22 Mar 2016 11:40:03 +0000 Subject: [PATCH 10/51] Merge upstream with andre-martins/master. --- aclocal.m4 | 2298 +-- configure | 12782 ++++++++-------- libturboparser/Makefile | 552 +- libturboparser/TurboParserInterface.cpp | 774 +- libturboparser/TurboParserInterface.h | 450 +- .../train_test_morphological_tagger.sh | 190 +- python/nlp_document.py | 136 +- python/nlp_pipeline.config | 112 +- python/nlp_pipeline.py | 490 +- python/nlp_sentence.py | 258 +- python/nlp_utils.py | 130 +- python/setup.py | 26 +- python/span.py | 96 +- python/turbo_parser.pyx | 1068 +- .../ConstituencyDictionary.cpp | 362 +- .../TurboMorphologicalTagger.cpp | 172 +- src/sequence/SequenceReader.cpp | 122 +- 17 files changed, 10009 insertions(+), 10009 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 3a9a040..e60dd8d 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,1149 +1,1149 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. - -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. -You have another version of autoconf. It may work, but is not guaranteed to. -If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) - -# Copyright (C) 2002-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. -m4_define([AC_PROG_CC], -m4_defn([AC_PROG_CC]) -[_AM_PROG_CC_C_O -]) - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.65])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl -]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi]) - -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST([install_sh])]) - -# Copyright (C) 2003-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it is modern enough. -# If it is, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) -fi -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# -------------------- -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) - -# _AM_SET_OPTIONS(OPTIONS) -# ------------------------ -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Copyright (C) 1999-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_CC_C_O -# --------------- -# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC -# to automatically call this. -AC_DEFUN([_AM_PROG_CC_C_O], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) - -# For backward compatibility. -AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_RUN_LOG(COMMAND) -# ------------------- -# Run COMMAND, save the exit status in ac_status, and log it. -# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) -AC_DEFUN([AM_RUN_LOG], -[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) - -# Copyright (C) 2009-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) - -# Copyright (C) 2001-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor 'install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004-2013 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -# -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - -m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], - - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done - rm -rf conftest.dir - - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.14' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.14.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.14.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/configure b/configure index d4e579d..797ecb7 100755 --- a/configure +++ b/configure @@ -1,6391 +1,6391 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for TurboParser 2.3.0. -# -# Report bugs to . -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and afm@cs.cmu.edu -$0: about your system, including any error possibly output -$0: before this message. Then install a modern shell, or -$0: manually run the script under such a shell if you do -$0: have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='TurboParser' -PACKAGE_TARNAME='TurboParser' -PACKAGE_VERSION='2.3.0' -PACKAGE_STRING='TurboParser 2.3.0' -PACKAGE_BUGREPORT='afm@cs.cmu.edu' -PACKAGE_URL='http://www.ark.cs.cmu.edu/TurboParser/' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -EGREP -GREP -CPP -DEBUG_FALSE -DEBUG_TRUE -LFLAGS -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -ac_ct_CC -CFLAGS -CC -am__fastdepCXX_FALSE -am__fastdepCXX_TRUE -CXXDEPMODE -am__nodep -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CXX -CPPFLAGS -LDFLAGS -CXXFLAGS -CXX -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_silent_rules -enable_dependency_tracking -enable_debug -' - ac_precious_vars='build_alias -host_alias -target_alias -CXX -CXXFLAGS -LDFLAGS -LIBS -CPPFLAGS -CCC -CC -CFLAGS -CPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures TurboParser 2.3.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/TurboParser] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of TurboParser 2.3.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-debug enable debugging, default: no - -Some influential environment variables: - CXX C++ compiler command - CXXFLAGS C++ compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CC C compiler command - CFLAGS C compiler flags - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -TurboParser home page: . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -TurboParser configure 2.3.0 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ----------------------------- ## -## Report this to afm@cs.cmu.edu ## -## ----------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by TurboParser $as_me 2.3.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -am__api_version='1.14' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac - -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='TurboParser' - VERSION='2.3.0' - - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' - - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' - - - - - - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi -ac_config_headers="$ac_config_headers config.h" - - -# Checks for programs. -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C++ compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -depcc="$CXX" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - -AUX_LIBS=../../deps/local/lib -AUX_INCLUDES=../../deps/local/include -LFLAGS="-L${AUX_LIBS} -lad3 -lgflags -lglog" -CPPFLAGS="-I${AUX_INCLUDES} -I${INCLUDES}/ad3" - - - -# Check for c++0x compile flag. - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -std=c++0x" >&5 -$as_echo_n "checking whether C compiler accepts -std=c++0x... " >&6; } -if ${ax_cv_check_cflags___std_cpp0x+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -std=c++0x" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags___std_cpp0x=yes -else - ax_cv_check_cflags___std_cpp0x=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___std_cpp0x" >&5 -$as_echo "$ax_cv_check_cflags___std_cpp0x" >&6; } -if test x"$ax_cv_check_cflags___std_cpp0x" = xyes; then : - CXXFLAGS="$CXXFLAGS -std=c++0x" -else - : -fi - - -# Macros -# This will make ILOG use STL libs -#AC_DEFINE([IL_STD], [], [This is necessary to make ILOG use STL libs]) - -############################################ -# Temporary solution to enable debug builds. -# See: http://stackoverflow.com/questions/4553735/gnu-autotools-debug-release-targets -############################################ -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; case "${enableval}" in - yes) debug=true ;; - no) debug=false ;; - *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; -esac -else - debug=false -fi - - - if test x"$debug" = x"true"; then - DEBUG_TRUE= - DEBUG_FALSE='#' -else - DEBUG_TRUE='#' - DEBUG_FALSE= -fi - -############################################ - - - - -# Checks for header files. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in stddef.h string.h sys/time.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 -$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } -if ${ac_cv_header_stdbool_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include - #ifndef bool - "error: bool is not defined" - #endif - #ifndef false - "error: false is not defined" - #endif - #if false - "error: false is not 0" - #endif - #ifndef true - "error: true is not defined" - #endif - #if true != 1 - "error: true is not 1" - #endif - #ifndef __bool_true_false_are_defined - "error: __bool_true_false_are_defined is not defined" - #endif - - struct s { _Bool s: 1; _Bool t; } s; - - char a[true == 1 ? 1 : -1]; - char b[false == 0 ? 1 : -1]; - char c[__bool_true_false_are_defined == 1 ? 1 : -1]; - char d[(bool) 0.5 == true ? 1 : -1]; - /* See body of main program for 'e'. */ - char f[(_Bool) 0.0 == false ? 1 : -1]; - char g[true]; - char h[sizeof (_Bool)]; - char i[sizeof s.t]; - enum { j = false, k = true, l = false * true, m = true * 256 }; - /* The following fails for - HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ - _Bool n[m]; - char o[sizeof n == m * sizeof n[0] ? 1 : -1]; - char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; - /* Catch a bug in an HP-UX C compiler. See - http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html - http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html - */ - _Bool q = true; - _Bool *pq = &q; - -int -main () -{ - - bool e = &s; - *pq |= q; - *pq |= ! q; - /* Refer to every declared value, to avoid compiler optimizations. */ - return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l - + !m + !n + !o + !p + !q + !pq); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdbool_h=yes -else - ac_cv_header_stdbool_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 -$as_echo "$ac_cv_header_stdbool_h" >&6; } - ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" -if test "x$ac_cv_type__Bool" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE__BOOL 1 -_ACEOF - - -fi - - -if test $ac_cv_header_stdbool_h = yes; then - -$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - - -# Checks for library functions. -for ac_func in gettimeofday -do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files Makefile src/tagger/Makefile src/parser/Makefile src/semantic_parser/Makefile src/entity_recognizer/Makefile src/coreference_resolver/Makefile src/dependency_labeler/Makefile src/constituency_labeler/Makefile src/morphological_tagger/Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then - as_fn_error $? "conditional \"DEBUG\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by TurboParser $as_me 2.3.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to . -TurboParser home page: ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -TurboParser config.status 2.3.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "src/tagger/Makefile") CONFIG_FILES="$CONFIG_FILES src/tagger/Makefile" ;; - "src/parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/parser/Makefile" ;; - "src/semantic_parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/semantic_parser/Makefile" ;; - "src/entity_recognizer/Makefile") CONFIG_FILES="$CONFIG_FILES src/entity_recognizer/Makefile" ;; - "src/coreference_resolver/Makefile") CONFIG_FILES="$CONFIG_FILES src/coreference_resolver/Makefile" ;; - "src/dependency_labeler/Makefile") CONFIG_FILES="$CONFIG_FILES src/dependency_labeler/Makefile" ;; - "src/constituency_labeler/Makefile") CONFIG_FILES="$CONFIG_FILES src/constituency_labeler/Makefile" ;; - "src/morphological_tagger/Makefile") CONFIG_FILES="$CONFIG_FILES src/morphological_tagger/Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for TurboParser 2.3.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and afm@cs.cmu.edu +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='TurboParser' +PACKAGE_TARNAME='TurboParser' +PACKAGE_VERSION='2.3.0' +PACKAGE_STRING='TurboParser 2.3.0' +PACKAGE_BUGREPORT='afm@cs.cmu.edu' +PACKAGE_URL='http://www.ark.cs.cmu.edu/TurboParser/' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +EGREP +GREP +CPP +DEBUG_FALSE +DEBUG_TRUE +LFLAGS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +ac_ct_CC +CFLAGS +CC +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CXX +CPPFLAGS +LDFLAGS +CXXFLAGS +CXX +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_debug +' + ac_precious_vars='build_alias +host_alias +target_alias +CXX +CXXFLAGS +LDFLAGS +LIBS +CPPFLAGS +CCC +CC +CFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures TurboParser 2.3.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/TurboParser] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of TurboParser 2.3.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-debug enable debugging, default: no + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +TurboParser home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +TurboParser configure 2.3.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ----------------------------- ## +## Report this to afm@cs.cmu.edu ## +## ----------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by TurboParser $as_me 2.3.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.14' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='TurboParser' + VERSION='2.3.0' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C++ compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +AUX_LIBS=../../deps/local/lib +AUX_INCLUDES=../../deps/local/include +LFLAGS="-L${AUX_LIBS} -lad3 -lgflags -lglog" +CPPFLAGS="-I${AUX_INCLUDES} -I${INCLUDES}/ad3" + + + +# Check for c++0x compile flag. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -std=c++0x" >&5 +$as_echo_n "checking whether C compiler accepts -std=c++0x... " >&6; } +if ${ax_cv_check_cflags___std_cpp0x+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -std=c++0x" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___std_cpp0x=yes +else + ax_cv_check_cflags___std_cpp0x=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___std_cpp0x" >&5 +$as_echo "$ax_cv_check_cflags___std_cpp0x" >&6; } +if test x"$ax_cv_check_cflags___std_cpp0x" = xyes; then : + CXXFLAGS="$CXXFLAGS -std=c++0x" +else + : +fi + + +# Macros +# This will make ILOG use STL libs +#AC_DEFINE([IL_STD], [], [This is necessary to make ILOG use STL libs]) + +############################################ +# Temporary solution to enable debug builds. +# See: http://stackoverflow.com/questions/4553735/gnu-autotools-debug-release-targets +############################################ +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; case "${enableval}" in + yes) debug=true ;; + no) debug=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; +esac +else + debug=false +fi + + + if test x"$debug" = x"true"; then + DEBUG_TRUE= + DEBUG_FALSE='#' +else + DEBUG_TRUE='#' + DEBUG_FALSE= +fi + +############################################ + + + + +# Checks for header files. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in stddef.h string.h sys/time.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 +$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } +if ${ac_cv_header_stdbool_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #if false + "error: false is not 0" + #endif + #ifndef true + "error: true is not defined" + #endif + #if true != 1 + "error: true is not 1" + #endif + #ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" + #endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) 0.5 == true ? 1 : -1]; + /* See body of main program for 'e'. */ + char f[(_Bool) 0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + enum { j = false, k = true, l = false * true, m = true * 256 }; + /* The following fails for + HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ + _Bool n[m]; + char o[sizeof n == m * sizeof n[0] ? 1 : -1]; + char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; + /* Catch a bug in an HP-UX C compiler. See + http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html + http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html + */ + _Bool q = true; + _Bool *pq = &q; + +int +main () +{ + + bool e = &s; + *pq |= q; + *pq |= ! q; + /* Refer to every declared value, to avoid compiler optimizations. */ + return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + + !m + !n + !o + !p + !q + !pq); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdbool_h=yes +else + ac_cv_header_stdbool_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 +$as_echo "$ac_cv_header_stdbool_h" >&6; } + ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" +if test "x$ac_cv_type__Bool" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE__BOOL 1 +_ACEOF + + +fi + + +if test $ac_cv_header_stdbool_h = yes; then + +$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +# Checks for library functions. +for ac_func in gettimeofday +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETTIMEOFDAY 1 +_ACEOF + +fi +done + + +ac_config_files="$ac_config_files Makefile src/tagger/Makefile src/parser/Makefile src/semantic_parser/Makefile src/entity_recognizer/Makefile src/coreference_resolver/Makefile src/dependency_labeler/Makefile src/constituency_labeler/Makefile src/morphological_tagger/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then + as_fn_error $? "conditional \"DEBUG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by TurboParser $as_me 2.3.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +TurboParser home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +TurboParser config.status 2.3.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/tagger/Makefile") CONFIG_FILES="$CONFIG_FILES src/tagger/Makefile" ;; + "src/parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/parser/Makefile" ;; + "src/semantic_parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/semantic_parser/Makefile" ;; + "src/entity_recognizer/Makefile") CONFIG_FILES="$CONFIG_FILES src/entity_recognizer/Makefile" ;; + "src/coreference_resolver/Makefile") CONFIG_FILES="$CONFIG_FILES src/coreference_resolver/Makefile" ;; + "src/dependency_labeler/Makefile") CONFIG_FILES="$CONFIG_FILES src/dependency_labeler/Makefile" ;; + "src/constituency_labeler/Makefile") CONFIG_FILES="$CONFIG_FILES src/constituency_labeler/Makefile" ;; + "src/morphological_tagger/Makefile") CONFIG_FILES="$CONFIG_FILES src/morphological_tagger/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/libturboparser/Makefile b/libturboparser/Makefile index bad93e0..4a94c85 100644 --- a/libturboparser/Makefile +++ b/libturboparser/Makefile @@ -1,276 +1,276 @@ -UTIL = ../src/util -CLASSIFIER = ../src/classifier -SEQUENCE = ../src/sequence -TAGGER = ../src/tagger -ENTITYRECOGNIZER = ../src/entity_recognizer -PARSER = ../src/parser -SEMANTICPARSER = ../src/semantic_parser -COREFERENCERESOLVER = ../src/coreference_resolver -MORPHOLOGICALTAGGER = ../src/morphological_tagger -AUXLIBS = ../deps/local/lib -AUXINCLUDES = ../deps/local/include - -OBJS = TurboParserInterface.o CoreferenceDecoder.o CoreferenceDictionary.o CoreferenceFeatures.o CoreferenceDocumentNumeric.o CoreferenceSentenceNumeric.o Mention.o CoreferenceDocument.o CoreferenceSentence.o CoreferenceOptions.o CoreferencePart.o CoreferencePipe.o CoreferenceReader.o CoreferenceWriter.o SemanticDecoder.o SemanticDictionary.o SemanticFeatures.o SemanticInstanceNumeric.o SemanticInstance.o SemanticOptions.o SemanticPart.o SemanticPipe.o SemanticReader.o SemanticWriter.o DependencyDecoder.o DependencyDictionary.o DependencyFeatures.o DependencyInstance.o DependencyInstanceNumeric.o DependencyOptions.o DependencyPart.o DependencyPipe.o DependencyReader.o DependencyWriter.o TaggerDictionary.o TaggerFeatures.o TaggerOptions.o TaggerPipe.o MorphologicalDictionary.o MorphologicalFeatures.o MorphologicalInstance.o MorphologicalInstanceNumeric.o MorphologicalOptions.o MorphologicalPipe.o MorphologicalReader.o MorphologicalWriter.o EntityDictionary.o EntityFeatures.o EntityInstance.o EntityInstanceNumeric.o EntityOptions.o EntityPipe.o EntityReader.o EntityWriter.o SequenceDecoder.o SequenceDictionary.o SequenceInstance.o SequenceInstanceNumeric.o SequenceOptions.o SequencePart.o SequencePipe.o SequenceReader.o SequenceWriter.o TokenDictionary.o Alphabet.o Dictionary.o Options.o Parameters.o Pipe.o Reader.o Writer.o AlgUtils.o SerializationUtils.o StringUtils.o TimeUtils.o -CC = g++ -DEBUG = -g -INCLUDES = -I$(UTIL)/ -I$(CLASSIFIER) -I$(SEQUENCE) -I$(TAGGER) -I$(ENTITYRECOGNIZER) -I$(PARSER) -I$(SEMANTICPARSER) -I$(COREFERENCERESOLVER) -I$(MORPHOLOGICALTAGGER) -I$(AUXINCLUDES) -LIBS = -L/usr/local/lib/ -L$(AUXLIBS) -CFLAGS = -std=c++0x -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) -LDFLAGS = -shared -LFLAGS = $(LIBS) -Wl,-whole-archive -lad3 -Wl,-no-whole-archive -lgflags -lglog - -all : libturboparser.a libturboparser.so - -libturboparser.a : $(OBJS) - ar rcs libturboparser.a $(OBJS) - -libturboparser.so : $(OBJS) - $(CC) -o libturboparser.so $(OBJS) $(LDFLAGS) $(LFLAGS) - -TurboParserInterface.o: TurboParserInterface.h TurboParserInterface.cpp $(TAGGER)/TaggerPipe.h $(ENTITYRECOGNIZER)/EntityPipe.h $(PARSER)/DependencyPipe.h $(SEMANTICPARSER)/SemanticPipe.h $(COREFERENCERESOLVER)/CoreferencePipe.h $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(UTIL)/Utils.h - $(CC) $(CFLAGS) TurboParserInterface.cpp - -##################### - -CoreferenceDecoder.o: $(COREFERENCERESOLVER)/CoreferenceDecoder.h $(COREFERENCERESOLVER)/CoreferenceDecoder.cpp $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferencePipe.h $(UTIL)/AlgUtils.h $(UTIL)/logval.h $(CLASSIFIER)/Decoder.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDecoder.cpp - -CoreferenceDictionary.o: $(COREFERENCERESOLVER)/CoreferenceDictionary.h $(COREFERENCERESOLVER)/CoreferenceDictionary.cpp $(COREFERENCERESOLVER)/CoreferencePipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDictionary.cpp - -CoreferenceFeatures.o: $(COREFERENCERESOLVER)/CoreferenceFeatures.h $(COREFERENCERESOLVER)/CoreferenceFeatures.cpp $(COREFERENCERESOLVER)/CoreferencePipe.h $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferenceFeatureTemplates.h $(CLASSIFIER)/Features.h $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.h $(CLASSIFIER)/FeatureEncoder.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceFeatures.cpp - -CoreferenceDocument.o: $(COREFERENCERESOLVER)/CoreferenceDocument.h $(COREFERENCERESOLVER)/CoreferenceDocument.cpp $(COREFERENCERESOLVER)/CoreferenceSentence.h $(CLASSIFIER)/Instance.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDocument.cpp - -CoreferenceSentence.o: $(COREFERENCERESOLVER)/CoreferenceSentence.h $(COREFERENCERESOLVER)/CoreferenceSentence.cpp $(CLASSIFIER)/Instance.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceSentence.cpp - -CoreferenceDocumentNumeric.o: $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.h $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.cpp $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.h $(COREFERENCERESOLVER)/CoreferenceDocument.h $(COREFERENCERESOLVER)/CoreferenceDictionary.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.cpp - -CoreferenceSentenceNumeric.o: $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.h $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.cpp $(COREFERENCERESOLVER)/CoreferenceSentence.h $(COREFERENCERESOLVER)/Mention.h $(COREFERENCERESOLVER)/CoreferenceDictionary.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.cpp - -Mention.o: $(COREFERENCERESOLVER)/Mention.h $(COREFERENCERESOLVER)/Mention.cpp $(COREFERENCERESOLVER)/CoreferenceDictionary.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/Mention.cpp - -CoreferenceOptions.o: $(COREFERENCERESOLVER)/CoreferenceOptions.h $(COREFERENCERESOLVER)/CoreferenceOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceOptions.cpp - -CoreferencePart.o: $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferencePart.cpp $(CLASSIFIER)/Part.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferencePart.cpp - -CoreferencePipe.o: $(COREFERENCERESOLVER)/CoreferencePipe.h $(COREFERENCERESOLVER)/CoreferencePipe.cpp $(CLASSIFIER)/Pipe.h $(COREFERENCERESOLVER)/CoreferenceOptions.h $(COREFERENCERESOLVER)/CoreferenceReader.h $(COREFERENCERESOLVER)/CoreferenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.h $(COREFERENCERESOLVER)/CoreferenceWriter.h $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferenceFeatures.h $(COREFERENCERESOLVER)/CoreferenceDecoder.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferencePipe.cpp - -CoreferenceReader.o: $(COREFERENCERESOLVER)/CoreferenceReader.h $(COREFERENCERESOLVER)/CoreferenceReader.cpp $(COREFERENCERESOLVER)/CoreferenceDocument.h $(CLASSIFIER)/Reader.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceReader.cpp - -CoreferenceWriter.o: $(COREFERENCERESOLVER)/CoreferenceWriter.h $(COREFERENCERESOLVER)/CoreferenceWriter.cpp $(COREFERENCERESOLVER)/CoreferenceDocument.h $(CLASSIFIER)/Writer.h - $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceWriter.cpp - -##################### - -SemanticDecoder.o: $(SEMANTICPARSER)/SemanticDecoder.h $(SEMANTICPARSER)/SemanticDecoder.cpp $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticPipe.h $(PARSER)/FactorTree.h $(SEMANTICPARSER)/FactorPredicateAutomaton.h $(SEMANTICPARSER)/FactorArgumentAutomaton.h $(UTIL)/AlgUtils.h $(UTIL)/logval.h $(CLASSIFIER)/Decoder.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticDecoder.cpp - -SemanticDictionary.o: $(SEMANTICPARSER)/SemanticDictionary.h $(SEMANTICPARSER)/SemanticDictionary.cpp $(SEMANTICPARSER)/SemanticPipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticDictionary.cpp - -SemanticFeatures.o: $(SEMANTICPARSER)/SemanticFeatures.h $(SEMANTICPARSER)/SemanticFeatures.cpp $(SEMANTICPARSER)/SemanticPipe.h $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticFeatureTemplates.h $(CLASSIFIER)/Features.h $(SEMANTICPARSER)/SemanticInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticFeatures.cpp - -SemanticInstance.o: $(SEMANTICPARSER)/SemanticInstance.h $(SEMANTICPARSER)/SemanticInstance.cpp $(CLASSIFIER)/Instance.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticInstance.cpp - -SemanticInstanceNumeric.o: $(SEMANTICPARSER)/SemanticInstanceNumeric.h $(SEMANTICPARSER)/SemanticInstanceNumeric.cpp $(SEMANTICPARSER)/SemanticInstance.h $(SEMANTICPARSER)/SemanticDictionary.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticInstanceNumeric.cpp - -SemanticOptions.o: $(SEMANTICPARSER)/SemanticOptions.h $(SEMANTICPARSER)/SemanticOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticOptions.cpp - -SemanticPart.o: $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticPart.cpp $(CLASSIFIER)/Part.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticPart.cpp - -SemanticPipe.o: $(SEMANTICPARSER)/SemanticPipe.h $(SEMANTICPARSER)/SemanticPipe.cpp $(CLASSIFIER)/Pipe.h $(SEMANTICPARSER)/SemanticOptions.h $(SEMANTICPARSER)/SemanticReader.h $(SEMANTICPARSER)/SemanticDictionary.h $(SEQUENCE)/TokenDictionary.h $(SEMANTICPARSER)/SemanticInstanceNumeric.h $(SEMANTICPARSER)/SemanticWriter.h $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticFeatures.h $(SEMANTICPARSER)/SemanticDecoder.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticPipe.cpp - -SemanticReader.o: $(SEMANTICPARSER)/SemanticReader.h $(SEMANTICPARSER)/SemanticReader.cpp $(SEMANTICPARSER)/SemanticInstance.h $(CLASSIFIER)/Reader.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticReader.cpp - -SemanticWriter.o: $(SEMANTICPARSER)/SemanticWriter.h $(SEMANTICPARSER)/SemanticWriter.cpp $(SEMANTICPARSER)/SemanticInstance.h $(CLASSIFIER)/Writer.h - $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticWriter.cpp - -##################### - -DependencyDecoder.o: $(PARSER)/DependencyDecoder.h $(PARSER)/DependencyDecoder.cpp $(PARSER)/DependencyPart.h $(PARSER)/DependencyPipe.h $(PARSER)/FactorTree.h $(PARSER)/FactorHeadAutomaton.h $(PARSER)/FactorGrandparentHeadAutomaton.h $(PARSER)/FactorTrigramHeadAutomaton.h $(PARSER)/FactorSequence.h $(UTIL)/AlgUtils.h $(UTIL)/logval.h $(CLASSIFIER)/Decoder.h - $(CC) $(CFLAGS) $(PARSER)/DependencyDecoder.cpp - -DependencyDictionary.o: $(PARSER)/DependencyDictionary.h $(PARSER)/DependencyDictionary.cpp $(PARSER)/DependencyPipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(PARSER)/DependencyDictionary.cpp - -DependencyFeatures.o: $(PARSER)/DependencyFeatures.h $(PARSER)/DependencyFeatures.cpp $(PARSER)/DependencyPipe.h $(PARSER)/DependencyPart.h $(PARSER)/DependencyFeatureTemplates.h $(CLASSIFIER)/Features.h $(PARSER)/DependencyInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h - $(CC) $(CFLAGS) $(PARSER)/DependencyFeatures.cpp - -DependencyInstance.o: $(PARSER)/DependencyInstance.h $(PARSER)/DependencyInstance.cpp $(CLASSIFIER)/Instance.h - $(CC) $(CFLAGS) $(PARSER)/DependencyInstance.cpp - -DependencyInstanceNumeric.o: $(PARSER)/DependencyInstanceNumeric.h $(PARSER)/DependencyInstanceNumeric.cpp $(PARSER)/DependencyInstance.h $(PARSER)/DependencyDictionary.h - $(CC) $(CFLAGS) $(PARSER)/DependencyInstanceNumeric.cpp - -DependencyOptions.o: $(PARSER)/DependencyOptions.h $(PARSER)/DependencyOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h - $(CC) $(CFLAGS) $(PARSER)/DependencyOptions.cpp - -DependencyPart.o: $(PARSER)/DependencyPart.h $(PARSER)/DependencyPart.cpp $(CLASSIFIER)/Part.h - $(CC) $(CFLAGS) $(PARSER)/DependencyPart.cpp - -DependencyPipe.o: $(PARSER)/DependencyPipe.h $(PARSER)/DependencyPipe.cpp $(CLASSIFIER)/Pipe.h $(PARSER)/DependencyOptions.h $(PARSER)/DependencyReader.h $(PARSER)/DependencyDictionary.h $(SEQUENCE)/TokenDictionary.h $(PARSER)/DependencyInstanceNumeric.h $(PARSER)/DependencyWriter.h $(PARSER)/DependencyPart.h $(PARSER)/DependencyFeatures.h $(PARSER)/DependencyDecoder.h - $(CC) $(CFLAGS) $(PARSER)/DependencyPipe.cpp - -DependencyReader.o: $(PARSER)/DependencyReader.h $(PARSER)/DependencyReader.cpp $(PARSER)/DependencyInstance.h $(CLASSIFIER)/Reader.h - $(CC) $(CFLAGS) $(PARSER)/DependencyReader.cpp - -DependencyWriter.o: $(PARSER)/DependencyWriter.h $(PARSER)/DependencyWriter.cpp $(PARSER)/DependencyInstance.h $(CLASSIFIER)/Writer.h - $(CC) $(CFLAGS) $(PARSER)/DependencyWriter.cpp - -##################### - -TaggerDictionary.o: $(TAGGER)/TaggerDictionary.h $(TAGGER)/TaggerDictionary.cpp $(TAGGER)/TaggerPipe.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(TAGGER)/TaggerDictionary.cpp - -TaggerFeatures.o: $(TAGGER)/TaggerFeatures.h $(TAGGER)/TaggerFeatures.cpp $(TAGGER)/TaggerPipe.h $(TAGGER)/TaggerFeatureTemplates.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h - $(CC) $(CFLAGS) $(TAGGER)/TaggerFeatures.cpp - -TaggerOptions.o: $(TAGGER)/TaggerOptions.h $(TAGGER)/TaggerOptions.cpp $(UTIL)/SerializationUtils.h $(SEQUENCE)/SequenceOptions.h - $(CC) $(CFLAGS) $(TAGGER)/TaggerOptions.cpp - -TaggerPipe.o: $(TAGGER)/TaggerPipe.h $(TAGGER)/TaggerPipe.cpp $(SEQUENCE)/SequencePipe.h $(TAGGER)/TaggerOptions.h $(TAGGER)/TaggerDictionary.h - $(CC) $(CFLAGS) $(TAGGER)/TaggerPipe.cpp - -##################### - -MorphologicalDictionary.o: $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.h $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.cpp $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.cpp - -MorphologicalFeatures.o: $(MORPHOLOGICALTAGGER)/MorphologicalFeatures.h $(MORPHOLOGICALTAGGER)/MorphologicalFeatures.cpp $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(MORPHOLOGICALTAGGER)/MorphologicalFeatureTemplates.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalFeatures.cpp - -MorphologicalInstance.o: $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(MORPHOLOGICALTAGGER)/MorphologicalInstance.cpp $(SEQUENCE)/SequenceInstance.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalInstance.cpp - -MorphologicalInstanceNumeric.o: $(MORPHOLOGICALTAGGER)/MorphologicalInstanceNumeric.h $(MORPHOLOGICALTAGGER)/MorphologicalInstanceNumeric.cpp $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(SEQUENCE)/SequenceInstanceNumeric.h $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalInstanceNumeric.cpp - -MorphologicalOptions.o: $(MORPHOLOGICALTAGGER)/MorphologicalOptions.h $(MORPHOLOGICALTAGGER)/MorphologicalOptions.cpp $(UTIL)/SerializationUtils.h $(SEQUENCE)/SequenceOptions.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalOptions.cpp - -MorphologicalPipe.o: $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(MORPHOLOGICALTAGGER)/MorphologicalPipe.cpp $(SEQUENCE)/SequencePipe.h $(MORPHOLOGICALTAGGER)/MorphologicalOptions.h $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalPipe.cpp - -MorphologicalReader.o: $(MORPHOLOGICALTAGGER)/MorphologicalReader.h $(MORPHOLOGICALTAGGER)/MorphologicalReader.cpp $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(SEQUENCE)/SequenceReader.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalReader.cpp - -MorphologicalWriter.o: $(MORPHOLOGICALTAGGER)/MorphologicalWriter.h $(MORPHOLOGICALTAGGER)/MorphologicalWriter.cpp $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(SEQUENCE)/SequenceWriter.h - $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalWriter.cpp - -##################### - -EntityDictionary.o: $(ENTITYRECOGNIZER)/EntityDictionary.h $(ENTITYRECOGNIZER)/EntityDictionary.cpp $(ENTITYRECOGNIZER)/EntityPipe.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityDictionary.cpp - -EntityFeatures.o: $(ENTITYRECOGNIZER)/EntityFeatures.h $(ENTITYRECOGNIZER)/EntityFeatures.cpp $(ENTITYRECOGNIZER)/EntityPipe.h $(ENTITYRECOGNIZER)/EntityFeatureTemplates.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityFeatures.cpp - -EntityOptions.o: $(ENTITYRECOGNIZER)/EntityOptions.h $(ENTITYRECOGNIZER)/EntityOptions.cpp $(UTIL)/SerializationUtils.h $(SEQUENCE)/SequenceOptions.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityOptions.cpp - -EntityPipe.o: $(ENTITYRECOGNIZER)/EntityPipe.h $(ENTITYRECOGNIZER)/EntityPipe.cpp $(SEQUENCE)/SequencePipe.h $(ENTITYRECOGNIZER)/EntityOptions.h $(ENTITYRECOGNIZER)/EntityDictionary.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityPipe.cpp - -EntityReader.o: $(ENTITYRECOGNIZER)/EntityReader.h $(ENTITYRECOGNIZER)/EntityReader.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceReader.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityReader.cpp - -EntityWriter.o: $(ENTITYRECOGNIZER)/EntityWriter.h $(ENTITYRECOGNIZER)/EntityWriter.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceWriter.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityWriter.cpp - -EntityInstance.o: $(ENTITYRECOGNIZER)/EntityInstance.h $(ENTITYRECOGNIZER)/EntityInstance.cpp $(SEQUENCE)/SequenceInstance.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityInstance.cpp - -EntityInstanceNumeric.o: $(ENTITYRECOGNIZER)/EntityInstanceNumeric.h $(ENTITYRECOGNIZER)/EntityInstanceNumeric.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceInstanceNumeric.h $(ENTITYRECOGNIZER)/EntityDictionary.h - $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityInstanceNumeric.cpp - -##################### - -SequenceDecoder.o: $(SEQUENCE)/SequenceDecoder.h $(SEQUENCE)/SequenceDecoder.cpp $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequencePipe.h $(CLASSIFIER)/Decoder.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceDecoder.cpp - -SequenceDictionary.o: $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/SequenceDictionary.cpp $(SEQUENCE)/SequencePipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceDictionary.cpp - -SequenceInstance.o: $(SEQUENCE)/SequenceInstance.h $(SEQUENCE)/SequenceInstance.cpp $(CLASSIFIER)/Instance.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceInstance.cpp - -SequenceInstanceNumeric.o: $(SEQUENCE)/SequenceInstanceNumeric.h $(SEQUENCE)/SequenceInstanceNumeric.cpp $(SEQUENCE)/SequenceInstance.h $(SEQUENCE)/SequenceDictionary.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceInstanceNumeric.cpp - -SequenceOptions.o: $(SEQUENCE)/SequenceOptions.h $(SEQUENCE)/SequenceOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceOptions.cpp - -SequencePart.o: $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequencePart.cpp $(CLASSIFIER)/Part.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequencePart.cpp - -SequencePipe.o: $(SEQUENCE)/SequencePipe.h $(SEQUENCE)/SequencePipe.cpp $(CLASSIFIER)/Pipe.h $(SEQUENCE)/SequenceOptions.h $(SEQUENCE)/SequenceReader.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(SEQUENCE)/SequenceInstanceNumeric.h $(SEQUENCE)/SequenceWriter.h $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceDecoder.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequencePipe.cpp - -SequenceReader.o: $(SEQUENCE)/SequenceReader.h $(SEQUENCE)/SequenceReader.cpp $(SEQUENCE)/SequenceInstance.h $(CLASSIFIER)/Reader.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceReader.cpp - -SequenceWriter.o: $(SEQUENCE)/SequenceWriter.h $(SEQUENCE)/SequenceWriter.cpp $(SEQUENCE)/SequenceInstance.h $(CLASSIFIER)/Writer.h - $(CC) $(CFLAGS) $(SEQUENCE)/SequenceWriter.cpp - -TokenDictionary.o: $(SEQUENCE)/TokenDictionary.h $(SEQUENCE)/TokenDictionary.cpp $(CLASSIFIER)/Pipe.h $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Dictionary.h $(CLASSIFIER)/Alphabet.h $(SEQUENCE)/SequenceReader.h $(PARSER)/DependencyReader.h - $(CC) $(CFLAGS) $(SEQUENCE)/TokenDictionary.cpp - -##################### - -Alphabet.o: $(CLASSIFIER)/Alphabet.h $(CLASSIFIER)/Alphabet.cpp $(UTIL)/SerializationUtils.h $(UTIL)/Utils.h - $(CC) $(CFLAGS) $(CLASSIFIER)/Alphabet.cpp - -Dictionary.o: $(CLASSIFIER)/Dictionary.h $(CLASSIFIER)/Dictionary.cpp - $(CC) $(CFLAGS) $(CLASSIFIER)/Dictionary.cpp - -Options.o: $(CLASSIFIER)/Options.h $(CLASSIFIER)/Options.cpp - $(CC) $(CFLAGS) $(CLASSIFIER)/Options.cpp - -Parameters.o: $(CLASSIFIER)/Parameters.h $(CLASSIFIER)/Parameters.cpp $(CLASSIFIER)/Features.h $(CLASSIFIER)/SparseParameterVector.h $(CLASSIFIER)/SparseLabeledParameterVector.h $(UTIL)/Utils.h - $(CC) $(CFLAGS) $(CLASSIFIER)/Parameters.cpp - -Pipe.o: $(CLASSIFIER)/Pipe.h $(CLASSIFIER)/Pipe.cpp $(CLASSIFIER)/Dictionary.h $(CLASSIFIER)/Features.h $(CLASSIFIER)/Part.h $(CLASSIFIER)/Reader.h $(CLASSIFIER)/Writer.h $(CLASSIFIER)/Options.h $(CLASSIFIER)/Decoder.h $(CLASSIFIER)/Parameters.h $(UTIL)/AlgUtils.h - $(CC) $(CFLAGS) $(CLASSIFIER)/Pipe.cpp - -Reader.o: $(CLASSIFIER)/Reader.h $(CLASSIFIER)/Reader.cpp $(CLASSIFIER)/Instance.h $(UTIL)/Utils.h - $(CC) $(CFLAGS) $(CLASSIFIER)/Reader.cpp - -Writer.o: $(CLASSIFIER)/Writer.h $(CLASSIFIER)/Writer.cpp $(CLASSIFIER)/Instance.h $(UTIL)/Utils.h - $(CC) $(CFLAGS) $(CLASSIFIER)/Writer.cpp - -##################### - -AlgUtils.o: $(UTIL)/AlgUtils.h $(UTIL)/AlgUtils.cpp - $(CC) $(CFLAGS) $(UTIL)/AlgUtils.cpp - -SerializationUtils.o: $(UTIL)/SerializationUtils.h $(UTIL)/SerializationUtils.cpp - $(CC) $(CFLAGS) $(UTIL)/SerializationUtils.cpp - -StringUtils.o: $(UTIL)/StringUtils.h $(UTIL)/StringUtils.cpp - $(CC) $(CFLAGS) $(UTIL)/StringUtils.cpp - -TimeUtils.o: $(UTIL)/TimeUtils.h $(UTIL)/TimeUtils.cpp - $(CC) $(CFLAGS) $(UTIL)/TimeUtils.cpp - -##################### - -clean: - rm -f *.o *~ libturboparser.a libturboparser.so +UTIL = ../src/util +CLASSIFIER = ../src/classifier +SEQUENCE = ../src/sequence +TAGGER = ../src/tagger +ENTITYRECOGNIZER = ../src/entity_recognizer +PARSER = ../src/parser +SEMANTICPARSER = ../src/semantic_parser +COREFERENCERESOLVER = ../src/coreference_resolver +MORPHOLOGICALTAGGER = ../src/morphological_tagger +AUXLIBS = ../deps/local/lib +AUXINCLUDES = ../deps/local/include + +OBJS = TurboParserInterface.o CoreferenceDecoder.o CoreferenceDictionary.o CoreferenceFeatures.o CoreferenceDocumentNumeric.o CoreferenceSentenceNumeric.o Mention.o CoreferenceDocument.o CoreferenceSentence.o CoreferenceOptions.o CoreferencePart.o CoreferencePipe.o CoreferenceReader.o CoreferenceWriter.o SemanticDecoder.o SemanticDictionary.o SemanticFeatures.o SemanticInstanceNumeric.o SemanticInstance.o SemanticOptions.o SemanticPart.o SemanticPipe.o SemanticReader.o SemanticWriter.o DependencyDecoder.o DependencyDictionary.o DependencyFeatures.o DependencyInstance.o DependencyInstanceNumeric.o DependencyOptions.o DependencyPart.o DependencyPipe.o DependencyReader.o DependencyWriter.o TaggerDictionary.o TaggerFeatures.o TaggerOptions.o TaggerPipe.o MorphologicalDictionary.o MorphologicalFeatures.o MorphologicalInstance.o MorphologicalInstanceNumeric.o MorphologicalOptions.o MorphologicalPipe.o MorphologicalReader.o MorphologicalWriter.o EntityDictionary.o EntityFeatures.o EntityInstance.o EntityInstanceNumeric.o EntityOptions.o EntityPipe.o EntityReader.o EntityWriter.o SequenceDecoder.o SequenceDictionary.o SequenceInstance.o SequenceInstanceNumeric.o SequenceOptions.o SequencePart.o SequencePipe.o SequenceReader.o SequenceWriter.o TokenDictionary.o Alphabet.o Dictionary.o Options.o Parameters.o Pipe.o Reader.o Writer.o AlgUtils.o SerializationUtils.o StringUtils.o TimeUtils.o +CC = g++ +DEBUG = -g +INCLUDES = -I$(UTIL)/ -I$(CLASSIFIER) -I$(SEQUENCE) -I$(TAGGER) -I$(ENTITYRECOGNIZER) -I$(PARSER) -I$(SEMANTICPARSER) -I$(COREFERENCERESOLVER) -I$(MORPHOLOGICALTAGGER) -I$(AUXINCLUDES) +LIBS = -L/usr/local/lib/ -L$(AUXLIBS) +CFLAGS = -std=c++0x -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) +LDFLAGS = -shared +LFLAGS = $(LIBS) -Wl,-whole-archive -lad3 -Wl,-no-whole-archive -lgflags -lglog + +all : libturboparser.a libturboparser.so + +libturboparser.a : $(OBJS) + ar rcs libturboparser.a $(OBJS) + +libturboparser.so : $(OBJS) + $(CC) -o libturboparser.so $(OBJS) $(LDFLAGS) $(LFLAGS) + +TurboParserInterface.o: TurboParserInterface.h TurboParserInterface.cpp $(TAGGER)/TaggerPipe.h $(ENTITYRECOGNIZER)/EntityPipe.h $(PARSER)/DependencyPipe.h $(SEMANTICPARSER)/SemanticPipe.h $(COREFERENCERESOLVER)/CoreferencePipe.h $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(UTIL)/Utils.h + $(CC) $(CFLAGS) TurboParserInterface.cpp + +##################### + +CoreferenceDecoder.o: $(COREFERENCERESOLVER)/CoreferenceDecoder.h $(COREFERENCERESOLVER)/CoreferenceDecoder.cpp $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferencePipe.h $(UTIL)/AlgUtils.h $(UTIL)/logval.h $(CLASSIFIER)/Decoder.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDecoder.cpp + +CoreferenceDictionary.o: $(COREFERENCERESOLVER)/CoreferenceDictionary.h $(COREFERENCERESOLVER)/CoreferenceDictionary.cpp $(COREFERENCERESOLVER)/CoreferencePipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDictionary.cpp + +CoreferenceFeatures.o: $(COREFERENCERESOLVER)/CoreferenceFeatures.h $(COREFERENCERESOLVER)/CoreferenceFeatures.cpp $(COREFERENCERESOLVER)/CoreferencePipe.h $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferenceFeatureTemplates.h $(CLASSIFIER)/Features.h $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.h $(CLASSIFIER)/FeatureEncoder.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceFeatures.cpp + +CoreferenceDocument.o: $(COREFERENCERESOLVER)/CoreferenceDocument.h $(COREFERENCERESOLVER)/CoreferenceDocument.cpp $(COREFERENCERESOLVER)/CoreferenceSentence.h $(CLASSIFIER)/Instance.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDocument.cpp + +CoreferenceSentence.o: $(COREFERENCERESOLVER)/CoreferenceSentence.h $(COREFERENCERESOLVER)/CoreferenceSentence.cpp $(CLASSIFIER)/Instance.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceSentence.cpp + +CoreferenceDocumentNumeric.o: $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.h $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.cpp $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.h $(COREFERENCERESOLVER)/CoreferenceDocument.h $(COREFERENCERESOLVER)/CoreferenceDictionary.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.cpp + +CoreferenceSentenceNumeric.o: $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.h $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.cpp $(COREFERENCERESOLVER)/CoreferenceSentence.h $(COREFERENCERESOLVER)/Mention.h $(COREFERENCERESOLVER)/CoreferenceDictionary.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceSentenceNumeric.cpp + +Mention.o: $(COREFERENCERESOLVER)/Mention.h $(COREFERENCERESOLVER)/Mention.cpp $(COREFERENCERESOLVER)/CoreferenceDictionary.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/Mention.cpp + +CoreferenceOptions.o: $(COREFERENCERESOLVER)/CoreferenceOptions.h $(COREFERENCERESOLVER)/CoreferenceOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceOptions.cpp + +CoreferencePart.o: $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferencePart.cpp $(CLASSIFIER)/Part.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferencePart.cpp + +CoreferencePipe.o: $(COREFERENCERESOLVER)/CoreferencePipe.h $(COREFERENCERESOLVER)/CoreferencePipe.cpp $(CLASSIFIER)/Pipe.h $(COREFERENCERESOLVER)/CoreferenceOptions.h $(COREFERENCERESOLVER)/CoreferenceReader.h $(COREFERENCERESOLVER)/CoreferenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(COREFERENCERESOLVER)/CoreferenceDocumentNumeric.h $(COREFERENCERESOLVER)/CoreferenceWriter.h $(COREFERENCERESOLVER)/CoreferencePart.h $(COREFERENCERESOLVER)/CoreferenceFeatures.h $(COREFERENCERESOLVER)/CoreferenceDecoder.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferencePipe.cpp + +CoreferenceReader.o: $(COREFERENCERESOLVER)/CoreferenceReader.h $(COREFERENCERESOLVER)/CoreferenceReader.cpp $(COREFERENCERESOLVER)/CoreferenceDocument.h $(CLASSIFIER)/Reader.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceReader.cpp + +CoreferenceWriter.o: $(COREFERENCERESOLVER)/CoreferenceWriter.h $(COREFERENCERESOLVER)/CoreferenceWriter.cpp $(COREFERENCERESOLVER)/CoreferenceDocument.h $(CLASSIFIER)/Writer.h + $(CC) $(CFLAGS) $(COREFERENCERESOLVER)/CoreferenceWriter.cpp + +##################### + +SemanticDecoder.o: $(SEMANTICPARSER)/SemanticDecoder.h $(SEMANTICPARSER)/SemanticDecoder.cpp $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticPipe.h $(PARSER)/FactorTree.h $(SEMANTICPARSER)/FactorPredicateAutomaton.h $(SEMANTICPARSER)/FactorArgumentAutomaton.h $(UTIL)/AlgUtils.h $(UTIL)/logval.h $(CLASSIFIER)/Decoder.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticDecoder.cpp + +SemanticDictionary.o: $(SEMANTICPARSER)/SemanticDictionary.h $(SEMANTICPARSER)/SemanticDictionary.cpp $(SEMANTICPARSER)/SemanticPipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticDictionary.cpp + +SemanticFeatures.o: $(SEMANTICPARSER)/SemanticFeatures.h $(SEMANTICPARSER)/SemanticFeatures.cpp $(SEMANTICPARSER)/SemanticPipe.h $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticFeatureTemplates.h $(CLASSIFIER)/Features.h $(SEMANTICPARSER)/SemanticInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticFeatures.cpp + +SemanticInstance.o: $(SEMANTICPARSER)/SemanticInstance.h $(SEMANTICPARSER)/SemanticInstance.cpp $(CLASSIFIER)/Instance.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticInstance.cpp + +SemanticInstanceNumeric.o: $(SEMANTICPARSER)/SemanticInstanceNumeric.h $(SEMANTICPARSER)/SemanticInstanceNumeric.cpp $(SEMANTICPARSER)/SemanticInstance.h $(SEMANTICPARSER)/SemanticDictionary.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticInstanceNumeric.cpp + +SemanticOptions.o: $(SEMANTICPARSER)/SemanticOptions.h $(SEMANTICPARSER)/SemanticOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticOptions.cpp + +SemanticPart.o: $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticPart.cpp $(CLASSIFIER)/Part.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticPart.cpp + +SemanticPipe.o: $(SEMANTICPARSER)/SemanticPipe.h $(SEMANTICPARSER)/SemanticPipe.cpp $(CLASSIFIER)/Pipe.h $(SEMANTICPARSER)/SemanticOptions.h $(SEMANTICPARSER)/SemanticReader.h $(SEMANTICPARSER)/SemanticDictionary.h $(SEQUENCE)/TokenDictionary.h $(SEMANTICPARSER)/SemanticInstanceNumeric.h $(SEMANTICPARSER)/SemanticWriter.h $(SEMANTICPARSER)/SemanticPart.h $(SEMANTICPARSER)/SemanticFeatures.h $(SEMANTICPARSER)/SemanticDecoder.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticPipe.cpp + +SemanticReader.o: $(SEMANTICPARSER)/SemanticReader.h $(SEMANTICPARSER)/SemanticReader.cpp $(SEMANTICPARSER)/SemanticInstance.h $(CLASSIFIER)/Reader.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticReader.cpp + +SemanticWriter.o: $(SEMANTICPARSER)/SemanticWriter.h $(SEMANTICPARSER)/SemanticWriter.cpp $(SEMANTICPARSER)/SemanticInstance.h $(CLASSIFIER)/Writer.h + $(CC) $(CFLAGS) $(SEMANTICPARSER)/SemanticWriter.cpp + +##################### + +DependencyDecoder.o: $(PARSER)/DependencyDecoder.h $(PARSER)/DependencyDecoder.cpp $(PARSER)/DependencyPart.h $(PARSER)/DependencyPipe.h $(PARSER)/FactorTree.h $(PARSER)/FactorHeadAutomaton.h $(PARSER)/FactorGrandparentHeadAutomaton.h $(PARSER)/FactorTrigramHeadAutomaton.h $(PARSER)/FactorSequence.h $(UTIL)/AlgUtils.h $(UTIL)/logval.h $(CLASSIFIER)/Decoder.h + $(CC) $(CFLAGS) $(PARSER)/DependencyDecoder.cpp + +DependencyDictionary.o: $(PARSER)/DependencyDictionary.h $(PARSER)/DependencyDictionary.cpp $(PARSER)/DependencyPipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(PARSER)/DependencyDictionary.cpp + +DependencyFeatures.o: $(PARSER)/DependencyFeatures.h $(PARSER)/DependencyFeatures.cpp $(PARSER)/DependencyPipe.h $(PARSER)/DependencyPart.h $(PARSER)/DependencyFeatureTemplates.h $(CLASSIFIER)/Features.h $(PARSER)/DependencyInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h + $(CC) $(CFLAGS) $(PARSER)/DependencyFeatures.cpp + +DependencyInstance.o: $(PARSER)/DependencyInstance.h $(PARSER)/DependencyInstance.cpp $(CLASSIFIER)/Instance.h + $(CC) $(CFLAGS) $(PARSER)/DependencyInstance.cpp + +DependencyInstanceNumeric.o: $(PARSER)/DependencyInstanceNumeric.h $(PARSER)/DependencyInstanceNumeric.cpp $(PARSER)/DependencyInstance.h $(PARSER)/DependencyDictionary.h + $(CC) $(CFLAGS) $(PARSER)/DependencyInstanceNumeric.cpp + +DependencyOptions.o: $(PARSER)/DependencyOptions.h $(PARSER)/DependencyOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h + $(CC) $(CFLAGS) $(PARSER)/DependencyOptions.cpp + +DependencyPart.o: $(PARSER)/DependencyPart.h $(PARSER)/DependencyPart.cpp $(CLASSIFIER)/Part.h + $(CC) $(CFLAGS) $(PARSER)/DependencyPart.cpp + +DependencyPipe.o: $(PARSER)/DependencyPipe.h $(PARSER)/DependencyPipe.cpp $(CLASSIFIER)/Pipe.h $(PARSER)/DependencyOptions.h $(PARSER)/DependencyReader.h $(PARSER)/DependencyDictionary.h $(SEQUENCE)/TokenDictionary.h $(PARSER)/DependencyInstanceNumeric.h $(PARSER)/DependencyWriter.h $(PARSER)/DependencyPart.h $(PARSER)/DependencyFeatures.h $(PARSER)/DependencyDecoder.h + $(CC) $(CFLAGS) $(PARSER)/DependencyPipe.cpp + +DependencyReader.o: $(PARSER)/DependencyReader.h $(PARSER)/DependencyReader.cpp $(PARSER)/DependencyInstance.h $(CLASSIFIER)/Reader.h + $(CC) $(CFLAGS) $(PARSER)/DependencyReader.cpp + +DependencyWriter.o: $(PARSER)/DependencyWriter.h $(PARSER)/DependencyWriter.cpp $(PARSER)/DependencyInstance.h $(CLASSIFIER)/Writer.h + $(CC) $(CFLAGS) $(PARSER)/DependencyWriter.cpp + +##################### + +TaggerDictionary.o: $(TAGGER)/TaggerDictionary.h $(TAGGER)/TaggerDictionary.cpp $(TAGGER)/TaggerPipe.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(TAGGER)/TaggerDictionary.cpp + +TaggerFeatures.o: $(TAGGER)/TaggerFeatures.h $(TAGGER)/TaggerFeatures.cpp $(TAGGER)/TaggerPipe.h $(TAGGER)/TaggerFeatureTemplates.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h + $(CC) $(CFLAGS) $(TAGGER)/TaggerFeatures.cpp + +TaggerOptions.o: $(TAGGER)/TaggerOptions.h $(TAGGER)/TaggerOptions.cpp $(UTIL)/SerializationUtils.h $(SEQUENCE)/SequenceOptions.h + $(CC) $(CFLAGS) $(TAGGER)/TaggerOptions.cpp + +TaggerPipe.o: $(TAGGER)/TaggerPipe.h $(TAGGER)/TaggerPipe.cpp $(SEQUENCE)/SequencePipe.h $(TAGGER)/TaggerOptions.h $(TAGGER)/TaggerDictionary.h + $(CC) $(CFLAGS) $(TAGGER)/TaggerPipe.cpp + +##################### + +MorphologicalDictionary.o: $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.h $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.cpp $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.cpp + +MorphologicalFeatures.o: $(MORPHOLOGICALTAGGER)/MorphologicalFeatures.h $(MORPHOLOGICALTAGGER)/MorphologicalFeatures.cpp $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(MORPHOLOGICALTAGGER)/MorphologicalFeatureTemplates.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalFeatures.cpp + +MorphologicalInstance.o: $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(MORPHOLOGICALTAGGER)/MorphologicalInstance.cpp $(SEQUENCE)/SequenceInstance.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalInstance.cpp + +MorphologicalInstanceNumeric.o: $(MORPHOLOGICALTAGGER)/MorphologicalInstanceNumeric.h $(MORPHOLOGICALTAGGER)/MorphologicalInstanceNumeric.cpp $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(SEQUENCE)/SequenceInstanceNumeric.h $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalInstanceNumeric.cpp + +MorphologicalOptions.o: $(MORPHOLOGICALTAGGER)/MorphologicalOptions.h $(MORPHOLOGICALTAGGER)/MorphologicalOptions.cpp $(UTIL)/SerializationUtils.h $(SEQUENCE)/SequenceOptions.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalOptions.cpp + +MorphologicalPipe.o: $(MORPHOLOGICALTAGGER)/MorphologicalPipe.h $(MORPHOLOGICALTAGGER)/MorphologicalPipe.cpp $(SEQUENCE)/SequencePipe.h $(MORPHOLOGICALTAGGER)/MorphologicalOptions.h $(MORPHOLOGICALTAGGER)/MorphologicalDictionary.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalPipe.cpp + +MorphologicalReader.o: $(MORPHOLOGICALTAGGER)/MorphologicalReader.h $(MORPHOLOGICALTAGGER)/MorphologicalReader.cpp $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(SEQUENCE)/SequenceReader.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalReader.cpp + +MorphologicalWriter.o: $(MORPHOLOGICALTAGGER)/MorphologicalWriter.h $(MORPHOLOGICALTAGGER)/MorphologicalWriter.cpp $(MORPHOLOGICALTAGGER)/MorphologicalInstance.h $(SEQUENCE)/SequenceWriter.h + $(CC) $(CFLAGS) $(MORPHOLOGICALTAGGER)/MorphologicalWriter.cpp + +##################### + +EntityDictionary.o: $(ENTITYRECOGNIZER)/EntityDictionary.h $(ENTITYRECOGNIZER)/EntityDictionary.cpp $(ENTITYRECOGNIZER)/EntityPipe.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityDictionary.cpp + +EntityFeatures.o: $(ENTITYRECOGNIZER)/EntityFeatures.h $(ENTITYRECOGNIZER)/EntityFeatures.cpp $(ENTITYRECOGNIZER)/EntityPipe.h $(ENTITYRECOGNIZER)/EntityFeatureTemplates.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceInstanceNumeric.h $(CLASSIFIER)/FeatureEncoder.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityFeatures.cpp + +EntityOptions.o: $(ENTITYRECOGNIZER)/EntityOptions.h $(ENTITYRECOGNIZER)/EntityOptions.cpp $(UTIL)/SerializationUtils.h $(SEQUENCE)/SequenceOptions.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityOptions.cpp + +EntityPipe.o: $(ENTITYRECOGNIZER)/EntityPipe.h $(ENTITYRECOGNIZER)/EntityPipe.cpp $(SEQUENCE)/SequencePipe.h $(ENTITYRECOGNIZER)/EntityOptions.h $(ENTITYRECOGNIZER)/EntityDictionary.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityPipe.cpp + +EntityReader.o: $(ENTITYRECOGNIZER)/EntityReader.h $(ENTITYRECOGNIZER)/EntityReader.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceReader.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityReader.cpp + +EntityWriter.o: $(ENTITYRECOGNIZER)/EntityWriter.h $(ENTITYRECOGNIZER)/EntityWriter.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceWriter.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityWriter.cpp + +EntityInstance.o: $(ENTITYRECOGNIZER)/EntityInstance.h $(ENTITYRECOGNIZER)/EntityInstance.cpp $(SEQUENCE)/SequenceInstance.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityInstance.cpp + +EntityInstanceNumeric.o: $(ENTITYRECOGNIZER)/EntityInstanceNumeric.h $(ENTITYRECOGNIZER)/EntityInstanceNumeric.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceInstanceNumeric.h $(ENTITYRECOGNIZER)/EntityDictionary.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityInstanceNumeric.cpp + +##################### + +SequenceDecoder.o: $(SEQUENCE)/SequenceDecoder.h $(SEQUENCE)/SequenceDecoder.cpp $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequencePipe.h $(CLASSIFIER)/Decoder.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceDecoder.cpp + +SequenceDictionary.o: $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/SequenceDictionary.cpp $(SEQUENCE)/SequencePipe.h $(CLASSIFIER)/Dictionary.h $(SEQUENCE)/TokenDictionary.h $(UTIL)/SerializationUtils.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceDictionary.cpp + +SequenceInstance.o: $(SEQUENCE)/SequenceInstance.h $(SEQUENCE)/SequenceInstance.cpp $(CLASSIFIER)/Instance.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceInstance.cpp + +SequenceInstanceNumeric.o: $(SEQUENCE)/SequenceInstanceNumeric.h $(SEQUENCE)/SequenceInstanceNumeric.cpp $(SEQUENCE)/SequenceInstance.h $(SEQUENCE)/SequenceDictionary.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceInstanceNumeric.cpp + +SequenceOptions.o: $(SEQUENCE)/SequenceOptions.h $(SEQUENCE)/SequenceOptions.cpp $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Options.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceOptions.cpp + +SequencePart.o: $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequencePart.cpp $(CLASSIFIER)/Part.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequencePart.cpp + +SequencePipe.o: $(SEQUENCE)/SequencePipe.h $(SEQUENCE)/SequencePipe.cpp $(CLASSIFIER)/Pipe.h $(SEQUENCE)/SequenceOptions.h $(SEQUENCE)/SequenceReader.h $(SEQUENCE)/SequenceDictionary.h $(SEQUENCE)/TokenDictionary.h $(SEQUENCE)/SequenceInstanceNumeric.h $(SEQUENCE)/SequenceWriter.h $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequenceFeatures.h $(SEQUENCE)/SequenceDecoder.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequencePipe.cpp + +SequenceReader.o: $(SEQUENCE)/SequenceReader.h $(SEQUENCE)/SequenceReader.cpp $(SEQUENCE)/SequenceInstance.h $(CLASSIFIER)/Reader.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceReader.cpp + +SequenceWriter.o: $(SEQUENCE)/SequenceWriter.h $(SEQUENCE)/SequenceWriter.cpp $(SEQUENCE)/SequenceInstance.h $(CLASSIFIER)/Writer.h + $(CC) $(CFLAGS) $(SEQUENCE)/SequenceWriter.cpp + +TokenDictionary.o: $(SEQUENCE)/TokenDictionary.h $(SEQUENCE)/TokenDictionary.cpp $(CLASSIFIER)/Pipe.h $(UTIL)/SerializationUtils.h $(CLASSIFIER)/Dictionary.h $(CLASSIFIER)/Alphabet.h $(SEQUENCE)/SequenceReader.h $(PARSER)/DependencyReader.h + $(CC) $(CFLAGS) $(SEQUENCE)/TokenDictionary.cpp + +##################### + +Alphabet.o: $(CLASSIFIER)/Alphabet.h $(CLASSIFIER)/Alphabet.cpp $(UTIL)/SerializationUtils.h $(UTIL)/Utils.h + $(CC) $(CFLAGS) $(CLASSIFIER)/Alphabet.cpp + +Dictionary.o: $(CLASSIFIER)/Dictionary.h $(CLASSIFIER)/Dictionary.cpp + $(CC) $(CFLAGS) $(CLASSIFIER)/Dictionary.cpp + +Options.o: $(CLASSIFIER)/Options.h $(CLASSIFIER)/Options.cpp + $(CC) $(CFLAGS) $(CLASSIFIER)/Options.cpp + +Parameters.o: $(CLASSIFIER)/Parameters.h $(CLASSIFIER)/Parameters.cpp $(CLASSIFIER)/Features.h $(CLASSIFIER)/SparseParameterVector.h $(CLASSIFIER)/SparseLabeledParameterVector.h $(UTIL)/Utils.h + $(CC) $(CFLAGS) $(CLASSIFIER)/Parameters.cpp + +Pipe.o: $(CLASSIFIER)/Pipe.h $(CLASSIFIER)/Pipe.cpp $(CLASSIFIER)/Dictionary.h $(CLASSIFIER)/Features.h $(CLASSIFIER)/Part.h $(CLASSIFIER)/Reader.h $(CLASSIFIER)/Writer.h $(CLASSIFIER)/Options.h $(CLASSIFIER)/Decoder.h $(CLASSIFIER)/Parameters.h $(UTIL)/AlgUtils.h + $(CC) $(CFLAGS) $(CLASSIFIER)/Pipe.cpp + +Reader.o: $(CLASSIFIER)/Reader.h $(CLASSIFIER)/Reader.cpp $(CLASSIFIER)/Instance.h $(UTIL)/Utils.h + $(CC) $(CFLAGS) $(CLASSIFIER)/Reader.cpp + +Writer.o: $(CLASSIFIER)/Writer.h $(CLASSIFIER)/Writer.cpp $(CLASSIFIER)/Instance.h $(UTIL)/Utils.h + $(CC) $(CFLAGS) $(CLASSIFIER)/Writer.cpp + +##################### + +AlgUtils.o: $(UTIL)/AlgUtils.h $(UTIL)/AlgUtils.cpp + $(CC) $(CFLAGS) $(UTIL)/AlgUtils.cpp + +SerializationUtils.o: $(UTIL)/SerializationUtils.h $(UTIL)/SerializationUtils.cpp + $(CC) $(CFLAGS) $(UTIL)/SerializationUtils.cpp + +StringUtils.o: $(UTIL)/StringUtils.h $(UTIL)/StringUtils.cpp + $(CC) $(CFLAGS) $(UTIL)/StringUtils.cpp + +TimeUtils.o: $(UTIL)/TimeUtils.h $(UTIL)/TimeUtils.cpp + $(CC) $(CFLAGS) $(UTIL)/TimeUtils.cpp + +##################### + +clean: + rm -f *.o *~ libturboparser.a libturboparser.so diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 7c903f8..3f79840 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -1,387 +1,387 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "TurboParserInterface.h" - -namespace TurboParserInterface { -TurboTaggerWorker::TurboTaggerWorker() { - tagger_options_ = new TaggerOptions; - tagger_options_->Initialize(); - - tagger_pipe_ = new TaggerPipe(tagger_options_); - tagger_pipe_->Initialize(); -} - -TurboTaggerWorker::~TurboTaggerWorker() { - LOG(INFO) << "Deleting tagger pipe."; - delete tagger_pipe_; - LOG(INFO) << "Deleting tagger options."; - delete tagger_options_; -} - -void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { - tagger_options_->SetModelFilePath(file_model); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - tagger_pipe_->LoadModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboTaggerWorker::Tag(const std::string &file_test, - const std::string &file_prediction) { - tagger_options_->SetTestFilePath(file_test); - tagger_options_->SetOutputFilePath(file_prediction); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - tagger_pipe_->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { - tagger_pipe_->ClassifyInstance(sentence); -} - -TurboEntityRecognizerWorker::TurboEntityRecognizerWorker() { - entity_options_ = new EntityOptions; - entity_options_->Initialize(); - - entity_pipe_ = new EntityPipe(entity_options_); - entity_pipe_->Initialize(); -} - -TurboEntityRecognizerWorker::~TurboEntityRecognizerWorker() { - LOG(INFO) << "Deleting entity recognizer pipe."; - delete entity_pipe_; - LOG(INFO) << "Deleting entity recognizer options."; - delete entity_options_; -} - -void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( - const std::string &file_model) { - entity_options_->SetModelFilePath(file_model); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - entity_pipe_->LoadModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboEntityRecognizerWorker::Tag(const std::string &file_test, - const std::string &file_prediction) { - entity_options_->SetTestFilePath(file_test); - entity_options_->SetOutputFilePath(file_prediction); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - entity_pipe_->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { - entity_pipe_->ClassifyInstance(sentence); -} - -TurboParserWorker::TurboParserWorker() { - parser_options_ = new DependencyOptions; - parser_options_->Initialize(); - - parser_pipe_ = new DependencyPipe(parser_options_); - parser_pipe_->Initialize(); -} - -TurboParserWorker::~TurboParserWorker() { - LOG(INFO) << "Deleting parser pipe."; - delete parser_pipe_; - LOG(INFO) << "Deleting parser options."; - delete parser_options_; -} - -void TurboParserWorker::LoadParserModel(const std::string &file_model) { - parser_options_->SetModelFilePath(file_model); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - parser_pipe_->LoadModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboParserWorker::Parse(const std::string &file_test, - const std::string &file_prediction) { - parser_options_->SetTestFilePath(file_test); - parser_options_->SetOutputFilePath(file_prediction); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - parser_pipe_->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { - parser_pipe_->ClassifyInstance(sentence); -} - -TurboSemanticParserWorker::TurboSemanticParserWorker() { - semantic_options_ = new SemanticOptions; - semantic_options_->Initialize(); - - semantic_pipe_ = new SemanticPipe(semantic_options_); - semantic_pipe_->Initialize(); -} - -TurboSemanticParserWorker::~TurboSemanticParserWorker() { - LOG(INFO) << "Deleting semantic pipe."; - delete semantic_pipe_; - LOG(INFO) << "Deleting semantic options."; - delete semantic_options_; -} - -void TurboSemanticParserWorker::LoadSemanticParserModel( - const std::string &file_model) { - semantic_options_->SetModelFilePath(file_model); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - LOG(INFO) << "Loading model file " << file_model; - - semantic_pipe_->LoadModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboSemanticParserWorker::ParseSemanticDependencies( - const std::string &file_test, - const std::string &file_prediction) { - semantic_options_->SetTestFilePath(file_test); - semantic_options_->SetOutputFilePath(file_prediction); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - semantic_pipe_->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( - SemanticInstance *sentence) { - semantic_pipe_->ClassifyInstance(sentence); -} - -TurboCoreferenceResolverWorker::TurboCoreferenceResolverWorker() { - coreference_options_ = new CoreferenceOptions; - coreference_options_->Initialize(); - - coreference_pipe_ = new CoreferencePipe(coreference_options_); - coreference_pipe_->Initialize(); -} - -TurboCoreferenceResolverWorker::~TurboCoreferenceResolverWorker() { - LOG(INFO) << "Deleting coreference pipe."; - delete coreference_pipe_; - LOG(INFO) << "Deleting coreference options."; - delete coreference_options_; -} - -void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( - const std::string &file_model) { - coreference_options_->SetModelFilePath(file_model); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - LOG(INFO) << "Loading model file " << file_model; - - coreference_pipe_->LoadModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboCoreferenceResolverWorker::ResolveCoreferences( - const std::string &file_test, - const std::string &file_prediction) { - coreference_options_->SetTestFilePath(file_test); - coreference_options_->SetOutputFilePath(file_prediction); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - coreference_pipe_->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( - CoreferenceDocument *document) { - coreference_pipe_->ClassifyInstance(document); -} - -TurboMorphologicalTaggerWorker::TurboMorphologicalTaggerWorker() { - morphological_tagger_options_ = new MorphologicalOptions; - morphological_tagger_options_->Initialize(); - - morphological_tagger_pipe_ = - new MorphologicalPipe(morphological_tagger_options_); - morphological_tagger_pipe_->Initialize(); -} - -TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() { - LOG(INFO) << "Deleting tagger pipe."; - delete morphological_tagger_pipe_; - LOG(INFO) << "Deleting tagger options."; - delete morphological_tagger_options_; -} - -void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( - const std::string - &file_model) { - morphological_tagger_options_->SetModelFilePath(file_model); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - morphological_tagger_pipe_->LoadModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, - const std::string &file_prediction) { - morphological_tagger_options_->SetTestFilePath(file_test); - morphological_tagger_options_->SetOutputFilePath(file_prediction); - - int time; - timeval start, end; - gettimeofday(&start, NULL); - - morphological_tagger_pipe_->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TurboMorphologicalTaggerWorker::TagSentence( - MorphologicalInstance *sentence) { - morphological_tagger_pipe_->ClassifyInstance(sentence); -} - -TurboParserInterface::TurboParserInterface() { - argc_ = 0; - argv_ = NULL; - BuildArgumentList(); - - // Initialize Google's logging library. - google::InitGoogleLogging(argv_[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc_, &argv_, false); - -#ifdef _WIN32 - google::LogToStderr(); -#endif -} - -TurboParserInterface::~TurboParserInterface() { - LOG(INFO) << "Deleting tagger workers."; - DeleteAllTaggers(); - - LOG(INFO) << "Deleting morphological tagger workers."; - DeleteAllMorphologicalTaggers(); - - LOG(INFO) << "Deleting entity recognizer workers."; - DeleteAllEntityRecognizers(); - - LOG(INFO) << "Deleting parser workers."; - DeleteAllParsers(); - - LOG(INFO) << "Deleting semantic parser workers."; - DeleteAllSemanticParsers(); - - LOG(INFO) << "Deleting coreference resolver workers."; - DeleteAllCoreferenceResolvers(); - - LOG(INFO) << "Clearing argument list."; - ClearArgumentList(); - - LOG(INFO) << "Done."; -} -} // namespace TurboParserInterface. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "TurboParserInterface.h" + +namespace TurboParserInterface { +TurboTaggerWorker::TurboTaggerWorker() { + tagger_options_ = new TaggerOptions; + tagger_options_->Initialize(); + + tagger_pipe_ = new TaggerPipe(tagger_options_); + tagger_pipe_->Initialize(); +} + +TurboTaggerWorker::~TurboTaggerWorker() { + LOG(INFO) << "Deleting tagger pipe."; + delete tagger_pipe_; + LOG(INFO) << "Deleting tagger options."; + delete tagger_options_; +} + +void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { + tagger_options_->SetModelFilePath(file_model); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + tagger_pipe_->LoadModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboTaggerWorker::Tag(const std::string &file_test, + const std::string &file_prediction) { + tagger_options_->SetTestFilePath(file_test); + tagger_options_->SetOutputFilePath(file_prediction); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + tagger_pipe_->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { + tagger_pipe_->ClassifyInstance(sentence); +} + +TurboEntityRecognizerWorker::TurboEntityRecognizerWorker() { + entity_options_ = new EntityOptions; + entity_options_->Initialize(); + + entity_pipe_ = new EntityPipe(entity_options_); + entity_pipe_->Initialize(); +} + +TurboEntityRecognizerWorker::~TurboEntityRecognizerWorker() { + LOG(INFO) << "Deleting entity recognizer pipe."; + delete entity_pipe_; + LOG(INFO) << "Deleting entity recognizer options."; + delete entity_options_; +} + +void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( + const std::string &file_model) { + entity_options_->SetModelFilePath(file_model); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + entity_pipe_->LoadModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboEntityRecognizerWorker::Tag(const std::string &file_test, + const std::string &file_prediction) { + entity_options_->SetTestFilePath(file_test); + entity_options_->SetOutputFilePath(file_prediction); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + entity_pipe_->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { + entity_pipe_->ClassifyInstance(sentence); +} + +TurboParserWorker::TurboParserWorker() { + parser_options_ = new DependencyOptions; + parser_options_->Initialize(); + + parser_pipe_ = new DependencyPipe(parser_options_); + parser_pipe_->Initialize(); +} + +TurboParserWorker::~TurboParserWorker() { + LOG(INFO) << "Deleting parser pipe."; + delete parser_pipe_; + LOG(INFO) << "Deleting parser options."; + delete parser_options_; +} + +void TurboParserWorker::LoadParserModel(const std::string &file_model) { + parser_options_->SetModelFilePath(file_model); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + parser_pipe_->LoadModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboParserWorker::Parse(const std::string &file_test, + const std::string &file_prediction) { + parser_options_->SetTestFilePath(file_test); + parser_options_->SetOutputFilePath(file_prediction); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + parser_pipe_->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { + parser_pipe_->ClassifyInstance(sentence); +} + +TurboSemanticParserWorker::TurboSemanticParserWorker() { + semantic_options_ = new SemanticOptions; + semantic_options_->Initialize(); + + semantic_pipe_ = new SemanticPipe(semantic_options_); + semantic_pipe_->Initialize(); +} + +TurboSemanticParserWorker::~TurboSemanticParserWorker() { + LOG(INFO) << "Deleting semantic pipe."; + delete semantic_pipe_; + LOG(INFO) << "Deleting semantic options."; + delete semantic_options_; +} + +void TurboSemanticParserWorker::LoadSemanticParserModel( + const std::string &file_model) { + semantic_options_->SetModelFilePath(file_model); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + LOG(INFO) << "Loading model file " << file_model; + + semantic_pipe_->LoadModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboSemanticParserWorker::ParseSemanticDependencies( + const std::string &file_test, + const std::string &file_prediction) { + semantic_options_->SetTestFilePath(file_test); + semantic_options_->SetOutputFilePath(file_prediction); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + semantic_pipe_->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( + SemanticInstance *sentence) { + semantic_pipe_->ClassifyInstance(sentence); +} + +TurboCoreferenceResolverWorker::TurboCoreferenceResolverWorker() { + coreference_options_ = new CoreferenceOptions; + coreference_options_->Initialize(); + + coreference_pipe_ = new CoreferencePipe(coreference_options_); + coreference_pipe_->Initialize(); +} + +TurboCoreferenceResolverWorker::~TurboCoreferenceResolverWorker() { + LOG(INFO) << "Deleting coreference pipe."; + delete coreference_pipe_; + LOG(INFO) << "Deleting coreference options."; + delete coreference_options_; +} + +void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( + const std::string &file_model) { + coreference_options_->SetModelFilePath(file_model); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + LOG(INFO) << "Loading model file " << file_model; + + coreference_pipe_->LoadModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboCoreferenceResolverWorker::ResolveCoreferences( + const std::string &file_test, + const std::string &file_prediction) { + coreference_options_->SetTestFilePath(file_test); + coreference_options_->SetOutputFilePath(file_prediction); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + coreference_pipe_->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( + CoreferenceDocument *document) { + coreference_pipe_->ClassifyInstance(document); +} + +TurboMorphologicalTaggerWorker::TurboMorphologicalTaggerWorker() { + morphological_tagger_options_ = new MorphologicalOptions; + morphological_tagger_options_->Initialize(); + + morphological_tagger_pipe_ = + new MorphologicalPipe(morphological_tagger_options_); + morphological_tagger_pipe_->Initialize(); +} + +TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() { + LOG(INFO) << "Deleting tagger pipe."; + delete morphological_tagger_pipe_; + LOG(INFO) << "Deleting tagger options."; + delete morphological_tagger_options_; +} + +void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( + const std::string + &file_model) { + morphological_tagger_options_->SetModelFilePath(file_model); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + morphological_tagger_pipe_->LoadModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, + const std::string &file_prediction) { + morphological_tagger_options_->SetTestFilePath(file_test); + morphological_tagger_options_->SetOutputFilePath(file_prediction); + + int time; + timeval start, end; + gettimeofday(&start, NULL); + + morphological_tagger_pipe_->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Took " << static_cast(time) / 1000.0 + << " sec." << endl; +} + +void TurboMorphologicalTaggerWorker::TagSentence( + MorphologicalInstance *sentence) { + morphological_tagger_pipe_->ClassifyInstance(sentence); +} + +TurboParserInterface::TurboParserInterface() { + argc_ = 0; + argv_ = NULL; + BuildArgumentList(); + + // Initialize Google's logging library. + google::InitGoogleLogging(argv_[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc_, &argv_, false); + +#ifdef _WIN32 + google::LogToStderr(); +#endif +} + +TurboParserInterface::~TurboParserInterface() { + LOG(INFO) << "Deleting tagger workers."; + DeleteAllTaggers(); + + LOG(INFO) << "Deleting morphological tagger workers."; + DeleteAllMorphologicalTaggers(); + + LOG(INFO) << "Deleting entity recognizer workers."; + DeleteAllEntityRecognizers(); + + LOG(INFO) << "Deleting parser workers."; + DeleteAllParsers(); + + LOG(INFO) << "Deleting semantic parser workers."; + DeleteAllSemanticParsers(); + + LOG(INFO) << "Deleting coreference resolver workers."; + DeleteAllCoreferenceResolvers(); + + LOG(INFO) << "Clearing argument list."; + ClearArgumentList(); + + LOG(INFO) << "Done."; +} +} // namespace TurboParserInterface. diff --git a/libturboparser/TurboParserInterface.h b/libturboparser/TurboParserInterface.h index 8d475aa..dd26a7f 100644 --- a/libturboparser/TurboParserInterface.h +++ b/libturboparser/TurboParserInterface.h @@ -1,225 +1,225 @@ -#include -#include -#include "TaggerPipe.h" -#include "EntityPipe.h" -#include "DependencyPipe.h" -#include "SemanticPipe.h" -#include "CoreferencePipe.h" -#include "MorphologicalPipe.h" - -namespace TurboParserInterface { -class TurboTaggerWorker { -public: - TurboTaggerWorker(); - virtual ~TurboTaggerWorker(); - - void LoadTaggerModel(const std::string &file_model); - - void Tag(const std::string &file_test, - const std::string &file_prediction); - - void TagSentence(SequenceInstance *sentence); - -private: - TaggerOptions *tagger_options_; - TaggerPipe *tagger_pipe_; -}; - -class TurboEntityRecognizerWorker { -public: - TurboEntityRecognizerWorker(); - virtual ~TurboEntityRecognizerWorker(); - - void LoadEntityRecognizerModel(const std::string &file_model); - - void Tag(const std::string &file_test, - const std::string &file_prediction); - - void TagSentence(EntityInstance *sentence); - -private: - EntityOptions *entity_options_; - EntityPipe *entity_pipe_; -}; - -class TurboParserWorker { -public: - TurboParserWorker(); - virtual ~TurboParserWorker(); - - void LoadParserModel(const std::string &file_model); - - void Parse(const std::string &file_test, - const std::string &file_prediction); - - void ParseSentence(DependencyInstance *sentence); - -private: - DependencyOptions *parser_options_; - DependencyPipe *parser_pipe_; -}; - -class TurboSemanticParserWorker { -public: - TurboSemanticParserWorker(); - virtual ~TurboSemanticParserWorker(); - - void LoadSemanticParserModel(const std::string &file_model); - - void ParseSemanticDependencies(const std::string &file_test, - const std::string &file_prediction); - - void ParseSemanticDependenciesFromSentence(SemanticInstance *sentence); - -private: - SemanticOptions *semantic_options_; - SemanticPipe *semantic_pipe_; -}; - -class TurboCoreferenceResolverWorker { -public: - TurboCoreferenceResolverWorker(); - virtual ~TurboCoreferenceResolverWorker(); - - void LoadCoreferenceResolverModel(const std::string &file_model); - - void ResolveCoreferences(const std::string &file_test, - const std::string &file_prediction); - - void ResolveCoreferencesFromDocument(CoreferenceDocument *document); - -private: - CoreferenceOptions *coreference_options_; - CoreferencePipe *coreference_pipe_; -}; - -class TurboMorphologicalTaggerWorker { -public: - TurboMorphologicalTaggerWorker(); - virtual ~TurboMorphologicalTaggerWorker(); - - void LoadMorphologicalTaggerModel(const std::string &file_model); - - void Tag(const std::string &file_test, - const std::string &file_prediction); - - void TagSentence(MorphologicalInstance *sentence); - -private: - MorphologicalOptions *morphological_tagger_options_; - MorphologicalPipe *morphological_tagger_pipe_; -}; - -class TurboParserInterface { -public: - TurboParserInterface(); - virtual ~TurboParserInterface(); - - void ClearArgumentList() { - for (int i = 0; i < argc_; ++i) { - if (argv_[i]) free(argv_[i]); - } - delete[] argv_; - argc_ = 0; - } - - void BuildArgumentList() { - argc_ = 2; - argv_ = new char*[argc_]; - argv_[0] = strdup("TurboParser"); - argv_[1] = strdup("--logtostderr"); - } - - TurboTaggerWorker *CreateTagger() { - TurboTaggerWorker *tagger = new TurboTaggerWorker(); - taggers_.push_back(tagger); - return tagger; - } - - TurboEntityRecognizerWorker *CreateEntityRecognizer() { - TurboEntityRecognizerWorker *entity_recognizer = - new TurboEntityRecognizerWorker(); - entity_recognizers_.push_back(entity_recognizer); - return entity_recognizer; - } - - TurboParserWorker *CreateParser() { - TurboParserWorker *parser = new TurboParserWorker(); - parsers_.push_back(parser); - return parser; - } - - TurboSemanticParserWorker *CreateSemanticParser() { - TurboSemanticParserWorker *semantic_parser = - new TurboSemanticParserWorker(); - semantic_parsers_.push_back(semantic_parser); - return semantic_parser; - } - - TurboCoreferenceResolverWorker *CreateCoreferenceResolver() { - TurboCoreferenceResolverWorker *coreference_resolver = - new TurboCoreferenceResolverWorker(); - coreference_resolvers_.push_back(coreference_resolver); - return coreference_resolver; - } - - TurboMorphologicalTaggerWorker *CreateMorphologicalTagger() { - TurboMorphologicalTaggerWorker *morphological_tagger = - new TurboMorphologicalTaggerWorker(); - morphological_taggers_.push_back(morphological_tagger); - return morphological_tagger; - } - - void DeleteAllTaggers() { - for (int i = 0; i < taggers_.size(); ++i) { - delete taggers_[i]; - } - taggers_.clear(); - } - - void DeleteAllEntityRecognizers() { - for (int i = 0; i < entity_recognizers_.size(); ++i) { - delete entity_recognizers_[i]; - } - entity_recognizers_.clear(); - } - - void DeleteAllParsers() { - for (int i = 0; i < parsers_.size(); ++i) { - delete parsers_[i]; - } - parsers_.clear(); - } - - void DeleteAllSemanticParsers() { - for (int i = 0; i < semantic_parsers_.size(); ++i) { - delete semantic_parsers_[i]; - } - semantic_parsers_.clear(); - } - - void DeleteAllCoreferenceResolvers() { - for (int i = 0; i < coreference_resolvers_.size(); ++i) { - delete coreference_resolvers_[i]; - } - coreference_resolvers_.clear(); - } - - void DeleteAllMorphologicalTaggers() { - for (int i = 0; i < morphological_taggers_.size(); ++i) { - delete morphological_taggers_[i]; - } - morphological_taggers_.clear(); - } - -private: - int argc_; - char** argv_; - std::vector taggers_; - std::vector parsers_; - std::vector semantic_parsers_; - std::vector entity_recognizers_; - std::vector coreference_resolvers_; - std::vector morphological_taggers_; -}; -} // namespace TurboParserInterface. +#include +#include +#include "TaggerPipe.h" +#include "EntityPipe.h" +#include "DependencyPipe.h" +#include "SemanticPipe.h" +#include "CoreferencePipe.h" +#include "MorphologicalPipe.h" + +namespace TurboParserInterface { +class TurboTaggerWorker { +public: + TurboTaggerWorker(); + virtual ~TurboTaggerWorker(); + + void LoadTaggerModel(const std::string &file_model); + + void Tag(const std::string &file_test, + const std::string &file_prediction); + + void TagSentence(SequenceInstance *sentence); + +private: + TaggerOptions *tagger_options_; + TaggerPipe *tagger_pipe_; +}; + +class TurboEntityRecognizerWorker { +public: + TurboEntityRecognizerWorker(); + virtual ~TurboEntityRecognizerWorker(); + + void LoadEntityRecognizerModel(const std::string &file_model); + + void Tag(const std::string &file_test, + const std::string &file_prediction); + + void TagSentence(EntityInstance *sentence); + +private: + EntityOptions *entity_options_; + EntityPipe *entity_pipe_; +}; + +class TurboParserWorker { +public: + TurboParserWorker(); + virtual ~TurboParserWorker(); + + void LoadParserModel(const std::string &file_model); + + void Parse(const std::string &file_test, + const std::string &file_prediction); + + void ParseSentence(DependencyInstance *sentence); + +private: + DependencyOptions *parser_options_; + DependencyPipe *parser_pipe_; +}; + +class TurboSemanticParserWorker { +public: + TurboSemanticParserWorker(); + virtual ~TurboSemanticParserWorker(); + + void LoadSemanticParserModel(const std::string &file_model); + + void ParseSemanticDependencies(const std::string &file_test, + const std::string &file_prediction); + + void ParseSemanticDependenciesFromSentence(SemanticInstance *sentence); + +private: + SemanticOptions *semantic_options_; + SemanticPipe *semantic_pipe_; +}; + +class TurboCoreferenceResolverWorker { +public: + TurboCoreferenceResolverWorker(); + virtual ~TurboCoreferenceResolverWorker(); + + void LoadCoreferenceResolverModel(const std::string &file_model); + + void ResolveCoreferences(const std::string &file_test, + const std::string &file_prediction); + + void ResolveCoreferencesFromDocument(CoreferenceDocument *document); + +private: + CoreferenceOptions *coreference_options_; + CoreferencePipe *coreference_pipe_; +}; + +class TurboMorphologicalTaggerWorker { +public: + TurboMorphologicalTaggerWorker(); + virtual ~TurboMorphologicalTaggerWorker(); + + void LoadMorphologicalTaggerModel(const std::string &file_model); + + void Tag(const std::string &file_test, + const std::string &file_prediction); + + void TagSentence(MorphologicalInstance *sentence); + +private: + MorphologicalOptions *morphological_tagger_options_; + MorphologicalPipe *morphological_tagger_pipe_; +}; + +class TurboParserInterface { +public: + TurboParserInterface(); + virtual ~TurboParserInterface(); + + void ClearArgumentList() { + for (int i = 0; i < argc_; ++i) { + if (argv_[i]) free(argv_[i]); + } + delete[] argv_; + argc_ = 0; + } + + void BuildArgumentList() { + argc_ = 2; + argv_ = new char*[argc_]; + argv_[0] = strdup("TurboParser"); + argv_[1] = strdup("--logtostderr"); + } + + TurboTaggerWorker *CreateTagger() { + TurboTaggerWorker *tagger = new TurboTaggerWorker(); + taggers_.push_back(tagger); + return tagger; + } + + TurboEntityRecognizerWorker *CreateEntityRecognizer() { + TurboEntityRecognizerWorker *entity_recognizer = + new TurboEntityRecognizerWorker(); + entity_recognizers_.push_back(entity_recognizer); + return entity_recognizer; + } + + TurboParserWorker *CreateParser() { + TurboParserWorker *parser = new TurboParserWorker(); + parsers_.push_back(parser); + return parser; + } + + TurboSemanticParserWorker *CreateSemanticParser() { + TurboSemanticParserWorker *semantic_parser = + new TurboSemanticParserWorker(); + semantic_parsers_.push_back(semantic_parser); + return semantic_parser; + } + + TurboCoreferenceResolverWorker *CreateCoreferenceResolver() { + TurboCoreferenceResolverWorker *coreference_resolver = + new TurboCoreferenceResolverWorker(); + coreference_resolvers_.push_back(coreference_resolver); + return coreference_resolver; + } + + TurboMorphologicalTaggerWorker *CreateMorphologicalTagger() { + TurboMorphologicalTaggerWorker *morphological_tagger = + new TurboMorphologicalTaggerWorker(); + morphological_taggers_.push_back(morphological_tagger); + return morphological_tagger; + } + + void DeleteAllTaggers() { + for (int i = 0; i < taggers_.size(); ++i) { + delete taggers_[i]; + } + taggers_.clear(); + } + + void DeleteAllEntityRecognizers() { + for (int i = 0; i < entity_recognizers_.size(); ++i) { + delete entity_recognizers_[i]; + } + entity_recognizers_.clear(); + } + + void DeleteAllParsers() { + for (int i = 0; i < parsers_.size(); ++i) { + delete parsers_[i]; + } + parsers_.clear(); + } + + void DeleteAllSemanticParsers() { + for (int i = 0; i < semantic_parsers_.size(); ++i) { + delete semantic_parsers_[i]; + } + semantic_parsers_.clear(); + } + + void DeleteAllCoreferenceResolvers() { + for (int i = 0; i < coreference_resolvers_.size(); ++i) { + delete coreference_resolvers_[i]; + } + coreference_resolvers_.clear(); + } + + void DeleteAllMorphologicalTaggers() { + for (int i = 0; i < morphological_taggers_.size(); ++i) { + delete morphological_taggers_[i]; + } + morphological_taggers_.clear(); + } + +private: + int argc_; + char** argv_; + std::vector taggers_; + std::vector parsers_; + std::vector semantic_parsers_; + std::vector entity_recognizers_; + std::vector coreference_resolvers_; + std::vector morphological_taggers_; +}; +} // namespace TurboParserInterface. diff --git a/morphological_tagger/scripts/train_test_morphological_tagger.sh b/morphological_tagger/scripts/train_test_morphological_tagger.sh index b037e22..78fc947 100755 --- a/morphological_tagger/scripts/train_test_morphological_tagger.sh +++ b/morphological_tagger/scripts/train_test_morphological_tagger.sh @@ -1,95 +1,95 @@ -#!/bin/bash - -# Root folder where TurboParser is installed. -root_folder="`cd $(dirname $0);cd ../..;pwd`" -task_folder="`cd $(dirname $0);cd ..;pwd`" -export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${root_folder}/deps/local/lib" - -# Set options. -language=$1 # Example: "UD_Danish". -language_prefix=$2 # Example: "da-ud" -train_algorithm=svm_mira # Training algorithm. -num_epochs=20 # Number of training epochs. -regularization_parameter=0.01 # The C parameter in MIRA. -train=true -test=true -model_type=0 # 0 for unigrams, 1 for bigrams, 2 for trigrams. -form_cutoff=1 # Word cutoff. Only words which occur more than these times won't be considered unknown. -prefix_length=0 -suffix_length=3 -suffix=morphological_tagger - -# Set path folders. -path_bin=${root_folder} # Folder containing the binary. -path_scripts=${task_folder}/scripts # Folder containing scripts. -path_data=${task_folder}/data/${language} # Folder with the data. -path_models=${task_folder}/models/${language} # Folder where models are stored. -path_results=${task_folder}/results/${language} # Folder for the results. - -# Create folders if they don't exist. -mkdir -p ${path_data} -mkdir -p ${path_models} -mkdir -p ${path_results} - -# Set file paths. Allow multiple test files. -file_model=${path_models}/${language_prefix}_${suffix}.model -file_train=${path_data}/${language_prefix}-train.conllu -files_test[0]=${path_data}/${language_prefix}-test.conllu -files_test[1]=${path_data}/${language_prefix}-dev.conllu - -# Obtain a prediction file path for each test file. -for (( i=0; i<${#files_test[*]}; i++ )) -do - file_test=${files_test[$i]} - file_prediction=${file_test}.pred - files_prediction[$i]=${file_prediction} -done - -################################################ -# Train the morphological tagger. -################################################ - -if $train -then - echo "Training..." - ${path_bin}/TurboMorphologicalTagger \ - --train \ - --train_epochs=${num_epochs} \ - --file_model=${file_model} \ - --file_train=${file_train} \ - --train_algorithm=${train_algorithm} \ - --train_regularization_constant=${regularization_parameter} \ - --sequence_model_type=${model_type} \ - --form_cutoff=${form_cutoff} \ - --prefix_length=${prefix_length} \ - --suffix_length=${suffix_length} \ - --logtostderr -fi - -################################################ -# Test the tagger. -################################################ - -if $test -then - - for (( i=0; i<${#files_test[*]}; i++ )) - do - file_test=${files_test[$i]} - file_prediction=${files_prediction[$i]} - - echo "" - echo "Testing on ${file_test}..." - ${path_bin}/TurboMorphologicalTagger \ - --test \ - --evaluate \ - --file_model=${file_model} \ - --file_test=${file_test} \ - --file_prediction=${file_prediction} \ - --logtostderr - - echo "" - #echo "Evaluating..." - #perl ${path_scripts}/eval_predpos.pl ${file_prediction} ${file_test} - done -fi +#!/bin/bash + +# Root folder where TurboParser is installed. +root_folder="`cd $(dirname $0);cd ../..;pwd`" +task_folder="`cd $(dirname $0);cd ..;pwd`" +export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${root_folder}/deps/local/lib" + +# Set options. +language=$1 # Example: "UD_Danish". +language_prefix=$2 # Example: "da-ud" +train_algorithm=svm_mira # Training algorithm. +num_epochs=20 # Number of training epochs. +regularization_parameter=0.01 # The C parameter in MIRA. +train=true +test=true +model_type=0 # 0 for unigrams, 1 for bigrams, 2 for trigrams. +form_cutoff=1 # Word cutoff. Only words which occur more than these times won't be considered unknown. +prefix_length=0 +suffix_length=3 +suffix=morphological_tagger + +# Set path folders. +path_bin=${root_folder} # Folder containing the binary. +path_scripts=${task_folder}/scripts # Folder containing scripts. +path_data=${task_folder}/data/${language} # Folder with the data. +path_models=${task_folder}/models/${language} # Folder where models are stored. +path_results=${task_folder}/results/${language} # Folder for the results. + +# Create folders if they don't exist. +mkdir -p ${path_data} +mkdir -p ${path_models} +mkdir -p ${path_results} + +# Set file paths. Allow multiple test files. +file_model=${path_models}/${language_prefix}_${suffix}.model +file_train=${path_data}/${language_prefix}-train.conllu +files_test[0]=${path_data}/${language_prefix}-test.conllu +files_test[1]=${path_data}/${language_prefix}-dev.conllu + +# Obtain a prediction file path for each test file. +for (( i=0; i<${#files_test[*]}; i++ )) +do + file_test=${files_test[$i]} + file_prediction=${file_test}.pred + files_prediction[$i]=${file_prediction} +done + +################################################ +# Train the morphological tagger. +################################################ + +if $train +then + echo "Training..." + ${path_bin}/TurboMorphologicalTagger \ + --train \ + --train_epochs=${num_epochs} \ + --file_model=${file_model} \ + --file_train=${file_train} \ + --train_algorithm=${train_algorithm} \ + --train_regularization_constant=${regularization_parameter} \ + --sequence_model_type=${model_type} \ + --form_cutoff=${form_cutoff} \ + --prefix_length=${prefix_length} \ + --suffix_length=${suffix_length} \ + --logtostderr +fi + +################################################ +# Test the tagger. +################################################ + +if $test +then + + for (( i=0; i<${#files_test[*]}; i++ )) + do + file_test=${files_test[$i]} + file_prediction=${files_prediction[$i]} + + echo "" + echo "Testing on ${file_test}..." + ${path_bin}/TurboMorphologicalTagger \ + --test \ + --evaluate \ + --file_model=${file_model} \ + --file_test=${file_test} \ + --file_prediction=${file_prediction} \ + --logtostderr + + echo "" + #echo "Evaluating..." + #perl ${path_scripts}/eval_predpos.pl ${file_prediction} ${file_test} + done +fi diff --git a/python/nlp_document.py b/python/nlp_document.py index bd1ca4b..3713cc8 100644 --- a/python/nlp_document.py +++ b/python/nlp_document.py @@ -1,68 +1,68 @@ -import turboparser as tp -from nlp_sentence import NLPSentence - -class NLPDocument(dict): - def __init__(self, sentences): - self['sentences'] = sentences - - def compute_coreferences(self, worker): - sentences = self['sentences'] - coreference_sentences = [] - for sentence in sentences: - sentence['coreference_spans'] = None - words = sentence['words'] - tags = sentence['tags'] - lemmas = sentence['lemmas'] - # TurboParser assumes 1-based indexing. - heads = [h+1 for h in sentence['heads']] - deprels = sentence['dependency_relations'] - # For now, don't use this (must be coded as spans). - entity_tags = sentence['entity_tags'] - feats = [[] for word in words] - predicate_names = [] - predicate_indices = [] - argument_roles = [] - argument_indices = [] - speakers = ['-' for word in words] - # TurboParser requires pre-appending a dummy root symbol. - words_with_root = ['_root_'] + words - lemmas_with_root = ['_root_'] + lemmas - tags_with_root = ['_root_'] + tags - feats_with_root = [['_root_']] + feats - deprels_with_root = ['_root_'] + deprels - heads_with_root = [-1] + heads - speakers_with_root = ['__'] + speakers - p_entity_spans = [] - p_constituent_spans = [] - p_coreference_spans = [] - coreference_sentence = tp.PCoreferenceSentence() - coreference_sentence.initialize('', \ - words_with_root, \ - lemmas_with_root, \ - tags_with_root, \ - tags_with_root, \ - feats_with_root, \ - deprels_with_root, \ - heads_with_root, \ - predicate_names, \ - predicate_indices, \ - argument_roles, \ - argument_indices, \ - speakers_with_root, \ - p_entity_spans, \ - p_constituent_spans, \ - p_coreference_spans) - coreference_sentences.append(coreference_sentence) - - coreference_document = tp.PCoreferenceDocument() - coreference_document.initialize('', 0, coreference_sentences) - worker.coreference_resolver.resolve_coreferences_from_document( \ - coreference_document) - - for i, sentence in enumerate(sentences): - coreference_sentence = coreference_document.get_sentence(i) - coreference_spans = coreference_sentence.get_coreference_spans() - # Convert back to 0-based indexing. - sentence['coreference_spans'] = \ - [(span.start()-1, span.end()-1, span.name()) \ - for span in coreference_spans] +import turboparser as tp +from nlp_sentence import NLPSentence + +class NLPDocument(dict): + def __init__(self, sentences): + self['sentences'] = sentences + + def compute_coreferences(self, worker): + sentences = self['sentences'] + coreference_sentences = [] + for sentence in sentences: + sentence['coreference_spans'] = None + words = sentence['words'] + tags = sentence['tags'] + lemmas = sentence['lemmas'] + # TurboParser assumes 1-based indexing. + heads = [h+1 for h in sentence['heads']] + deprels = sentence['dependency_relations'] + # For now, don't use this (must be coded as spans). + entity_tags = sentence['entity_tags'] + feats = [[] for word in words] + predicate_names = [] + predicate_indices = [] + argument_roles = [] + argument_indices = [] + speakers = ['-' for word in words] + # TurboParser requires pre-appending a dummy root symbol. + words_with_root = ['_root_'] + words + lemmas_with_root = ['_root_'] + lemmas + tags_with_root = ['_root_'] + tags + feats_with_root = [['_root_']] + feats + deprels_with_root = ['_root_'] + deprels + heads_with_root = [-1] + heads + speakers_with_root = ['__'] + speakers + p_entity_spans = [] + p_constituent_spans = [] + p_coreference_spans = [] + coreference_sentence = tp.PCoreferenceSentence() + coreference_sentence.initialize('', \ + words_with_root, \ + lemmas_with_root, \ + tags_with_root, \ + tags_with_root, \ + feats_with_root, \ + deprels_with_root, \ + heads_with_root, \ + predicate_names, \ + predicate_indices, \ + argument_roles, \ + argument_indices, \ + speakers_with_root, \ + p_entity_spans, \ + p_constituent_spans, \ + p_coreference_spans) + coreference_sentences.append(coreference_sentence) + + coreference_document = tp.PCoreferenceDocument() + coreference_document.initialize('', 0, coreference_sentences) + worker.coreference_resolver.resolve_coreferences_from_document( \ + coreference_document) + + for i, sentence in enumerate(sentences): + coreference_sentence = coreference_document.get_sentence(i) + coreference_spans = coreference_sentence.get_coreference_spans() + # Convert back to 0-based indexing. + sentence['coreference_spans'] = \ + [(span.start()-1, span.end()-1, span.name()) \ + for span in coreference_spans] diff --git a/python/nlp_pipeline.config b/python/nlp_pipeline.config index c80e93c..1102591 100644 --- a/python/nlp_pipeline.config +++ b/python/nlp_pipeline.config @@ -1,56 +1,56 @@ -PT -splitter="tokenizers/punkt/portuguese.pickle" -tagger="/home/afm/projects/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_tagger.model" -parser="/home/afm/projects/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" -lemmatizer="/home/afm/projects/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_lemmatizer.model" - -ES -splitter="tokenizers/punkt/spanish.pickle" -tagger="/home/afm/projects/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_tagger.model" -entity_recognizer="/home/afm/projects/TurboParser/ner/models/spanish/spanish_entity_recognizer.model" -parser="/home/afm/projects/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" -semantic_parser="/home/afm/projects/TurboParser/srl/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" -coreference_resolver="/home/afm/projects/TurboParser/coreference_resolver/models/spanish/spanish_coreference_resolver.model" -lemmatizer="/home/afm/projects/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_lemmatizer.model" - -EN -splitter="tokenizers/punkt/english.pickle" -tagger="/home/afm/projects/TurboParser/models/english_proj/english_proj_tagger.model" -parser="/home/afm/projects/TurboParser/models/english_proj/english_proj_parser_pruned-true_model-standard.model" - -EN-Nonprojective -splitter="tokenizers/punkt/english.pickle" -tagger="/home/afm/projects/TurboParser/models/english_proj/english_proj_tagger.model" -entity_recognizer="/home/afm/projects/TurboParser/ner/models/english/english_entity_recognizer.model" -parser="/home/afm/projects/TurboParser/models/english/english_parser_pruned-true_model-standard.model" -semantic_parser="/home/afm/projects/TurboParser/srl/models/english/english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" -coreference_resolver="/home/afm/projects/TurboParser/coreference_resolver/models/english_ontonotes_conll2012/english_ontonotes_conll2012_coreference_resolver.model" -lemmatizer="/home/afm/projects/TurboParser/models/english/english_lemmatizer.model" - -PT-BR-Universal -splitter="tokenizers/punkt/portuguese.pickle" -tagger="/home/afm/projects/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_tagger.model" -parser="/home/afm/projects/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_parser_pruned-true_model-standard.model" -morphological_tagger="/home/afm/projects/TurboParser/morphological_tagger/models/UD_Portuguese/pt-ud_morphological_tagger.model" - -ES-Universal -splitter="tokenizers/punkt/spanish.pickle" -tagger="/home/afm/projects/TurboParser/models/spanish_universal/spanish_universal_tagger.model" -parser="/home/afm/projects/TurboParser/models/spanish_universal/spanish_universal_parser_pruned-true_model-standard.model" -morphological_tagger="/home/afm/projects/TurboParser/morphological_tagger/models/UD_Spanish/es-ud_morphological_tagger.model" - -FR-Universal -splitter="tokenizers/punkt/french.pickle" -tagger="/home/afm/projects/TurboParser/models/french_universal/french_universal_tagger.model" -parser="/home/afm/projects/TurboParser/models/french_universal/french_universal_parser_pruned-true_model-standard.model" - -IT-Universal -splitter="tokenizers/punkt/italian.pickle" -tagger="/home/afm/projects/TurboParser/models/italian_universal/italian_universal_tagger.model" -parser="/home/afm/projects/TurboParser/models/italian_universal/italian_universal_parser_pruned-true_model-standard.model" -morphological_tagger="/home/afm/projects/TurboParser/morphological_tagger/models/UD_Italian/it-ud_morphological_tagger.model" - -DE-Universal -splitter="tokenizers/punkt/german.pickle" -tagger="/home/afm/projects/TurboParser/models/german_universal/german_universal_tagger.model" -parser="/home/afm/projects/TurboParser/models/german_universal/german_universal_parser_pruned-true_model-standard.model" +PT +splitter="tokenizers/punkt/portuguese.pickle" +tagger="/home/afm/projects/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_tagger.model" +parser="/home/afm/projects/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" +lemmatizer="/home/afm/projects/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_lemmatizer.model" + +ES +splitter="tokenizers/punkt/spanish.pickle" +tagger="/home/afm/projects/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_tagger.model" +entity_recognizer="/home/afm/projects/TurboParser/ner/models/spanish/spanish_entity_recognizer.model" +parser="/home/afm/projects/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" +semantic_parser="/home/afm/projects/TurboParser/srl/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" +coreference_resolver="/home/afm/projects/TurboParser/coreference_resolver/models/spanish/spanish_coreference_resolver.model" +lemmatizer="/home/afm/projects/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_lemmatizer.model" + +EN +splitter="tokenizers/punkt/english.pickle" +tagger="/home/afm/projects/TurboParser/models/english_proj/english_proj_tagger.model" +parser="/home/afm/projects/TurboParser/models/english_proj/english_proj_parser_pruned-true_model-standard.model" + +EN-Nonprojective +splitter="tokenizers/punkt/english.pickle" +tagger="/home/afm/projects/TurboParser/models/english_proj/english_proj_tagger.model" +entity_recognizer="/home/afm/projects/TurboParser/ner/models/english/english_entity_recognizer.model" +parser="/home/afm/projects/TurboParser/models/english/english_parser_pruned-true_model-standard.model" +semantic_parser="/home/afm/projects/TurboParser/srl/models/english/english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" +coreference_resolver="/home/afm/projects/TurboParser/coreference_resolver/models/english_ontonotes_conll2012/english_ontonotes_conll2012_coreference_resolver.model" +lemmatizer="/home/afm/projects/TurboParser/models/english/english_lemmatizer.model" + +PT-BR-Universal +splitter="tokenizers/punkt/portuguese.pickle" +tagger="/home/afm/projects/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_tagger.model" +parser="/home/afm/projects/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_parser_pruned-true_model-standard.model" +morphological_tagger="/home/afm/projects/TurboParser/morphological_tagger/models/UD_Portuguese/pt-ud_morphological_tagger.model" + +ES-Universal +splitter="tokenizers/punkt/spanish.pickle" +tagger="/home/afm/projects/TurboParser/models/spanish_universal/spanish_universal_tagger.model" +parser="/home/afm/projects/TurboParser/models/spanish_universal/spanish_universal_parser_pruned-true_model-standard.model" +morphological_tagger="/home/afm/projects/TurboParser/morphological_tagger/models/UD_Spanish/es-ud_morphological_tagger.model" + +FR-Universal +splitter="tokenizers/punkt/french.pickle" +tagger="/home/afm/projects/TurboParser/models/french_universal/french_universal_tagger.model" +parser="/home/afm/projects/TurboParser/models/french_universal/french_universal_parser_pruned-true_model-standard.model" + +IT-Universal +splitter="tokenizers/punkt/italian.pickle" +tagger="/home/afm/projects/TurboParser/models/italian_universal/italian_universal_tagger.model" +parser="/home/afm/projects/TurboParser/models/italian_universal/italian_universal_parser_pruned-true_model-standard.model" +morphological_tagger="/home/afm/projects/TurboParser/morphological_tagger/models/UD_Italian/it-ud_morphological_tagger.model" + +DE-Universal +splitter="tokenizers/punkt/german.pickle" +tagger="/home/afm/projects/TurboParser/models/german_universal/german_universal_tagger.model" +parser="/home/afm/projects/TurboParser/models/german_universal/german_universal_parser_pruned-true_model-standard.model" diff --git a/python/nlp_pipeline.py b/python/nlp_pipeline.py index 87c2b51..e9e0699 100644 --- a/python/nlp_pipeline.py +++ b/python/nlp_pipeline.py @@ -1,245 +1,245 @@ -import nltk -import tokenizers.portuguese.word_tokenizer as tokenizer_PT -import lemmatizer -import turboparser as tp -from nlp_sentence import NLPSentence -from nlp_document import NLPDocument -import nlp_utils -from span import Span -import os -import pdb - -class NLPPipelineWorker: - def __init__(self, pipeline, language): - self.tagger = None - self.morphological_tagger = None - self.entity_recognizer = None - self.parser = None - self.semantic_parser = None - self.lemmatizer = None - self.coreference_resolver = None - - if language not in pipeline.models: - print 'Error: no model for language %s.' % language - raise NotImplementedError - - if 'splitter' in pipeline.models[language]: - self.sent_tokenizer = nltk.data.load(pipeline.models[language]['splitter']) - else: - # If no splitter is specified, use the English model. - self.sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') - - if language == 'PT': - self.word_tokenizer = tokenizer_PT.PortugueseFlorestaWordTokenizer() - elif language == 'PT-Cintil': - self.word_tokenizer = tokenizer_PT.PortugueseCintilWordTokenizer() - else: - self.word_tokenizer = nltk.TreebankWordTokenizer() # For now... - - if 'tagger' in pipeline.models[language]: - self.tagger = pipeline.turbo_interface.create_tagger() - self.tagger.load_tagger_model(pipeline.models[language]['tagger']) - if 'morphological_tagger' in pipeline.models[language]: - self.morphological_tagger = pipeline.turbo_interface.create_morphological_tagger() - self.morphological_tagger.load_morphological_tagger_model(pipeline.models[language]['morphological_tagger']) - if 'entity_recognizer' in pipeline.models[language]: - self.entity_recognizer = pipeline.turbo_interface.create_entity_recognizer() - self.entity_recognizer.load_entity_recognizer_model(pipeline.models[language]['entity_recognizer']) - if 'parser' in pipeline.models[language]: - self.parser = pipeline.turbo_interface.create_parser() - self.parser.load_parser_model(pipeline.models[language]['parser']) - if 'lemmatizer' in pipeline.models[language]: - self.lemmatizer = lemmatizer.BasicLemmatizer() - self.lemmatizer.load_lemmatizer_model(pipeline.models[language]['lemmatizer']) - if 'semantic_parser' in pipeline.models[language]: - self.semantic_parser = pipeline.turbo_interface.create_semantic_parser() - self.semantic_parser.load_semantic_parser_model(pipeline.models[language]['semantic_parser']) - if 'coreference_resolver' in pipeline.models[language]: - self.coreference_resolver = pipeline.turbo_interface.create_coreference_resolver() - self.coreference_resolver.load_coreference_resolver_model(pipeline.models[language]['coreference_resolver']) - - -class NLPPipeline: - def __init__(self): - # Load the initialization file. - configuration_filepath = os.path.dirname(os.path.realpath(__file__)) + \ - os.sep + 'nlp_pipeline.config' - self.models = {} - self.load_configuration_file(configuration_filepath) - self.turbo_interface = tp.PTurboParser() - self.workers = {} - - def load_configuration_file(self, filepath): - f = open(filepath) - language = '' - for line in f: - line = line.rstrip('\r\n') - if line == '': - language = '' - continue - # Ignore comments. - index = line.find('#') - if index >= 0: - line = line[:index] - line = line.strip() - if line == '': - continue - if language == '': - language = line - print 'Loading information for %s' % language - self.models[language] = {} - else: - pair = line.split('=') - assert len(pair) == 2, pdb.set_trace() - name = pair[0] - value = pair[1].strip('"') - self.models[language][name] = value - f.close() - - def get_worker(self, language): - if language in self.workers: - return self.workers[language] - else: - worker = NLPPipelineWorker(self, language) - self.workers[language] = worker - return worker - - def split_sentences(self, text, language): - worker = self.get_worker(language) - sentences = worker.sent_tokenizer.tokenize(text) - return sentences - - def tokenize(self, sentence, language): - worker = self.get_worker(language) - tokenized_sentence = worker.word_tokenizer.tokenize(sentence) - return tokenized_sentence - - def tag(self, tokenized_sentence, language): - worker = self.get_worker(language) - sent = NLPSentence() - sent['words'] = tokenized_sentence - sent.compute_morphology(worker) - tags = sent['tags'] - if sent['lemmas'] != None: - lemmas = sent['lemmas'] - else: - lemmas = ['_' for token in tokenized_sentence] - if sent['morphological_tags'] != None: - feats = ['|'.join(morph) if len(morph) > 0 else '_' \ - for morph in sent['morphological_tags']] - else: - feats = ['_' for token in tokenized_sentence] - return tags, lemmas, feats - - def recognize_entities(self, tokenized_sentence, tags, language): - worker = self.get_worker(language) - sent = NLPSentence() - sent['words'] = tokenized_sentence - sent['tags'] = tags - sent.compute_entities(worker) - entity_tags = sent['entity_tags'] - return entity_tags - - def parse(self, tokenized_sentence, tags, lemmas, language): - worker = self.get_worker(language) - sent = NLPSentence() - sent['words'] = tokenized_sentence - sent['tags'] = tags - sent['lemmas'] = lemmas - sent.compute_syntactic_dependencies(worker) - # Convert to 1-based indexing for back-compatibility. - #heads = [h+1 for h in sent['heads']] - heads = sent['heads'] - deprels = sent['dependency_relations'] - return heads, deprels - - def has_morphological_tagger(self, language): - worker = self.get_worker(language) - return (worker.morphological_tagger != None) - - def has_entity_recognizer(self, language): - worker = self.get_worker(language) - return (worker.entity_recognizer != None) - - def has_semantic_parser(self, language): - worker = self.get_worker(language) - return (worker.semantic_parser != None) - - def has_coreference_resolver(self, language): - worker = self.get_worker(language) - return (worker.coreference_resolver != None) - - def parse_semantic_dependencies(self, tokenized_sentence, tags, lemmas, - heads, deprels, language): - worker = self.get_worker(language) - sent = NLPSentence() - sent['words'] = tokenized_sentence - sent['tags'] = tags - sent['lemmas'] = lemmas - sent['heads'] = heads - # Convert from 1-based indexing for back-compatibility. - #sent['heads'] = [h-1 for h in heads] - sent['dependency_relations'] = deprels - sent.compute_semantic_dependencies(worker) - num_predicates = len(sent['predicate_names']) - predicates = ['_' for token in tokenized_sentence] - argument_lists = [['_' for k in xrange(num_predicates)] \ - for token in tokenized_sentence] - for k in xrange(num_predicates): - name = sent['predicate_names'][k] - p = sent['predicate_indices'][k] - predicates[p] = name - for l in xrange(len(sent['argument_roles'][k])): - role = sent['argument_roles'][k][l] - a = sent['argument_indices'][k][l] - argument_lists[a][k] = role - return predicates, argument_lists - - def resolve_coreferences(self, all_tokenized_sentences, all_tags, - all_lemmas, all_heads, all_deprels, - all_entity_tags, language): - worker = self.get_worker(language) - sents = [] - for j, tokenized_sentence in enumerate(all_tokenized_sentences): - sent = NLPSentence() - sent['words'] = tokenized_sentence - sent['tags'] = all_tags[j] - sent['lemmas'] = all_lemmas[j] - sent['heads'] = all_heads[j] - # Convert from 1-based indexing for back-compatibility. - #sent['heads'] = [h-1 for h in all_heads[j]] - sent['dependency_relations'] = all_deprels[j] - # For now, don't use this (must be coded as spans). - sent['entity_tags'] = all_entity_tags[j] - sents.append(sent) - doc = NLPDocument(sents) - doc.compute_coreferences(worker) - - # Convert from spans to coref info. - all_coref_info = [] - for sent in doc['sentences']: - spans = [] - for (start, end, name) in sent['coreference_spans']: - span = Span(start, end, name) - spans.append(span) - coref_info = nlp_utils.construct_coreference_info_from_spans( \ - spans, len(sent['words'])) - all_coref_info.append(coref_info) - - return all_coref_info - - def parse_conll(self, text, language): - sentences = self.split_sentences(text, language) - conll_str = '' - for sentence in sentences: - tokenized_sentence = self.tokenize(sentence, language) - tags, lemmas, feats = self.tag(tokenized_sentence, language) - heads, deprels = self.parse(tokenized_sentence, tags, lemmas, - language) - for i, token in enumerate(tokenized_sentence): - conll_str += str(i+1) + '\t' + token + '\t' + lemmas[i] + \ - '\t' + tags[i] + '\t' + tags[i] + '\t' + \ - feats[i] + '\t' + str(heads[i]+1) + '\t' + \ - deprels[i] + '\n' - conll_str += '\n' - return conll_str +import nltk +import tokenizers.portuguese.word_tokenizer as tokenizer_PT +import lemmatizer +import turboparser as tp +from nlp_sentence import NLPSentence +from nlp_document import NLPDocument +import nlp_utils +from span import Span +import os +import pdb + +class NLPPipelineWorker: + def __init__(self, pipeline, language): + self.tagger = None + self.morphological_tagger = None + self.entity_recognizer = None + self.parser = None + self.semantic_parser = None + self.lemmatizer = None + self.coreference_resolver = None + + if language not in pipeline.models: + print 'Error: no model for language %s.' % language + raise NotImplementedError + + if 'splitter' in pipeline.models[language]: + self.sent_tokenizer = nltk.data.load(pipeline.models[language]['splitter']) + else: + # If no splitter is specified, use the English model. + self.sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') + + if language == 'PT': + self.word_tokenizer = tokenizer_PT.PortugueseFlorestaWordTokenizer() + elif language == 'PT-Cintil': + self.word_tokenizer = tokenizer_PT.PortugueseCintilWordTokenizer() + else: + self.word_tokenizer = nltk.TreebankWordTokenizer() # For now... + + if 'tagger' in pipeline.models[language]: + self.tagger = pipeline.turbo_interface.create_tagger() + self.tagger.load_tagger_model(pipeline.models[language]['tagger']) + if 'morphological_tagger' in pipeline.models[language]: + self.morphological_tagger = pipeline.turbo_interface.create_morphological_tagger() + self.morphological_tagger.load_morphological_tagger_model(pipeline.models[language]['morphological_tagger']) + if 'entity_recognizer' in pipeline.models[language]: + self.entity_recognizer = pipeline.turbo_interface.create_entity_recognizer() + self.entity_recognizer.load_entity_recognizer_model(pipeline.models[language]['entity_recognizer']) + if 'parser' in pipeline.models[language]: + self.parser = pipeline.turbo_interface.create_parser() + self.parser.load_parser_model(pipeline.models[language]['parser']) + if 'lemmatizer' in pipeline.models[language]: + self.lemmatizer = lemmatizer.BasicLemmatizer() + self.lemmatizer.load_lemmatizer_model(pipeline.models[language]['lemmatizer']) + if 'semantic_parser' in pipeline.models[language]: + self.semantic_parser = pipeline.turbo_interface.create_semantic_parser() + self.semantic_parser.load_semantic_parser_model(pipeline.models[language]['semantic_parser']) + if 'coreference_resolver' in pipeline.models[language]: + self.coreference_resolver = pipeline.turbo_interface.create_coreference_resolver() + self.coreference_resolver.load_coreference_resolver_model(pipeline.models[language]['coreference_resolver']) + + +class NLPPipeline: + def __init__(self): + # Load the initialization file. + configuration_filepath = os.path.dirname(os.path.realpath(__file__)) + \ + os.sep + 'nlp_pipeline.config' + self.models = {} + self.load_configuration_file(configuration_filepath) + self.turbo_interface = tp.PTurboParser() + self.workers = {} + + def load_configuration_file(self, filepath): + f = open(filepath) + language = '' + for line in f: + line = line.rstrip('\r\n') + if line == '': + language = '' + continue + # Ignore comments. + index = line.find('#') + if index >= 0: + line = line[:index] + line = line.strip() + if line == '': + continue + if language == '': + language = line + print 'Loading information for %s' % language + self.models[language] = {} + else: + pair = line.split('=') + assert len(pair) == 2, pdb.set_trace() + name = pair[0] + value = pair[1].strip('"') + self.models[language][name] = value + f.close() + + def get_worker(self, language): + if language in self.workers: + return self.workers[language] + else: + worker = NLPPipelineWorker(self, language) + self.workers[language] = worker + return worker + + def split_sentences(self, text, language): + worker = self.get_worker(language) + sentences = worker.sent_tokenizer.tokenize(text) + return sentences + + def tokenize(self, sentence, language): + worker = self.get_worker(language) + tokenized_sentence = worker.word_tokenizer.tokenize(sentence) + return tokenized_sentence + + def tag(self, tokenized_sentence, language): + worker = self.get_worker(language) + sent = NLPSentence() + sent['words'] = tokenized_sentence + sent.compute_morphology(worker) + tags = sent['tags'] + if sent['lemmas'] != None: + lemmas = sent['lemmas'] + else: + lemmas = ['_' for token in tokenized_sentence] + if sent['morphological_tags'] != None: + feats = ['|'.join(morph) if len(morph) > 0 else '_' \ + for morph in sent['morphological_tags']] + else: + feats = ['_' for token in tokenized_sentence] + return tags, lemmas, feats + + def recognize_entities(self, tokenized_sentence, tags, language): + worker = self.get_worker(language) + sent = NLPSentence() + sent['words'] = tokenized_sentence + sent['tags'] = tags + sent.compute_entities(worker) + entity_tags = sent['entity_tags'] + return entity_tags + + def parse(self, tokenized_sentence, tags, lemmas, language): + worker = self.get_worker(language) + sent = NLPSentence() + sent['words'] = tokenized_sentence + sent['tags'] = tags + sent['lemmas'] = lemmas + sent.compute_syntactic_dependencies(worker) + # Convert to 1-based indexing for back-compatibility. + #heads = [h+1 for h in sent['heads']] + heads = sent['heads'] + deprels = sent['dependency_relations'] + return heads, deprels + + def has_morphological_tagger(self, language): + worker = self.get_worker(language) + return (worker.morphological_tagger != None) + + def has_entity_recognizer(self, language): + worker = self.get_worker(language) + return (worker.entity_recognizer != None) + + def has_semantic_parser(self, language): + worker = self.get_worker(language) + return (worker.semantic_parser != None) + + def has_coreference_resolver(self, language): + worker = self.get_worker(language) + return (worker.coreference_resolver != None) + + def parse_semantic_dependencies(self, tokenized_sentence, tags, lemmas, + heads, deprels, language): + worker = self.get_worker(language) + sent = NLPSentence() + sent['words'] = tokenized_sentence + sent['tags'] = tags + sent['lemmas'] = lemmas + sent['heads'] = heads + # Convert from 1-based indexing for back-compatibility. + #sent['heads'] = [h-1 for h in heads] + sent['dependency_relations'] = deprels + sent.compute_semantic_dependencies(worker) + num_predicates = len(sent['predicate_names']) + predicates = ['_' for token in tokenized_sentence] + argument_lists = [['_' for k in xrange(num_predicates)] \ + for token in tokenized_sentence] + for k in xrange(num_predicates): + name = sent['predicate_names'][k] + p = sent['predicate_indices'][k] + predicates[p] = name + for l in xrange(len(sent['argument_roles'][k])): + role = sent['argument_roles'][k][l] + a = sent['argument_indices'][k][l] + argument_lists[a][k] = role + return predicates, argument_lists + + def resolve_coreferences(self, all_tokenized_sentences, all_tags, + all_lemmas, all_heads, all_deprels, + all_entity_tags, language): + worker = self.get_worker(language) + sents = [] + for j, tokenized_sentence in enumerate(all_tokenized_sentences): + sent = NLPSentence() + sent['words'] = tokenized_sentence + sent['tags'] = all_tags[j] + sent['lemmas'] = all_lemmas[j] + sent['heads'] = all_heads[j] + # Convert from 1-based indexing for back-compatibility. + #sent['heads'] = [h-1 for h in all_heads[j]] + sent['dependency_relations'] = all_deprels[j] + # For now, don't use this (must be coded as spans). + sent['entity_tags'] = all_entity_tags[j] + sents.append(sent) + doc = NLPDocument(sents) + doc.compute_coreferences(worker) + + # Convert from spans to coref info. + all_coref_info = [] + for sent in doc['sentences']: + spans = [] + for (start, end, name) in sent['coreference_spans']: + span = Span(start, end, name) + spans.append(span) + coref_info = nlp_utils.construct_coreference_info_from_spans( \ + spans, len(sent['words'])) + all_coref_info.append(coref_info) + + return all_coref_info + + def parse_conll(self, text, language): + sentences = self.split_sentences(text, language) + conll_str = '' + for sentence in sentences: + tokenized_sentence = self.tokenize(sentence, language) + tags, lemmas, feats = self.tag(tokenized_sentence, language) + heads, deprels = self.parse(tokenized_sentence, tags, lemmas, + language) + for i, token in enumerate(tokenized_sentence): + conll_str += str(i+1) + '\t' + token + '\t' + lemmas[i] + \ + '\t' + tags[i] + '\t' + tags[i] + '\t' + \ + feats[i] + '\t' + str(heads[i]+1) + '\t' + \ + deprels[i] + '\n' + conll_str += '\n' + return conll_str diff --git a/python/nlp_sentence.py b/python/nlp_sentence.py index 03e5584..0acd2d0 100644 --- a/python/nlp_sentence.py +++ b/python/nlp_sentence.py @@ -1,129 +1,129 @@ -import turboparser as tp - -class NLPSentence(dict): - def __init__(self): - pass - - def compute_morphology(self, worker): - words = self['words'] - - # Compute POS tags. - self['tags'] = None - tags = ['_' for word in words] - sequence_instance = tp.PSequenceInstance() - sequence_instance.initialize(words, tags) - worker.tagger.tag_sentence(sequence_instance) - tags = [sequence_instance.get_tag(i) for i in xrange(len(words))] - self['tags'] = tags - - # Compute lemmas. - self['lemmas'] = None - if worker.lemmatizer != None: - lemmas = worker.lemmatizer.lemmatize_sentence(words, tags) - self['lemmas'] = lemmas - else: - lemmas = ['_' for word in words] - - # Compute morphological tags. - self['morphological_tags'] = None - if worker.morphological_tagger != None: - feats = ['_' for word in words] - morphological_instance = tp.PMorphologicalInstance() - morphological_instance.initialize(words, lemmas, tags, feats) - worker.morphological_tagger.tag_sentence(morphological_instance) - feats = [morphological_instance.get_tag(i) \ - for i in xrange(len(words))] - self['morphological_tags'] = [feat.split('|') if feat != '_' \ - else [] \ - for feat in feats] - - def compute_entities(self, worker): - words = self['words'] - tags = self['tags'] - # For now, use entity BIO tags. Later we should move to entity spans. - self['entity_tags'] = None - entity_tags = ['_' for word in words] - entity_instance = tp.PEntityInstance() - entity_instance.initialize(words, tags, entity_tags) - worker.entity_recognizer.tag_sentence(entity_instance) - entity_tags = [entity_instance.get_tag(i) for i in xrange(len(words))] - self['entity_tags'] = entity_tags - - def compute_syntactic_dependencies(self, worker): - words = self['words'] - tags = self['tags'] - lemmas = self['lemmas'] - feats = [[] for word in words] - # TurboParser assumes 1-based indexing. - heads = [0 for word in words] - deprels = ['_' for word in words] - # TurboParser requires pre-appending a dummy root symbol. - words_with_root = ['_root_'] + words - lemmas_with_root = ['_root_'] + lemmas - tags_with_root = ['_root_'] + tags - feats_with_root = [['_root_']] + feats - deprels_with_root = ['_root_'] + deprels - heads_with_root = [-1] + heads - dependency_instance = tp.PDependencyInstance() - dependency_instance.initialize(words_with_root, lemmas_with_root, \ - tags_with_root, tags_with_root, \ - feats_with_root, deprels_with_root, \ - heads_with_root) - worker.parser.parse_sentence(dependency_instance) - # Convert back to 0-based indexing. Words attached to the root will get - # head = -1. - self['heads'] = [dependency_instance.get_head(i+1)-1 \ - for i in xrange(len(words))] - self['dependency_relations'] = \ - [dependency_instance.get_dependency_relation(i+1) \ - for i in xrange(len(words))] - - def compute_semantic_dependencies(self, worker): - words = self['words'] - tags = self['tags'] - lemmas = self['lemmas'] - # TurboParser assumes 1-based indexing. - heads = [h+1 for h in self['heads']] - deprels = self['dependency_relations'] - feats = [[] for word in words] - predicate_names = [] - predicate_indices = [] - argument_roles = [] - argument_indices = [] - # TurboParser requires pre-appending a dummy root symbol. - words_with_root = ['_root_'] + words - lemmas_with_root = ['_root_'] + lemmas - tags_with_root = ['_root_'] + tags - feats_with_root = [['_root_']] + feats - deprels_with_root = ['_root_'] + deprels - heads_with_root = [-1] + heads - semantic_instance = tp.PSemanticInstance() - semantic_instance.initialize('', words_with_root, lemmas_with_root, \ - tags_with_root, tags_with_root, \ - feats_with_root, deprels_with_root, \ - heads_with_root, predicate_names, \ - predicate_indices, argument_roles, \ - argument_indices) - worker.semantic_parser.parse_semantic_dependencies_from_sentence( \ - semantic_instance) - - num_predicates = semantic_instance.get_num_predicates() - predicate_names = [semantic_instance.get_predicate_name(k) \ - for k in xrange(num_predicates)] - # Convert back to 0-based indexing. - predicate_indices = [semantic_instance.get_predicate_index(k)-1 \ - for k in xrange(num_predicates)] - argument_roles = \ - [[semantic_instance.get_argument_role(k, l) \ - for l in xrange(semantic_instance.get_num_arguments_predicate(k))] \ - for k in xrange(num_predicates)] - # Convert to back 0-based indexing. - argument_indices = \ - [[semantic_instance.get_argument_index(k, l)-1 \ - for l in xrange(semantic_instance.get_num_arguments_predicate(k))] \ - for k in xrange(num_predicates)] - - self['predicate_names'] = predicate_names - self['predicate_indices'] = predicate_indices - self['argument_roles'] = argument_roles - self['argument_indices'] = argument_indices +import turboparser as tp + +class NLPSentence(dict): + def __init__(self): + pass + + def compute_morphology(self, worker): + words = self['words'] + + # Compute POS tags. + self['tags'] = None + tags = ['_' for word in words] + sequence_instance = tp.PSequenceInstance() + sequence_instance.initialize(words, tags) + worker.tagger.tag_sentence(sequence_instance) + tags = [sequence_instance.get_tag(i) for i in xrange(len(words))] + self['tags'] = tags + + # Compute lemmas. + self['lemmas'] = None + if worker.lemmatizer != None: + lemmas = worker.lemmatizer.lemmatize_sentence(words, tags) + self['lemmas'] = lemmas + else: + lemmas = ['_' for word in words] + + # Compute morphological tags. + self['morphological_tags'] = None + if worker.morphological_tagger != None: + feats = ['_' for word in words] + morphological_instance = tp.PMorphologicalInstance() + morphological_instance.initialize(words, lemmas, tags, feats) + worker.morphological_tagger.tag_sentence(morphological_instance) + feats = [morphological_instance.get_tag(i) \ + for i in xrange(len(words))] + self['morphological_tags'] = [feat.split('|') if feat != '_' \ + else [] \ + for feat in feats] + + def compute_entities(self, worker): + words = self['words'] + tags = self['tags'] + # For now, use entity BIO tags. Later we should move to entity spans. + self['entity_tags'] = None + entity_tags = ['_' for word in words] + entity_instance = tp.PEntityInstance() + entity_instance.initialize(words, tags, entity_tags) + worker.entity_recognizer.tag_sentence(entity_instance) + entity_tags = [entity_instance.get_tag(i) for i in xrange(len(words))] + self['entity_tags'] = entity_tags + + def compute_syntactic_dependencies(self, worker): + words = self['words'] + tags = self['tags'] + lemmas = self['lemmas'] + feats = [[] for word in words] + # TurboParser assumes 1-based indexing. + heads = [0 for word in words] + deprels = ['_' for word in words] + # TurboParser requires pre-appending a dummy root symbol. + words_with_root = ['_root_'] + words + lemmas_with_root = ['_root_'] + lemmas + tags_with_root = ['_root_'] + tags + feats_with_root = [['_root_']] + feats + deprels_with_root = ['_root_'] + deprels + heads_with_root = [-1] + heads + dependency_instance = tp.PDependencyInstance() + dependency_instance.initialize(words_with_root, lemmas_with_root, \ + tags_with_root, tags_with_root, \ + feats_with_root, deprels_with_root, \ + heads_with_root) + worker.parser.parse_sentence(dependency_instance) + # Convert back to 0-based indexing. Words attached to the root will get + # head = -1. + self['heads'] = [dependency_instance.get_head(i+1)-1 \ + for i in xrange(len(words))] + self['dependency_relations'] = \ + [dependency_instance.get_dependency_relation(i+1) \ + for i in xrange(len(words))] + + def compute_semantic_dependencies(self, worker): + words = self['words'] + tags = self['tags'] + lemmas = self['lemmas'] + # TurboParser assumes 1-based indexing. + heads = [h+1 for h in self['heads']] + deprels = self['dependency_relations'] + feats = [[] for word in words] + predicate_names = [] + predicate_indices = [] + argument_roles = [] + argument_indices = [] + # TurboParser requires pre-appending a dummy root symbol. + words_with_root = ['_root_'] + words + lemmas_with_root = ['_root_'] + lemmas + tags_with_root = ['_root_'] + tags + feats_with_root = [['_root_']] + feats + deprels_with_root = ['_root_'] + deprels + heads_with_root = [-1] + heads + semantic_instance = tp.PSemanticInstance() + semantic_instance.initialize('', words_with_root, lemmas_with_root, \ + tags_with_root, tags_with_root, \ + feats_with_root, deprels_with_root, \ + heads_with_root, predicate_names, \ + predicate_indices, argument_roles, \ + argument_indices) + worker.semantic_parser.parse_semantic_dependencies_from_sentence( \ + semantic_instance) + + num_predicates = semantic_instance.get_num_predicates() + predicate_names = [semantic_instance.get_predicate_name(k) \ + for k in xrange(num_predicates)] + # Convert back to 0-based indexing. + predicate_indices = [semantic_instance.get_predicate_index(k)-1 \ + for k in xrange(num_predicates)] + argument_roles = \ + [[semantic_instance.get_argument_role(k, l) \ + for l in xrange(semantic_instance.get_num_arguments_predicate(k))] \ + for k in xrange(num_predicates)] + # Convert to back 0-based indexing. + argument_indices = \ + [[semantic_instance.get_argument_index(k, l)-1 \ + for l in xrange(semantic_instance.get_num_arguments_predicate(k))] \ + for k in xrange(num_predicates)] + + self['predicate_names'] = predicate_names + self['predicate_indices'] = predicate_indices + self['argument_roles'] = argument_roles + self['argument_indices'] = argument_indices diff --git a/python/nlp_utils.py b/python/nlp_utils.py index 3c2543f..a9ae98e 100644 --- a/python/nlp_utils.py +++ b/python/nlp_utils.py @@ -1,65 +1,65 @@ -from span import * - -def construct_coreference_spans_from_text(span_lines): - left_bracket = '(' - right_bracket = ')' - characters_to_ignore = '*-' - name = '' - span_names_stack = [] - span_start_stack = [] - spans = [] - - for i in xrange(len(span_lines)): - line = span_lines[i] - fields = line.split('|') - for field in fields: - if field[0] == left_bracket and field[-1] == right_bracket: - start_position = i - end_position = i - name = field[1:-1] - span = Span(start_position, end_position, name) - spans.append(span) - elif field[0] == left_bracket: - start_position = i - end_position = -1 - name = field[1:] - span = Span(start_position, end_position, name) - spans.append(span) - elif field[-1] == right_bracket: - name = field[:-1] - selected_span = None - for span in reversed(spans): - if span.name == name and span.end == -1: - assert selected_span == None, pdb.set_trace() - selected_span = span - break - assert selected_span != None, pdb.set_trace() - selected_span.end = i - - for span in spans: - assert span.end != -1 - - return spans - -def construct_coreference_info_from_spans(spans, num_words): - coreference_span_descriptions = [''] * num_words - for span in spans: - if span.start == span.end: # Single-word mention. - if coreference_span_descriptions[span.start] != '': - coreference_span_descriptions[span.start] += '|' - coreference_span_descriptions[span.start] += '(' + span.name + ')' - else: - desc = coreference_span_descriptions[span.start] - if desc != '': - desc = '|' + desc - coreference_span_descriptions[span.start] = '(' + span.name + desc - desc = coreference_span_descriptions[span.end] - if desc != '': - desc += '|' - coreference_span_descriptions[span.end] = desc + span.name + ')' - - for j in xrange(num_words): - if coreference_span_descriptions[j] == '': - coreference_span_descriptions[j] = '_' - - return coreference_span_descriptions +from span import * + +def construct_coreference_spans_from_text(span_lines): + left_bracket = '(' + right_bracket = ')' + characters_to_ignore = '*-' + name = '' + span_names_stack = [] + span_start_stack = [] + spans = [] + + for i in xrange(len(span_lines)): + line = span_lines[i] + fields = line.split('|') + for field in fields: + if field[0] == left_bracket and field[-1] == right_bracket: + start_position = i + end_position = i + name = field[1:-1] + span = Span(start_position, end_position, name) + spans.append(span) + elif field[0] == left_bracket: + start_position = i + end_position = -1 + name = field[1:] + span = Span(start_position, end_position, name) + spans.append(span) + elif field[-1] == right_bracket: + name = field[:-1] + selected_span = None + for span in reversed(spans): + if span.name == name and span.end == -1: + assert selected_span == None, pdb.set_trace() + selected_span = span + break + assert selected_span != None, pdb.set_trace() + selected_span.end = i + + for span in spans: + assert span.end != -1 + + return spans + +def construct_coreference_info_from_spans(spans, num_words): + coreference_span_descriptions = [''] * num_words + for span in spans: + if span.start == span.end: # Single-word mention. + if coreference_span_descriptions[span.start] != '': + coreference_span_descriptions[span.start] += '|' + coreference_span_descriptions[span.start] += '(' + span.name + ')' + else: + desc = coreference_span_descriptions[span.start] + if desc != '': + desc = '|' + desc + coreference_span_descriptions[span.start] = '(' + span.name + desc + desc = coreference_span_descriptions[span.end] + if desc != '': + desc += '|' + coreference_span_descriptions[span.end] = desc + span.name + ')' + + for j in xrange(num_words): + if coreference_span_descriptions[j] == '': + coreference_span_descriptions[j] = '_' + + return coreference_span_descriptions diff --git a/python/setup.py b/python/setup.py index 8cfee8f..441a1d4 100644 --- a/python/setup.py +++ b/python/setup.py @@ -1,13 +1,13 @@ -from distutils.core import setup -from distutils.extension import Extension -from Cython.Distutils import build_ext - -src = "../libturboparser/" - -setup(cmdclass={'build_ext': build_ext}, - ext_modules=[Extension("turboparser", ["turbo_parser.pyx"], - language="c++", - extra_compile_args=["-std=c++0x"], - include_dirs=["../src/morphological_tagger", "../src/coreference_resolver", "../src/semantic_parser", "../src/parser", "../src/entity_recognizer/", "../src/tagger/", "../src/sequence/", "../src/classifier/", "../src/util", "../deps/local/include/"], - library_dirs=[src, "../deps/local/lib/"], - libraries=["turboparser", "gflags", "glog", "ad3"])]) +from distutils.core import setup +from distutils.extension import Extension +from Cython.Distutils import build_ext + +src = "../libturboparser/" + +setup(cmdclass={'build_ext': build_ext}, + ext_modules=[Extension("turboparser", ["turbo_parser.pyx"], + language="c++", + extra_compile_args=["-std=c++0x"], + include_dirs=["../src/morphological_tagger", "../src/coreference_resolver", "../src/semantic_parser", "../src/parser", "../src/entity_recognizer/", "../src/tagger/", "../src/sequence/", "../src/classifier/", "../src/util", "../deps/local/include/"], + library_dirs=[src, "../deps/local/lib/"], + libraries=["turboparser", "gflags", "glog", "ad3"])]) diff --git a/python/span.py b/python/span.py index ac50649..cd721d6 100644 --- a/python/span.py +++ b/python/span.py @@ -1,48 +1,48 @@ -import numpy as np - -class Span: - def __init__(self, start, end, name=''): - self.start = start - self.end = end - self.name = name - - def length(self): - return self.end - self.start + 1 - - def contains_index(self, i): - return self.start <= i and self.end >= i - - def lies_inside_span(self, span): - return self.start >= span.start and self.end <= span.end - - def lies_inside_any_of_spans(self, spans): - for span in spans: - if self.lies_inside_span(span): - return True - return False - - def closest_span(self, spans, min_dist=False): - distances = [] - for span in spans: - distances.append(self.distance(span, min_dist)) - span_index = np.argmin(distances) - return spans[span_index] - - def distance(self, span, min_dist=False): - if min_dist: - start_interval = min(self.end, span.end) - end_interval = max(self.start, span.start) - return max(0, end_interval-start_interval) - else: - return abs(self.start-span.start) + abs(self.end-span.end) - - def is_equal(self, span): - return self.start == span.start and self.end == span.end - - def overlaps(self, span): - start_interval = max(self.start, span.start) - end_interval = min(self.end, span.end) - return start_interval <= end_interval - - def print_span(self): - print self.name, self.start, self.end +import numpy as np + +class Span: + def __init__(self, start, end, name=''): + self.start = start + self.end = end + self.name = name + + def length(self): + return self.end - self.start + 1 + + def contains_index(self, i): + return self.start <= i and self.end >= i + + def lies_inside_span(self, span): + return self.start >= span.start and self.end <= span.end + + def lies_inside_any_of_spans(self, spans): + for span in spans: + if self.lies_inside_span(span): + return True + return False + + def closest_span(self, spans, min_dist=False): + distances = [] + for span in spans: + distances.append(self.distance(span, min_dist)) + span_index = np.argmin(distances) + return spans[span_index] + + def distance(self, span, min_dist=False): + if min_dist: + start_interval = min(self.end, span.end) + end_interval = max(self.start, span.start) + return max(0, end_interval-start_interval) + else: + return abs(self.start-span.start) + abs(self.end-span.end) + + def is_equal(self, span): + return self.start == span.start and self.end == span.end + + def overlaps(self, span): + start_interval = max(self.start, span.start) + end_interval = min(self.end, span.end) + return start_interval <= end_interval + + def print_span(self): + print self.name, self.start, self.end diff --git a/python/turbo_parser.pyx b/python/turbo_parser.pyx index e76d642..2ec4641 100644 --- a/python/turbo_parser.pyx +++ b/python/turbo_parser.pyx @@ -1,534 +1,534 @@ -from libcpp.string cimport string -from libcpp.vector cimport vector -from libcpp cimport bool - -import pdb - -# Get the classes from the c++ headers. - -cdef extern from "../src/sequence/SequenceInstance.h": - cdef cppclass SequenceInstance: - SequenceInstance() - void Initialize(vector[string] forms, vector[string] tags) - string GetTag(int i) - -cdef extern from "../src/morphological_tagger/MorphologicalInstance.h": - cdef cppclass MorphologicalInstance: - MorphologicalInstance() - void Initialize(vector[string] forms, vector[string] lemmas, \ - vector[string] pos, vector[string] tags) - string GetTag(int i) - -cdef extern from "../src/entity_recognizer/EntityInstance.h": - cdef cppclass EntityInstance: - EntityInstance() - void Initialize(vector[string] forms, vector[string] pos, \ - vector[string] tags) - string GetTag(int i) - -cdef extern from "../src/parser/DependencyInstance.h": - cdef cppclass DependencyInstance: - DependencyInstance() - void Initialize(vector[string] forms, vector[string] lemmas, \ - vector[string] cpos, vector[string] pos, \ - vector[vector[string]] feats, vector[string] deprels, \ - vector[int] heads) - int GetHead(int i) - string GetDependencyRelation(int i) - -cdef extern from "../src/semantic_parser/SemanticInstance.h": - cdef cppclass SemanticInstance: - SemanticInstance() - void Initialize(string name, vector[string] forms, vector[string] lemmas, \ - vector[string] cpos, vector[string] pos, \ - vector[vector[string]] feats, vector[string] deprels, \ - vector[int] heads, vector[string] predicate_names, \ - vector[int] predicate_indices, \ - vector[vector[string]] argument_roles, \ - vector[vector[int]] argument_indices) - int GetNumPredicates() - string GetPredicateName(int k) - int GetPredicateIndex(int k) - int GetNumArgumentsPredicate(int k) - string GetArgumentRole(int k, int l) - int GetArgumentIndex(int k, int l) - -cdef extern from "../src/entity_recognizer/EntitySpan.h": - ctypedef NamedSpan EntitySpan - cdef cppclass NamedSpan: - NamedSpan(int start, int end, string name) - int start() - int end() - string name() - -cdef extern from "../src/coreference_resolver/CoreferenceSentence.h": - cdef cppclass CoreferenceSentence: - CoreferenceSentence() - void Initialize(string name, vector[string] forms, vector[string] lemmas, \ - vector[string] cpos, vector[string] pos, \ - vector[vector[string]] feats, vector[string] deprels, \ - vector[int] heads, vector[string] predicate_names, \ - vector[int] predicate_indices, \ - vector[vector[string]] argument_roles, \ - vector[vector[int]] argument_indices, \ - vector[string] speakers, \ - vector[NamedSpan*] entity_spans, \ - vector[NamedSpan*] constituent_spans, \ - vector[NamedSpan*] coreference_spans) - vector[NamedSpan*] GetCoreferenceSpans() - -cdef extern from "../src/coreference_resolver/CoreferenceDocument.h": - cdef cppclass CoreferenceDocument: - CoreferenceDocument() - void Initialize(string name, int part_number, \ - vector[CoreferenceSentence*] sentences) - int GetNumSentences() - CoreferenceSentence *GetSentence(int i) - -cdef extern from "../libturboparser/TurboParserInterface.h" namespace "TurboParserInterface": - cdef cppclass TurboTaggerWorker: - TurboTaggerWorker() - void LoadTaggerModel(string file_model) - void Tag(string file_test, string file_prediction) - void TagSentence(SequenceInstance *sentence) - - cdef cppclass TurboMorphologicalTaggerWorker: - TurboMorphologicalTaggerWorker() - void LoadMorphologicalTaggerModel(string file_model) - void Tag(string file_test, string file_prediction) - void TagSentence(MorphologicalInstance *sentence) - - cdef cppclass TurboEntityRecognizerWorker: - TurboEntityRecognizerWorker() - void LoadEntityRecognizerModel(string file_model) - void Tag(string file_test, string file_prediction) - void TagSentence(EntityInstance *sentence) - - cdef cppclass TurboParserWorker: - TurboParserWorker() - void LoadParserModel(string file_model) - void Parse(string file_test, string file_prediction) - void ParseSentence(DependencyInstance *sentence) - - cdef cppclass TurboSemanticParserWorker: - TurboSemanticParserWorker() - void LoadSemanticParserModel(string file_model) - void ParseSemanticDependencies(string file_test, string file_prediction) - void ParseSemanticDependenciesFromSentence(SemanticInstance *sentence) - - cdef cppclass TurboCoreferenceResolverWorker: - TurboCoreferenceResolverWorker() - void LoadCoreferenceResolverModel(string file_model) - void ResolveCoreferences(string file_test, string file_prediction) - void ResolveCoreferencesFromDocument(CoreferenceDocument *document) - - cdef cppclass TurboParserInterface: - TurboParserInterface() - TurboTaggerWorker* CreateTagger() - TurboMorphologicalTaggerWorker* CreateMorphologicalTagger() - TurboEntityRecognizerWorker* CreateEntityRecognizer() - TurboParserWorker* CreateParser() - TurboSemanticParserWorker* CreateSemanticParser() - TurboCoreferenceResolverWorker* CreateCoreferenceResolver() - - -# Wrap them into python extension types. - -cdef class PTurboParser: - cdef TurboParserInterface *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new TurboParserInterface() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def create_tagger(self): - tagger = PTurboTaggerWorker(allocate=False) - tagger.thisptr = self.thisptr.CreateTagger() - return tagger - - def create_morphological_tagger(self): - morphological_tagger = PTurboMorphologicalTaggerWorker(allocate=False) - morphological_tagger.thisptr = self.thisptr.CreateMorphologicalTagger() - return morphological_tagger - - def create_entity_recognizer(self): - entity_recognizer = PTurboEntityRecognizerWorker(allocate=False) - entity_recognizer.thisptr = self.thisptr.CreateEntityRecognizer() - return entity_recognizer - - def create_parser(self): - parser = PTurboParserWorker(allocate=False) - parser.thisptr = self.thisptr.CreateParser() - return parser - - def create_semantic_parser(self): - semantic_parser = PTurboSemanticParserWorker(allocate=False) - semantic_parser.thisptr = self.thisptr.CreateSemanticParser() - return semantic_parser - - def create_coreference_resolver(self): - coreference_resolver = PTurboCoreferenceResolverWorker(allocate=False) - coreference_resolver.thisptr = self.thisptr.CreateCoreferenceResolver() - return coreference_resolver - -cdef class PSequenceInstance: - cdef SequenceInstance *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new SequenceInstance() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, vector[string] forms, vector[string] tags): - self.thisptr.Initialize(forms, tags) - - def get_tag(self, i): - return self.thisptr.GetTag(i) - -cdef class PMorphologicalInstance: - cdef MorphologicalInstance *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new MorphologicalInstance() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, vector[string] forms, vector[string] lemmas, \ - vector[string] pos, vector[string] tags): - self.thisptr.Initialize(forms, lemmas, pos, tags) - - def get_tag(self, i): - return self.thisptr.GetTag(i) - -cdef class PEntityInstance: - cdef EntityInstance *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new EntityInstance() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, vector[string] forms, vector[string] pos, \ - vector[string] tags): - self.thisptr.Initialize(forms, pos, tags) - - def get_tag(self, i): - return self.thisptr.GetTag(i) - -cdef class PDependencyInstance: - cdef DependencyInstance *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new DependencyInstance() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, vector[string] forms, vector[string] lemmas, \ - vector[string] cpos, vector[string] pos, \ - vector[vector[string]] feats, vector[string] deprels, \ - vector[int] heads): - self.thisptr.Initialize(forms, lemmas, cpos, pos, feats, deprels, heads) - - def get_head(self, i): - return self.thisptr.GetHead(i) - - def get_dependency_relation(self, i): - return self.thisptr.GetDependencyRelation(i) - -cdef class PSemanticInstance: - cdef SemanticInstance *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new SemanticInstance() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, string name, vector[string] forms, \ - vector[string] lemmas, \ - vector[string] cpos, vector[string] pos, \ - vector[vector[string]] feats, vector[string] deprels, \ - vector[int] heads, vector[string] predicate_names, \ - vector[int] predicate_indices, \ - vector[vector[string]] argument_roles, \ - vector[vector[int]] argument_indices): - self.thisptr.Initialize(name, forms, lemmas, cpos, pos, feats, \ - deprels, heads, predicate_names, \ - predicate_indices, argument_roles, \ - argument_indices) - - def get_num_predicates(self): - return self.thisptr.GetNumPredicates() - - def get_predicate_name(self, k): - return self.thisptr.GetPredicateName(k) - - def get_predicate_index(self, k): - return self.thisptr.GetPredicateIndex(k) - - def get_num_arguments_predicate(self, k): - return self.thisptr.GetNumArgumentsPredicate(k) - - def get_argument_role(self, k, l): - return self.thisptr.GetArgumentRole(k, l) - - def get_argument_index(self, k, l): - return self.thisptr.GetArgumentIndex(k, l) - -cdef class PNamedSpan: - cdef NamedSpan *thisptr - cdef bool allocate - def __cinit__(self, start=-1, end=-1, name='', allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new NamedSpan(start, end, name) - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def start(self): - return self.thisptr.start() - - def end(self): - return self.thisptr.end() - - def name(self): - return self.thisptr.name() - -cdef class PEntitySpan(PNamedSpan): - def __cinit__(self, start=-1, end=-1, name='', allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new EntitySpan(start, end, name) - -cdef class PCoreferenceSentence: - cdef CoreferenceSentence *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new CoreferenceSentence() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, string name, vector[string] forms, \ - vector[string] lemmas, \ - vector[string] cpos, vector[string] pos, \ - vector[vector[string]] feats, vector[string] deprels, \ - vector[int] heads, vector[string] predicate_names, \ - vector[int] predicate_indices, \ - vector[vector[string]] argument_roles, \ - vector[vector[int]] argument_indices, \ - vector[string] speakers, \ - p_entity_spans, \ - p_constituent_spans, \ - p_coreference_spans): - cdef vector[EntitySpan*] entity_spans - for p_span in p_entity_spans: - entity_spans.push_back((p_span).thisptr) - cdef vector[NamedSpan*] constituent_spans - for p_span in p_constituent_spans: - constituent_spans.push_back((p_span).thisptr) - cdef vector[NamedSpan*] coreference_spans - for p_span in p_coreference_spans: - coreference_spans.push_back((p_span).thisptr) - self.thisptr.Initialize(name, forms, lemmas, cpos, pos, feats, \ - deprels, heads, predicate_names, \ - predicate_indices, argument_roles, \ - argument_indices, speakers, entity_spans, \ - constituent_spans, coreference_spans) - - def get_coreference_spans(self): - cdef vector[NamedSpan*] coreference_spans = \ - self.thisptr.GetCoreferenceSpans() - p_coreference_spans = [] - for span in coreference_spans: - p_span = PNamedSpan(allocate=False) - p_span.thisptr = span - p_coreference_spans.append(p_span) - return p_coreference_spans - -cdef class PCoreferenceDocument: - cdef CoreferenceDocument *thisptr - cdef bool allocate - def __cinit__(self, allocate=True): - self.allocate = allocate - if allocate: - self.thisptr = new CoreferenceDocument() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def initialize(self, string name, int part_number, \ - p_sentences): - cdef vector[CoreferenceSentence*] sentences - for p_sentence in p_sentences: - sentences.push_back((p_sentence).thisptr) - self.thisptr.Initialize(name, part_number, sentences) - - def get_num_sentences(self): - self.thisptr.GetNumSentences() - - def get_sentence(self, int i): - cdef CoreferenceSentence *sentence = self.thisptr.GetSentence(i) - p_sentence = PCoreferenceSentence(allocate=False) - p_sentence.thisptr = sentence - return p_sentence - -cdef class PTurboTaggerWorker: - cdef TurboTaggerWorker *thisptr - cdef bool allocate - def __cinit__(self, allocate=False): - self.allocate = allocate - if allocate: - self.thisptr = new TurboTaggerWorker() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def load_tagger_model(self, file_model): - self.thisptr.LoadTaggerModel(file_model) - - def tag(self, file_test, file_prediction): - self.thisptr.Tag(file_test, file_prediction) - - def tag_sentence(self, sequence_instance): - self.thisptr.TagSentence((sequence_instance).thisptr) - -cdef class PTurboMorphologicalTaggerWorker: - cdef TurboMorphologicalTaggerWorker *thisptr - cdef bool allocate - def __cinit__(self, allocate=False): - self.allocate = allocate - if allocate: - self.thisptr = new TurboMorphologicalTaggerWorker() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def load_morphological_tagger_model(self, file_model): - self.thisptr.LoadMorphologicalTaggerModel(file_model) - - def tag(self, file_test, file_prediction): - self.thisptr.Tag(file_test, file_prediction) - - def tag_sentence(self, sequence_instance): - self.thisptr.TagSentence( \ - (sequence_instance).thisptr) - -cdef class PTurboEntityRecognizerWorker: - cdef TurboEntityRecognizerWorker *thisptr - cdef bool allocate - def __cinit__(self, allocate=False): - self.allocate = allocate - if allocate: - self.thisptr = new TurboEntityRecognizerWorker() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def load_entity_recognizer_model(self, file_model): - self.thisptr.LoadEntityRecognizerModel(file_model) - - def tag(self, file_test, file_prediction): - self.thisptr.Tag(file_test, file_prediction) - - def tag_sentence(self, entity_instance): - self.thisptr.TagSentence((entity_instance).thisptr) - -cdef class PTurboParserWorker: - cdef TurboParserWorker *thisptr - cdef bool allocate - def __cinit__(self, allocate=False): - self.allocate = allocate - if allocate: - self.thisptr = new TurboParserWorker() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def load_parser_model(self, file_model): - self.thisptr.LoadParserModel(file_model) - - def parse(self, file_test, file_prediction): - self.thisptr.Parse(file_test, file_prediction) - - def parse_sentence(self, dependency_instance): - self.thisptr.ParseSentence( \ - (dependency_instance).thisptr) - -cdef class PTurboSemanticParserWorker: - cdef TurboSemanticParserWorker *thisptr - cdef bool allocate - def __cinit__(self, allocate=False): - self.allocate = allocate - if allocate: - self.thisptr = new TurboSemanticParserWorker() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def load_semantic_parser_model(self, file_model): - self.thisptr.LoadSemanticParserModel(file_model) - - def parse_semantic_dependencies(self, file_test, file_prediction): - self.thisptr.ParseSemanticDependencies(file_test, file_prediction) - - def parse_semantic_dependencies_from_sentence(self, semantic_instance): - self.thisptr.ParseSemanticDependenciesFromSentence( \ - (semantic_instance).thisptr) - -cdef class PTurboCoreferenceResolverWorker: - cdef TurboCoreferenceResolverWorker *thisptr - cdef bool allocate - def __cinit__(self, allocate=False): - self.allocate = allocate - if allocate: - self.thisptr = new TurboCoreferenceResolverWorker() - - def __dealloc__(self): - if self.allocate: - del self.thisptr - - def load_coreference_resolver_model(self, file_model): - self.thisptr.LoadCoreferenceResolverModel(file_model) - - def resolve_coreferences(self, file_test, file_prediction): - self.thisptr.ResolveCoreferences(file_test, file_prediction) - - def resolve_coreferences_from_document(self, coreference_document): - self.thisptr.ResolveCoreferencesFromDocument( \ - (coreference_document).thisptr) +from libcpp.string cimport string +from libcpp.vector cimport vector +from libcpp cimport bool + +import pdb + +# Get the classes from the c++ headers. + +cdef extern from "../src/sequence/SequenceInstance.h": + cdef cppclass SequenceInstance: + SequenceInstance() + void Initialize(vector[string] forms, vector[string] tags) + string GetTag(int i) + +cdef extern from "../src/morphological_tagger/MorphologicalInstance.h": + cdef cppclass MorphologicalInstance: + MorphologicalInstance() + void Initialize(vector[string] forms, vector[string] lemmas, \ + vector[string] pos, vector[string] tags) + string GetTag(int i) + +cdef extern from "../src/entity_recognizer/EntityInstance.h": + cdef cppclass EntityInstance: + EntityInstance() + void Initialize(vector[string] forms, vector[string] pos, \ + vector[string] tags) + string GetTag(int i) + +cdef extern from "../src/parser/DependencyInstance.h": + cdef cppclass DependencyInstance: + DependencyInstance() + void Initialize(vector[string] forms, vector[string] lemmas, \ + vector[string] cpos, vector[string] pos, \ + vector[vector[string]] feats, vector[string] deprels, \ + vector[int] heads) + int GetHead(int i) + string GetDependencyRelation(int i) + +cdef extern from "../src/semantic_parser/SemanticInstance.h": + cdef cppclass SemanticInstance: + SemanticInstance() + void Initialize(string name, vector[string] forms, vector[string] lemmas, \ + vector[string] cpos, vector[string] pos, \ + vector[vector[string]] feats, vector[string] deprels, \ + vector[int] heads, vector[string] predicate_names, \ + vector[int] predicate_indices, \ + vector[vector[string]] argument_roles, \ + vector[vector[int]] argument_indices) + int GetNumPredicates() + string GetPredicateName(int k) + int GetPredicateIndex(int k) + int GetNumArgumentsPredicate(int k) + string GetArgumentRole(int k, int l) + int GetArgumentIndex(int k, int l) + +cdef extern from "../src/entity_recognizer/EntitySpan.h": + ctypedef NamedSpan EntitySpan + cdef cppclass NamedSpan: + NamedSpan(int start, int end, string name) + int start() + int end() + string name() + +cdef extern from "../src/coreference_resolver/CoreferenceSentence.h": + cdef cppclass CoreferenceSentence: + CoreferenceSentence() + void Initialize(string name, vector[string] forms, vector[string] lemmas, \ + vector[string] cpos, vector[string] pos, \ + vector[vector[string]] feats, vector[string] deprels, \ + vector[int] heads, vector[string] predicate_names, \ + vector[int] predicate_indices, \ + vector[vector[string]] argument_roles, \ + vector[vector[int]] argument_indices, \ + vector[string] speakers, \ + vector[NamedSpan*] entity_spans, \ + vector[NamedSpan*] constituent_spans, \ + vector[NamedSpan*] coreference_spans) + vector[NamedSpan*] GetCoreferenceSpans() + +cdef extern from "../src/coreference_resolver/CoreferenceDocument.h": + cdef cppclass CoreferenceDocument: + CoreferenceDocument() + void Initialize(string name, int part_number, \ + vector[CoreferenceSentence*] sentences) + int GetNumSentences() + CoreferenceSentence *GetSentence(int i) + +cdef extern from "../libturboparser/TurboParserInterface.h" namespace "TurboParserInterface": + cdef cppclass TurboTaggerWorker: + TurboTaggerWorker() + void LoadTaggerModel(string file_model) + void Tag(string file_test, string file_prediction) + void TagSentence(SequenceInstance *sentence) + + cdef cppclass TurboMorphologicalTaggerWorker: + TurboMorphologicalTaggerWorker() + void LoadMorphologicalTaggerModel(string file_model) + void Tag(string file_test, string file_prediction) + void TagSentence(MorphologicalInstance *sentence) + + cdef cppclass TurboEntityRecognizerWorker: + TurboEntityRecognizerWorker() + void LoadEntityRecognizerModel(string file_model) + void Tag(string file_test, string file_prediction) + void TagSentence(EntityInstance *sentence) + + cdef cppclass TurboParserWorker: + TurboParserWorker() + void LoadParserModel(string file_model) + void Parse(string file_test, string file_prediction) + void ParseSentence(DependencyInstance *sentence) + + cdef cppclass TurboSemanticParserWorker: + TurboSemanticParserWorker() + void LoadSemanticParserModel(string file_model) + void ParseSemanticDependencies(string file_test, string file_prediction) + void ParseSemanticDependenciesFromSentence(SemanticInstance *sentence) + + cdef cppclass TurboCoreferenceResolverWorker: + TurboCoreferenceResolverWorker() + void LoadCoreferenceResolverModel(string file_model) + void ResolveCoreferences(string file_test, string file_prediction) + void ResolveCoreferencesFromDocument(CoreferenceDocument *document) + + cdef cppclass TurboParserInterface: + TurboParserInterface() + TurboTaggerWorker* CreateTagger() + TurboMorphologicalTaggerWorker* CreateMorphologicalTagger() + TurboEntityRecognizerWorker* CreateEntityRecognizer() + TurboParserWorker* CreateParser() + TurboSemanticParserWorker* CreateSemanticParser() + TurboCoreferenceResolverWorker* CreateCoreferenceResolver() + + +# Wrap them into python extension types. + +cdef class PTurboParser: + cdef TurboParserInterface *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new TurboParserInterface() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def create_tagger(self): + tagger = PTurboTaggerWorker(allocate=False) + tagger.thisptr = self.thisptr.CreateTagger() + return tagger + + def create_morphological_tagger(self): + morphological_tagger = PTurboMorphologicalTaggerWorker(allocate=False) + morphological_tagger.thisptr = self.thisptr.CreateMorphologicalTagger() + return morphological_tagger + + def create_entity_recognizer(self): + entity_recognizer = PTurboEntityRecognizerWorker(allocate=False) + entity_recognizer.thisptr = self.thisptr.CreateEntityRecognizer() + return entity_recognizer + + def create_parser(self): + parser = PTurboParserWorker(allocate=False) + parser.thisptr = self.thisptr.CreateParser() + return parser + + def create_semantic_parser(self): + semantic_parser = PTurboSemanticParserWorker(allocate=False) + semantic_parser.thisptr = self.thisptr.CreateSemanticParser() + return semantic_parser + + def create_coreference_resolver(self): + coreference_resolver = PTurboCoreferenceResolverWorker(allocate=False) + coreference_resolver.thisptr = self.thisptr.CreateCoreferenceResolver() + return coreference_resolver + +cdef class PSequenceInstance: + cdef SequenceInstance *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new SequenceInstance() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, vector[string] forms, vector[string] tags): + self.thisptr.Initialize(forms, tags) + + def get_tag(self, i): + return self.thisptr.GetTag(i) + +cdef class PMorphologicalInstance: + cdef MorphologicalInstance *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new MorphologicalInstance() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, vector[string] forms, vector[string] lemmas, \ + vector[string] pos, vector[string] tags): + self.thisptr.Initialize(forms, lemmas, pos, tags) + + def get_tag(self, i): + return self.thisptr.GetTag(i) + +cdef class PEntityInstance: + cdef EntityInstance *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new EntityInstance() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, vector[string] forms, vector[string] pos, \ + vector[string] tags): + self.thisptr.Initialize(forms, pos, tags) + + def get_tag(self, i): + return self.thisptr.GetTag(i) + +cdef class PDependencyInstance: + cdef DependencyInstance *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new DependencyInstance() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, vector[string] forms, vector[string] lemmas, \ + vector[string] cpos, vector[string] pos, \ + vector[vector[string]] feats, vector[string] deprels, \ + vector[int] heads): + self.thisptr.Initialize(forms, lemmas, cpos, pos, feats, deprels, heads) + + def get_head(self, i): + return self.thisptr.GetHead(i) + + def get_dependency_relation(self, i): + return self.thisptr.GetDependencyRelation(i) + +cdef class PSemanticInstance: + cdef SemanticInstance *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new SemanticInstance() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, string name, vector[string] forms, \ + vector[string] lemmas, \ + vector[string] cpos, vector[string] pos, \ + vector[vector[string]] feats, vector[string] deprels, \ + vector[int] heads, vector[string] predicate_names, \ + vector[int] predicate_indices, \ + vector[vector[string]] argument_roles, \ + vector[vector[int]] argument_indices): + self.thisptr.Initialize(name, forms, lemmas, cpos, pos, feats, \ + deprels, heads, predicate_names, \ + predicate_indices, argument_roles, \ + argument_indices) + + def get_num_predicates(self): + return self.thisptr.GetNumPredicates() + + def get_predicate_name(self, k): + return self.thisptr.GetPredicateName(k) + + def get_predicate_index(self, k): + return self.thisptr.GetPredicateIndex(k) + + def get_num_arguments_predicate(self, k): + return self.thisptr.GetNumArgumentsPredicate(k) + + def get_argument_role(self, k, l): + return self.thisptr.GetArgumentRole(k, l) + + def get_argument_index(self, k, l): + return self.thisptr.GetArgumentIndex(k, l) + +cdef class PNamedSpan: + cdef NamedSpan *thisptr + cdef bool allocate + def __cinit__(self, start=-1, end=-1, name='', allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new NamedSpan(start, end, name) + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def start(self): + return self.thisptr.start() + + def end(self): + return self.thisptr.end() + + def name(self): + return self.thisptr.name() + +cdef class PEntitySpan(PNamedSpan): + def __cinit__(self, start=-1, end=-1, name='', allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new EntitySpan(start, end, name) + +cdef class PCoreferenceSentence: + cdef CoreferenceSentence *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new CoreferenceSentence() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, string name, vector[string] forms, \ + vector[string] lemmas, \ + vector[string] cpos, vector[string] pos, \ + vector[vector[string]] feats, vector[string] deprels, \ + vector[int] heads, vector[string] predicate_names, \ + vector[int] predicate_indices, \ + vector[vector[string]] argument_roles, \ + vector[vector[int]] argument_indices, \ + vector[string] speakers, \ + p_entity_spans, \ + p_constituent_spans, \ + p_coreference_spans): + cdef vector[EntitySpan*] entity_spans + for p_span in p_entity_spans: + entity_spans.push_back((p_span).thisptr) + cdef vector[NamedSpan*] constituent_spans + for p_span in p_constituent_spans: + constituent_spans.push_back((p_span).thisptr) + cdef vector[NamedSpan*] coreference_spans + for p_span in p_coreference_spans: + coreference_spans.push_back((p_span).thisptr) + self.thisptr.Initialize(name, forms, lemmas, cpos, pos, feats, \ + deprels, heads, predicate_names, \ + predicate_indices, argument_roles, \ + argument_indices, speakers, entity_spans, \ + constituent_spans, coreference_spans) + + def get_coreference_spans(self): + cdef vector[NamedSpan*] coreference_spans = \ + self.thisptr.GetCoreferenceSpans() + p_coreference_spans = [] + for span in coreference_spans: + p_span = PNamedSpan(allocate=False) + p_span.thisptr = span + p_coreference_spans.append(p_span) + return p_coreference_spans + +cdef class PCoreferenceDocument: + cdef CoreferenceDocument *thisptr + cdef bool allocate + def __cinit__(self, allocate=True): + self.allocate = allocate + if allocate: + self.thisptr = new CoreferenceDocument() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def initialize(self, string name, int part_number, \ + p_sentences): + cdef vector[CoreferenceSentence*] sentences + for p_sentence in p_sentences: + sentences.push_back((p_sentence).thisptr) + self.thisptr.Initialize(name, part_number, sentences) + + def get_num_sentences(self): + self.thisptr.GetNumSentences() + + def get_sentence(self, int i): + cdef CoreferenceSentence *sentence = self.thisptr.GetSentence(i) + p_sentence = PCoreferenceSentence(allocate=False) + p_sentence.thisptr = sentence + return p_sentence + +cdef class PTurboTaggerWorker: + cdef TurboTaggerWorker *thisptr + cdef bool allocate + def __cinit__(self, allocate=False): + self.allocate = allocate + if allocate: + self.thisptr = new TurboTaggerWorker() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def load_tagger_model(self, file_model): + self.thisptr.LoadTaggerModel(file_model) + + def tag(self, file_test, file_prediction): + self.thisptr.Tag(file_test, file_prediction) + + def tag_sentence(self, sequence_instance): + self.thisptr.TagSentence((sequence_instance).thisptr) + +cdef class PTurboMorphologicalTaggerWorker: + cdef TurboMorphologicalTaggerWorker *thisptr + cdef bool allocate + def __cinit__(self, allocate=False): + self.allocate = allocate + if allocate: + self.thisptr = new TurboMorphologicalTaggerWorker() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def load_morphological_tagger_model(self, file_model): + self.thisptr.LoadMorphologicalTaggerModel(file_model) + + def tag(self, file_test, file_prediction): + self.thisptr.Tag(file_test, file_prediction) + + def tag_sentence(self, sequence_instance): + self.thisptr.TagSentence( \ + (sequence_instance).thisptr) + +cdef class PTurboEntityRecognizerWorker: + cdef TurboEntityRecognizerWorker *thisptr + cdef bool allocate + def __cinit__(self, allocate=False): + self.allocate = allocate + if allocate: + self.thisptr = new TurboEntityRecognizerWorker() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def load_entity_recognizer_model(self, file_model): + self.thisptr.LoadEntityRecognizerModel(file_model) + + def tag(self, file_test, file_prediction): + self.thisptr.Tag(file_test, file_prediction) + + def tag_sentence(self, entity_instance): + self.thisptr.TagSentence((entity_instance).thisptr) + +cdef class PTurboParserWorker: + cdef TurboParserWorker *thisptr + cdef bool allocate + def __cinit__(self, allocate=False): + self.allocate = allocate + if allocate: + self.thisptr = new TurboParserWorker() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def load_parser_model(self, file_model): + self.thisptr.LoadParserModel(file_model) + + def parse(self, file_test, file_prediction): + self.thisptr.Parse(file_test, file_prediction) + + def parse_sentence(self, dependency_instance): + self.thisptr.ParseSentence( \ + (dependency_instance).thisptr) + +cdef class PTurboSemanticParserWorker: + cdef TurboSemanticParserWorker *thisptr + cdef bool allocate + def __cinit__(self, allocate=False): + self.allocate = allocate + if allocate: + self.thisptr = new TurboSemanticParserWorker() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def load_semantic_parser_model(self, file_model): + self.thisptr.LoadSemanticParserModel(file_model) + + def parse_semantic_dependencies(self, file_test, file_prediction): + self.thisptr.ParseSemanticDependencies(file_test, file_prediction) + + def parse_semantic_dependencies_from_sentence(self, semantic_instance): + self.thisptr.ParseSemanticDependenciesFromSentence( \ + (semantic_instance).thisptr) + +cdef class PTurboCoreferenceResolverWorker: + cdef TurboCoreferenceResolverWorker *thisptr + cdef bool allocate + def __cinit__(self, allocate=False): + self.allocate = allocate + if allocate: + self.thisptr = new TurboCoreferenceResolverWorker() + + def __dealloc__(self): + if self.allocate: + del self.thisptr + + def load_coreference_resolver_model(self, file_model): + self.thisptr.LoadCoreferenceResolverModel(file_model) + + def resolve_coreferences(self, file_test, file_prediction): + self.thisptr.ResolveCoreferences(file_test, file_prediction) + + def resolve_coreferences_from_document(self, coreference_document): + self.thisptr.ResolveCoreferencesFromDocument( \ + (coreference_document).thisptr) diff --git a/src/constituency_labeler/ConstituencyDictionary.cpp b/src/constituency_labeler/ConstituencyDictionary.cpp index 84dc9b9..d9ada91 100644 --- a/src/constituency_labeler/ConstituencyDictionary.cpp +++ b/src/constituency_labeler/ConstituencyDictionary.cpp @@ -1,181 +1,181 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "ConstituencyDictionary.h" -#include "ConstituencyLabelerPipe.h" -#include "ConstituencyInstance.h" -#include - -// Special symbols. -const string kConstituencyTokenUnknown = "_UNKNOWN_"; // Unknown word/lemma. -const string kConstituencyTokenStart = "_START_"; // Start symbol. -const string kConstituencyTokenStop = "_STOP_"; // Stop symbol. - -// Maximum alphabet sizes. -const unsigned int kConstituencyMaxLemmaAlphabetSize = 0xffff; -const unsigned int kConstituencyMaxMorphAlphabetSize = 0xfff; //0xffff; - -DEFINE_int32(constituency_lemma_cutoff, 0, - "Ignore word lemmas whose frequency is less than this."); -DEFINE_int32(constituency_morph_cutoff, 0, - "Ignore morphological features whose frequency is less than this."); - -void ConstituencyDictionary::CreateConstituentDictionary( - ConstituencyReader *reader) { - // Create tag dictionary. - CreateTagDictionary(reader); - - // Create constituent dictionary. - LOG(INFO) << "Creating constituent and rule dictionary..."; - std::vector label_freqs(constituent_alphabet_.size(), -1); - - int lemma_cutoff = FLAGS_constituency_lemma_cutoff; - int morph_cutoff = FLAGS_constituency_morph_cutoff; - std::vector lemma_freqs; - std::vector morph_freqs; - Alphabet lemma_alphabet; - Alphabet morph_alphabet; - - string special_symbols[NUM_SPECIAL_TOKENS]; - special_symbols[TOKEN_UNKNOWN] = kConstituencyTokenUnknown; - special_symbols[TOKEN_START] = kConstituencyTokenStart; - special_symbols[TOKEN_STOP] = kConstituencyTokenStop; - - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - lemma_alphabet.Insert(special_symbols[i]); - morph_alphabet.Insert(special_symbols[i]); - - // Counts of special symbols are set to -1: - lemma_freqs.push_back(-1); - morph_freqs.push_back(-1); - } - - // Go through the corpus and build the label dictionary, - // counting the frequencies. - reader->Open(pipe_->GetOptions()->GetTrainingFilePath()); - ConstituencyInstance *instance = - static_cast(reader->GetNext()); - while (instance != NULL) { - // Word-level elements. - int instance_length = instance->size(); - for (int i = 0; i < instance_length; ++i) { - int id; - // Add lemma to alphabet. - id = lemma_alphabet.Insert(instance->GetLemma(i)); - if (id >= lemma_freqs.size()) { - CHECK_EQ(id, lemma_freqs.size()); - lemma_freqs.push_back(0); - } - ++lemma_freqs[id]; - - // Add FEATS to alphabet. - for (int j = 0; j < instance->GetNumMorphFeatures(i); ++j) { - id = morph_alphabet.Insert(instance->GetMorphFeature(i, j)); - if (id >= morph_freqs.size()) { - CHECK_EQ(id, morph_freqs.size()); - morph_freqs.push_back(0); - } - ++morph_freqs[id]; - } - } - - // Tree-level elements. - const ParseTree &tree = instance->GetParseTree(); - const std::vector &non_terminals = tree.non_terminals(); - int num_nodes = non_terminals.size(); - for (int i = 0; i < num_nodes; ++i) { - ParseTreeNode *node = non_terminals[i]; - const std::string &label = node->label(); - - // Add constituent to alphabet. - int id = constituent_alphabet_.Insert(label); - if (id >= label_freqs.size()) { - CHECK_EQ(id, label_freqs.size()); - label_freqs.push_back(0); - } - ++label_freqs[id]; - - // Add rule to alphabet. - if (!node->IsPreTerminal()) { - std::string rule = label + ":"; - for (int j = 0; j < node->GetNumChildren(); ++j) { - rule += " " + node->GetChild(j)->label(); - } - int rule_id = rule_alphabet_.Insert(rule); - } - } - delete instance; - instance = static_cast(reader->GetNext()); - } - reader->Close(); - constituent_alphabet_.StopGrowth(); - - // Now adjust the cutoffs if necessary. - while (true) { - lemma_alphabet_.clear(); - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - lemma_alphabet_.Insert(special_symbols[i]); - } - for (Alphabet::iterator iter = lemma_alphabet.begin(); - iter != lemma_alphabet.end(); - ++iter) { - if (lemma_freqs[iter->second] > lemma_cutoff) { - lemma_alphabet_.Insert(iter->first); - } - } - if (lemma_alphabet_.size() < kConstituencyMaxLemmaAlphabetSize) break; - ++lemma_cutoff; - LOG(INFO) << "Incrementing lemma cutoff to " << lemma_cutoff << "..."; - } - - while (true) { - morph_alphabet_.clear(); - for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { - morph_alphabet_.Insert(special_symbols[i]); - } - for (Alphabet::iterator iter = morph_alphabet.begin(); - iter != morph_alphabet.end(); - ++iter) { - if (morph_freqs[iter->second] > morph_cutoff) { - morph_alphabet_.Insert(iter->first); - } - } - if (morph_alphabet_.size() < kConstituencyMaxMorphAlphabetSize) break; - ++morph_cutoff; - LOG(INFO) << "Incrementing FEATS cutoff to " << morph_cutoff << "..."; - } - - lemma_alphabet_.StopGrowth(); - morph_alphabet_.StopGrowth(); - - CHECK_LT(lemma_alphabet_.size(), 0xffff); - CHECK_LT(morph_alphabet_.size(), 0xffff); - - LOG(INFO) << "Number of lemmas: " << lemma_alphabet_.size(); - LOG(INFO) << "Number of feats: " << morph_alphabet_.size(); - LOG(INFO) << "Number of constituent tags: " << constituent_alphabet_.size(); - LOG(INFO) << "Number of rules: " << rule_alphabet_.size(); - LOG(INFO) << "Constituent tags and their frequencies:"; - for (Alphabet::iterator it = constituent_alphabet_.begin(); - it != constituent_alphabet_.end(); - ++it) { - std::string label = it->first; - int label_id = it->second; - LOG(INFO) << label << "\t" << label_freqs[label_id]; - } -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "ConstituencyDictionary.h" +#include "ConstituencyLabelerPipe.h" +#include "ConstituencyInstance.h" +#include + +// Special symbols. +const string kConstituencyTokenUnknown = "_UNKNOWN_"; // Unknown word/lemma. +const string kConstituencyTokenStart = "_START_"; // Start symbol. +const string kConstituencyTokenStop = "_STOP_"; // Stop symbol. + +// Maximum alphabet sizes. +const unsigned int kConstituencyMaxLemmaAlphabetSize = 0xffff; +const unsigned int kConstituencyMaxMorphAlphabetSize = 0xfff; //0xffff; + +DEFINE_int32(constituency_lemma_cutoff, 0, + "Ignore word lemmas whose frequency is less than this."); +DEFINE_int32(constituency_morph_cutoff, 0, + "Ignore morphological features whose frequency is less than this."); + +void ConstituencyDictionary::CreateConstituentDictionary( + ConstituencyReader *reader) { + // Create tag dictionary. + CreateTagDictionary(reader); + + // Create constituent dictionary. + LOG(INFO) << "Creating constituent and rule dictionary..."; + std::vector label_freqs(constituent_alphabet_.size(), -1); + + int lemma_cutoff = FLAGS_constituency_lemma_cutoff; + int morph_cutoff = FLAGS_constituency_morph_cutoff; + std::vector lemma_freqs; + std::vector morph_freqs; + Alphabet lemma_alphabet; + Alphabet morph_alphabet; + + string special_symbols[NUM_SPECIAL_TOKENS]; + special_symbols[TOKEN_UNKNOWN] = kConstituencyTokenUnknown; + special_symbols[TOKEN_START] = kConstituencyTokenStart; + special_symbols[TOKEN_STOP] = kConstituencyTokenStop; + + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + lemma_alphabet.Insert(special_symbols[i]); + morph_alphabet.Insert(special_symbols[i]); + + // Counts of special symbols are set to -1: + lemma_freqs.push_back(-1); + morph_freqs.push_back(-1); + } + + // Go through the corpus and build the label dictionary, + // counting the frequencies. + reader->Open(pipe_->GetOptions()->GetTrainingFilePath()); + ConstituencyInstance *instance = + static_cast(reader->GetNext()); + while (instance != NULL) { + // Word-level elements. + int instance_length = instance->size(); + for (int i = 0; i < instance_length; ++i) { + int id; + // Add lemma to alphabet. + id = lemma_alphabet.Insert(instance->GetLemma(i)); + if (id >= lemma_freqs.size()) { + CHECK_EQ(id, lemma_freqs.size()); + lemma_freqs.push_back(0); + } + ++lemma_freqs[id]; + + // Add FEATS to alphabet. + for (int j = 0; j < instance->GetNumMorphFeatures(i); ++j) { + id = morph_alphabet.Insert(instance->GetMorphFeature(i, j)); + if (id >= morph_freqs.size()) { + CHECK_EQ(id, morph_freqs.size()); + morph_freqs.push_back(0); + } + ++morph_freqs[id]; + } + } + + // Tree-level elements. + const ParseTree &tree = instance->GetParseTree(); + const std::vector &non_terminals = tree.non_terminals(); + int num_nodes = non_terminals.size(); + for (int i = 0; i < num_nodes; ++i) { + ParseTreeNode *node = non_terminals[i]; + const std::string &label = node->label(); + + // Add constituent to alphabet. + int id = constituent_alphabet_.Insert(label); + if (id >= label_freqs.size()) { + CHECK_EQ(id, label_freqs.size()); + label_freqs.push_back(0); + } + ++label_freqs[id]; + + // Add rule to alphabet. + if (!node->IsPreTerminal()) { + std::string rule = label + ":"; + for (int j = 0; j < node->GetNumChildren(); ++j) { + rule += " " + node->GetChild(j)->label(); + } + int rule_id = rule_alphabet_.Insert(rule); + } + } + delete instance; + instance = static_cast(reader->GetNext()); + } + reader->Close(); + constituent_alphabet_.StopGrowth(); + + // Now adjust the cutoffs if necessary. + while (true) { + lemma_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + lemma_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = lemma_alphabet.begin(); + iter != lemma_alphabet.end(); + ++iter) { + if (lemma_freqs[iter->second] > lemma_cutoff) { + lemma_alphabet_.Insert(iter->first); + } + } + if (lemma_alphabet_.size() < kConstituencyMaxLemmaAlphabetSize) break; + ++lemma_cutoff; + LOG(INFO) << "Incrementing lemma cutoff to " << lemma_cutoff << "..."; + } + + while (true) { + morph_alphabet_.clear(); + for (int i = 0; i < NUM_SPECIAL_TOKENS; ++i) { + morph_alphabet_.Insert(special_symbols[i]); + } + for (Alphabet::iterator iter = morph_alphabet.begin(); + iter != morph_alphabet.end(); + ++iter) { + if (morph_freqs[iter->second] > morph_cutoff) { + morph_alphabet_.Insert(iter->first); + } + } + if (morph_alphabet_.size() < kConstituencyMaxMorphAlphabetSize) break; + ++morph_cutoff; + LOG(INFO) << "Incrementing FEATS cutoff to " << morph_cutoff << "..."; + } + + lemma_alphabet_.StopGrowth(); + morph_alphabet_.StopGrowth(); + + CHECK_LT(lemma_alphabet_.size(), 0xffff); + CHECK_LT(morph_alphabet_.size(), 0xffff); + + LOG(INFO) << "Number of lemmas: " << lemma_alphabet_.size(); + LOG(INFO) << "Number of feats: " << morph_alphabet_.size(); + LOG(INFO) << "Number of constituent tags: " << constituent_alphabet_.size(); + LOG(INFO) << "Number of rules: " << rule_alphabet_.size(); + LOG(INFO) << "Constituent tags and their frequencies:"; + for (Alphabet::iterator it = constituent_alphabet_.begin(); + it != constituent_alphabet_.end(); + ++it) { + std::string label = it->first; + int label_id = it->second; + LOG(INFO) << label << "\t" << label_freqs[label_id]; + } +} diff --git a/src/morphological_tagger/TurboMorphologicalTagger.cpp b/src/morphological_tagger/TurboMorphologicalTagger.cpp index 906c721..3ba7b4d 100644 --- a/src/morphological_tagger/TurboMorphologicalTagger.cpp +++ b/src/morphological_tagger/TurboMorphologicalTagger.cpp @@ -1,86 +1,86 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "MorphologicalPipe.h" - -using namespace std; - -void TrainMorphologicalTagger(); -void TestMorphologicalTagger(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - -#ifdef _WIN32 - google::LogToStderr(); -#endif - if (FLAGS_train) { - LOG(INFO) << "Training morphological tagger..." << endl; - TrainMorphologicalTagger(); - } else if (FLAGS_test) { - LOG(INFO) << "Running morphological tagger..." << endl; - TestMorphologicalTagger(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainMorphologicalTagger() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - MorphologicalOptions *options = new MorphologicalOptions; - options->Initialize(); - - MorphologicalPipe *pipe = new MorphologicalPipe(options); - pipe->Initialize(); - pipe->Train(); - pipe->SaveModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; - - delete pipe; - delete options; -} - -void TestMorphologicalTagger() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - MorphologicalOptions *options = new MorphologicalOptions; - options->Initialize(); - - MorphologicalPipe *pipe = new MorphologicalPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; - - delete pipe; - delete options; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "MorphologicalPipe.h" + +using namespace std; + +void TrainMorphologicalTagger(); +void TestMorphologicalTagger(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + +#ifdef _WIN32 + google::LogToStderr(); +#endif + if (FLAGS_train) { + LOG(INFO) << "Training morphological tagger..." << endl; + TrainMorphologicalTagger(); + } else if (FLAGS_test) { + LOG(INFO) << "Running morphological tagger..." << endl; + TestMorphologicalTagger(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainMorphologicalTagger() { + int time; + timeval start, end; + gettimeofday(&start, NULL); + + MorphologicalOptions *options = new MorphologicalOptions; + options->Initialize(); + + MorphologicalPipe *pipe = new MorphologicalPipe(options); + pipe->Initialize(); + pipe->Train(); + pipe->SaveModelFile(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Training took " << static_cast(time) / 1000.0 + << " sec." << endl; + + delete pipe; + delete options; +} + +void TestMorphologicalTagger() { + int time; + timeval start, end; + gettimeofday(&start, NULL); + + MorphologicalOptions *options = new MorphologicalOptions; + options->Initialize(); + + MorphologicalPipe *pipe = new MorphologicalPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + gettimeofday(&end, NULL); + time = diff_ms(end, start); + + LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 + << " sec." << endl; + + delete pipe; + delete options; +} diff --git a/src/sequence/SequenceReader.cpp b/src/sequence/SequenceReader.cpp index badf78a..c342202 100644 --- a/src/sequence/SequenceReader.cpp +++ b/src/sequence/SequenceReader.cpp @@ -1,61 +1,61 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "SequenceReader.h" -#include "Utils.h" -#include -#include - -using namespace std; - -Instance *SequenceReader::GetNext() { - // Fill all fields for the entire sentence. - vector > sentence_fields; - string line; - if (is_.is_open()) { - while (!is_.eof()) { - getline(is_, line); - if (line.length() <= 0) break; - vector fields; - StringSplit(line, "\t", &fields, true); - sentence_fields.push_back(fields); - } - } - - // Sentence length. - int length = sentence_fields.size(); - - // Convert to array of words and tags. - vector forms(length); - vector tags(length); - - for (int i = 0; i < length; ++i) { - const vector &info = sentence_fields[i]; - CHECK_EQ(info.size(), 2); - forms[i] = info[0]; - tags[i] = info[1]; - } - - SequenceInstance *instance = NULL; - if (length > 0) { - instance = new SequenceInstance; - instance->Initialize(forms, tags); - } - - return static_cast(instance); -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "SequenceReader.h" +#include "Utils.h" +#include +#include + +using namespace std; + +Instance *SequenceReader::GetNext() { + // Fill all fields for the entire sentence. + vector > sentence_fields; + string line; + if (is_.is_open()) { + while (!is_.eof()) { + getline(is_, line); + if (line.length() <= 0) break; + vector fields; + StringSplit(line, "\t", &fields, true); + sentence_fields.push_back(fields); + } + } + + // Sentence length. + int length = sentence_fields.size(); + + // Convert to array of words and tags. + vector forms(length); + vector tags(length); + + for (int i = 0; i < length; ++i) { + const vector &info = sentence_fields[i]; + CHECK_EQ(info.size(), 2); + forms[i] = info[0]; + tags[i] = info[1]; + } + + SequenceInstance *instance = NULL; + if (length > 0) { + instance = new SequenceInstance; + instance->Initialize(forms, tags); + } + + return static_cast(instance); +} From c0de62b18679520df51f5c163aef8d665c1b8523 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 22 Mar 2016 15:38:32 +0000 Subject: [PATCH 11/51] Update VSproject files. --- .../turbo_constituency_labeler.vcxproj | 2 +- .../turbo_coreference_resolver.vcxproj | 2 +- .../turbo_dependency_labeler.vcxproj | 2 +- .../turbo_entity_recognizer.vcxproj | 2 +- .../turbo_morphological_tagger.vcxproj | 528 +++++++++--------- vsprojects/turbo_parser/turbo_parser.vcxproj | 2 +- .../turbo_semantic_parser.vcxproj | 2 +- vsprojects/turbo_tagger/turbo_tagger.vcxproj | 2 +- vsprojects/turboparser.sln | 2 +- 9 files changed, 272 insertions(+), 272 deletions(-) diff --git a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj index e893a79..3de8afc 100644 --- a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj +++ b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj @@ -196,7 +196,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj index ecd9a3c..e150d76 100644 --- a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj +++ b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj @@ -196,7 +196,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj index f096830..3206e38 100644 --- a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj +++ b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj @@ -196,7 +196,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj index 770b1ec..8b8e2a4 100644 --- a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj +++ b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj index 8e09301..7e00c2c 100644 --- a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj +++ b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj @@ -1,265 +1,265 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release O0 - Win32 - - - Release O0 - x64 - - - Release - Win32 - - - Release - x64 - - - - {B9C929EE-DAA3-443C-BE47-4B7CEF435164} - Win32Proj - turbo_morphological_tagger - turbo_morphological_tagger - - - - Application - true - v120 - Unicode - - - Application - true - v120 - Unicode - - - Application - false - v120 - true - Unicode - - - Application - false - v120 - true - Unicode - - - Application - false - v120 - true - Unicode - - - Application - false - v120 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) - - - Console - true - ..\..\deps\glog-0.3.2\Debug;..\..\deps\gflags-2.0\Debug;..\..\deps\AD3-2.0.2\vsprojects\Debug - AD3.lib;libgflags-debug.lib;libglog.lib;%(AdditionalDependencies) - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) - $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) - Disabled - - - Console - true - ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) - - - Console - true - true - true - ..\..\deps\glog-0.3.2\Release;..\..\deps\gflags-2.0\Release;..\..\deps\AD3-2.0.2\vsprojects\Release - AD3.lib;libgflags.lib;libglog.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) - - - Console - true - true - true - ..\..\deps\glog-0.3.2\Release;..\..\deps\gflags-2.0\Release;..\..\deps\AD3-2.0.2\vsprojects\Release - AD3.lib;libgflags.lib;libglog.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) - $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) - AnySuitable - Speed - true - true - - - Console - true - true - true - ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) - - - - - Level3 - - - Disabled - true - false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) - $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) - Disabled - - - false - false - false - - - Console - true - true - true - ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) - - - - - - - - {572f3882-6014-4fb1-ae04-01a17d4eb041} - - - {26e7dfe3-2fc3-43c0-8499-b6a59669f20a} - - - {ecaf13e4-5ab5-4f92-9efe-565e79f0cd21} - - - {a17d3ac6-4c67-4615-8d6b-ddeabbb7faa5} - - - {6ec765b9-c3cd-4a5d-94c8-851333497db1} - - - {9811eff4-9d77-4000-b2b3-29155a8d722a} - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release O0 + Win32 + + + Release O0 + x64 + + + Release + Win32 + + + Release + x64 + + + + {B9C929EE-DAA3-443C-BE47-4B7CEF435164} + Win32Proj + turbo_morphological_tagger + turbo_morphological_tagger + + + + Application + true + v120 + Unicode + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + Application + false + v120 + true + Unicode + + + Application + false + v120 + true + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) + + + Console + true + ..\..\deps\glog-0.3.2\Debug;..\..\deps\gflags-2.0\Debug;..\..\deps\AD3-2.0.2\vsprojects\Debug + AD3.lib;libgflags-debug.lib;libglog.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + Disabled + + + Console + true + ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug + AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) + + + Console + true + true + true + ..\..\deps\glog-0.3.2\Release;..\..\deps\gflags-2.0\Release;..\..\deps\AD3-2.0.2\vsprojects\Release + AD3.lib;libgflags.lib;libglog.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) + + + Console + true + true + true + ..\..\deps\glog-0.3.2\Release;..\..\deps\gflags-2.0\Release;..\..\deps\AD3-2.0.2\vsprojects\Release + AD3.lib;libgflags.lib;libglog.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + AnySuitable + Speed + true + true + + + Console + true + true + true + ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + + + + + Level3 + + + Disabled + true + false + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + Disabled + + + false + false + false + + + Console + true + true + true + ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release + AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + + + + + + + + {572f3882-6014-4fb1-ae04-01a17d4eb041} + + + {26e7dfe3-2fc3-43c0-8499-b6a59669f20a} + + + {ecaf13e4-5ab5-4f92-9efe-565e79f0cd21} + + + {a17d3ac6-4c67-4615-8d6b-ddeabbb7faa5} + + + {6ec765b9-c3cd-4a5d-94c8-851333497db1} + + + {9811eff4-9d77-4000-b2b3-29155a8d722a} + + + + + \ No newline at end of file diff --git a/vsprojects/turbo_parser/turbo_parser.vcxproj b/vsprojects/turbo_parser/turbo_parser.vcxproj index 1047438..27a164f 100644 --- a/vsprojects/turbo_parser/turbo_parser.vcxproj +++ b/vsprojects/turbo_parser/turbo_parser.vcxproj @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj index 769b66a..7e5d4f7 100644 --- a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj +++ b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj @@ -225,7 +225,7 @@ true true true - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release diff --git a/vsprojects/turbo_tagger/turbo_tagger.vcxproj b/vsprojects/turbo_tagger/turbo_tagger.vcxproj index 6f163ba..4358796 100644 --- a/vsprojects/turbo_tagger/turbo_tagger.vcxproj +++ b/vsprojects/turbo_tagger/turbo_tagger.vcxproj @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turboparser.sln b/vsprojects/turboparser.sln index 6d0fd80..9b466da 100644 --- a/vsprojects/turboparser.sln +++ b/vsprojects/turboparser.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "classifier", "classifier\classifier.vcxproj", "{572F3882-6014-4FB1-AE04-01A17D4EB041}" EndProject From 62ad916aabd9bcc5960a86941c1f1e7ed60170a1 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 22 Mar 2016 16:52:18 +0000 Subject: [PATCH 12/51] Update VSproject files (for Debug mode). --- .../turbo_constituency_labeler.vcxproj | 2 +- .../turbo_coreference_resolver.vcxproj | 2 +- .../turbo_dependency_labeler/turbo_dependency_labeler.vcxproj | 2 +- .../turbo_entity_recognizer/turbo_entity_recognizer.vcxproj | 2 +- .../turbo_morphological_tagger.vcxproj | 2 +- vsprojects/turbo_parser/turbo_parser.vcxproj | 2 +- vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj | 2 +- vsprojects/turbo_tagger/turbo_tagger.vcxproj | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj index 3de8afc..faf48ff 100644 --- a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj +++ b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj @@ -141,7 +141,7 @@ Console true - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug diff --git a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj index e150d76..88f11a4 100644 --- a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj +++ b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj @@ -141,7 +141,7 @@ Console true - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug diff --git a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj index 3206e38..b25eaf4 100644 --- a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj +++ b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj @@ -141,7 +141,7 @@ Console true - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug diff --git a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj index 8b8e2a4..e7fdf30 100644 --- a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj +++ b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj @@ -143,7 +143,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj index 7e00c2c..766725f 100644 --- a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj +++ b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj @@ -143,7 +143,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_parser/turbo_parser.vcxproj b/vsprojects/turbo_parser/turbo_parser.vcxproj index 27a164f..cda631e 100644 --- a/vsprojects/turbo_parser/turbo_parser.vcxproj +++ b/vsprojects/turbo_parser/turbo_parser.vcxproj @@ -142,7 +142,7 @@ Console true - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug diff --git a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj index 7e5d4f7..27aaed6 100644 --- a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj +++ b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj @@ -166,7 +166,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_tagger/turbo_tagger.vcxproj b/vsprojects/turbo_tagger/turbo_tagger.vcxproj index 4358796..150d721 100644 --- a/vsprojects/turbo_tagger/turbo_tagger.vcxproj +++ b/vsprojects/turbo_tagger/turbo_tagger.vcxproj @@ -143,7 +143,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) From 7d93a253c6aeaeca57f6edd98258d3e99d79d7f3 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 22 Mar 2016 17:04:41 +0000 Subject: [PATCH 13/51] Update VSproject files (for Release O0 mode). --- .../turbo_constituency_labeler.vcxproj | 2 +- .../turbo_coreference_resolver.vcxproj | 2 +- .../turbo_dependency_labeler/turbo_dependency_labeler.vcxproj | 2 +- .../turbo_entity_recognizer/turbo_entity_recognizer.vcxproj | 2 +- .../turbo_morphological_tagger.vcxproj | 2 +- vsprojects/turbo_parser/turbo_parser.vcxproj | 2 +- vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj | 2 +- vsprojects/turbo_tagger/turbo_tagger.vcxproj | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj index faf48ff..fc5c578 100644 --- a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj +++ b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj @@ -220,7 +220,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj index 88f11a4..efec342 100644 --- a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj +++ b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj @@ -220,7 +220,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj index b25eaf4..da6ce9c 100644 --- a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj +++ b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj @@ -220,7 +220,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj index e7fdf30..be708fe 100644 --- a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj +++ b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj index 766725f..b90e3b9 100644 --- a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj +++ b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_parser/turbo_parser.vcxproj b/vsprojects/turbo_parser/turbo_parser.vcxproj index cda631e..fdf7ae4 100644 --- a/vsprojects/turbo_parser/turbo_parser.vcxproj +++ b/vsprojects/turbo_parser/turbo_parser.vcxproj @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj index 27aaed6..a09cdfb 100644 --- a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj +++ b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj @@ -249,7 +249,7 @@ true true true - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release diff --git a/vsprojects/turbo_tagger/turbo_tagger.vcxproj b/vsprojects/turbo_tagger/turbo_tagger.vcxproj index 150d721..f8b9f9e 100644 --- a/vsprojects/turbo_tagger/turbo_tagger.vcxproj +++ b/vsprojects/turbo_tagger/turbo_tagger.vcxproj @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3.lib;libgflags.lib;libglog_static.lib;gtest.lib;%(AdditionalDependencies) + AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) From 9ea50da4cb8032bd9322e571997a0e150700bb3b Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 22 Mar 2016 17:12:34 +0000 Subject: [PATCH 14/51] Update .gitignore. --- .gitignore | 59 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index f3077b3..f4cfc65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,31 @@ -Makefile -TurboParser -TurboTagger -autom4te.cache -compile -config.h -config.log -config.status -deps/AD3-2.0.2/ -deps/gflags-2.0/ -deps/glog-0.3.2/ -deps/eigen-eigen-c58038c56923/ -deps/local/ -data_local/ -ner/ -*.o -*.obj -*.tlog -stamp-h1 -.deps -vsprojects/*/x64 -vsprojects/x64/* -vsprojects/*/Debug -vsprojects/Debug/* -vsprojects/*/Release -vsprojects/Release/* -vsprojects/*/*.vcxproj.user -vsprojects/*/*.vcxproj.filters -vsprojects/*.sdf +Makefile +TurboParser +TurboTagger +autom4te.cache +compile +config.h +config.log +config.status +deps/AD3-2.0.2/ +deps/gflags-2.0/ +deps/glog-0.3.2/ +deps/googletest/ +deps/eigen-eigen-c58038c56923/ +deps/local/ +data_local/ +ner/ +*.o +*.obj +*.tlog +stamp-h1 +.deps +vsprojects/*/x64 +vsprojects/x64/* +vsprojects/*/Debug +vsprojects/Debug/* +vsprojects/*/Release +vsprojects/Release/* +vsprojects/*/*.vcxproj.user +vsprojects/*/*.vcxproj.filters +vsprojects/*.sdf vsprojects/*.opensdf \ No newline at end of file From 9b57d1d358128c61b0271337f73f72228dfb9e61 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 24 Mar 2016 18:20:30 +0000 Subject: [PATCH 15/51] Purge timeval and timezone structs and usage of gettimeofday. Implementation of std::chrono usage. Update .gitignore. --- .gitignore | 4 +- libturboparser/TurboParserInterface.cpp | 168 +- src/classifier/Pipe.cpp | 58 +- .../ConstituencyLabelerPipe.h | 495 ++- .../TurboConstituencyLabeler.cpp | 200 +- src/coreference_resolver/CoreferencePipe.h | 343 +- .../TurboCoreferenceResolver.cpp | 200 +- .../DependencyLabelerPipe.h | 467 ++- .../TurboDependencyLabeler.cpp | 204 +- .../TurboEntityRecognizer.cpp | 172 +- .../TurboMorphologicalTagger.cpp | 34 +- src/parser/DependencyDecoder.cpp | 37 +- src/parser/DependencyPipe.h | 588 ++- src/parser/TurboParser.cpp | 256 +- src/semantic_parser/SemanticDecoder.cpp | 3316 ++++++++--------- src/semantic_parser/SemanticPipe.h | 819 ++-- src/semantic_parser/TurboSemanticParser.cpp | 256 +- src/sequence/SequencePipe.h | 11 +- src/tagger/TurboTagger.cpp | 172 +- src/util/TimeUtils.cpp | 61 +- src/util/TimeUtils.h | 22 +- src/util/chrono.h | 106 + vsprojects/util/util.vcxproj | 5 +- vsprojects/util/util.vcxproj.filters | 109 +- 24 files changed, 4051 insertions(+), 4052 deletions(-) create mode 100644 src/util/chrono.h diff --git a/.gitignore b/.gitignore index f4cfc65..f73f21e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,5 +27,7 @@ vsprojects/*/Release vsprojects/Release/* vsprojects/*/*.vcxproj.user vsprojects/*/*.vcxproj.filters +vsprojects/*.opendb +vsprojects/*.opensdf vsprojects/*.sdf -vsprojects/*.opensdf \ No newline at end of file +vsprojects/*.cachefile \ No newline at end of file diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 3f79840..a979505 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -29,17 +29,16 @@ TurboTaggerWorker::~TurboTaggerWorker() { void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { tagger_options_->SetModelFilePath(file_model); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); tagger_pipe_->LoadModelFile(); + + chrono.StopTime(); + time = chrono.GetElapsedTime(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboTaggerWorker::Tag(const std::string &file_test, @@ -47,17 +46,16 @@ void TurboTaggerWorker::Tag(const std::string &file_test, tagger_options_->SetTestFilePath(file_test); tagger_options_->SetOutputFilePath(file_prediction); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); tagger_pipe_->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { @@ -83,17 +81,16 @@ void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( const std::string &file_model) { entity_options_->SetModelFilePath(file_model); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); entity_pipe_->LoadModelFile(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboEntityRecognizerWorker::Tag(const std::string &file_test, @@ -101,17 +98,16 @@ void TurboEntityRecognizerWorker::Tag(const std::string &file_test, entity_options_->SetTestFilePath(file_test); entity_options_->SetOutputFilePath(file_prediction); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); entity_pipe_->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { @@ -136,17 +132,16 @@ TurboParserWorker::~TurboParserWorker() { void TurboParserWorker::LoadParserModel(const std::string &file_model) { parser_options_->SetModelFilePath(file_model); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); parser_pipe_->LoadModelFile(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboParserWorker::Parse(const std::string &file_test, @@ -154,17 +149,16 @@ void TurboParserWorker::Parse(const std::string &file_test, parser_options_->SetTestFilePath(file_test); parser_options_->SetOutputFilePath(file_prediction); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); parser_pipe_->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { @@ -190,19 +184,18 @@ void TurboSemanticParserWorker::LoadSemanticParserModel( const std::string &file_model) { semantic_options_->SetModelFilePath(file_model); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); LOG(INFO) << "Loading model file " << file_model; semantic_pipe_->LoadModelFile(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboSemanticParserWorker::ParseSemanticDependencies( @@ -211,21 +204,20 @@ void TurboSemanticParserWorker::ParseSemanticDependencies( semantic_options_->SetTestFilePath(file_test); semantic_options_->SetOutputFilePath(file_prediction); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); semantic_pipe_->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( - SemanticInstance *sentence) { + SemanticInstance *sentence) { semantic_pipe_->ClassifyInstance(sentence); } @@ -248,19 +240,18 @@ void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( const std::string &file_model) { coreference_options_->SetModelFilePath(file_model); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); LOG(INFO) << "Loading model file " << file_model; coreference_pipe_->LoadModelFile(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboCoreferenceResolverWorker::ResolveCoreferences( @@ -269,21 +260,20 @@ void TurboCoreferenceResolverWorker::ResolveCoreferences( coreference_options_->SetTestFilePath(file_test); coreference_options_->SetOutputFilePath(file_prediction); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); coreference_pipe_->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( - CoreferenceDocument *document) { + CoreferenceDocument *document) { coreference_pipe_->ClassifyInstance(document); } @@ -304,21 +294,20 @@ TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() { } void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( - const std::string - &file_model) { + const std::string + &file_model) { morphological_tagger_options_->SetModelFilePath(file_model); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); morphological_tagger_pipe_->LoadModelFile(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, @@ -326,21 +315,20 @@ void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, morphological_tagger_options_->SetTestFilePath(file_test); morphological_tagger_options_->SetOutputFilePath(file_prediction); - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); morphological_tagger_pipe_->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); + chrono.StopTime(); + time = chrono.GetElapsedTime(); - LOG(INFO) << "Took " << static_cast(time) / 1000.0 - << " sec." << endl; + LOG(INFO) << "Took " << time << " sec." << endl; } void TurboMorphologicalTaggerWorker::TagSentence( - MorphologicalInstance *sentence) { + MorphologicalInstance *sentence) { morphological_tagger_pipe_->ClassifyInstance(sentence); } diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index 43f3e50..d41cac8 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -156,8 +156,8 @@ void Pipe::Train() { } void Pipe::CreateInstances() { - timeval start, end; - gettimeofday(&start, NULL); + chronowrap::Chronometer chrono; + chrono.GetTime(); LOG(INFO) << "Creating instances..."; @@ -172,8 +172,8 @@ void Pipe::CreateInstances() { LOG(INFO) << "Number of instances: " << instances_.size(); - gettimeofday(&end, NULL); - LOG(INFO) << "Time: " << diff_ms(end, start); + chrono.StopTime(); + LOG(INFO) << "Time: " << chrono.GetElapsedTime() << " sec."; } void Pipe::MakeSupportedParameters() { @@ -218,10 +218,10 @@ void Pipe::TrainEpoch(int epoch) { int num_instances = instances_.size(); double lambda = 1.0 / (options_->GetRegularizationConstant() * (static_cast(num_instances))); - timeval start, end; - gettimeofday(&start, NULL); - int time_decoding = 0; - int time_scores = 0; + chronowrap::Chronometer chrono; + chrono.GetTime(); + double time_decoding = 0; + double time_scores = 0; int num_mistakes = 0; if (epoch == 0) { @@ -246,11 +246,11 @@ void Pipe::TrainEpoch(int epoch) { RemoveUnsupportedFeatures(instance, parts, features); } - timeval start_scores, end_scores; - gettimeofday(&start_scores, NULL); + chronowrap::Chronometer chrono_scores; + chrono_scores.GetTime(); ComputeScores(instance, parts, features, &scores); - gettimeofday(&end_scores, NULL); - time_scores += diff_ms(end_scores, start_scores); + chrono_scores.StopTime(); + time_scores += chrono_scores.GetElapsedTime(); // This is a no-op by default. But it's convenient to have it here to build // latent-variable structured classifiers (e.g. for coreference resolution). @@ -259,11 +259,11 @@ void Pipe::TrainEpoch(int epoch) { if (options_->GetTrainingAlgorithm() == "perceptron" || options_->GetTrainingAlgorithm() == "mira") { - timeval start_decoding, end_decoding; - gettimeofday(&start_decoding, NULL); + chronowrap::Chronometer chrono_decoding; + chrono_decoding.GetTime(); decoder_->Decode(instance, parts, scores, &predicted_outputs); - gettimeofday(&end_decoding, NULL); - time_decoding += diff_ms(end_decoding, start_decoding); + chrono_decoding.StopTime(); + time_decoding += chrono_decoding.GetElapsedTime(); if (options_->GetTrainingAlgorithm() == "perceptron") { for (int r = 0; r < parts->size(); ++r) { @@ -285,8 +285,8 @@ void Pipe::TrainEpoch(int epoch) { options_->GetTrainingAlgorithm() == "crf_sgd" || options_->GetTrainingAlgorithm() == "crf_margin_sgd") { double loss; - timeval start_decoding, end_decoding; - gettimeofday(&start_decoding, NULL); + chronowrap::Chronometer chrono_decoding; + chrono_decoding.GetTime(); if (options_->GetTrainingAlgorithm() == "svm_mira" || options_->GetTrainingAlgorithm() == "svm_sgd") { // Do cost-augmented inference. @@ -310,8 +310,8 @@ void Pipe::TrainEpoch(int epoch) { &predicted_outputs, &entropy, &loss); CHECK_GE(entropy, 0.0); } - gettimeofday(&end_decoding, NULL); - time_decoding += diff_ms(end_decoding, start_decoding); + chrono_decoding.StopTime(); + time_decoding += chrono_decoding.GetElapsedTime(); loss -= inner_loss; if (loss < 0.0) { @@ -379,10 +379,10 @@ void Pipe::TrainEpoch(int epoch) { delete parts; delete features; - gettimeofday(&end, NULL); - LOG(INFO) << "Time: " << diff_ms(end, start); - LOG(INFO) << "Time to score: " << time_scores; - LOG(INFO) << "Time to decode: " << time_decoding; + chrono.StopTime(); + LOG(INFO) << "Time: " << chrono.GetElapsedTime() << " sec."; + LOG(INFO) << "Time to score: " << time_scores << " sec."; + LOG(INFO) << "Time to decode: " << time_decoding << " sec."; LOG(INFO) << "Number of Features: " << parameters_->Size(); if (options_->GetTrainingAlgorithm() == "perceptron" || options_->GetTrainingAlgorithm() == "mira") { @@ -403,8 +403,8 @@ void Pipe::Run() { vector gold_outputs; vector predicted_outputs; - timeval start, end; - gettimeofday(&start, NULL); + chronowrap::Chronometer chrono; + chrono.GetTime(); if (options_->evaluate()) BeginEvaluation(); @@ -445,9 +445,9 @@ void Pipe::Run() { writer_->Close(); reader_->Close(); - gettimeofday(&end, NULL); + chrono.StopTime(); LOG(INFO) << "Number of instances: " << num_instances; - LOG(INFO) << "Time: " << diff_ms(end, start); + LOG(INFO) << "Time: " << chrono.GetElapsedTime() << " sec."; if (options_->evaluate()) EndEvaluation(); } @@ -484,4 +484,4 @@ void Pipe::ClassifyInstance(Instance *instance) { delete parts; delete features; -} +} diff --git a/src/constituency_labeler/ConstituencyLabelerPipe.h b/src/constituency_labeler/ConstituencyLabelerPipe.h index c15fa91..7d5ed0c 100644 --- a/src/constituency_labeler/ConstituencyLabelerPipe.h +++ b/src/constituency_labeler/ConstituencyLabelerPipe.h @@ -1,249 +1,248 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef CONSTITUENCYLABELERPIPE_H_ -#define CONSTITUENCYLABELERPIPE_H_ - -#include "Pipe.h" -#include "ConstituencyLabelerOptions.h" -#include "ConstituencyLabelerReader.h" -#include "ConstituencyLabelerDictionary.h" -#include "TokenDictionary.h" -#include "ConstituencyLabelerInstanceNumeric.h" -#include "ConstituencyLabelerWriter.h" -#include "ConstituencyLabelerPart.h" -#include "ConstituencyLabelerFeatures.h" -#include "ConstituencyLabelerDecoder.h" - -class ConstituencyLabelerPipe : public Pipe { -public: - ConstituencyLabelerPipe(Options* options) : Pipe(options) { - token_dictionary_ = NULL; - } - virtual ~ConstituencyLabelerPipe() { delete token_dictionary_; } - - ConstituencyLabelerReader *GetConstituencyReader() { - return static_cast(reader_); - }; - ConstituencyLabelerDictionary *GetConstituencyLabelerDictionary() { - return static_cast(dictionary_); - }; - ConstituencyLabelerOptions *GetConstituencyLabelerOptions() { - return static_cast(options_); - }; - -protected: - void CreateDictionary() { - dictionary_ = new ConstituencyLabelerDictionary(this); - GetConstituencyLabelerDictionary()->SetTokenDictionary(token_dictionary_); - } - void CreateReader() { reader_ = new ConstituencyLabelerReader; } - void CreateWriter() { writer_ = new ConstituencyLabelerWriter; } - void CreateDecoder() { decoder_ = new ConstituencyLabelerDecoder(this); }; - Parts *CreateParts() { return new ConstituencyLabelerParts; }; - Features *CreateFeatures() { return new ConstituencyLabelerFeatures(this); }; - - void CreateTokenDictionary() { - token_dictionary_ = new TokenDictionary(this); - }; - - void PreprocessData(); - - Instance *GetFormattedInstance(Instance *instance) { - ConstituencyLabelerInstanceNumeric *instance_numeric = - new ConstituencyLabelerInstanceNumeric; - instance_numeric->Initialize( - *GetConstituencyLabelerDictionary(), - static_cast(instance)); - return instance_numeric; - } - -protected: - void SaveModel(FILE* fs); - void LoadModel(FILE* fs); - - // Return the allowed labels for the i-th node. An empty vector means that all - // tags are allowed. - void GetAllowedLabels(Instance *instance, int i, - std::vector *allowed_labels) { - // Make constituent-label dictionary pruning. - allowed_labels->clear(); - bool prune_labels = GetConstituencyLabelerOptions()->prune_labels(); - if (!prune_labels) return; - - ConstituencyLabelerInstanceNumeric *sentence = - static_cast(instance); - ConstituencyLabelerDictionary *labeler_dictionary = - GetConstituencyLabelerDictionary(); - - int constituent_id = sentence->GetConstituentId(i); - *allowed_labels = - labeler_dictionary->GetConstituentLabels(constituent_id); - } - - void MakeParts(Instance *instance, Parts *parts, - std::vector *gold_outputs); - - void MakeNodeParts(Instance *instance, - Parts *parts, - std::vector *gold_outputs); - - void MakeSelectedFeatures(Instance *instance, Parts *parts, - const std::vector &selected_parts, - Features *features); - - void ComputeScores(Instance *instance, Parts *parts, Features *features, - std::vector *scores); - - void MakeFeatureDifference(Parts *parts, - Features *features, - const std::vector &gold_output, - const std::vector &predicted_output, - FeatureVector *difference); - - void MakeGradientStep(Parts *parts, - Features *features, - double eta, - int iteration, - const std::vector &gold_output, - const std::vector &predicted_output); - - void LabelInstance(Parts *parts, const std::vector &output, - Instance *instance); - - void BeginEvaluation() { - num_tokens_ = 0; - num_constituents_ = 0; - num_matched_labels_ = 0; - num_predicted_labels_ = 0; - num_gold_labels_ = 0; - num_pruned_gold_labels_ = 0; - num_possible_labels_ = 0; - gettimeofday(&start_clock_, NULL); - } - void EvaluateInstance(Instance *instance, - Instance *output_instance, - Parts *parts, - const std::vector &gold_outputs, - const std::vector &predicted_outputs) { - ConstituencyLabelerInstance *labeler_instance = - static_cast(instance); - ConstituencyLabelerParts *labeler_parts = - static_cast(parts); - ConstituencyLabelerOptions *labeler_options = - static_cast(options_); - ConstituencyLabelerDictionary *labeler_dictionary = - static_cast(dictionary_); - const std::string &null_label = labeler_options->null_label(); - - int num_possible_labels = 0; - int num_gold_labels = 0; - int num_actual_gold_labels = 0; - for (int i = 0; i < labeler_instance->GetNumConstituents(); ++i) { - if (labeler_instance->GetConstituentLabel(i) != null_label) { - ++num_actual_gold_labels; - } - } - - for (int i = 0; i < labeler_instance->GetNumConstituents(); ++i) { - const vector& nodes = labeler_parts->FindNodeParts(i); - for (int k = 0; k < nodes.size(); ++k) { - int r = nodes[k]; - int label = - static_cast((*parts)[r])->label(); - - // Ignore if this is the null label. - if (label == labeler_dictionary->null_label()) continue; - - ++num_possible_labels; - if (gold_outputs[r] >= 0.5) { - CHECK_EQ(gold_outputs[r], 1.0); - if (NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { - ++num_matched_labels_; - } - ++num_gold_labels; - } - if (predicted_outputs[r] >= 0.5) { - CHECK_EQ(predicted_outputs[r], 1.0); - ++num_predicted_labels_; - } - } - ++num_constituents_; - } - num_tokens_ += labeler_instance->size(); - num_gold_labels_ += num_actual_gold_labels; - int missed_labels = num_actual_gold_labels - num_gold_labels; - - num_pruned_gold_labels_ += missed_labels; - num_possible_labels_ += num_possible_labels; - } - void EndEvaluation() { - double precision = - static_cast(num_matched_labels_) / - static_cast(num_predicted_labels_); - double recall = - static_cast(num_matched_labels_) / - static_cast(num_gold_labels_); - double F1 = 2.0 * precision * recall / (precision + recall); - double pruning_recall = - static_cast(num_gold_labels_ - - num_pruned_gold_labels_) / - static_cast(num_gold_labels_); - double pruning_efficiency = - static_cast(num_possible_labels_) / - static_cast(num_constituents_); - - LOG(INFO) << "Precision: " << precision - << " (" << num_matched_labels_ << "/" - << num_predicted_labels_ << ")"; - LOG(INFO) << "Recall: " << recall - << " (" << num_matched_labels_ << "/" - << num_gold_labels_ << ")"; - LOG(INFO) << "F1: " << F1; - LOG(INFO) << "Pruning recall: " << pruning_recall - << " (" - << num_gold_labels_ - num_pruned_gold_labels_ - << "/" - << num_gold_labels_ << ")"; - LOG(INFO) << "Pruning efficiency: " << pruning_efficiency - << " possible labels per node" - << " (" << num_possible_labels_ << "/" - << num_constituents_ << ")"; - - timeval end_clock; - gettimeofday(&end_clock, NULL); - double num_seconds = - static_cast(diff_ms(end_clock, start_clock_)) / 1000.0; - double tokens_per_second = static_cast(num_tokens_) / num_seconds; - LOG(INFO) << "Speed: " - << tokens_per_second << " tokens per second."; - } - -protected: - TokenDictionary *token_dictionary_; - int num_tokens_; - int num_constituents_; - int num_matched_labels_; - int num_predicted_labels_; - int num_gold_labels_; - int num_pruned_gold_labels_; +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef CONSTITUENCYLABELERPIPE_H_ +#define CONSTITUENCYLABELERPIPE_H_ + +#include "Pipe.h" +#include "TimeUtils.h" +#include "ConstituencyLabelerOptions.h" +#include "ConstituencyLabelerReader.h" +#include "ConstituencyLabelerDictionary.h" +#include "TokenDictionary.h" +#include "ConstituencyLabelerInstanceNumeric.h" +#include "ConstituencyLabelerWriter.h" +#include "ConstituencyLabelerPart.h" +#include "ConstituencyLabelerFeatures.h" +#include "ConstituencyLabelerDecoder.h" + +class ConstituencyLabelerPipe : public Pipe { +public: + ConstituencyLabelerPipe(Options* options) : Pipe(options) { + token_dictionary_ = NULL; + } + virtual ~ConstituencyLabelerPipe() { delete token_dictionary_; } + + ConstituencyLabelerReader *GetConstituencyReader() { + return static_cast(reader_); + }; + ConstituencyLabelerDictionary *GetConstituencyLabelerDictionary() { + return static_cast(dictionary_); + }; + ConstituencyLabelerOptions *GetConstituencyLabelerOptions() { + return static_cast(options_); + }; + +protected: + void CreateDictionary() { + dictionary_ = new ConstituencyLabelerDictionary(this); + GetConstituencyLabelerDictionary()->SetTokenDictionary(token_dictionary_); + } + void CreateReader() { reader_ = new ConstituencyLabelerReader; } + void CreateWriter() { writer_ = new ConstituencyLabelerWriter; } + void CreateDecoder() { decoder_ = new ConstituencyLabelerDecoder(this); }; + Parts *CreateParts() { return new ConstituencyLabelerParts; }; + Features *CreateFeatures() { return new ConstituencyLabelerFeatures(this); }; + + void CreateTokenDictionary() { + token_dictionary_ = new TokenDictionary(this); + }; + + void PreprocessData(); + + Instance *GetFormattedInstance(Instance *instance) { + ConstituencyLabelerInstanceNumeric *instance_numeric = + new ConstituencyLabelerInstanceNumeric; + instance_numeric->Initialize( + *GetConstituencyLabelerDictionary(), + static_cast(instance)); + return instance_numeric; + } + +protected: + void SaveModel(FILE* fs); + void LoadModel(FILE* fs); + + // Return the allowed labels for the i-th node. An empty vector means that all + // tags are allowed. + void GetAllowedLabels(Instance *instance, int i, + std::vector *allowed_labels) { + // Make constituent-label dictionary pruning. + allowed_labels->clear(); + bool prune_labels = GetConstituencyLabelerOptions()->prune_labels(); + if (!prune_labels) return; + + ConstituencyLabelerInstanceNumeric *sentence = + static_cast(instance); + ConstituencyLabelerDictionary *labeler_dictionary = + GetConstituencyLabelerDictionary(); + + int constituent_id = sentence->GetConstituentId(i); + *allowed_labels = + labeler_dictionary->GetConstituentLabels(constituent_id); + } + + void MakeParts(Instance *instance, Parts *parts, + std::vector *gold_outputs); + + void MakeNodeParts(Instance *instance, + Parts *parts, + std::vector *gold_outputs); + + void MakeSelectedFeatures(Instance *instance, Parts *parts, + const std::vector &selected_parts, + Features *features); + + void ComputeScores(Instance *instance, Parts *parts, Features *features, + std::vector *scores); + + void MakeFeatureDifference(Parts *parts, + Features *features, + const std::vector &gold_output, + const std::vector &predicted_output, + FeatureVector *difference); + + void MakeGradientStep(Parts *parts, + Features *features, + double eta, + int iteration, + const std::vector &gold_output, + const std::vector &predicted_output); + + void LabelInstance(Parts *parts, const std::vector &output, + Instance *instance); + + void BeginEvaluation() { + num_tokens_ = 0; + num_constituents_ = 0; + num_matched_labels_ = 0; + num_predicted_labels_ = 0; + num_gold_labels_ = 0; + num_pruned_gold_labels_ = 0; + num_possible_labels_ = 0; + chrono.GetTime(); + } + void EvaluateInstance(Instance *instance, + Instance *output_instance, + Parts *parts, + const std::vector &gold_outputs, + const std::vector &predicted_outputs) { + ConstituencyLabelerInstance *labeler_instance = + static_cast(instance); + ConstituencyLabelerParts *labeler_parts = + static_cast(parts); + ConstituencyLabelerOptions *labeler_options = + static_cast(options_); + ConstituencyLabelerDictionary *labeler_dictionary = + static_cast(dictionary_); + const std::string &null_label = labeler_options->null_label(); + + int num_possible_labels = 0; + int num_gold_labels = 0; + int num_actual_gold_labels = 0; + for (int i = 0; i < labeler_instance->GetNumConstituents(); ++i) { + if (labeler_instance->GetConstituentLabel(i) != null_label) { + ++num_actual_gold_labels; + } + } + + for (int i = 0; i < labeler_instance->GetNumConstituents(); ++i) { + const vector& nodes = labeler_parts->FindNodeParts(i); + for (int k = 0; k < nodes.size(); ++k) { + int r = nodes[k]; + int label = + static_cast((*parts)[r])->label(); + + // Ignore if this is the null label. + if (label == labeler_dictionary->null_label()) continue; + + ++num_possible_labels; + if (gold_outputs[r] >= 0.5) { + CHECK_EQ(gold_outputs[r], 1.0); + if (NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { + ++num_matched_labels_; + } + ++num_gold_labels; + } + if (predicted_outputs[r] >= 0.5) { + CHECK_EQ(predicted_outputs[r], 1.0); + ++num_predicted_labels_; + } + } + ++num_constituents_; + } + num_tokens_ += labeler_instance->size(); + num_gold_labels_ += num_actual_gold_labels; + int missed_labels = num_actual_gold_labels - num_gold_labels; + + num_pruned_gold_labels_ += missed_labels; + num_possible_labels_ += num_possible_labels; + } + void EndEvaluation() { + double precision = + static_cast(num_matched_labels_) / + static_cast(num_predicted_labels_); + double recall = + static_cast(num_matched_labels_) / + static_cast(num_gold_labels_); + double F1 = 2.0 * precision * recall / (precision + recall); + double pruning_recall = + static_cast(num_gold_labels_ - + num_pruned_gold_labels_) / + static_cast(num_gold_labels_); + double pruning_efficiency = + static_cast(num_possible_labels_) / + static_cast(num_constituents_); + + LOG(INFO) << "Precision: " << precision + << " (" << num_matched_labels_ << "/" + << num_predicted_labels_ << ")"; + LOG(INFO) << "Recall: " << recall + << " (" << num_matched_labels_ << "/" + << num_gold_labels_ << ")"; + LOG(INFO) << "F1: " << F1; + LOG(INFO) << "Pruning recall: " << pruning_recall + << " (" + << num_gold_labels_ - num_pruned_gold_labels_ + << "/" + << num_gold_labels_ << ")"; + LOG(INFO) << "Pruning efficiency: " << pruning_efficiency + << " possible labels per node" + << " (" << num_possible_labels_ << "/" + << num_constituents_ << ")"; + + chrono.StopTime(); + double num_seconds = chrono.GetElapsedTime(); + double tokens_per_second = static_cast(num_tokens_) / num_seconds; + LOG(INFO) << "Speed: " + << tokens_per_second << " tokens per second."; + } + +protected: + TokenDictionary *token_dictionary_; + int num_tokens_; + int num_constituents_; + int num_matched_labels_; + int num_predicted_labels_; + int num_gold_labels_; + int num_pruned_gold_labels_; int num_possible_labels_; - timeval start_clock_; -}; - -#endif /* CONSTITUENCYLABELERPIPE_H_ */ + chronowrap::Chronometer chrono; +}; + +#endif /* CONSTITUENCYLABELERPIPE_H_ */ diff --git a/src/constituency_labeler/TurboConstituencyLabeler.cpp b/src/constituency_labeler/TurboConstituencyLabeler.cpp index c046070..28fc028 100644 --- a/src/constituency_labeler/TurboConstituencyLabeler.cpp +++ b/src/constituency_labeler/TurboConstituencyLabeler.cpp @@ -1,101 +1,99 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "ConstituencyLabelerPipe.h" - -void TrainConstituencyLabeler(); -void TestConstituencyLabeler(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - - if (FLAGS_train) { - LOG(INFO) << "Training constituency labeler..." << endl; - TrainConstituencyLabeler(); - } else if (FLAGS_test) { - LOG(INFO) << "Running constituency labeler..." << endl; - TestConstituencyLabeler(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainConstituencyLabeler() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - ConstituencyLabelerOptions *options = new ConstituencyLabelerOptions; - options->Initialize(); - - ConstituencyLabelerPipe *pipe = new ConstituencyLabelerPipe(options); - pipe->Initialize(); - - LOG(INFO) << "Training the constituency labeler..."; - pipe->Train(); - pipe->SaveModelFile(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TestConstituencyLabeler() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - ConstituencyLabelerOptions *options = new ConstituencyLabelerOptions; - options->Initialize(); - - ConstituencyLabelerPipe *pipe = new ConstituencyLabelerPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "ConstituencyLabelerPipe.h" + +void TrainConstituencyLabeler(); +void TestConstituencyLabeler(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + + if (FLAGS_train) { + LOG(INFO) << "Training constituency labeler..." << endl; + TrainConstituencyLabeler(); + } else if (FLAGS_test) { + LOG(INFO) << "Running constituency labeler..." << endl; + TestConstituencyLabeler(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainConstituencyLabeler() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + ConstituencyLabelerOptions *options = new ConstituencyLabelerOptions; + options->Initialize(); + + ConstituencyLabelerPipe *pipe = new ConstituencyLabelerPipe(options); + pipe->Initialize(); + + LOG(INFO) << "Training the constituency labeler..."; + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestConstituencyLabeler() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + ConstituencyLabelerOptions *options = new ConstituencyLabelerOptions; + options->Initialize(); + + ConstituencyLabelerPipe *pipe = new ConstituencyLabelerPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/coreference_resolver/CoreferencePipe.h b/src/coreference_resolver/CoreferencePipe.h index 8805603..4f71d27 100644 --- a/src/coreference_resolver/CoreferencePipe.h +++ b/src/coreference_resolver/CoreferencePipe.h @@ -1,175 +1,174 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEPIPE_H_ -#define COREFERENCEPIPE_H_ - -#include "Pipe.h" -#include "CoreferenceOptions.h" -#include "CoreferenceReader.h" -#include "CoreferenceDictionary.h" -#include "TokenDictionary.h" -#include "CoreferenceDocumentNumeric.h" -#include "CoreferenceWriter.h" -#include "CoreferencePart.h" -#include "CoreferenceFeatures.h" -#include "CoreferenceDecoder.h" - -class CoreferencePipe : public Pipe { -public: - CoreferencePipe(Options* options) : Pipe(options) { - token_dictionary_ = NULL; - dependency_dictionary_ = NULL; - semantic_dictionary_ = NULL; - } - virtual ~CoreferencePipe() { - delete token_dictionary_; - delete dependency_dictionary_; - delete semantic_dictionary_; - } - - CoreferenceOptions *GetCoreferenceOptions() { - return static_cast(options_); - }; - CoreferenceReader *GetCoreferenceReader() { - return static_cast(reader_); - }; - CoreferenceSentenceReader *GetCoreferenceSentenceReader() { - return GetCoreferenceReader()->GetSentenceReader(); - }; - CoreferenceDictionary *GetCoreferenceDictionary() { - return static_cast(dictionary_); - }; - SemanticDictionary *GetSemanticDictionary() { - return static_cast(semantic_dictionary_); - }; - DependencyDictionary *GetDependencyDictionary() { - return static_cast(dependency_dictionary_); - }; - -protected: - void CreateDictionary() { - dictionary_ = new CoreferenceDictionary(this); - GetCoreferenceDictionary()->SetTokenDictionary(token_dictionary_); - GetCoreferenceDictionary()->SetDependencyDictionary(dependency_dictionary_); - GetCoreferenceDictionary()->SetSemanticDictionary(semantic_dictionary_); - } - void CreateReader() { reader_ = new CoreferenceReader(options_); } - void CreateWriter() { writer_ = new CoreferenceWriter(options_); } - void CreateDecoder() { decoder_ = new CoreferenceDecoder(this); } - Parts *CreateParts() { return new CoreferenceParts; } - Features *CreateFeatures() { return new CoreferenceFeatures(this); } - - void CreateTokenDictionary() { - token_dictionary_ = new TokenDictionary(this); - } - - void CreateDependencyDictionary() { - dependency_dictionary_ = new DependencyDictionary(this); - } - - void CreateSemanticDictionary() { - semantic_dictionary_ = new SemanticDictionary(this); - } - - void PreprocessData(); - - Instance *GetFormattedInstance(Instance *instance) { - CoreferenceDocumentNumeric *instance_numeric = - new CoreferenceDocumentNumeric; - // Only add gold mentions as candidates if we're training. - bool add_gold_mentions = options_->train(); - instance_numeric->Initialize(*GetCoreferenceDictionary(), - static_cast(instance), - add_gold_mentions); - return instance_numeric; - } - -protected: - void SaveModel(FILE* fs); - void LoadModel(FILE* fs); - - void MakeParts(Instance *instance, Parts *parts, - std::vector *gold_outputs); - - void MakeSelectedFeatures(Instance *instance, Parts *parts, - const std::vector &selected_parts, - Features *features); - - void ComputeScores(Instance *instance, Parts *parts, Features *features, - std::vector *scores); - - void MakeFeatureDifference(Parts *parts, - Features *features, - const std::vector &gold_output, - const std::vector &predicted_output, - FeatureVector *difference); - - void MakeGradientStep(Parts *parts, - Features *features, - double eta, - int iteration, - const std::vector &gold_output, - const std::vector &predicted_output); - - void TransformGold(Instance *instance, - Parts *parts, - const std::vector &scores, - std::vector *gold_output, - double *loss_inner); - - void LabelInstance(Parts *parts, const std::vector &output, - Instance *instance); - - void BeginEvaluation() { +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEPIPE_H_ +#define COREFERENCEPIPE_H_ + +#include "Pipe.h" +#include "TimeUtils.h" +#include "CoreferenceOptions.h" +#include "CoreferenceReader.h" +#include "CoreferenceDictionary.h" +#include "TokenDictionary.h" +#include "CoreferenceDocumentNumeric.h" +#include "CoreferenceWriter.h" +#include "CoreferencePart.h" +#include "CoreferenceFeatures.h" +#include "CoreferenceDecoder.h" + +class CoreferencePipe : public Pipe { +public: + CoreferencePipe(Options* options) : Pipe(options) { + token_dictionary_ = NULL; + dependency_dictionary_ = NULL; + semantic_dictionary_ = NULL; + } + virtual ~CoreferencePipe() { + delete token_dictionary_; + delete dependency_dictionary_; + delete semantic_dictionary_; + } + + CoreferenceOptions *GetCoreferenceOptions() { + return static_cast(options_); + }; + CoreferenceReader *GetCoreferenceReader() { + return static_cast(reader_); + }; + CoreferenceSentenceReader *GetCoreferenceSentenceReader() { + return GetCoreferenceReader()->GetSentenceReader(); + }; + CoreferenceDictionary *GetCoreferenceDictionary() { + return static_cast(dictionary_); + }; + SemanticDictionary *GetSemanticDictionary() { + return static_cast(semantic_dictionary_); + }; + DependencyDictionary *GetDependencyDictionary() { + return static_cast(dependency_dictionary_); + }; + +protected: + void CreateDictionary() { + dictionary_ = new CoreferenceDictionary(this); + GetCoreferenceDictionary()->SetTokenDictionary(token_dictionary_); + GetCoreferenceDictionary()->SetDependencyDictionary(dependency_dictionary_); + GetCoreferenceDictionary()->SetSemanticDictionary(semantic_dictionary_); + } + void CreateReader() { reader_ = new CoreferenceReader(options_); } + void CreateWriter() { writer_ = new CoreferenceWriter(options_); } + void CreateDecoder() { decoder_ = new CoreferenceDecoder(this); } + Parts *CreateParts() { return new CoreferenceParts; } + Features *CreateFeatures() { return new CoreferenceFeatures(this); } + + void CreateTokenDictionary() { + token_dictionary_ = new TokenDictionary(this); + } + + void CreateDependencyDictionary() { + dependency_dictionary_ = new DependencyDictionary(this); + } + + void CreateSemanticDictionary() { + semantic_dictionary_ = new SemanticDictionary(this); + } + + void PreprocessData(); + + Instance *GetFormattedInstance(Instance *instance) { + CoreferenceDocumentNumeric *instance_numeric = + new CoreferenceDocumentNumeric; + // Only add gold mentions as candidates if we're training. + bool add_gold_mentions = options_->train(); + instance_numeric->Initialize(*GetCoreferenceDictionary(), + static_cast(instance), + add_gold_mentions); + return instance_numeric; + } + +protected: + void SaveModel(FILE* fs); + void LoadModel(FILE* fs); + + void MakeParts(Instance *instance, Parts *parts, + std::vector *gold_outputs); + + void MakeSelectedFeatures(Instance *instance, Parts *parts, + const std::vector &selected_parts, + Features *features); + + void ComputeScores(Instance *instance, Parts *parts, Features *features, + std::vector *scores); + + void MakeFeatureDifference(Parts *parts, + Features *features, + const std::vector &gold_output, + const std::vector &predicted_output, + FeatureVector *difference); + + void MakeGradientStep(Parts *parts, + Features *features, + double eta, + int iteration, + const std::vector &gold_output, + const std::vector &predicted_output); + + void TransformGold(Instance *instance, + Parts *parts, + const std::vector &scores, + std::vector *gold_output, + double *loss_inner); + + void LabelInstance(Parts *parts, const std::vector &output, + Instance *instance); + + void BeginEvaluation() { num_tokens_ = 0; - gettimeofday(&start_clock_, NULL); - } - - void EvaluateInstance(Instance *instance, - Instance *output_instance, - Parts *parts, - const vector &gold_outputs, - const vector &predicted_outputs) { - CoreferenceDocument *document = - static_cast(instance); - for (int i = 0; i < document->GetNumSentences(); ++i) { - num_tokens_ += document->GetSentence(i)->size() - 1; - } - } - + chrono.GetTime(); + } + + void EvaluateInstance(Instance *instance, + Instance *output_instance, + Parts *parts, + const vector &gold_outputs, + const vector &predicted_outputs) { + CoreferenceDocument *document = + static_cast(instance); + for (int i = 0; i < document->GetNumSentences(); ++i) { + num_tokens_ += document->GetSentence(i)->size() - 1; + } + } + void EndEvaluation() { - timeval end_clock; - gettimeofday(&end_clock, NULL); - double num_seconds = - static_cast(diff_ms(end_clock, start_clock_)) / 1000.0; - double tokens_per_second = static_cast(num_tokens_) / num_seconds; - LOG(INFO) << "Speed: " - << tokens_per_second << " tokens per second."; - } - -protected: - TokenDictionary *token_dictionary_; - DependencyDictionary *dependency_dictionary_; - SemanticDictionary *semantic_dictionary_; - //int num_tag_mistakes_; + chrono.StopTime(); + double num_seconds = chrono.GetElapsedTime(); + double tokens_per_second = static_cast(num_tokens_) / num_seconds; + LOG(INFO) << "Speed: " + << tokens_per_second << " tokens per second."; + } + +protected: + TokenDictionary *token_dictionary_; + DependencyDictionary *dependency_dictionary_; + SemanticDictionary *semantic_dictionary_; + //int num_tag_mistakes_; int num_tokens_; - timeval start_clock_; -}; - -#endif /* COREFERENCEPIPE_H_ */ + chronowrap::Chronometer chrono; +}; + +#endif /* COREFERENCEPIPE_H_ */ diff --git a/src/coreference_resolver/TurboCoreferenceResolver.cpp b/src/coreference_resolver/TurboCoreferenceResolver.cpp index 5c95f30..772540b 100644 --- a/src/coreference_resolver/TurboCoreferenceResolver.cpp +++ b/src/coreference_resolver/TurboCoreferenceResolver.cpp @@ -1,101 +1,99 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "CoreferencePipe.h" - -void TrainCoreferenceResolver(); -void TestCoreferenceResolver(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - - if (FLAGS_train) { - LOG(INFO) << "Training coreference resolver..." << endl; - TrainCoreferenceResolver(); - } else if (FLAGS_test) { - LOG(INFO) << "Running coreference resolver..." << endl; - TestCoreferenceResolver(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainCoreferenceResolver() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - CoreferenceOptions *options = new CoreferenceOptions; - options->Initialize(); - - CoreferencePipe *pipe = new CoreferencePipe(options); - pipe->Initialize(); - - LOG(INFO) << "Training the coreference resolver..."; - pipe->Train(); - pipe->SaveModelFile(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TestCoreferenceResolver() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - CoreferenceOptions *options = new CoreferenceOptions; - options->Initialize(); - - CoreferencePipe *pipe = new CoreferencePipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "CoreferencePipe.h" + +void TrainCoreferenceResolver(); +void TestCoreferenceResolver(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + + if (FLAGS_train) { + LOG(INFO) << "Training coreference resolver..." << endl; + TrainCoreferenceResolver(); + } else if (FLAGS_test) { + LOG(INFO) << "Running coreference resolver..." << endl; + TestCoreferenceResolver(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainCoreferenceResolver() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + CoreferenceOptions *options = new CoreferenceOptions; + options->Initialize(); + + CoreferencePipe *pipe = new CoreferencePipe(options); + pipe->Initialize(); + + LOG(INFO) << "Training the coreference resolver..."; + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestCoreferenceResolver() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + CoreferenceOptions *options = new CoreferenceOptions; + options->Initialize(); + + CoreferencePipe *pipe = new CoreferencePipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/dependency_labeler/DependencyLabelerPipe.h b/src/dependency_labeler/DependencyLabelerPipe.h index 10941e2..1a2e021 100644 --- a/src/dependency_labeler/DependencyLabelerPipe.h +++ b/src/dependency_labeler/DependencyLabelerPipe.h @@ -1,236 +1,235 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef DEPENDENCYLABELERPIPE_H_ -#define DEPENDENCYLABELERPIPE_H_ - -#include "Pipe.h" -#include "DependencyLabelerOptions.h" -#include "DependencyReader.h" -#include "DependencyDictionary.h" -#include "TokenDictionary.h" -#include "DependencyInstanceNumeric.h" -#include "DependencyWriter.h" -#include "DependencyLabelerPart.h" -#include "DependencyLabelerFeatures.h" -#include "DependencyLabelerDecoder.h" - -class DependencyLabelerPipe : public Pipe { -public: - DependencyLabelerPipe(Options* options) : Pipe(options) { - token_dictionary_ = NULL; - //pruner_parameters_ = NULL; - //train_pruner_ = false; - } - virtual ~DependencyLabelerPipe() { - //delete token_dictionary_; - //delete pruner_parameters_; - } - - // Same reader as the dependency parser. - DependencyReader *GetDependencyReader() { - return static_cast(reader_); - } - // Same dictionary as the dependency parser. - DependencyDictionary *GetDependencyDictionary() { - return static_cast(dictionary_); - } - DependencyLabelerDecoder *GetDependencyLabelerDecoder() { - return static_cast(decoder_); - } - DependencyLabelerOptions *GetDependencyLabelerOptions() { - return static_cast(options_); - } - - void Initialize() { - Pipe::Initialize(); - //pruner_parameters_ = new Parameters; - } - - //void SetPrunerParameters(Parameters *pruner_parameters) { - // pruner_parameters_ = pruner_parameters; - //} - //void LoadPrunerModelFile() { - // LoadPrunerModelByName(GetDependencyOptions()->GetPrunerModelFilePath()); - //} - -protected: - void CreateDictionary() { - dictionary_ = new DependencyDictionary(this); - GetDependencyDictionary()->SetTokenDictionary(token_dictionary_); - }; - void CreateReader() { reader_ = new DependencyReader; }; - void CreateWriter() { writer_ = new DependencyWriter; }; - void CreateDecoder() { decoder_ = new DependencyLabelerDecoder(this); }; - Parts *CreateParts() { return new DependencyLabelerParts; }; - Features *CreateFeatures() { return new DependencyLabelerFeatures(this); }; - - void CreateTokenDictionary() { - token_dictionary_ = new TokenDictionary(this); - }; - - Parameters *GetTrainingParameters() { - //if (train_pruner_) return pruner_parameters_; - return parameters_; - } - - void PreprocessData(); - - Instance *GetFormattedInstance(Instance *instance) { - DependencyInstanceNumeric *instance_numeric = - new DependencyInstanceNumeric; - instance_numeric->Initialize(*GetDependencyDictionary(), - static_cast(instance)); - return instance_numeric; - } - - void SaveModel(FILE* fs); - void LoadModel(FILE* fs); - - //void LoadPrunerModel(FILE* fs); - //void LoadPrunerModelByName(const string &model_name); - - void MakeParts(Instance *instance, Parts *parts, - std::vector *gold_outputs); - void MakeArcParts(Instance *instance, Parts *parts, - std::vector *gold_outputs); - void MakeSiblingParts(Instance *instance, - Parts *parts, - std::vector *gold_outputs); - - void MakeSelectedFeatures(Instance *instance, - Parts *parts, - const std::vector& selected_parts, - Features *features); - - void ComputeScores(Instance *instance, Parts *parts, Features *features, - std::vector *scores); - - void MakeFeatureDifference(Parts *parts, - Features *features, - const std::vector &gold_output, - const std::vector &predicted_output, - FeatureVector *difference); - - void MakeGradientStep(Parts *parts, - Features *features, - double eta, - int iteration, - const std::vector &gold_output, - const std::vector &predicted_output); - - void LabelInstance(Parts *parts, const std::vector &output, - Instance *instance); - - virtual void BeginEvaluation() { - num_head_mistakes_ = 0; - num_head_pruned_mistakes_ = 0; - num_heads_after_pruning_ = 0; - num_tokens_ = 0; - gettimeofday(&start_clock_, NULL); - } - virtual void EvaluateInstance(Instance *instance, - Instance *output_instance, - Parts *parts, - const std::vector &gold_outputs, - const std::vector &predicted_outputs) { - DependencyInstance *dependency_instance = - static_cast(instance); - DependencyInstance *dependency_output_instance = - static_cast(output_instance); - DependencyLabelerParts *dependency_parts = - static_cast(parts); - for (int m = 1; m < dependency_instance->size(); ++m) { - int head = -1; - int h = dependency_output_instance->GetHead(m); - int num_possible_heads = 0; - const vector &index_labeled_parts = - dependency_parts->FindArcs(m); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int r = index_labeled_parts[k]; - if (r < 0) continue; - ++num_possible_heads; - if (gold_outputs[r] >= 0.5) { - CHECK_EQ(gold_outputs[r], 1.0); - if (!NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { - ++num_head_mistakes_; - } - head = h; - //break; - } - } - if (head < 0) { - VLOG(2) << "Pruned gold part..."; - ++num_head_mistakes_; - ++num_head_pruned_mistakes_; - } - ++num_tokens_; - num_heads_after_pruning_ += num_possible_heads; - } - } - virtual void EndEvaluation() { - LOG(INFO) << "Labeling accuracy: " << - static_cast(num_tokens_ - num_head_mistakes_) / - static_cast(num_tokens_); - LOG(INFO) << "Pruning recall: " << - static_cast(num_tokens_ - num_head_pruned_mistakes_) / - static_cast(num_tokens_); - LOG(INFO) << "Pruning efficiency: " << - static_cast(num_heads_after_pruning_) / - static_cast(num_tokens_) +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef DEPENDENCYLABELERPIPE_H_ +#define DEPENDENCYLABELERPIPE_H_ + +#include "Pipe.h" +#include "TimeUtils.h" +#include "DependencyLabelerOptions.h" +#include "DependencyReader.h" +#include "DependencyDictionary.h" +#include "TokenDictionary.h" +#include "DependencyInstanceNumeric.h" +#include "DependencyWriter.h" +#include "DependencyLabelerPart.h" +#include "DependencyLabelerFeatures.h" +#include "DependencyLabelerDecoder.h" + +class DependencyLabelerPipe : public Pipe { +public: + DependencyLabelerPipe(Options* options) : Pipe(options) { + token_dictionary_ = NULL; + //pruner_parameters_ = NULL; + //train_pruner_ = false; + } + virtual ~DependencyLabelerPipe() { + //delete token_dictionary_; + //delete pruner_parameters_; + } + + // Same reader as the dependency parser. + DependencyReader *GetDependencyReader() { + return static_cast(reader_); + } + // Same dictionary as the dependency parser. + DependencyDictionary *GetDependencyDictionary() { + return static_cast(dictionary_); + } + DependencyLabelerDecoder *GetDependencyLabelerDecoder() { + return static_cast(decoder_); + } + DependencyLabelerOptions *GetDependencyLabelerOptions() { + return static_cast(options_); + } + + void Initialize() { + Pipe::Initialize(); + //pruner_parameters_ = new Parameters; + } + + //void SetPrunerParameters(Parameters *pruner_parameters) { + // pruner_parameters_ = pruner_parameters; + //} + //void LoadPrunerModelFile() { + // LoadPrunerModelByName(GetDependencyOptions()->GetPrunerModelFilePath()); + //} + +protected: + void CreateDictionary() { + dictionary_ = new DependencyDictionary(this); + GetDependencyDictionary()->SetTokenDictionary(token_dictionary_); + }; + void CreateReader() { reader_ = new DependencyReader; }; + void CreateWriter() { writer_ = new DependencyWriter; }; + void CreateDecoder() { decoder_ = new DependencyLabelerDecoder(this); }; + Parts *CreateParts() { return new DependencyLabelerParts; }; + Features *CreateFeatures() { return new DependencyLabelerFeatures(this); }; + + void CreateTokenDictionary() { + token_dictionary_ = new TokenDictionary(this); + }; + + Parameters *GetTrainingParameters() { + //if (train_pruner_) return pruner_parameters_; + return parameters_; + } + + void PreprocessData(); + + Instance *GetFormattedInstance(Instance *instance) { + DependencyInstanceNumeric *instance_numeric = + new DependencyInstanceNumeric; + instance_numeric->Initialize(*GetDependencyDictionary(), + static_cast(instance)); + return instance_numeric; + } + + void SaveModel(FILE* fs); + void LoadModel(FILE* fs); + + //void LoadPrunerModel(FILE* fs); + //void LoadPrunerModelByName(const string &model_name); + + void MakeParts(Instance *instance, Parts *parts, + std::vector *gold_outputs); + void MakeArcParts(Instance *instance, Parts *parts, + std::vector *gold_outputs); + void MakeSiblingParts(Instance *instance, + Parts *parts, + std::vector *gold_outputs); + + void MakeSelectedFeatures(Instance *instance, + Parts *parts, + const std::vector& selected_parts, + Features *features); + + void ComputeScores(Instance *instance, Parts *parts, Features *features, + std::vector *scores); + + void MakeFeatureDifference(Parts *parts, + Features *features, + const std::vector &gold_output, + const std::vector &predicted_output, + FeatureVector *difference); + + void MakeGradientStep(Parts *parts, + Features *features, + double eta, + int iteration, + const std::vector &gold_output, + const std::vector &predicted_output); + + void LabelInstance(Parts *parts, const std::vector &output, + Instance *instance); + + virtual void BeginEvaluation() { + num_head_mistakes_ = 0; + num_head_pruned_mistakes_ = 0; + num_heads_after_pruning_ = 0; + num_tokens_ = 0; + chrono.GetTime(); + } + virtual void EvaluateInstance(Instance *instance, + Instance *output_instance, + Parts *parts, + const std::vector &gold_outputs, + const std::vector &predicted_outputs) { + DependencyInstance *dependency_instance = + static_cast(instance); + DependencyInstance *dependency_output_instance = + static_cast(output_instance); + DependencyLabelerParts *dependency_parts = + static_cast(parts); + for (int m = 1; m < dependency_instance->size(); ++m) { + int head = -1; + int h = dependency_output_instance->GetHead(m); + int num_possible_heads = 0; + const vector &index_labeled_parts = + dependency_parts->FindArcs(m); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int r = index_labeled_parts[k]; + if (r < 0) continue; + ++num_possible_heads; + if (gold_outputs[r] >= 0.5) { + CHECK_EQ(gold_outputs[r], 1.0); + if (!NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { + ++num_head_mistakes_; + } + head = h; + //break; + } + } + if (head < 0) { + VLOG(2) << "Pruned gold part..."; + ++num_head_mistakes_; + ++num_head_pruned_mistakes_; + } + ++num_tokens_; + num_heads_after_pruning_ += num_possible_heads; + } + } + virtual void EndEvaluation() { + LOG(INFO) << "Labeling accuracy: " << + static_cast(num_tokens_ - num_head_mistakes_) / + static_cast(num_tokens_); + LOG(INFO) << "Pruning recall: " << + static_cast(num_tokens_ - num_head_pruned_mistakes_) / + static_cast(num_tokens_); + LOG(INFO) << "Pruning efficiency: " << + static_cast(num_heads_after_pruning_) / + static_cast(num_tokens_) << " possible labels per token."; - timeval end_clock; - gettimeofday(&end_clock, NULL); - double num_seconds = - static_cast(diff_ms(end_clock, start_clock_)) / 1000.0; - double tokens_per_second = static_cast(num_tokens_) / num_seconds; - LOG(INFO) << "Labeling speed: " - << tokens_per_second << " tokens per second."; - } - - void ComputeDescendents(const std::vector &heads, - std::vector >* descendents) const; - - void GetAllAncestors(const std::vector &heads, - int descend, - std::vector* ancestors) const; - - int GetSiblingLabel(int sibling, int modifier) { - CHECK_GE(sibling, -1); - CHECK_GE(modifier, -1); - int num_labels = GetDependencyDictionary()->GetLabelAlphabet().size(); - return ((1 + sibling) * (1 + num_labels) + (1 + modifier)); - } - - //bool ExistsPath(const vector &heads, - // int ancest, - // int descend) const; - //bool IsProjectiveArc(const vector &heads, int par, int ch) const; - -protected: - TokenDictionary *token_dictionary_; - //bool train_pruner_; - //Parameters *pruner_parameters_; - int num_head_mistakes_; - int num_head_pruned_mistakes_; - int num_heads_after_pruning_; + chrono.StopTime(); + double num_seconds = chrono.GetElapsedTime(); + double tokens_per_second = static_cast(num_tokens_) / num_seconds; + LOG(INFO) << "Labeling speed: " + << tokens_per_second << " tokens per second."; + } + + void ComputeDescendents(const std::vector &heads, + std::vector >* descendents) const; + + void GetAllAncestors(const std::vector &heads, + int descend, + std::vector* ancestors) const; + + int GetSiblingLabel(int sibling, int modifier) { + CHECK_GE(sibling, -1); + CHECK_GE(modifier, -1); + int num_labels = GetDependencyDictionary()->GetLabelAlphabet().size(); + return ((1 + sibling) * (1 + num_labels) + (1 + modifier)); + } + + //bool ExistsPath(const vector &heads, + // int ancest, + // int descend) const; + //bool IsProjectiveArc(const vector &heads, int par, int ch) const; + +protected: + TokenDictionary *token_dictionary_; + //bool train_pruner_; + //Parameters *pruner_parameters_; + int num_head_mistakes_; + int num_head_pruned_mistakes_; + int num_heads_after_pruning_; int num_tokens_; - timeval start_clock_; -}; - -#endif /* DEPENDENCYLABELERPIPE_H_ */ + chronowrap::Chronometer chrono; +}; + +#endif /* DEPENDENCYLABELERPIPE_H_ */ diff --git a/src/dependency_labeler/TurboDependencyLabeler.cpp b/src/dependency_labeler/TurboDependencyLabeler.cpp index 58b227d..154c2d8 100644 --- a/src/dependency_labeler/TurboDependencyLabeler.cpp +++ b/src/dependency_labeler/TurboDependencyLabeler.cpp @@ -1,103 +1,101 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "DependencyLabelerPipe.h" - -using namespace std; - -void TrainDependencyLabeler(); -void TestDependencyLabeler(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - - if (FLAGS_train) { - LOG(INFO) << "Training dependency labeler..." << endl; - TrainDependencyLabeler(); - } else if (FLAGS_test) { - LOG(INFO) << "Running dependency labeler..." << endl; - TestDependencyLabeler(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainDependencyLabeler() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - DependencyLabelerOptions *options = new DependencyLabelerOptions; - options->Initialize(); - - DependencyLabelerPipe *pipe = new DependencyLabelerPipe(options); - pipe->Initialize(); - - LOG(INFO) << "Training the dependency labeler..."; - pipe->Train(); - pipe->SaveModelFile(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TestDependencyLabeler() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - DependencyLabelerOptions *options = new DependencyLabelerOptions; - options->Initialize(); - - DependencyLabelerPipe *pipe = new DependencyLabelerPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "DependencyLabelerPipe.h" + +using namespace std; + +void TrainDependencyLabeler(); +void TestDependencyLabeler(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + + if (FLAGS_train) { + LOG(INFO) << "Training dependency labeler..." << endl; + TrainDependencyLabeler(); + } else if (FLAGS_test) { + LOG(INFO) << "Running dependency labeler..." << endl; + TestDependencyLabeler(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainDependencyLabeler() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + DependencyLabelerOptions *options = new DependencyLabelerOptions; + options->Initialize(); + + DependencyLabelerPipe *pipe = new DependencyLabelerPipe(options); + pipe->Initialize(); + + LOG(INFO) << "Training the dependency labeler..."; + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestDependencyLabeler() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + DependencyLabelerOptions *options = new DependencyLabelerOptions; + options->Initialize(); + + DependencyLabelerPipe *pipe = new DependencyLabelerPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/entity_recognizer/TurboEntityRecognizer.cpp b/src/entity_recognizer/TurboEntityRecognizer.cpp index 2e7c986..3034879 100644 --- a/src/entity_recognizer/TurboEntityRecognizer.cpp +++ b/src/entity_recognizer/TurboEntityRecognizer.cpp @@ -1,87 +1,85 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "EntityPipe.h" - -using namespace std; - -void TrainEntityRecognizer(); -void TestEntityRecognizer(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - -#ifdef _WIN32 - google::LogToStderr(); -#endif - if (FLAGS_train) { - LOG(INFO) << "Training entity recognizer..." << endl; - TrainEntityRecognizer(); - } else if (FLAGS_test) { - LOG(INFO) << "Running entity recognizer..." << endl; - TestEntityRecognizer(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainEntityRecognizer() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - EntityOptions *options = new EntityOptions; - options->Initialize(); - - EntityPipe *pipe = new EntityPipe(options); - pipe->Initialize(); - pipe->Train(); - pipe->SaveModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; - - delete pipe; - delete options; -} - -void TestEntityRecognizer() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - EntityOptions *options = new EntityOptions; - options->Initialize(); - - EntityPipe *pipe = new EntityPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - - pipe->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; - - delete pipe; - delete options; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "EntityPipe.h" + +using namespace std; + +void TrainEntityRecognizer(); +void TestEntityRecognizer(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + +#ifdef _WIN32 + google::LogToStderr(); +#endif + if (FLAGS_train) { + LOG(INFO) << "Training entity recognizer..." << endl; + TrainEntityRecognizer(); + } else if (FLAGS_test) { + LOG(INFO) << "Running entity recognizer..." << endl; + TestEntityRecognizer(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainEntityRecognizer() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + EntityOptions *options = new EntityOptions; + options->Initialize(); + + EntityPipe *pipe = new EntityPipe(options); + pipe->Initialize(); + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestEntityRecognizer() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + EntityOptions *options = new EntityOptions; + options->Initialize(); + + EntityPipe *pipe = new EntityPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/morphological_tagger/TurboMorphologicalTagger.cpp b/src/morphological_tagger/TurboMorphologicalTagger.cpp index 3ba7b4d..9822f6a 100644 --- a/src/morphological_tagger/TurboMorphologicalTagger.cpp +++ b/src/morphological_tagger/TurboMorphologicalTagger.cpp @@ -40,9 +40,9 @@ int main(int argc, char** argv) { } void TrainMorphologicalTagger() { - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); MorphologicalOptions *options = new MorphologicalOptions; options->Initialize(); @@ -52,20 +52,19 @@ void TrainMorphologicalTagger() { pipe->Train(); pipe->SaveModelFile(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; - delete pipe; delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; } void TestMorphologicalTagger() { - int time; - timeval start, end; - gettimeofday(&start, NULL); + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); MorphologicalOptions *options = new MorphologicalOptions; options->Initialize(); @@ -75,12 +74,11 @@ void TestMorphologicalTagger() { pipe->LoadModelFile(); pipe->Run(); - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; - delete pipe; delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; } diff --git a/src/parser/DependencyDecoder.cpp b/src/parser/DependencyDecoder.cpp index d2978bb..54e134a 100644 --- a/src/parser/DependencyDecoder.cpp +++ b/src/parser/DependencyDecoder.cpp @@ -23,7 +23,8 @@ #include "FactorHeadAutomaton.h" #include "FactorGrandparentHeadAutomaton.h" #include "FactorTrigramHeadAutomaton.h" -#include "FactorSequence.h" +#include "FactorSequence.h" +#include "TimeUtils.h" #include "AlgUtils.h" #include #include @@ -1087,7 +1088,7 @@ void DependencyDecoder::DecodeInsideOutside(Instance *instance, Parts *parts, } for (int m = 1; m < sentence_length; ++m) { LOG(INFO) << "Sum " << m << " = " << sum[m]; - } +} #endif } @@ -1292,14 +1293,14 @@ void DependencyDecoder::DecodeFactorGraph(Instance *instance, Parts *parts, int m = arc->modifier(); graph_paths[h][m] = true; } - timeval start, end; - gettimeofday(&start, NULL); + chronowrap::Chronometer chrono; + chrono.GetTime(); ComputeTransitiveClosure(&graph_paths); for (int i = 0; i < sentence->size(); ++i) { graph_paths[i][i] = true; } - gettimeofday(&end, NULL); - double elapsed_time_paths = diff_ms(end, start); + chrono.StopTime(); + double elapsed_time_paths = chrono.GetElapsedTime(); int num_possible_paths = 0; for (int i = 0; i < sentence->size(); ++i) { for (int j = 0; j < sentence->size(); ++j) { @@ -1309,7 +1310,7 @@ void DependencyDecoder::DecodeFactorGraph(Instance *instance, Parts *parts, VLOG(2) << num_arcs << " possible arcs and " << num_possible_paths << " possible paths in " << sentence->size() * sentence->size() - << " (took " << elapsed_time_paths << " ms.)"; + << " (took " << elapsed_time_paths << " sec.)"; } } @@ -2511,12 +2512,12 @@ void DependencyDecoder::DecodeFactorGraph(Instance *instance, Parts *parts, bool solved = false; if (add_evidence) { VLOG(2) << "Adding evidence..."; - timeval start, end; - gettimeofday(&start, NULL); + chronowrap::Chronometer chrono; + chrono.GetTime(); int status = factor_graph->AddEvidence(&evidence, &recomputed_indices); - gettimeofday(&end, NULL); - double elapsed_time = diff_ms(end, start); - VLOG(2) << "Graph simplification took " << elapsed_time << "ms."; + chrono.StopTime(); + double elapsed_time = chrono.GetElapsedTime(); + VLOG(2) << "Graph simplification took " << elapsed_time << "sec."; CHECK_NE(status, AD3::STATUS_INFEASIBLE); if (status == AD3::STATUS_OPTIMAL_INTEGER) solved = true; VLOG(2) << "Number of factors: " << factor_graph->GetNumFactors(); @@ -2552,14 +2553,14 @@ void DependencyDecoder::DecodeFactorGraph(Instance *instance, Parts *parts, //factor_graph->SetResidualThresholdAD3(1e-6); // Run AD3. - timeval start, end; - gettimeofday(&start, NULL); + chronowrap::Chronometer chrono; + chrono.GetTime(); if (!solved) { factor_graph->SolveLPMAPWithAD3(&posteriors, &additional_posteriors, value); } - gettimeofday(&end, NULL); - double elapsed_time = diff_ms(end, start); - VLOG(2) << "Elapsed time (AD3) = " << elapsed_time + chrono.StopTime(); + double elapsed_time = chrono.GetElapsedTime(); + VLOG(2) << "Elapsed time (AD3) = " << elapsed_time << " sec." << " (" << sentence->size() << ") "; delete factor_graph; @@ -3328,4 +3329,4 @@ void DependencyDecoder::DecodeCPLEX(Instance *instance, Parts *parts, } } -#endif +#endif diff --git a/src/parser/DependencyPipe.h b/src/parser/DependencyPipe.h index 6a0ea0c..4f85008 100644 --- a/src/parser/DependencyPipe.h +++ b/src/parser/DependencyPipe.h @@ -1,297 +1,295 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef DEPENDENCYPIPE_H_ -#define DEPENDENCYPIPE_H_ - -#include "Pipe.h" -#include "DependencyOptions.h" -#include "DependencyReader.h" -#include "DependencyDictionary.h" -#include "TokenDictionary.h" -#include "DependencyInstanceNumeric.h" -#include "DependencyWriter.h" -#include "DependencyPart.h" -#include "DependencyFeatures.h" -#include "DependencyDecoder.h" - -class DependencyPipe : public Pipe { -public: - DependencyPipe(Options* options) : Pipe(options) { - token_dictionary_ = NULL; - pruner_parameters_ = NULL; - train_pruner_ = false; - } - virtual ~DependencyPipe() { - delete token_dictionary_; - delete pruner_parameters_; - } - - DependencyReader *GetDependencyReader() { - return static_cast(reader_); - } - DependencyDictionary *GetDependencyDictionary() { - return static_cast(dictionary_); - } - DependencyDecoder *GetDependencyDecoder() { - return static_cast(decoder_); - } - DependencyOptions *GetDependencyOptions() { - return static_cast(options_); - } - - void Initialize() { - Pipe::Initialize(); - pruner_parameters_ = new Parameters; - } - - void SetPrunerParameters(Parameters *pruner_parameters) { - pruner_parameters_ = pruner_parameters; - } - void LoadPrunerModelFile() { - LoadPrunerModelByName(GetDependencyOptions()->GetPrunerModelFilePath()); - } - - // Check if a tree is projective. - // TODO(atm): This function should probably be moved to another class. - bool IsProjectiveTree(const vector &heads) const { - for (int m = 1; m < heads.size(); ++m) { - if (!IsProjectiveArc(heads, heads[m], m)) return false; - } - return true; - } - -protected: - void CreateDictionary() { - dictionary_ = new DependencyDictionary(this); - GetDependencyDictionary()->SetTokenDictionary(token_dictionary_); - }; - void CreateReader() { reader_ = new DependencyReader; }; - void CreateWriter() { writer_ = new DependencyWriter; }; - void CreateDecoder() { decoder_ = new DependencyDecoder(this); }; - Parts *CreateParts() { return new DependencyParts; }; - Features *CreateFeatures() { return new DependencyFeatures(this); }; - - void CreateTokenDictionary() { - token_dictionary_ = new TokenDictionary(this); - }; - - Parameters *GetTrainingParameters() { - if (train_pruner_) return pruner_parameters_; - return parameters_; - } - - void PreprocessData(); - - Instance *GetFormattedInstance(Instance *instance) { - DependencyInstanceNumeric *instance_numeric = - new DependencyInstanceNumeric; - instance_numeric->Initialize(*GetDependencyDictionary(), - static_cast(instance)); - return instance_numeric; - } - - void SaveModel(FILE* fs); - void LoadModel(FILE* fs); - - void LoadPrunerModel(FILE* fs); - void LoadPrunerModelByName(const string &model_name); - - void EnforceConnectedGraph(Instance *instance, - const vector &arcs, - vector *inserted_root_nodes); - void EnforceProjectiveGraph(Instance *instance, - const vector &arcs, - vector *inserted_heads, - vector *inserted_modifiers); - - void MakeParts(Instance *instance, Parts *parts, - vector *gold_outputs); - void MakePartsBasic(Instance *instance, Parts *parts, - vector *gold_outputs); - void MakePartsBasic(Instance *instance, bool add_labeled_parts, Parts *parts, - vector *gold_outputs); - void MakePartsGlobal(Instance *instance, Parts *parts, - vector *gold_outputs); - void MakePartsArbitrarySiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsConsecutiveSiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsGrandparents(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsGrandSiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsTriSiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsNonprojectiveArcs(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsDirectedPaths(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsHeadBigrams(Instance *instance, - Parts *parts, - vector *gold_outputs); - - void MakeFeatures(Instance *instance, Parts *parts, bool pruner, - Features *features) { - vector selected_parts(parts->size(), true); - MakeSelectedFeatures(instance, parts, pruner, selected_parts, features); - } - void MakeSelectedFeatures(Instance *instance, Parts *parts, - const vector& selected_parts, Features *features) { - // Set pruner = false unless we're training the pruner. - MakeSelectedFeatures(instance, parts, train_pruner_, selected_parts, - features); - } - void MakeSelectedFeatures(Instance *instance, - Parts *parts, - bool pruner, - const vector& selected_parts, - Features *features); - - void ComputeScores(Instance *instance, Parts *parts, Features *features, - vector *scores) { - // Set pruner = false unless we're training the pruner. - ComputeScores(instance, parts, features, train_pruner_, scores); - } - void ComputeScores(Instance *instance, Parts *parts, Features *features, - bool pruner, vector *scores); - - void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - bool pruner, - const vector &selected_parts, - Features *features); - - void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - const vector &selected_parts, - Features *features) { - // Set pruner = false unless we're training the pruner. - RemoveUnsupportedFeatures(instance, parts, train_pruner_, selected_parts, - features); - } - - void MakeFeatureDifference(Parts *parts, - Features *features, - const vector &gold_output, - const vector &predicted_output, - FeatureVector *difference); - - void MakeGradientStep(Parts *parts, - Features *features, - double eta, - int iteration, - const vector &gold_output, - const vector &predicted_output); - - void TouchParameters(Parts *parts, Features *features, - const vector &selected_parts); - - void LabelInstance(Parts *parts, const vector &output, - Instance *instance); - - void Prune(Instance *instance, Parts *parts, vector *gold_outputs, - bool preserve_gold); - - virtual void BeginEvaluation() { - num_head_mistakes_ = 0; - num_head_pruned_mistakes_ = 0; - num_heads_after_pruning_ = 0; +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef DEPENDENCYPIPE_H_ +#define DEPENDENCYPIPE_H_ + +#include "Pipe.h" +#include "DependencyOptions.h" +#include "DependencyReader.h" +#include "DependencyDictionary.h" +#include "TokenDictionary.h" +#include "DependencyInstanceNumeric.h" +#include "DependencyWriter.h" +#include "DependencyPart.h" +#include "DependencyFeatures.h" +#include "DependencyDecoder.h" + +class DependencyPipe : public Pipe { +public: + DependencyPipe(Options* options) : Pipe(options) { + token_dictionary_ = NULL; + pruner_parameters_ = NULL; + train_pruner_ = false; + } + virtual ~DependencyPipe() { + delete token_dictionary_; + delete pruner_parameters_; + } + + DependencyReader *GetDependencyReader() { + return static_cast(reader_); + } + DependencyDictionary *GetDependencyDictionary() { + return static_cast(dictionary_); + } + DependencyDecoder *GetDependencyDecoder() { + return static_cast(decoder_); + } + DependencyOptions *GetDependencyOptions() { + return static_cast(options_); + } + + void Initialize() { + Pipe::Initialize(); + pruner_parameters_ = new Parameters; + } + + void SetPrunerParameters(Parameters *pruner_parameters) { + pruner_parameters_ = pruner_parameters; + } + void LoadPrunerModelFile() { + LoadPrunerModelByName(GetDependencyOptions()->GetPrunerModelFilePath()); + } + + // Check if a tree is projective. + // TODO(atm): This function should probably be moved to another class. + bool IsProjectiveTree(const vector &heads) const { + for (int m = 1; m < heads.size(); ++m) { + if (!IsProjectiveArc(heads, heads[m], m)) return false; + } + return true; + } + +protected: + void CreateDictionary() { + dictionary_ = new DependencyDictionary(this); + GetDependencyDictionary()->SetTokenDictionary(token_dictionary_); + }; + void CreateReader() { reader_ = new DependencyReader; }; + void CreateWriter() { writer_ = new DependencyWriter; }; + void CreateDecoder() { decoder_ = new DependencyDecoder(this); }; + Parts *CreateParts() { return new DependencyParts; }; + Features *CreateFeatures() { return new DependencyFeatures(this); }; + + void CreateTokenDictionary() { + token_dictionary_ = new TokenDictionary(this); + }; + + Parameters *GetTrainingParameters() { + if (train_pruner_) return pruner_parameters_; + return parameters_; + } + + void PreprocessData(); + + Instance *GetFormattedInstance(Instance *instance) { + DependencyInstanceNumeric *instance_numeric = + new DependencyInstanceNumeric; + instance_numeric->Initialize(*GetDependencyDictionary(), + static_cast(instance)); + return instance_numeric; + } + + void SaveModel(FILE* fs); + void LoadModel(FILE* fs); + + void LoadPrunerModel(FILE* fs); + void LoadPrunerModelByName(const string &model_name); + + void EnforceConnectedGraph(Instance *instance, + const vector &arcs, + vector *inserted_root_nodes); + void EnforceProjectiveGraph(Instance *instance, + const vector &arcs, + vector *inserted_heads, + vector *inserted_modifiers); + + void MakeParts(Instance *instance, Parts *parts, + vector *gold_outputs); + void MakePartsBasic(Instance *instance, Parts *parts, + vector *gold_outputs); + void MakePartsBasic(Instance *instance, bool add_labeled_parts, Parts *parts, + vector *gold_outputs); + void MakePartsGlobal(Instance *instance, Parts *parts, + vector *gold_outputs); + void MakePartsArbitrarySiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsConsecutiveSiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsGrandparents(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsGrandSiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsTriSiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsNonprojectiveArcs(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsDirectedPaths(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsHeadBigrams(Instance *instance, + Parts *parts, + vector *gold_outputs); + + void MakeFeatures(Instance *instance, Parts *parts, bool pruner, + Features *features) { + vector selected_parts(parts->size(), true); + MakeSelectedFeatures(instance, parts, pruner, selected_parts, features); + } + void MakeSelectedFeatures(Instance *instance, Parts *parts, + const vector& selected_parts, Features *features) { + // Set pruner = false unless we're training the pruner. + MakeSelectedFeatures(instance, parts, train_pruner_, selected_parts, + features); + } + void MakeSelectedFeatures(Instance *instance, + Parts *parts, + bool pruner, + const vector& selected_parts, + Features *features); + + void ComputeScores(Instance *instance, Parts *parts, Features *features, + vector *scores) { + // Set pruner = false unless we're training the pruner. + ComputeScores(instance, parts, features, train_pruner_, scores); + } + void ComputeScores(Instance *instance, Parts *parts, Features *features, + bool pruner, vector *scores); + + void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + bool pruner, + const vector &selected_parts, + Features *features); + + void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + const vector &selected_parts, + Features *features) { + // Set pruner = false unless we're training the pruner. + RemoveUnsupportedFeatures(instance, parts, train_pruner_, selected_parts, + features); + } + + void MakeFeatureDifference(Parts *parts, + Features *features, + const vector &gold_output, + const vector &predicted_output, + FeatureVector *difference); + + void MakeGradientStep(Parts *parts, + Features *features, + double eta, + int iteration, + const vector &gold_output, + const vector &predicted_output); + + void TouchParameters(Parts *parts, Features *features, + const vector &selected_parts); + + void LabelInstance(Parts *parts, const vector &output, + Instance *instance); + + void Prune(Instance *instance, Parts *parts, vector *gold_outputs, + bool preserve_gold); + + virtual void BeginEvaluation() { + num_head_mistakes_ = 0; + num_head_pruned_mistakes_ = 0; + num_heads_after_pruning_ = 0; num_tokens_ = 0; - gettimeofday(&start_clock_, NULL); - } - virtual void EvaluateInstance(Instance *instance, - Instance *output_instance, - Parts *parts, - const vector &gold_outputs, - const vector &predicted_outputs) { - DependencyInstance *dependency_instance = - static_cast(instance); - DependencyParts *dependency_parts = static_cast(parts); - for (int m = 1; m < dependency_instance->size(); ++m) { - int head = -1; - int num_possible_heads = 0; - for (int h = 0; h < dependency_instance->size(); ++h) { - int r = dependency_parts->FindArc(h, m); - if (r < 0) continue; - ++num_possible_heads; - if (gold_outputs[r] >= 0.5) { - CHECK_EQ(gold_outputs[r], 1.0); - if (!NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { - ++num_head_mistakes_; - } - head = h; - //break; - } - } - if (head < 0) { - VLOG(2) << "Pruned gold part..."; - ++num_head_mistakes_; - ++num_head_pruned_mistakes_; - } - ++num_tokens_; - num_heads_after_pruning_ += num_possible_heads; - } - } - virtual void EndEvaluation() { - LOG(INFO) << "Parsing accuracy: " << - static_cast(num_tokens_ - num_head_mistakes_) / - static_cast(num_tokens_); - LOG(INFO) << "Pruning recall: " << - static_cast(num_tokens_ - num_head_pruned_mistakes_) / - static_cast(num_tokens_); - LOG(INFO) << "Pruning efficiency: " << - static_cast(num_heads_after_pruning_) / - static_cast(num_tokens_) + chrono.GetTime(); + } + virtual void EvaluateInstance(Instance *instance, + Instance *output_instance, + Parts *parts, + const vector &gold_outputs, + const vector &predicted_outputs) { + DependencyInstance *dependency_instance = + static_cast(instance); + DependencyParts *dependency_parts = static_cast(parts); + for (int m = 1; m < dependency_instance->size(); ++m) { + int head = -1; + int num_possible_heads = 0; + for (int h = 0; h < dependency_instance->size(); ++h) { + int r = dependency_parts->FindArc(h, m); + if (r < 0) continue; + ++num_possible_heads; + if (gold_outputs[r] >= 0.5) { + CHECK_EQ(gold_outputs[r], 1.0); + if (!NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { + ++num_head_mistakes_; + } + head = h; + //break; + } + } + if (head < 0) { + VLOG(2) << "Pruned gold part..."; + ++num_head_mistakes_; + ++num_head_pruned_mistakes_; + } + ++num_tokens_; + num_heads_after_pruning_ += num_possible_heads; + } + } + virtual void EndEvaluation() { + LOG(INFO) << "Parsing accuracy: " << + static_cast(num_tokens_ - num_head_mistakes_) / + static_cast(num_tokens_); + LOG(INFO) << "Pruning recall: " << + static_cast(num_tokens_ - num_head_pruned_mistakes_) / + static_cast(num_tokens_); + LOG(INFO) << "Pruning efficiency: " << + static_cast(num_heads_after_pruning_) / + static_cast(num_tokens_) << " possible heads per token."; - timeval end_clock; - gettimeofday(&end_clock, NULL); - double num_seconds = - static_cast(diff_ms(end_clock, start_clock_)) / 1000.0; - double tokens_per_second = static_cast(num_tokens_) / num_seconds; - LOG(INFO) << "Parsing speed: " - << tokens_per_second << " tokens per second."; - } - -#if 0 - void GetAllAncestors(const vector &heads, - int descend, - vector* ancestors) const; -#endif - bool ExistsPath(const vector &heads, - int ancest, - int descend) const; - bool IsProjectiveArc(const vector &heads, int par, int ch) const; - -protected: - TokenDictionary *token_dictionary_; - bool train_pruner_; - Parameters *pruner_parameters_; - int num_head_mistakes_; - int num_head_pruned_mistakes_; - int num_heads_after_pruning_; - int num_tokens_; - timeval start_clock_; -}; - -#endif /* DEPENDENCYPIPE_H_ */ + chrono.StopTime(); + double num_seconds = chrono.GetElapsedTime(); + double tokens_per_second = static_cast(num_tokens_) / num_seconds; + LOG(INFO) << "Parsing speed: " + << tokens_per_second << " tokens per second."; + } + +#if 0 + void GetAllAncestors(const vector &heads, + int descend, + vector* ancestors) const; +#endif + bool ExistsPath(const vector &heads, + int ancest, + int descend) const; + bool IsProjectiveArc(const vector &heads, int par, int ch) const; + +protected: + TokenDictionary *token_dictionary_; + bool train_pruner_; + Parameters *pruner_parameters_; + int num_head_mistakes_; + int num_head_pruned_mistakes_; + int num_heads_after_pruning_; + int num_tokens_; + chronowrap::Chronometer chrono; +}; + +#endif /* DEPENDENCYPIPE_H_ */ diff --git a/src/parser/TurboParser.cpp b/src/parser/TurboParser.cpp index 3d4173a..10125c2 100644 --- a/src/parser/TurboParser.cpp +++ b/src/parser/TurboParser.cpp @@ -1,129 +1,127 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "DependencyPipe.h" - -using namespace std; - -void TrainParser(); -void TestParser(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - - if (FLAGS_train) { - LOG(INFO) << "Training parser..." << endl; - TrainParser(); - } else if (FLAGS_test) { - LOG(INFO) << "Running parser..." << endl; - TestParser(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainParser() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - DependencyOptions *options = new DependencyOptions; - options->Initialize(); - - DependencyPipe *pipe = new DependencyPipe(options); - pipe->Initialize(); - - if (options->prune_basic()) { - if (options->use_pretrained_pruner()) { - pipe->LoadPrunerModelFile(); - } else { - // Train the pruner. - LOG(INFO) << "Training the pruner..."; - DependencyOptions *pruner_options = new DependencyOptions; - *pruner_options = *options; - // Transform things such as pruner_train_algorithm - // in train_algorithm. - pruner_options->CopyPrunerFlags(); - pruner_options->Initialize(); - DependencyPipe *pruner_pipe = new DependencyPipe(pruner_options); - pruner_pipe->Initialize(); - - pruner_pipe->Train(); - pipe->SetPrunerParameters(pruner_pipe->GetParameters()); - // This is necessary so that the pruner parameters are not - // destroyed when deleting the pruner pipe. - pruner_pipe->SetParameters(NULL); - - delete pruner_pipe; - delete pruner_options; - } - } - - LOG(INFO) << "Training the parser..."; - pipe->Train(); - pipe->SaveModelFile(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TestParser() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - DependencyOptions *options = new DependencyOptions; - options->Initialize(); - - DependencyPipe *pipe = new DependencyPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "DependencyPipe.h" + +using namespace std; + +void TrainParser(); +void TestParser(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + + if (FLAGS_train) { + LOG(INFO) << "Training parser..." << endl; + TrainParser(); + } else if (FLAGS_test) { + LOG(INFO) << "Running parser..." << endl; + TestParser(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainParser() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + DependencyOptions *options = new DependencyOptions; + options->Initialize(); + + DependencyPipe *pipe = new DependencyPipe(options); + pipe->Initialize(); + + if (options->prune_basic()) { + if (options->use_pretrained_pruner()) { + pipe->LoadPrunerModelFile(); + } else { + // Train the pruner. + LOG(INFO) << "Training the pruner..."; + DependencyOptions *pruner_options = new DependencyOptions; + *pruner_options = *options; + // Transform things such as pruner_train_algorithm + // in train_algorithm. + pruner_options->CopyPrunerFlags(); + pruner_options->Initialize(); + DependencyPipe *pruner_pipe = new DependencyPipe(pruner_options); + pruner_pipe->Initialize(); + + pruner_pipe->Train(); + pipe->SetPrunerParameters(pruner_pipe->GetParameters()); + // This is necessary so that the pruner parameters are not + // destroyed when deleting the pruner pipe. + pruner_pipe->SetParameters(NULL); + + delete pruner_pipe; + delete pruner_options; + } + } + + LOG(INFO) << "Training the parser..."; + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestParser() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + DependencyOptions *options = new DependencyOptions; + options->Initialize(); + + DependencyPipe *pipe = new DependencyPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/semantic_parser/SemanticDecoder.cpp b/src/semantic_parser/SemanticDecoder.cpp index 75f93f1..8618996 100644 --- a/src/semantic_parser/SemanticDecoder.cpp +++ b/src/semantic_parser/SemanticDecoder.cpp @@ -1,1660 +1,1660 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "SemanticDecoder.h" -#include "SemanticPart.h" -#include "SemanticPipe.h" -#include "AlgUtils.h" -#include -#include -#include "logval.h" -#include "ad3/FactorGraph.h" -#include "FactorSemanticGraph.h" -#include "FactorPredicateAutomaton.h" -#include "FactorArgumentAutomaton.h" - -// Define a matrix of doubles using Eigen. -typedef LogVal LogValD; -namespace Eigen { -typedef Eigen::Matrix MatrixXlogd; -} - -using namespace std; - -DEFINE_double(srl_train_cost_false_positives, 1.0, - "Cost for predicting false positives."); -DEFINE_double(srl_train_cost_false_negatives, 1.0, - "Cost for predicting false negatives."); - -void SemanticDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, - const vector &scores, - const vector &gold_output, - vector *predicted_output, - double *cost, - double *loss) { - SemanticParts *semantic_parts = static_cast(parts); - int offset_arcs, num_arcs; - - // TODO(atm): make it possible to penalize wrong predicate parts as well? - // Or unlabeled arcs in addition to labeled arcs? - if (pipe_->GetSemanticOptions()->labeled()) { - semantic_parts->GetOffsetLabeledArc(&offset_arcs, &num_arcs); - } else { - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - } - - //////////////////////////////////////////////////// - // F1: a = 0.5, b = 0.5. - // Recall: a = 0, b = 1. - // In general: - // p = a - (a+b)*z0 - // q = b*sum(z0) - // p'*z + q = a*sum(z) - (a+b)*z0'*z + b*sum(z0) - // = a*(1-z0)'*z + b*(1-z)'*z0. - //////////////////////////////////////////////////// - - // Penalty for predicting 1 when it is 0 (FP). - double a = FLAGS_srl_train_cost_false_positives; - // Penalty for predicting 0 when it is 1 (FN). - double b = FLAGS_srl_train_cost_false_negatives; - - // p = 0.5-z0, q = 0.5'*z0, loss = p'*z + q - double q = 0.0; - vector p(num_arcs, 0.0); - - vector scores_cost = scores; - for (int r = 0; r < num_arcs; ++r) { - p[r] = a - (a + b) * gold_output[offset_arcs + r]; - scores_cost[offset_arcs + r] += p[r]; - q += b*gold_output[offset_arcs + r]; - } - - Decode(instance, parts, scores_cost, predicted_output); - - *cost = q; - for (int r = 0; r < num_arcs; ++r) { - *cost += p[r] * (*predicted_output)[offset_arcs + r]; - } - - *loss = *cost; - for (int r = 0; r < parts->size(); ++r) { - *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); - } - -#if 0 - for (int k = 0; k < 2; ++k) { - const vector *output; - string type; - if (k == 0) { - type = "gold"; - output = &gold_output; - } else { - type = "predicted"; - output = predicted_output; - } - for (int r = 0; r < parts->size(); ++r) { - int offset_pred_, offset_arcs_, offset_labeled_arcs_, offset_siblings_, - offset_consecutive_siblings_, num_; - semantic_parts->GetOffsetPredicate(&offset_pred_, &num_); - semantic_parts->GetOffsetArc(&offset_arcs_, &num_); - semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs_, &num_); - semantic_parts->GetOffsetSibling(&offset_siblings_, &num_); - semantic_parts->GetOffsetConsecutiveSibling(&offset_consecutive_siblings_, &num_); - if (r >= offset_consecutive_siblings_) { - SemanticPartConsecutiveSibling *sibling = - static_cast((*parts)[r]); - if ((*output)[r] > 0) { - LOG(INFO) << type << " consec sibling: " << "[" << r << "]" << " " - << sibling->predicate() << " " - << sibling->sense() << " " - << sibling->first_argument() << " " - << sibling->second_argument() << " " - << (*output)[r]; - } - } else if (r >= offset_siblings_) { - SemanticPartSibling *sibling = - static_cast((*parts)[r]); - if ((*output)[r] > 0) { - LOG(INFO) << type << " sibling: " << "[" << r << "]" << " " - << sibling->predicate() << " " - << sibling->sense() << " " - << sibling->first_argument() << " " - << sibling->second_argument() << " " - << (*output)[r]; - } - } else if (r >= offset_labeled_arcs_) { - SemanticPartLabeledArc *labeled_arc = - static_cast((*parts)[r]); - if ((*output)[r] > 0) { - LOG(INFO) << type << " labeled_arc: " << "[" << r << "]" << " " - << labeled_arc->predicate() << " " - << labeled_arc->sense() << " " - << labeled_arc->argument() << " " - << labeled_arc->role() << " " - << (*output)[r]; - } - } else if (r >= offset_arcs_) { - SemanticPartArc *arc = - static_cast((*parts)[r]); - if ((*output)[r] > 0) { - LOG(INFO) << type << " arc: " << "[" << r << "]" << " " - << arc->predicate() << " " - << arc->sense() << " " - << arc->argument() << " " - << (*output)[r]; - } - } else if (r >= offset_pred_) { - SemanticPartPredicate *predicate = - static_cast((*parts)[r]); - if ((*output)[r] > 0) { - LOG(INFO) << type << " predicate: " << "[" << r << "]" << " " - << predicate->predicate() << " " - << predicate->sense() << " " - << (*output)[r]; - } - } else { - CHECK(false); - } - } - } -#endif -} - -void SemanticDecoder::DecodeMarginals(Instance *instance, Parts *parts, - const vector &scores, - const vector &gold_output, - vector *predicted_output, - double *entropy, - double *loss) { - SemanticParts *semantic_parts = static_cast(parts); - - // Right now, only allow marginal inference for arc-factored models. - CHECK(semantic_parts->IsArcFactored()); - - // Create copy of the scores. - vector copied_scores(scores); - vector total_scores; - vector label_marginals; - int offset_predicate_parts, num_predicate_parts; - int offset_arcs, num_arcs; - int offset_labeled_arcs, num_labeled_arcs; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs, - &num_labeled_arcs); - - // If labeled parsing, decode the labels and update the scores. - if (pipe_->GetSemanticOptions()->labeled()) { - DecodeLabelMarginals(instance, parts, copied_scores, &total_scores, - &label_marginals); - for (int r = 0; r < total_scores.size(); ++r) { - // Sum the "labeled" scores to the (eventually) already existing - // "unlabeled" scores. - copied_scores[offset_arcs + r] += total_scores[r]; - } - } - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - double log_partition_function; - DecodeBasicMarginals(instance, parts, copied_scores, predicted_output, - &log_partition_function, entropy); - - // If labeled parsing, write the components of the predicted output that - // correspond to the labeled parts. - if (pipe_->GetSemanticOptions()->labeled()) { - for (int r = 0; r < num_labeled_arcs; ++r) { - SemanticPartLabeledArc *labeled_arc = - static_cast( - (*parts)[offset_labeled_arcs + r]); - int index_arc = semantic_parts->FindArc(labeled_arc->predicate(), - labeled_arc->argument(), - labeled_arc->sense()); - CHECK_GE(index_arc, 0); - (*predicted_output)[offset_labeled_arcs + r] = - label_marginals[r] * (*predicted_output)[index_arc]; - } - - // Recompute the entropy. - *entropy = log_partition_function; - for (int r = 0; r < num_predicate_parts; ++r) { - *entropy -= (*predicted_output)[offset_predicate_parts + r] * - scores[offset_predicate_parts + r]; - } - for (int r = 0; r < num_arcs; ++r) { - *entropy -= (*predicted_output)[offset_arcs + r] * - scores[offset_arcs + r]; - } - for (int r = 0; r < num_labeled_arcs; ++r) { - *entropy -= (*predicted_output)[offset_labeled_arcs + r] * - scores[offset_labeled_arcs + r]; - } - if (*entropy < 0.0) { - LOG(INFO) << "Entropy truncated to zero (" << *entropy << ")"; - *entropy = 0.0; - } - } - - *loss = *entropy; - for (int r = 0; r < parts->size(); ++r) { - *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); - } - if (*loss < 0.0) { - LOG(INFO) << "Loss truncated to zero (" << *loss << ")"; - *loss = 0.0; - } -} - -// Decode the best label for each candidate arc. The output vector -// best_labeled_parts, indexed by the unlabeled arcs, contains the indices -// of the best labeled part for each arc. -void SemanticDecoder::DecodeLabels(Instance *instance, Parts *parts, - const vector &scores, - vector *best_labeled_parts) { - SemanticParts *semantic_parts = static_cast(parts); - - int offset, num_arcs; - semantic_parts->GetOffsetArc(&offset, &num_arcs); - best_labeled_parts->resize(num_arcs); - for (int r = 0; r < num_arcs; ++r) { - SemanticPartArc *arc = - static_cast((*parts)[offset + r]); - const vector &index_labeled_parts = - semantic_parts->FindLabeledArcs(arc->predicate(), - arc->argument(), - arc->sense()); - // Find the best label for each candidate arc. - int best_label = -1; - double best_score; - for (int k = 0; k < index_labeled_parts.size(); ++k) { - if (best_label < 0 || - scores[index_labeled_parts[k]] > best_score) { - best_label = index_labeled_parts[k]; - best_score = scores[best_label]; - } - } - (*best_labeled_parts)[r] = best_label; - } -} - -// Decode the label marginals for each candidate arc. The output vector -// total_scores contains the sum of exp-scores (over the labels) for each arc; -// label_marginals contains those marginals ignoring the tree constraint. -void SemanticDecoder::DecodeLabelMarginals(Instance *instance, Parts *parts, - const vector &scores, - vector *total_scores, - vector *label_marginals) { - SemanticParts *semantic_parts = static_cast(parts); - - int offset, num_arcs; - int offset_labeled, num_labeled_arcs; - semantic_parts->GetOffsetArc(&offset, &num_arcs); - semantic_parts->GetOffsetLabeledArc(&offset_labeled, &num_labeled_arcs); - total_scores->clear(); - total_scores->resize(num_arcs, 0.0); - label_marginals->clear(); - label_marginals->resize(num_labeled_arcs, 0.0); - - for (int r = 0; r < num_arcs; ++r) { - SemanticPartArc *arc = - static_cast((*parts)[offset + r]); - const vector &index_labeled_parts = - semantic_parts->FindLabeledArcs(arc->predicate(), - arc->argument(), - arc->sense()); - // Find the best label for each candidate arc. - LogValD total_score = LogValD::Zero(); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - total_score += LogValD(scores[index_labeled_parts[k]], false); - } - (*total_scores)[r] = total_score.logabs(); - double sum = 0.0; - for (int k = 0; k < index_labeled_parts.size(); ++k) { - LogValD marginal = - LogValD(scores[index_labeled_parts[k]], false) / total_score; - (*label_marginals)[index_labeled_parts[k] - offset_labeled] = - marginal.as_float(); - sum += marginal.as_float(); - } - if (!NEARLY_EQ_TOL(sum, 1.0, 1e-9)) { - LOG(INFO) << "Label marginals don't sum to one: sum = " << sum; - } - } -} - -void SemanticDecoder::Decode(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output) { - SemanticParts *semantic_parts = static_cast(parts); - - // Create copy of the scores. - vector copied_scores(scores); - vector best_labeled_parts; - int offset_labeled_arcs, num_labeled_arcs; - semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs, - &num_labeled_arcs); - int offset_arcs, num_arcs; - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - int offset_predicate_parts, num_predicate_parts; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - - bool labeled_decoding = false; - // TODO: change this test. - int offset_labeled_siblings, num_labeled_siblings; - semantic_parts->GetOffsetLabeledSibling(&offset_labeled_siblings, - &num_labeled_siblings); - if (num_labeled_siblings > 0) labeled_decoding = true; - if (pipe_->GetSemanticOptions()->deterministic_labels()) { - labeled_decoding = true; - } - - if (labeled_decoding) { - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - DecodeFactorGraph(instance, parts, copied_scores, labeled_decoding, true, - predicted_output); - - // At test time, run a basic decoder on top of the outcome of AD3 - // as a rounding heuristic to make sure we get a valid graph. - // TODO: maybe change the interface to AD3 to let us implement - // a primal rounding heuristic. - if (pipe_->GetSemanticOptions()->test()) { - double threshold = 0.5; - for (int r = 0; r < num_arcs; ++r) { - copied_scores[offset_arcs + r] = 0.0; - } - for (int r = 0; r < num_predicate_parts; ++r) { - copied_scores[offset_predicate_parts + r] = 0.0; - } - for (int r = 0; r < num_labeled_arcs; ++r) { - copied_scores[offset_labeled_arcs + r] = - (*predicted_output)[offset_labeled_arcs + r] - threshold; - } - - DecodeLabels(instance, parts, copied_scores, &best_labeled_parts); - for (int r = 0; r < best_labeled_parts.size(); ++r) { - // Sum the "labeled" scores to the (eventually) already existing - // "unlabeled" scores. - copied_scores[offset_arcs + r] += copied_scores[best_labeled_parts[r]]; - } - - double value; - predicted_output->assign(parts->size(), 0.0); - DecodeBasic(instance, parts, copied_scores, predicted_output, &value); - - // Write the components of the predicted output that - // correspond to the labeled parts. - for (int r = 0; r < num_arcs; ++r) { - CHECK_GE(best_labeled_parts[r], offset_arcs + num_arcs); - (*predicted_output)[best_labeled_parts[r]] = - (*predicted_output)[offset_arcs + r]; - } - } - } else { - // If labeled parsing, decode the labels and update the scores. - if (pipe_->GetSemanticOptions()->labeled()) { - DecodeLabels(instance, parts, copied_scores, &best_labeled_parts); - for (int r = 0; r < best_labeled_parts.size(); ++r) { - // Sum the "labeled" scores to the (eventually) already existing - // "unlabeled" scores. - copied_scores[offset_arcs + r] += copied_scores[best_labeled_parts[r]]; - } - } - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - if (semantic_parts->IsArcFactored() || - semantic_parts->IsLabeledArcFactored()) { - double value; - DecodeBasic(instance, parts, copied_scores, predicted_output, &value); - } else { - DecodeFactorGraph(instance, parts, copied_scores, labeled_decoding, true, - predicted_output); - - // At test time, run a basic decoder on top of the outcome of AD3 - // as a rounding heuristic to make sure we get a valid graph. - // TODO: maybe change the interface to AD3 to let us implement - // a primal rounding heuristic. - if (pipe_->GetSemanticOptions()->test()) { - double threshold = 0.5; - for (int r = 0; r < num_arcs; ++r) { - copied_scores[offset_arcs + r] = - (*predicted_output)[offset_arcs + r] - threshold; - } - for (int r = 0; r < num_predicate_parts; ++r) { - copied_scores[offset_predicate_parts + r] = 0.0; - } - // This is not strictly necessary (since labeled arcs are not used by - // DecodeBasic), but should not harm. - for (int r = 0; r < num_labeled_arcs; ++r) { - copied_scores[offset_labeled_arcs + r] = 0.0; - } - predicted_output->assign(parts->size(), 0.0); - double value; - DecodeBasic(instance, parts, copied_scores, predicted_output, &value); - } - } - - // If labeled parsing, write the components of the predicted output that - // correspond to the labeled parts. - if (pipe_->GetSemanticOptions()->labeled()) { - for (int r = 0; r < num_arcs; ++r) { - CHECK_GE(best_labeled_parts[r], offset_arcs + num_arcs); - (*predicted_output)[best_labeled_parts[r]] = - (*predicted_output)[offset_arcs + r]; - } - } - } -} - -// Build predicate and arc indices. -void SemanticDecoder::BuildBasicIndices( - int sentence_length, - const vector &predicate_parts, - const vector &arcs, - vector > *index_predicates, - vector > > *arcs_by_predicate) { - int num_arcs = arcs.size(); - int num_predicate_parts = predicate_parts.size(); - - arcs_by_predicate->assign(sentence_length, vector >()); - for (int r = 0; r < num_arcs; ++r) { - int p = arcs[r]->predicate(); - int s = arcs[r]->sense(); - if (s >= (*arcs_by_predicate)[p].size()) { - (*arcs_by_predicate)[p].resize(s + 1); - } - (*arcs_by_predicate)[p][s].push_back(r); - } - - index_predicates->assign(sentence_length, vector()); - for (int r = 0; r < num_predicate_parts; ++r) { - CHECK_LT(r, predicate_parts.size()); - int p = predicate_parts[r]->predicate(); - int s = predicate_parts[r]->sense(); - if (s >= (*index_predicates)[p].size()) { - (*index_predicates)[p].resize(s + 1, -1); - } - (*index_predicates)[p][s] = r; - } -} - -void SemanticDecoder::DecodePruner(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output) { - //DecodePrunerNaive(instance, parts, scores, predicted_output); - //return; - - int sentence_length = - static_cast(instance)->size(); - SemanticParts *semantic_parts = static_cast(parts); - double posterior_threshold = - pipe_->GetSemanticOptions()->GetPrunerPosteriorThreshold(); - int max_arguments = pipe_->GetSemanticOptions()->GetPrunerMaxArguments(); - if (max_arguments < 0) max_arguments = sentence_length; - - int offset_predicate_parts, num_predicate_parts; - int offset_arcs, num_arcs; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - - vector arcs(num_arcs); - vector scores_arcs(num_arcs); - for (int r = 0; r < num_arcs; ++r) { - arcs[r] = static_cast((*parts)[offset_arcs + r]); - scores_arcs[r] = scores[offset_arcs + r]; - } - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - CHECK(semantic_parts->IsArcFactored()); - - vector > > arcs_by_predicate; - arcs_by_predicate.resize(sentence_length); - for (int r = 0; r < num_arcs; ++r) { - int p = arcs[r]->predicate(); - int s = arcs[r]->sense(); - if (s >= arcs_by_predicate[p].size()) { - arcs_by_predicate[p].resize(s + 1); - } - arcs_by_predicate[p][s].push_back(r); - } - - double entropy; - double log_partition_function; - vector posteriors; - DecodeBasicMarginals(instance, parts, scores, &posteriors, - &log_partition_function, &entropy); - - // Get max_arguments argumens per predicate. - int num_used_parts = 0; - for (int p = 0; p < sentence_length; ++p) { - for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { - vector > scores_arguments; - for (int a = 1; a < sentence_length; ++a) { - int r = semantic_parts->FindArc(p, a, s); - if (r < 0) continue; - scores_arguments.push_back(pair(-posteriors[r], r)); - } - if (scores_arguments.size() == 0) continue; - sort(scores_arguments.begin(), scores_arguments.end()); - double max_posterior = 1.0; // -scores_arguments[0].first; - for (int k = 0; k < max_arguments && k < scores_arguments.size(); ++k) { - int r = scores_arguments[k].second; - if (-scores_arguments[k].first >= posterior_threshold * max_posterior) { - ++num_used_parts; - (*predicted_output)[r] = 1.0; - } else { - break; - } - } - } - } - - VLOG(2) << "Pruning reduced to " - << static_cast(num_used_parts) / - static_cast(sentence_length) - << " candidate heads per word."; -} - -void SemanticDecoder::DecodePrunerNaive(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output) { - int sentence_length = - static_cast(instance)->size(); - SemanticParts *semantic_parts = static_cast(parts); - int max_arguments = pipe_->GetSemanticOptions()->GetPrunerMaxArguments(); - int offset_predicate_parts, num_predicate_parts; - int offset_arcs, num_arcs; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - - vector arcs(num_arcs); - vector scores_arcs(num_arcs); - for (int r = 0; r < num_arcs; ++r) { - arcs[r] = static_cast((*parts)[offset_arcs + r]); - scores_arcs[r] = scores[offset_arcs + r]; - } - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - for (int r = 0; r < num_predicate_parts; ++r) { - // Don't prune any of the predicate parts. - (*predicted_output)[offset_predicate_parts + r] = 1.0; - } - - CHECK(semantic_parts->IsArcFactored()); - - vector > > arcs_by_predicate; - arcs_by_predicate.resize(sentence_length); - for (int r = 0; r < num_arcs; ++r) { - int p = arcs[r]->predicate(); - int s = arcs[r]->sense(); - if (s >= arcs_by_predicate[p].size()) { - arcs_by_predicate[p].resize(s + 1); - } - arcs_by_predicate[p][s].push_back(r); - } - - // Get max_arguments argumens per predicate. - for (int p = 0; p < sentence_length; ++p) { - for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { - vector > scores_arguments; - for (int a = 1; a < sentence_length; ++a) { - int r = semantic_parts->FindArc(p, a, s); - if (r < 0) continue; - scores_arguments.push_back(pair(-scores[r], r)); - } - sort(scores_arguments.begin(), scores_arguments.end()); - for (int k = 0; k < max_arguments && k < scores_arguments.size(); ++k) { - int r = scores_arguments[k].second; - (*predicted_output)[r] = 1.0; - //LOG(INFO) << "Keeping arc (" << p << ", " - // << s << ", " - // << static_cast((*parts)[r])->argument() - // << ")."; - } - } - } -} - -// Decoder for the basic model. For each predicate, choose the best -// sense and the best set of arcs independently. -void SemanticDecoder::DecodeBasic(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output, - double *value) { - int sentence_length = - static_cast(instance)->size(); - SemanticParts *semantic_parts = static_cast(parts); - int offset_predicate_parts, num_predicate_parts; - int offset_arcs, num_arcs; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - - vector arcs(num_arcs); - vector scores_arcs(num_arcs); - for (int r = 0; r < num_arcs; ++r) { - arcs[r] = static_cast((*parts)[offset_arcs + r]); - scores_arcs[r] = scores[offset_arcs + r]; - } - - vector predicate_parts(num_predicate_parts); - vector scores_predicates(num_predicate_parts); - for (int r = 0; r < num_predicate_parts; ++r) { - predicate_parts[r] = - static_cast((*parts)[offset_predicate_parts + r]); - scores_predicates[r] = scores[offset_predicate_parts + r]; - } - - vector > > arcs_by_predicate; - vector > index_predicates; - vector selected_predicates; - vector selected_arcs; - BuildBasicIndices(sentence_length, predicate_parts, arcs, &index_predicates, - &arcs_by_predicate); - - DecodeSemanticGraph(sentence_length, predicate_parts, arcs, index_predicates, - arcs_by_predicate, scores_predicates, scores_arcs, - &selected_predicates, &selected_arcs, value); - - predicted_output->resize(parts->size()); - for (int r = 0; r < num_predicate_parts; ++r) { - if (selected_predicates[r]) { - (*predicted_output)[offset_predicate_parts + r] = 1.0; - } else { - (*predicted_output)[offset_predicate_parts + r] = 0.0; - } - } - for (int r = 0; r < num_arcs; ++r) { - if (selected_arcs[r]) { - (*predicted_output)[offset_arcs + r] = 1.0; - } else { - (*predicted_output)[offset_arcs + r] = 0.0; - } - } - -#if 0 - arcs_by_predicate.resize(sentence_length); - for (int r = 0; r < num_arcs; ++r) { - int p = arcs[r]->predicate(); - int s = arcs[r]->sense(); - if (s >= arcs_by_predicate[p].size()) { - arcs_by_predicate[p].resize(s + 1); - } - arcs_by_predicate[p][s].push_back(r); - } - - vector scores_predicates(num_predicate_parts); - //vector > index_predicates(sentence_length); - for (int r = 0; r < num_predicate_parts; ++r) { - scores_predicates[r] = scores[offset_predicate_parts + r]; - SemanticPartPredicate *predicate_part = - static_cast((*parts)[offset_predicate_parts + r]); - int p = predicate_part->predicate(); - int s = predicate_part->sense(); - if (s >= index_predicates[p].size()) { - index_predicates[p].resize(s + 1, -1); - } - index_predicates[p][s] = r; - } - - predicted_output->resize(parts->size()); - for (int r = 0; r < num_predicate_parts; ++r) { - (*predicted_output)[offset_predicate_parts + r] = 0.0; - } - for (int r = 0; r < num_arcs; ++r) { - (*predicted_output)[offset_arcs + r] = 0.0; - } - - double total_score = 0.0; - for (int p = 0; p < sentence_length; ++p) { - int best_sense = -1; - double best_score = 0.0; - vector > selected_arcs; - selected_arcs.resize(arcs_by_predicate[p].size()); - for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { - // Compute the best assignment of arcs departing from this - // predicate word. - selected_arcs[s].resize(arcs_by_predicate[p][s].size()); - int r = index_predicates[p][s]; - double score = scores_predicates[r]; - for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { - int r = arcs_by_predicate[p][s][k]; - if (scores_arcs[r] > 0.0) { - selected_arcs[s][k] = true; - score += scores_arcs[r]; - } else { - selected_arcs[s][k] = false; - } - } - if (score > best_score) { - best_sense = s; - best_score = score; - } - } - if (best_sense >= 0) { - total_score += best_score; - int s = best_sense; - int r = index_predicates[p][s]; - CHECK_GE(r, 0); - (*predicted_output)[offset_predicate_parts + r] = 1.0; - for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { - if (!selected_arcs[s][k]) continue; - int r = arcs_by_predicate[p][s][k]; - (*predicted_output)[offset_arcs + r] = 1.0; - //LOG(INFO) << "Selected arc " - // << arcs[r]->predicate() << " " - // << arcs[r]->argument() << " " - // << arcs[r]->sense(); - } - } - } -#endif -} - -// Decoder for the basic model. For each predicate, choose the best -// sense and the best set of arcs independently. -void SemanticDecoder::DecodeBasicMarginals(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output, - double *log_partition_function, - double *entropy) { - int sentence_length = - static_cast(instance)->size(); - SemanticParts *semantic_parts = static_cast(parts); - int offset_predicate_parts, num_predicate_parts; - int offset_arcs, num_arcs; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - - vector arcs(num_arcs); - vector scores_arcs(num_arcs); - for (int r = 0; r < num_arcs; ++r) { - arcs[r] = static_cast((*parts)[offset_arcs + r]); - scores_arcs[r] = scores[offset_arcs + r]; - } - - vector > > arcs_by_predicate; - arcs_by_predicate.resize(sentence_length); - for (int r = 0; r < num_arcs; ++r) { - int p = arcs[r]->predicate(); - int s = arcs[r]->sense(); - if (s >= arcs_by_predicate[p].size()) { - arcs_by_predicate[p].resize(s + 1); - } - arcs_by_predicate[p][s].push_back(r); - } - - vector scores_predicates(num_predicate_parts); - vector > index_predicates(sentence_length); - for (int r = 0; r < num_predicate_parts; ++r) { - scores_predicates[r] = scores[offset_predicate_parts + r]; - SemanticPartPredicate *predicate_part = - static_cast((*parts)[offset_predicate_parts + r]); - int p = predicate_part->predicate(); - int s = predicate_part->sense(); - if (s >= index_predicates[p].size()) { - index_predicates[p].resize(s + 1, -1); - } - index_predicates[p][s] = r; - } - - predicted_output->resize(parts->size()); - for (int r = 0; r < num_predicate_parts; ++r) { - (*predicted_output)[offset_predicate_parts + r] = 0.0; - } - for (int r = 0; r < num_arcs; ++r) { - (*predicted_output)[offset_arcs + r] = 0.0; - } - - *log_partition_function = 0.0; - *entropy = 0.0; - for (int p = 0; p < sentence_length; ++p) { - // Initiliaze log partition all senses to exp(0.0) to account for - // the null sense which implies there are no outgoing arcs. - LogValD log_partition_all_senses = LogValD::One(); - //LogValD log_partition_all_senses = LogValD::Zero(); - vector log_partition_senses(arcs_by_predicate[p].size(), - LogValD::Zero()); - vector > log_partition_arcs(arcs_by_predicate[p].size()); - for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { - int r = index_predicates[p][s]; - double score = scores_predicates[r]; - //CHECK_EQ(score, 0.0); - // Initialize log partition arcs to exp(0.0) to account for the - // event that the arc does not exist. - log_partition_arcs[s].assign(arcs_by_predicate[p][s].size(), - LogValD::One()); - for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { - int r = arcs_by_predicate[p][s][k]; - log_partition_arcs[s][k] += LogValD(scores_arcs[r], false); - //score += log_partition_arcs[s][k].as_float(); - score += log_partition_arcs[s][k].logabs(); - } - //LOG(INFO) << s << " " << score; - log_partition_senses[s] = LogValD(score, false); - //log_partition_senses[s] = LogValD(score); - //LOG(INFO) << s << " " << log_partition_senses[s].logabs(); - log_partition_all_senses += log_partition_senses[s]; - } - - // This makes sure the log partition function does not become -infty for - // predicates that do not have any sense. - if (arcs_by_predicate[p].size() > 0) { - if (false && sentence_length < 5) { - LOG(INFO) << "Log partition[" << p << "] = " - << log_partition_all_senses.logabs(); - } - *log_partition_function += log_partition_all_senses.logabs(); - } - - for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { - int r = index_predicates[p][s]; - double predicate_marginal = LogValD(log_partition_senses[s].logabs() - - log_partition_all_senses.logabs(), - false).as_float(); - //LOG(INFO) << "Predicate marginal[" << p << "][" << s << "] = " - // << predicate_marginal; - (*predicted_output)[offset_predicate_parts + r] = predicate_marginal; - //CHECK_EQ(scores_predicates[r], 0.0); - *entropy -= scores_predicates[r] * predicate_marginal; - for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { - int r = arcs_by_predicate[p][s][k]; - double marginal = LogValD(scores_arcs[r] - - log_partition_arcs[s][k].logabs(), - false).as_float(); - marginal *= predicate_marginal; - if (false && sentence_length < 5) { - LOG(INFO) << "marginal[" << p << "][" << s << "][" << k << "] = " - << marginal << "\t" - << "scores_arcs[" << p << "][" << s << "][" << k << "] = " - << scores_arcs[r]; - } - (*predicted_output)[offset_arcs + r] = marginal; - *entropy -= scores_arcs[r] * marginal; - } - } - } - - *entropy += *log_partition_function; - if (false && sentence_length < 5) { - LOG(INFO) << "Log-partition function:" << *log_partition_function; - LOG(INFO) << "Entropy:" << *entropy; - } -} - -// Decoder for the basic model. For each predicate, choose the best -// sense and the best set of arcs independently. -void SemanticDecoder::DecodeSemanticGraph( - int sentence_length, - const vector &predicate_parts, - const vector &arcs, - const vector > &index_predicates, - const vector > > &arcs_by_predicate, - const vector &predicate_scores, - const vector &arc_scores, - vector *selected_predicates, - vector *selected_arcs, - double *value) { - int num_predicate_parts = predicate_parts.size(); - int num_arcs = arcs.size(); - - selected_predicates->assign(num_predicate_parts, false); - selected_arcs->assign(num_arcs, false); - - double total_score = 0.0; - for (int p = 0; p < sentence_length; ++p) { - int best_sense = -1; - double best_score = 0.0; - vector > selected; - selected.resize(arcs_by_predicate[p].size()); - for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { - // Compute the best assignment of arcs departing from this - // predicate word. - selected[s].resize(arcs_by_predicate[p][s].size()); - int r = index_predicates[p][s]; - double score = predicate_scores[r]; - for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { - int r = arcs_by_predicate[p][s][k]; - if (arc_scores[r] > 0.0) { - selected[s][k] = true; - score += arc_scores[r]; - } else { - selected[s][k] = false; - } - } - // Note: we're allowing a non-null sense (!= -1) without outgoing arcs. - if (score > best_score) { - best_sense = s; - best_score = score; - } - } - if (best_sense >= 0) { - total_score += best_score; - int s = best_sense; - int r = index_predicates[p][s]; - CHECK_GE(r, 0); - (*selected_predicates)[r] = true; - for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { - if (!selected[s][k]) continue; - int r = arcs_by_predicate[p][s][k]; - (*selected_arcs)[r] = true; - } - } - } - *value = total_score; -} - -// Decode building a factor graph and calling the AD3 algorithm. -void SemanticDecoder::DecodeFactorGraph(Instance *instance, Parts *parts, - const vector &scores, - bool labeled_decoding, - bool relax, - vector *predicted_output) { - SemanticParts *semantic_parts = static_cast(parts); - SemanticInstanceNumeric* sentence = - static_cast(instance); - CHECK(relax); - - // Get the offsets for the different parts. - int offset_predicate_parts, num_predicate_parts; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - int offset_arcs, num_arcs; - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - int offset_labeled_arcs, num_labeled_arcs; - semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs, - &num_labeled_arcs); - int offset_siblings, num_siblings; - semantic_parts->GetOffsetSibling(&offset_siblings, &num_siblings); - int offset_labeled_siblings, num_labeled_siblings; - semantic_parts->GetOffsetLabeledSibling(&offset_labeled_siblings, - &num_labeled_siblings); - int offset_consecutive_siblings, num_consecutive_siblings; - semantic_parts->GetOffsetConsecutiveSibling(&offset_consecutive_siblings, - &num_consecutive_siblings); - int offset_grandparents, num_grandparents; - semantic_parts->GetOffsetGrandparent(&offset_grandparents, &num_grandparents); - int offset_coparents, num_coparents; - semantic_parts->GetOffsetCoparent(&offset_coparents, &num_coparents); - int offset_consecutive_coparents, num_consecutive_coparents; - semantic_parts->GetOffsetConsecutiveCoparent(&offset_consecutive_coparents, - &num_consecutive_coparents); - -#if 0 - int offset_grandsiblings, num_grandsiblings; - semantic_parts->GetOffsetGrandSibling(&offset_grandsiblings, &num_grandsiblings); - int offset_trisiblings, num_trisiblings; - dependency_parts->GetOffsetTriSibling(&offset_trisiblings, &num_trisiblings); -#endif - - // Define what parts are used. - bool use_arbitrary_sibling_parts = (num_siblings > 0); - bool use_labeled_arbitrary_sibling_parts = (num_labeled_siblings > 0); - bool use_consecutive_sibling_parts = (num_consecutive_siblings > 0); - bool use_grandparent_parts = (num_grandparents > 0); - bool use_coparent_parts = (num_coparents > 0); - bool use_consecutive_coparent_parts = (num_consecutive_coparents > 0); -#if 0 - bool use_grandsibling_parts = (num_grandsiblings > 0); - bool use_trisibling_parts = (num_trisiblings > 0); -#endif - - if (!labeled_decoding) { - CHECK_EQ(num_labeled_siblings, 0); - CHECK(!pipe_->GetSemanticOptions()->deterministic_labels()); - } - - // Variables of the factor graph. - vector variables; - - // Indices that allow to identify the part corresponding to each variable. - vector part_indices_; - vector additional_part_indices; - vector factor_part_indices_; - - // Create factor graph. - AD3::FactorGraph *factor_graph = new AD3::FactorGraph; - int verbosity = 1; //1; - if (VLOG_IS_ON(2)) { - verbosity = 2; - } - factor_graph->SetVerbosity(verbosity); - - // Build predicate part variables. - int offset_predicate_variables = variables.size(); - for (int r = 0; r < num_predicate_parts; ++r) { - AD3::BinaryVariable* variable = factor_graph->CreateBinaryVariable(); - variable->SetLogPotential(scores[offset_predicate_parts + r]); - variables.push_back(variable); - part_indices_.push_back(offset_predicate_parts + r); - } - - // Build arc variables. - int offset_arc_variables = variables.size(); - for (int r = 0; r < num_arcs; ++r) { - AD3::BinaryVariable* variable = factor_graph->CreateBinaryVariable(); - variable->SetLogPotential(scores[offset_arcs + r]); - variables.push_back(variable); - part_indices_.push_back(offset_arcs + r); - } - - int offset_labeled_arc_variables = variables.size(); - if (labeled_decoding) { - // Build labeled arc variables. - for (int r = 0; r < num_labeled_arcs; ++r) { - AD3::BinaryVariable* variable = factor_graph->CreateBinaryVariable(); - variable->SetLogPotential(scores[offset_labeled_arcs + r]); - variables.push_back(variable); - part_indices_.push_back(offset_labeled_arcs + r); - } - } - - // Build basic semantic graph factor. - vector local_variables(num_predicate_parts + num_arcs); - vector predicate_parts(num_predicate_parts); - for (int r = 0; r < num_predicate_parts; ++r) { - local_variables[r] = variables[offset_predicate_variables + r]; - predicate_parts[r] = - static_cast((*parts)[offset_predicate_parts + r]); - } - vector arcs(num_arcs); - for (int r = 0; r < num_arcs; ++r) { - local_variables[num_predicate_parts + r] = - variables[offset_arc_variables + r]; - arcs[r] = static_cast((*parts)[offset_arcs + r]); - } - AD3::FactorSemanticGraph *factor = new AD3::FactorSemanticGraph; - factor->Initialize(sentence->size(), predicate_parts, arcs, this); - factor_graph->DeclareFactor(factor, local_variables, true); - factor_part_indices_.push_back(-1); - - if (labeled_decoding) { - // Build XOR-OUT factors to impose that each arc has a unique label. - for (int r = 0; r < num_arcs; ++r) { - const vector &index_labeled_parts = - semantic_parts->GetLabeledParts(offset_arcs + r); - vector - local_variables(index_labeled_parts.size() + 1); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(offset_labeled_arc_variables + index_part - offset_labeled_arcs, - variables.size()); - local_variables[k] = variables[offset_labeled_arc_variables + - index_part - offset_labeled_arcs]; - } - CHECK_GE(offset_arc_variables + r, 0); - CHECK_LT(offset_arc_variables + r, variables.size()); - local_variables[index_labeled_parts.size()] = - variables[offset_arc_variables + r]; - factor_graph->CreateFactorXOROUT(local_variables); - factor_part_indices_.push_back(-1); - } - - // If some labels are deterministic, make sure the same role is not filled - // more than once for each predicate. - if (pipe_->GetSemanticOptions()->deterministic_labels()) { - int sentence_length = - static_cast(instance)->size(); - vector > > - labeled_arcs_by_predicate_role(sentence_length); - for (int r = 0; r < num_labeled_arcs; ++r) { - SemanticPartLabeledArc *labeled_arc = - static_cast( - (*semantic_parts)[offset_labeled_arcs + r]); - int p = labeled_arc->predicate(); - int l = labeled_arc->role(); - // Skip if role l is not deterministic. - if (!pipe_->GetSemanticDictionary()->IsRoleDeterministic(l)) continue; - if (labeled_arcs_by_predicate_role[p].size() <= l) { - labeled_arcs_by_predicate_role[p].resize(l + 1); - } - labeled_arcs_by_predicate_role[p][l].push_back(r); - } - for (int p = 0; p < labeled_arcs_by_predicate_role.size(); ++p) { - for (int l = 0; l < labeled_arcs_by_predicate_role[p].size(); ++l) { - if (labeled_arcs_by_predicate_role[p][l].size() <= 1) continue; - vector - local_variables(labeled_arcs_by_predicate_role[p][l].size()); - for (int k = 0; k < labeled_arcs_by_predicate_role[p][l].size(); - ++k) { - int r = labeled_arcs_by_predicate_role[p][l][k]; - local_variables[k] = variables[offset_labeled_arc_variables + r]; - } - factor_graph->CreateFactorAtMostOne(local_variables); - factor_part_indices_.push_back(-1); - } - } - } - } - - ////////////////////////////////////////////////////////////////////// - // Build sibling factors. - ////////////////////////////////////////////////////////////////////// - if (use_arbitrary_sibling_parts) { - for (int r = 0; r < num_siblings; ++r) { - SemanticPartSibling *part = static_cast( - (*semantic_parts)[offset_siblings + r]); - int r1 = semantic_parts->FindArc(part->predicate(), - part->first_argument(), - part->sense()); - int r2 = semantic_parts->FindArc(part->predicate(), - part->second_argument(), - part->sense()); - CHECK_GE(r1, 0); - CHECK_GE(r2, 0); - vector local_variables; - local_variables.push_back(variables[r1 - offset_arcs + - offset_arc_variables]); - local_variables.push_back(variables[r2 - offset_arcs + - offset_arc_variables]); - - factor_graph->CreateFactorPAIR(local_variables, - scores[offset_siblings + r]); - // TODO: set these global indices at the end after all variables/factors - // are created. - //factor->SetGlobalIndex(...); - additional_part_indices.push_back(offset_siblings + r); - factor_part_indices_.push_back(offset_siblings + r); - } - } - - ////////////////////////////////////////////////////////////////////// - // Build labeled sibling factors. - ////////////////////////////////////////////////////////////////////// - if (use_labeled_arbitrary_sibling_parts) { - CHECK(labeled_decoding); - for (int r = 0; r < num_labeled_siblings; ++r) { - SemanticPartLabeledSibling *part = - static_cast( - (*semantic_parts)[offset_labeled_siblings + r]); - int r1 = semantic_parts->FindLabeledArc(part->predicate(), - part->first_argument(), - part->sense(), - part->first_role()); - int r2 = semantic_parts->FindLabeledArc(part->predicate(), - part->second_argument(), - part->sense(), - part->second_role()); - CHECK_GE(r1, 0); - CHECK_GE(r2, 0); - vector local_variables; - local_variables.push_back(variables[r1 - offset_labeled_arcs + - offset_labeled_arc_variables]); - local_variables.push_back(variables[r2 - offset_labeled_arcs + - offset_labeled_arc_variables]); - - factor_graph->CreateFactorPAIR(local_variables, - scores[offset_labeled_siblings + r]); - // TODO: set these global indices at the end after all variables/factors - // are created. - //factor->SetGlobalIndex(...); - additional_part_indices.push_back(offset_labeled_siblings + r); - factor_part_indices_.push_back(offset_labeled_siblings + r); - } - } - - ////////////////////////////////////////////////////////////////////// - // Build consecutive sibling factors. - ////////////////////////////////////////////////////////////////////// - if (use_consecutive_sibling_parts) { - // Get all the consecutive siblings, indices, etc. - vector > predicate_part_indices(sentence->size()); - for (int r = 0; r < num_predicate_parts; ++r) { - SemanticPartPredicate* predicate_part = - static_cast( - (*parts)[offset_predicate_parts + r]); - predicate_part_indices[predicate_part->predicate()]. - push_back(offset_predicate_parts + r); - } - vector > left_arc_indices(sentence->size()); - vector > right_arc_indices(sentence->size()); - for (int r = 0; r < num_arcs; ++r) { - SemanticPartArc* arc = - static_cast((*parts)[offset_arcs + r]); - // Handle self-loops (p=a) in the right side automaton. - if (arc->predicate() > arc->argument()) { - left_arc_indices[arc->predicate()].push_back(offset_arcs + r); - } else { - right_arc_indices[arc->predicate()].push_back(offset_arcs + r); - } - } - vector > - left_siblings(sentence->size()); - vector > - right_siblings(sentence->size()); - vector > left_scores(sentence->size()); - vector > right_scores(sentence->size()); - vector > left_indices(sentence->size()); - vector > right_indices(sentence->size()); - for (int r = 0; r < num_consecutive_siblings; ++r) { - SemanticPartConsecutiveSibling *sibling = - static_cast( - (*parts)[offset_consecutive_siblings + r]); - // TODO: Try to disable self loops on the left side? - // Make sure no non-basic sibling part ends up in two - // factors. - if (sibling->predicate() > sibling->second_argument()) { - // Left sibling. - left_siblings[sibling->predicate()].push_back(sibling); - left_scores[sibling->predicate()].push_back( - scores[offset_consecutive_siblings + r]); - // Save the part index to get the posterior later. - left_indices[sibling->predicate()]. - push_back(offset_consecutive_siblings + r); - } else { - CHECK(sibling->predicate() < sibling->second_argument() || - (sibling->predicate() == sibling->second_argument() && - sibling->first_argument() < 0)) - << sibling->predicate() << " " - << sibling->first_argument() << " " - << sibling->second_argument(); - // Right sibling. - right_siblings[sibling->predicate()].push_back(sibling); - right_scores[sibling->predicate()].push_back( - scores[offset_consecutive_siblings + r]); - // Save the part index to get the posterior later. - right_indices[sibling->predicate()]. - push_back(offset_consecutive_siblings + r); - } - } - - // Now, go through each predicate and create left and right automata. - for (int p = 0; p < sentence->size(); ++p) { - // Build left head automaton. - if (predicate_part_indices[p].size() == 0) { - CHECK_EQ(left_arc_indices[p].size(), 0); - CHECK_EQ(right_arc_indices[p].size(), 0); - CHECK_EQ(left_siblings[p].size(), 0); - CHECK_EQ(right_siblings[p].size(), 0); - continue; - } - vector local_variables; - vector predicate_senses; - vector left_arcs; - for (int s = 0; s < predicate_part_indices[p].size(); ++s) { - int r = predicate_part_indices[p][s]; - int index = offset_predicate_variables + r - offset_predicate_parts; - local_variables.push_back(variables[index]); - SemanticPartPredicate *predicate = - static_cast((*parts)[r]); - predicate_senses.push_back(predicate); - } - for (int k = 0; k < left_arc_indices[p].size(); ++k) { - int r = left_arc_indices[p][k]; - int index = offset_arc_variables + r - offset_arcs; - local_variables.push_back(variables[index]); - SemanticPartArc *arc = - static_cast((*parts)[r]); - left_arcs.push_back(arc); - } - - AD3::FactorPredicateAutomaton *factor = new AD3::FactorPredicateAutomaton; - factor->Initialize(false, predicate_senses, left_arcs, left_siblings[p]); - factor->SetAdditionalLogPotentials(left_scores[p]); - factor_graph->DeclareFactor(factor, local_variables, true); - factor_part_indices_.push_back(-1); - additional_part_indices.insert(additional_part_indices.end(), - left_indices[p].begin(), - left_indices[p].end()); - - // Build right head automaton. - local_variables.clear(); - predicate_senses.clear(); - vector right_arcs; - for (int s = 0; s < predicate_part_indices[p].size(); ++s) { - int r = predicate_part_indices[p][s]; - CHECK_GE(r, 0); - int index = offset_predicate_variables + r - offset_predicate_parts; - local_variables.push_back(variables[index]); - SemanticPartPredicate *predicate = - static_cast((*parts)[r]); - predicate_senses.push_back(predicate); - } - for (int k = 0; k < right_arc_indices[p].size(); ++k) { - int r = right_arc_indices[p][k]; - CHECK_GE(r, 0); - int index = offset_arc_variables + r - offset_arcs; - local_variables.push_back(variables[index]); - SemanticPartArc *arc = - static_cast((*parts)[r]); - right_arcs.push_back(arc); - } - - factor = new AD3::FactorPredicateAutomaton; - factor->Initialize(true, predicate_senses, right_arcs, right_siblings[p]); - factor->SetAdditionalLogPotentials(right_scores[p]); - factor_graph->DeclareFactor(factor, local_variables, true); - factor_part_indices_.push_back(-1); - additional_part_indices.insert(additional_part_indices.end(), - right_indices[p].begin(), - right_indices[p].end()); - } - } - - ////////////////////////////////////////////////////////////////////// - // Build consecutive co-parent factors. - ////////////////////////////////////////////////////////////////////// - if (use_consecutive_coparent_parts) { - // Get all the consecutive co-parents, indices, etc. - // Note: contrarily to the consecutive siblings, here a left arc is one - // whose predicate is on the left of the argument. - vector > left_arc_indices(sentence->size()); - vector > right_arc_indices(sentence->size()); - for (int r = 0; r < num_arcs; ++r) { - SemanticPartArc* arc = - static_cast((*parts)[offset_arcs + r]); - if (arc->predicate() < arc->argument()) { - left_arc_indices[arc->argument()].push_back(offset_arcs + r); - } else { - right_arc_indices[arc->argument()].push_back(offset_arcs + r); - } - } - vector > - left_coparents(sentence->size()); - vector > - right_coparents(sentence->size()); - vector > left_scores(sentence->size()); - vector > right_scores(sentence->size()); - vector > left_indices(sentence->size()); - vector > right_indices(sentence->size()); - for (int r = 0; r < num_consecutive_coparents; ++r) { - SemanticPartConsecutiveCoparent *coparent = - static_cast( - (*parts)[offset_consecutive_coparents + r]); - if (coparent->argument() > coparent->second_predicate()) { - // Left co-parent. - left_coparents[coparent->argument()].push_back(coparent); - left_scores[coparent->argument()].push_back( - scores[offset_consecutive_coparents + r]); - // Save the part index to get the posterior later. - left_indices[coparent->argument()]. - push_back(offset_consecutive_coparents + r); - } else { - CHECK(coparent->argument() < coparent->second_predicate() || - (coparent->argument() == coparent->second_predicate() && - coparent->first_predicate() < 0)); - // Right co-parent. - right_coparents[coparent->argument()].push_back(coparent); - right_scores[coparent->argument()].push_back( - scores[offset_consecutive_coparents + r]); - // Save the part index to get the posterior later. - right_indices[coparent->argument()]. - push_back(offset_consecutive_coparents + r); - } - } - - // Now, go through each argument and create left and right automata. - for (int a = 1; a < sentence->size(); ++a) { - // Build left argument automaton. - vector local_variables; - vector left_arcs; - for (int k = 0; k < left_arc_indices[a].size(); ++k) { - int r = left_arc_indices[a][k]; - int index = offset_arc_variables + r - offset_arcs; - local_variables.push_back(variables[index]); - SemanticPartArc *arc = - static_cast((*parts)[r]); - left_arcs.push_back(arc); - } - - AD3::FactorArgumentAutomaton *factor = new AD3::FactorArgumentAutomaton; - factor->Initialize(a, false, left_arcs, left_coparents[a]); - factor->SetAdditionalLogPotentials(left_scores[a]); - factor_graph->DeclareFactor(factor, local_variables, true); - factor_part_indices_.push_back(-1); - additional_part_indices.insert(additional_part_indices.end(), - left_indices[a].begin(), - left_indices[a].end()); - - // Build right head automaton. - local_variables.clear(); - vector right_arcs; - for (int k = 0; k < right_arc_indices[a].size(); ++k) { - int r = right_arc_indices[a][k]; - int index = offset_arc_variables + r - offset_arcs; - local_variables.push_back(variables[index]); - SemanticPartArc *arc = - static_cast((*parts)[r]); - right_arcs.push_back(arc); - } - - factor = new AD3::FactorArgumentAutomaton; - factor->Initialize(a, true, right_arcs, right_coparents[a]); - factor->SetAdditionalLogPotentials(right_scores[a]); - factor_graph->DeclareFactor(factor, local_variables, true); - factor_part_indices_.push_back(-1); - additional_part_indices.insert(additional_part_indices.end(), - right_indices[a].begin(), - right_indices[a].end()); - } - } - - ////////////////////////////////////////////////////////////////////// - // Build grandparent factors. - ////////////////////////////////////////////////////////////////////// - if (use_grandparent_parts) { - for (int r = 0; r < num_grandparents; ++r) { - SemanticPartGrandparent *part = static_cast( - (*semantic_parts)[offset_grandparents + r]); - int r1 = semantic_parts->FindArc(part->grandparent_predicate(), - part->predicate(), - part->grandparent_sense()); - int r2 = semantic_parts->FindArc(part->predicate(), - part->argument(), - part->sense()); - CHECK_GE(r1, 0); - CHECK_GE(r2, 0); - vector local_variables; - local_variables.push_back(variables[r1 - offset_arcs + - offset_arc_variables]); - local_variables.push_back(variables[r2 - offset_arcs + - offset_arc_variables]); - - factor_graph->CreateFactorPAIR(local_variables, - scores[offset_grandparents + r]); - // TODO: set these global indices at the end after all variables/factors - // are created. - //factor->SetGlobalIndex(...); - additional_part_indices.push_back(offset_grandparents + r); - factor_part_indices_.push_back(offset_grandparents + r); - } - } - - ////////////////////////////////////////////////////////////////////// - // Build co-parent factors. - ////////////////////////////////////////////////////////////////////// - if (use_coparent_parts) { - for (int r = 0; r < num_coparents; ++r) { - SemanticPartCoparent *part = static_cast( - (*semantic_parts)[offset_coparents + r]); - int r1 = semantic_parts->FindArc(part->first_predicate(), - part->argument(), - part->first_sense()); - int r2 = semantic_parts->FindArc(part->second_predicate(), - part->argument(), - part->second_sense()); - CHECK_GE(r1, 0); - CHECK_GE(r2, 0); - vector local_variables; - local_variables.push_back(variables[r1 - offset_arcs + - offset_arc_variables]); - local_variables.push_back(variables[r2 - offset_arcs + - offset_arc_variables]); - - factor_graph->CreateFactorPAIR(local_variables, - scores[offset_coparents + r]); - // TODO: set these global indices at the end after all variables/factors - // are created. - //factor->SetGlobalIndex(...); - additional_part_indices.push_back(offset_coparents + r); - factor_part_indices_.push_back(offset_coparents + r); - } - } - - ////////////////////////////////////////////////////////////////////////////// - - CHECK_EQ(variables.size(), part_indices_.size()); - CHECK_EQ(factor_graph->GetNumFactors(), factor_part_indices_.size()); - - // Compute additional_part_indices_. - int offset = factor_graph->GetNumVariables(); - for (int i = 0; i < factor_graph->GetNumFactors(); ++i) { - offset += factor_graph->GetFactor(i)->GetAdditionalLogPotentials().size(); - } - CHECK_EQ(additional_part_indices.size(), - offset - factor_graph->GetNumVariables()); - // Concatenate part_indices and additional_part_indices. - part_indices_.insert(part_indices_.end(), - additional_part_indices.begin(), - additional_part_indices.end()); - - VLOG(2) << "Number of factors: " << factor_graph->GetNumFactors(); - VLOG(2) << "Number of variables: " << factor_graph->GetNumVariables(); - -#if 0 - LOG(INFO) << "Number of factors: " << factor_graph->GetNumFactors(); - LOG(INFO) << "Number of variables: " << factor_graph->GetNumVariables(); - LOG(INFO) << "Number of siblings: " << num_siblings; - LOG(INFO) << "part_indices_.size() = " << part_indices_.size(); - LOG(INFO) << "additional_part_indices.size() = " << additional_part_indices.size(); - LOG(INFO) << "factor_part_indices_.size() = " << factor_part_indices_.size(); -#endif - - vector recomputed_indices(part_indices_.size(), -1); - bool solved = false; - - //#define PRINT_GRAPH -#ifdef PRINT_GRAPH - ofstream stream; - stream.open("tmp.fg", ofstream::out | ofstream::app); - CHECK(stream.good()); - factor_graph->Print(stream); - stream << endl; - stream.flush(); - stream.clear(); - stream.close(); -#endif - - vector posteriors; - vector additional_posteriors; - double value_ref; - double *value = &value_ref; - - //factor_graph->SetMaxIterationsAD3(2000); - factor_graph->SetMaxIterationsAD3(500); - factor_graph->SetEtaAD3(0.05); - factor_graph->AdaptEtaAD3(true); - factor_graph->SetResidualThresholdAD3(1e-3); - //factor_graph->SetResidualThresholdAD3(1e-6); - +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "SemanticDecoder.h" +#include "SemanticPart.h" +#include "SemanticPipe.h" +#include "AlgUtils.h" +#include +#include +#include "logval.h" +#include "ad3/FactorGraph.h" +#include "FactorSemanticGraph.h" +#include "FactorPredicateAutomaton.h" +#include "FactorArgumentAutomaton.h" + +// Define a matrix of doubles using Eigen. +typedef LogVal LogValD; +namespace Eigen { +typedef Eigen::Matrix MatrixXlogd; +} + +using namespace std; + +DEFINE_double(srl_train_cost_false_positives, 1.0, + "Cost for predicting false positives."); +DEFINE_double(srl_train_cost_false_negatives, 1.0, + "Cost for predicting false negatives."); + +void SemanticDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, + const vector &scores, + const vector &gold_output, + vector *predicted_output, + double *cost, + double *loss) { + SemanticParts *semantic_parts = static_cast(parts); + int offset_arcs, num_arcs; + + // TODO(atm): make it possible to penalize wrong predicate parts as well? + // Or unlabeled arcs in addition to labeled arcs? + if (pipe_->GetSemanticOptions()->labeled()) { + semantic_parts->GetOffsetLabeledArc(&offset_arcs, &num_arcs); + } else { + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + } + + //////////////////////////////////////////////////// + // F1: a = 0.5, b = 0.5. + // Recall: a = 0, b = 1. + // In general: + // p = a - (a+b)*z0 + // q = b*sum(z0) + // p'*z + q = a*sum(z) - (a+b)*z0'*z + b*sum(z0) + // = a*(1-z0)'*z + b*(1-z)'*z0. + //////////////////////////////////////////////////// + + // Penalty for predicting 1 when it is 0 (FP). + double a = FLAGS_srl_train_cost_false_positives; + // Penalty for predicting 0 when it is 1 (FN). + double b = FLAGS_srl_train_cost_false_negatives; + + // p = 0.5-z0, q = 0.5'*z0, loss = p'*z + q + double q = 0.0; + vector p(num_arcs, 0.0); + + vector scores_cost = scores; + for (int r = 0; r < num_arcs; ++r) { + p[r] = a - (a + b) * gold_output[offset_arcs + r]; + scores_cost[offset_arcs + r] += p[r]; + q += b*gold_output[offset_arcs + r]; + } + + Decode(instance, parts, scores_cost, predicted_output); + + *cost = q; + for (int r = 0; r < num_arcs; ++r) { + *cost += p[r] * (*predicted_output)[offset_arcs + r]; + } + + *loss = *cost; + for (int r = 0; r < parts->size(); ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } + +#if 0 + for (int k = 0; k < 2; ++k) { + const vector *output; + string type; + if (k == 0) { + type = "gold"; + output = &gold_output; + } else { + type = "predicted"; + output = predicted_output; + } + for (int r = 0; r < parts->size(); ++r) { + int offset_pred_, offset_arcs_, offset_labeled_arcs_, offset_siblings_, + offset_consecutive_siblings_, num_; + semantic_parts->GetOffsetPredicate(&offset_pred_, &num_); + semantic_parts->GetOffsetArc(&offset_arcs_, &num_); + semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs_, &num_); + semantic_parts->GetOffsetSibling(&offset_siblings_, &num_); + semantic_parts->GetOffsetConsecutiveSibling(&offset_consecutive_siblings_, &num_); + if (r >= offset_consecutive_siblings_) { + SemanticPartConsecutiveSibling *sibling = + static_cast((*parts)[r]); + if ((*output)[r] > 0) { + LOG(INFO) << type << " consec sibling: " << "[" << r << "]" << " " + << sibling->predicate() << " " + << sibling->sense() << " " + << sibling->first_argument() << " " + << sibling->second_argument() << " " + << (*output)[r]; + } + } else if (r >= offset_siblings_) { + SemanticPartSibling *sibling = + static_cast((*parts)[r]); + if ((*output)[r] > 0) { + LOG(INFO) << type << " sibling: " << "[" << r << "]" << " " + << sibling->predicate() << " " + << sibling->sense() << " " + << sibling->first_argument() << " " + << sibling->second_argument() << " " + << (*output)[r]; + } + } else if (r >= offset_labeled_arcs_) { + SemanticPartLabeledArc *labeled_arc = + static_cast((*parts)[r]); + if ((*output)[r] > 0) { + LOG(INFO) << type << " labeled_arc: " << "[" << r << "]" << " " + << labeled_arc->predicate() << " " + << labeled_arc->sense() << " " + << labeled_arc->argument() << " " + << labeled_arc->role() << " " + << (*output)[r]; + } + } else if (r >= offset_arcs_) { + SemanticPartArc *arc = + static_cast((*parts)[r]); + if ((*output)[r] > 0) { + LOG(INFO) << type << " arc: " << "[" << r << "]" << " " + << arc->predicate() << " " + << arc->sense() << " " + << arc->argument() << " " + << (*output)[r]; + } + } else if (r >= offset_pred_) { + SemanticPartPredicate *predicate = + static_cast((*parts)[r]); + if ((*output)[r] > 0) { + LOG(INFO) << type << " predicate: " << "[" << r << "]" << " " + << predicate->predicate() << " " + << predicate->sense() << " " + << (*output)[r]; + } + } else { + CHECK(false); + } + } + } +#endif +} + +void SemanticDecoder::DecodeMarginals(Instance *instance, Parts *parts, + const vector &scores, + const vector &gold_output, + vector *predicted_output, + double *entropy, + double *loss) { + SemanticParts *semantic_parts = static_cast(parts); + + // Right now, only allow marginal inference for arc-factored models. + CHECK(semantic_parts->IsArcFactored()); + + // Create copy of the scores. + vector copied_scores(scores); + vector total_scores; + vector label_marginals; + int offset_predicate_parts, num_predicate_parts; + int offset_arcs, num_arcs; + int offset_labeled_arcs, num_labeled_arcs; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs, + &num_labeled_arcs); + + // If labeled parsing, decode the labels and update the scores. + if (pipe_->GetSemanticOptions()->labeled()) { + DecodeLabelMarginals(instance, parts, copied_scores, &total_scores, + &label_marginals); + for (int r = 0; r < total_scores.size(); ++r) { + // Sum the "labeled" scores to the (eventually) already existing + // "unlabeled" scores. + copied_scores[offset_arcs + r] += total_scores[r]; + } + } + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + double log_partition_function; + DecodeBasicMarginals(instance, parts, copied_scores, predicted_output, + &log_partition_function, entropy); + + // If labeled parsing, write the components of the predicted output that + // correspond to the labeled parts. + if (pipe_->GetSemanticOptions()->labeled()) { + for (int r = 0; r < num_labeled_arcs; ++r) { + SemanticPartLabeledArc *labeled_arc = + static_cast( + (*parts)[offset_labeled_arcs + r]); + int index_arc = semantic_parts->FindArc(labeled_arc->predicate(), + labeled_arc->argument(), + labeled_arc->sense()); + CHECK_GE(index_arc, 0); + (*predicted_output)[offset_labeled_arcs + r] = + label_marginals[r] * (*predicted_output)[index_arc]; + } + + // Recompute the entropy. + *entropy = log_partition_function; + for (int r = 0; r < num_predicate_parts; ++r) { + *entropy -= (*predicted_output)[offset_predicate_parts + r] * + scores[offset_predicate_parts + r]; + } + for (int r = 0; r < num_arcs; ++r) { + *entropy -= (*predicted_output)[offset_arcs + r] * + scores[offset_arcs + r]; + } + for (int r = 0; r < num_labeled_arcs; ++r) { + *entropy -= (*predicted_output)[offset_labeled_arcs + r] * + scores[offset_labeled_arcs + r]; + } + if (*entropy < 0.0) { + LOG(INFO) << "Entropy truncated to zero (" << *entropy << ")"; + *entropy = 0.0; + } + } + + *loss = *entropy; + for (int r = 0; r < parts->size(); ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } + if (*loss < 0.0) { + LOG(INFO) << "Loss truncated to zero (" << *loss << ")"; + *loss = 0.0; + } +} + +// Decode the best label for each candidate arc. The output vector +// best_labeled_parts, indexed by the unlabeled arcs, contains the indices +// of the best labeled part for each arc. +void SemanticDecoder::DecodeLabels(Instance *instance, Parts *parts, + const vector &scores, + vector *best_labeled_parts) { + SemanticParts *semantic_parts = static_cast(parts); + + int offset, num_arcs; + semantic_parts->GetOffsetArc(&offset, &num_arcs); + best_labeled_parts->resize(num_arcs); + for (int r = 0; r < num_arcs; ++r) { + SemanticPartArc *arc = + static_cast((*parts)[offset + r]); + const vector &index_labeled_parts = + semantic_parts->FindLabeledArcs(arc->predicate(), + arc->argument(), + arc->sense()); + // Find the best label for each candidate arc. + int best_label = -1; + double best_score; + for (int k = 0; k < index_labeled_parts.size(); ++k) { + if (best_label < 0 || + scores[index_labeled_parts[k]] > best_score) { + best_label = index_labeled_parts[k]; + best_score = scores[best_label]; + } + } + (*best_labeled_parts)[r] = best_label; + } +} + +// Decode the label marginals for each candidate arc. The output vector +// total_scores contains the sum of exp-scores (over the labels) for each arc; +// label_marginals contains those marginals ignoring the tree constraint. +void SemanticDecoder::DecodeLabelMarginals(Instance *instance, Parts *parts, + const vector &scores, + vector *total_scores, + vector *label_marginals) { + SemanticParts *semantic_parts = static_cast(parts); + + int offset, num_arcs; + int offset_labeled, num_labeled_arcs; + semantic_parts->GetOffsetArc(&offset, &num_arcs); + semantic_parts->GetOffsetLabeledArc(&offset_labeled, &num_labeled_arcs); + total_scores->clear(); + total_scores->resize(num_arcs, 0.0); + label_marginals->clear(); + label_marginals->resize(num_labeled_arcs, 0.0); + + for (int r = 0; r < num_arcs; ++r) { + SemanticPartArc *arc = + static_cast((*parts)[offset + r]); + const vector &index_labeled_parts = + semantic_parts->FindLabeledArcs(arc->predicate(), + arc->argument(), + arc->sense()); + // Find the best label for each candidate arc. + LogValD total_score = LogValD::Zero(); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + total_score += LogValD(scores[index_labeled_parts[k]], false); + } + (*total_scores)[r] = total_score.logabs(); + double sum = 0.0; + for (int k = 0; k < index_labeled_parts.size(); ++k) { + LogValD marginal = + LogValD(scores[index_labeled_parts[k]], false) / total_score; + (*label_marginals)[index_labeled_parts[k] - offset_labeled] = + marginal.as_float(); + sum += marginal.as_float(); + } + if (!NEARLY_EQ_TOL(sum, 1.0, 1e-9)) { + LOG(INFO) << "Label marginals don't sum to one: sum = " << sum; + } + } +} + +void SemanticDecoder::Decode(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output) { + SemanticParts *semantic_parts = static_cast(parts); + + // Create copy of the scores. + vector copied_scores(scores); + vector best_labeled_parts; + int offset_labeled_arcs, num_labeled_arcs; + semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs, + &num_labeled_arcs); + int offset_arcs, num_arcs; + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + int offset_predicate_parts, num_predicate_parts; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + + bool labeled_decoding = false; + // TODO: change this test. + int offset_labeled_siblings, num_labeled_siblings; + semantic_parts->GetOffsetLabeledSibling(&offset_labeled_siblings, + &num_labeled_siblings); + if (num_labeled_siblings > 0) labeled_decoding = true; + if (pipe_->GetSemanticOptions()->deterministic_labels()) { + labeled_decoding = true; + } + + if (labeled_decoding) { + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + DecodeFactorGraph(instance, parts, copied_scores, labeled_decoding, true, + predicted_output); + + // At test time, run a basic decoder on top of the outcome of AD3 + // as a rounding heuristic to make sure we get a valid graph. + // TODO: maybe change the interface to AD3 to let us implement + // a primal rounding heuristic. + if (pipe_->GetSemanticOptions()->test()) { + double threshold = 0.5; + for (int r = 0; r < num_arcs; ++r) { + copied_scores[offset_arcs + r] = 0.0; + } + for (int r = 0; r < num_predicate_parts; ++r) { + copied_scores[offset_predicate_parts + r] = 0.0; + } + for (int r = 0; r < num_labeled_arcs; ++r) { + copied_scores[offset_labeled_arcs + r] = + (*predicted_output)[offset_labeled_arcs + r] - threshold; + } + + DecodeLabels(instance, parts, copied_scores, &best_labeled_parts); + for (int r = 0; r < best_labeled_parts.size(); ++r) { + // Sum the "labeled" scores to the (eventually) already existing + // "unlabeled" scores. + copied_scores[offset_arcs + r] += copied_scores[best_labeled_parts[r]]; + } + + double value; + predicted_output->assign(parts->size(), 0.0); + DecodeBasic(instance, parts, copied_scores, predicted_output, &value); + + // Write the components of the predicted output that + // correspond to the labeled parts. + for (int r = 0; r < num_arcs; ++r) { + CHECK_GE(best_labeled_parts[r], offset_arcs + num_arcs); + (*predicted_output)[best_labeled_parts[r]] = + (*predicted_output)[offset_arcs + r]; + } + } + } else { + // If labeled parsing, decode the labels and update the scores. + if (pipe_->GetSemanticOptions()->labeled()) { + DecodeLabels(instance, parts, copied_scores, &best_labeled_parts); + for (int r = 0; r < best_labeled_parts.size(); ++r) { + // Sum the "labeled" scores to the (eventually) already existing + // "unlabeled" scores. + copied_scores[offset_arcs + r] += copied_scores[best_labeled_parts[r]]; + } + } + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + if (semantic_parts->IsArcFactored() || + semantic_parts->IsLabeledArcFactored()) { + double value; + DecodeBasic(instance, parts, copied_scores, predicted_output, &value); + } else { + DecodeFactorGraph(instance, parts, copied_scores, labeled_decoding, true, + predicted_output); + + // At test time, run a basic decoder on top of the outcome of AD3 + // as a rounding heuristic to make sure we get a valid graph. + // TODO: maybe change the interface to AD3 to let us implement + // a primal rounding heuristic. + if (pipe_->GetSemanticOptions()->test()) { + double threshold = 0.5; + for (int r = 0; r < num_arcs; ++r) { + copied_scores[offset_arcs + r] = + (*predicted_output)[offset_arcs + r] - threshold; + } + for (int r = 0; r < num_predicate_parts; ++r) { + copied_scores[offset_predicate_parts + r] = 0.0; + } + // This is not strictly necessary (since labeled arcs are not used by + // DecodeBasic), but should not harm. + for (int r = 0; r < num_labeled_arcs; ++r) { + copied_scores[offset_labeled_arcs + r] = 0.0; + } + predicted_output->assign(parts->size(), 0.0); + double value; + DecodeBasic(instance, parts, copied_scores, predicted_output, &value); + } + } + + // If labeled parsing, write the components of the predicted output that + // correspond to the labeled parts. + if (pipe_->GetSemanticOptions()->labeled()) { + for (int r = 0; r < num_arcs; ++r) { + CHECK_GE(best_labeled_parts[r], offset_arcs + num_arcs); + (*predicted_output)[best_labeled_parts[r]] = + (*predicted_output)[offset_arcs + r]; + } + } + } +} + +// Build predicate and arc indices. +void SemanticDecoder::BuildBasicIndices( + int sentence_length, + const vector &predicate_parts, + const vector &arcs, + vector > *index_predicates, + vector > > *arcs_by_predicate) { + int num_arcs = arcs.size(); + int num_predicate_parts = predicate_parts.size(); + + arcs_by_predicate->assign(sentence_length, vector >()); + for (int r = 0; r < num_arcs; ++r) { + int p = arcs[r]->predicate(); + int s = arcs[r]->sense(); + if (s >= (*arcs_by_predicate)[p].size()) { + (*arcs_by_predicate)[p].resize(s + 1); + } + (*arcs_by_predicate)[p][s].push_back(r); + } + + index_predicates->assign(sentence_length, vector()); + for (int r = 0; r < num_predicate_parts; ++r) { + CHECK_LT(r, predicate_parts.size()); + int p = predicate_parts[r]->predicate(); + int s = predicate_parts[r]->sense(); + if (s >= (*index_predicates)[p].size()) { + (*index_predicates)[p].resize(s + 1, -1); + } + (*index_predicates)[p][s] = r; + } +} + +void SemanticDecoder::DecodePruner(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output) { + //DecodePrunerNaive(instance, parts, scores, predicted_output); + //return; + + int sentence_length = + static_cast(instance)->size(); + SemanticParts *semantic_parts = static_cast(parts); + double posterior_threshold = + pipe_->GetSemanticOptions()->GetPrunerPosteriorThreshold(); + int max_arguments = pipe_->GetSemanticOptions()->GetPrunerMaxArguments(); + if (max_arguments < 0) max_arguments = sentence_length; + + int offset_predicate_parts, num_predicate_parts; + int offset_arcs, num_arcs; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + + vector arcs(num_arcs); + vector scores_arcs(num_arcs); + for (int r = 0; r < num_arcs; ++r) { + arcs[r] = static_cast((*parts)[offset_arcs + r]); + scores_arcs[r] = scores[offset_arcs + r]; + } + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + CHECK(semantic_parts->IsArcFactored()); + + vector > > arcs_by_predicate; + arcs_by_predicate.resize(sentence_length); + for (int r = 0; r < num_arcs; ++r) { + int p = arcs[r]->predicate(); + int s = arcs[r]->sense(); + if (s >= arcs_by_predicate[p].size()) { + arcs_by_predicate[p].resize(s + 1); + } + arcs_by_predicate[p][s].push_back(r); + } + + double entropy; + double log_partition_function; + vector posteriors; + DecodeBasicMarginals(instance, parts, scores, &posteriors, + &log_partition_function, &entropy); + + // Get max_arguments argumens per predicate. + int num_used_parts = 0; + for (int p = 0; p < sentence_length; ++p) { + for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { + vector > scores_arguments; + for (int a = 1; a < sentence_length; ++a) { + int r = semantic_parts->FindArc(p, a, s); + if (r < 0) continue; + scores_arguments.push_back(pair(-posteriors[r], r)); + } + if (scores_arguments.size() == 0) continue; + sort(scores_arguments.begin(), scores_arguments.end()); + double max_posterior = 1.0; // -scores_arguments[0].first; + for (int k = 0; k < max_arguments && k < scores_arguments.size(); ++k) { + int r = scores_arguments[k].second; + if (-scores_arguments[k].first >= posterior_threshold * max_posterior) { + ++num_used_parts; + (*predicted_output)[r] = 1.0; + } else { + break; + } + } + } + } + + VLOG(2) << "Pruning reduced to " + << static_cast(num_used_parts) / + static_cast(sentence_length) + << " candidate heads per word."; +} + +void SemanticDecoder::DecodePrunerNaive(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output) { + int sentence_length = + static_cast(instance)->size(); + SemanticParts *semantic_parts = static_cast(parts); + int max_arguments = pipe_->GetSemanticOptions()->GetPrunerMaxArguments(); + int offset_predicate_parts, num_predicate_parts; + int offset_arcs, num_arcs; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + + vector arcs(num_arcs); + vector scores_arcs(num_arcs); + for (int r = 0; r < num_arcs; ++r) { + arcs[r] = static_cast((*parts)[offset_arcs + r]); + scores_arcs[r] = scores[offset_arcs + r]; + } + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + for (int r = 0; r < num_predicate_parts; ++r) { + // Don't prune any of the predicate parts. + (*predicted_output)[offset_predicate_parts + r] = 1.0; + } + + CHECK(semantic_parts->IsArcFactored()); + + vector > > arcs_by_predicate; + arcs_by_predicate.resize(sentence_length); + for (int r = 0; r < num_arcs; ++r) { + int p = arcs[r]->predicate(); + int s = arcs[r]->sense(); + if (s >= arcs_by_predicate[p].size()) { + arcs_by_predicate[p].resize(s + 1); + } + arcs_by_predicate[p][s].push_back(r); + } + + // Get max_arguments argumens per predicate. + for (int p = 0; p < sentence_length; ++p) { + for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { + vector > scores_arguments; + for (int a = 1; a < sentence_length; ++a) { + int r = semantic_parts->FindArc(p, a, s); + if (r < 0) continue; + scores_arguments.push_back(pair(-scores[r], r)); + } + sort(scores_arguments.begin(), scores_arguments.end()); + for (int k = 0; k < max_arguments && k < scores_arguments.size(); ++k) { + int r = scores_arguments[k].second; + (*predicted_output)[r] = 1.0; + //LOG(INFO) << "Keeping arc (" << p << ", " + // << s << ", " + // << static_cast((*parts)[r])->argument() + // << ")."; + } + } + } +} + +// Decoder for the basic model. For each predicate, choose the best +// sense and the best set of arcs independently. +void SemanticDecoder::DecodeBasic(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output, + double *value) { + int sentence_length = + static_cast(instance)->size(); + SemanticParts *semantic_parts = static_cast(parts); + int offset_predicate_parts, num_predicate_parts; + int offset_arcs, num_arcs; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + + vector arcs(num_arcs); + vector scores_arcs(num_arcs); + for (int r = 0; r < num_arcs; ++r) { + arcs[r] = static_cast((*parts)[offset_arcs + r]); + scores_arcs[r] = scores[offset_arcs + r]; + } + + vector predicate_parts(num_predicate_parts); + vector scores_predicates(num_predicate_parts); + for (int r = 0; r < num_predicate_parts; ++r) { + predicate_parts[r] = + static_cast((*parts)[offset_predicate_parts + r]); + scores_predicates[r] = scores[offset_predicate_parts + r]; + } + + vector > > arcs_by_predicate; + vector > index_predicates; + vector selected_predicates; + vector selected_arcs; + BuildBasicIndices(sentence_length, predicate_parts, arcs, &index_predicates, + &arcs_by_predicate); + + DecodeSemanticGraph(sentence_length, predicate_parts, arcs, index_predicates, + arcs_by_predicate, scores_predicates, scores_arcs, + &selected_predicates, &selected_arcs, value); + + predicted_output->resize(parts->size()); + for (int r = 0; r < num_predicate_parts; ++r) { + if (selected_predicates[r]) { + (*predicted_output)[offset_predicate_parts + r] = 1.0; + } else { + (*predicted_output)[offset_predicate_parts + r] = 0.0; + } + } + for (int r = 0; r < num_arcs; ++r) { + if (selected_arcs[r]) { + (*predicted_output)[offset_arcs + r] = 1.0; + } else { + (*predicted_output)[offset_arcs + r] = 0.0; + } + } + +#if 0 + arcs_by_predicate.resize(sentence_length); + for (int r = 0; r < num_arcs; ++r) { + int p = arcs[r]->predicate(); + int s = arcs[r]->sense(); + if (s >= arcs_by_predicate[p].size()) { + arcs_by_predicate[p].resize(s + 1); + } + arcs_by_predicate[p][s].push_back(r); + } + + vector scores_predicates(num_predicate_parts); + //vector > index_predicates(sentence_length); + for (int r = 0; r < num_predicate_parts; ++r) { + scores_predicates[r] = scores[offset_predicate_parts + r]; + SemanticPartPredicate *predicate_part = + static_cast((*parts)[offset_predicate_parts + r]); + int p = predicate_part->predicate(); + int s = predicate_part->sense(); + if (s >= index_predicates[p].size()) { + index_predicates[p].resize(s + 1, -1); + } + index_predicates[p][s] = r; + } + + predicted_output->resize(parts->size()); + for (int r = 0; r < num_predicate_parts; ++r) { + (*predicted_output)[offset_predicate_parts + r] = 0.0; + } + for (int r = 0; r < num_arcs; ++r) { + (*predicted_output)[offset_arcs + r] = 0.0; + } + + double total_score = 0.0; + for (int p = 0; p < sentence_length; ++p) { + int best_sense = -1; + double best_score = 0.0; + vector > selected_arcs; + selected_arcs.resize(arcs_by_predicate[p].size()); + for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { + // Compute the best assignment of arcs departing from this + // predicate word. + selected_arcs[s].resize(arcs_by_predicate[p][s].size()); + int r = index_predicates[p][s]; + double score = scores_predicates[r]; + for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { + int r = arcs_by_predicate[p][s][k]; + if (scores_arcs[r] > 0.0) { + selected_arcs[s][k] = true; + score += scores_arcs[r]; + } else { + selected_arcs[s][k] = false; + } + } + if (score > best_score) { + best_sense = s; + best_score = score; + } + } + if (best_sense >= 0) { + total_score += best_score; + int s = best_sense; + int r = index_predicates[p][s]; + CHECK_GE(r, 0); + (*predicted_output)[offset_predicate_parts + r] = 1.0; + for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { + if (!selected_arcs[s][k]) continue; + int r = arcs_by_predicate[p][s][k]; + (*predicted_output)[offset_arcs + r] = 1.0; + //LOG(INFO) << "Selected arc " + // << arcs[r]->predicate() << " " + // << arcs[r]->argument() << " " + // << arcs[r]->sense(); + } + } + } +#endif +} + +// Decoder for the basic model. For each predicate, choose the best +// sense and the best set of arcs independently. +void SemanticDecoder::DecodeBasicMarginals(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output, + double *log_partition_function, + double *entropy) { + int sentence_length = + static_cast(instance)->size(); + SemanticParts *semantic_parts = static_cast(parts); + int offset_predicate_parts, num_predicate_parts; + int offset_arcs, num_arcs; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + + vector arcs(num_arcs); + vector scores_arcs(num_arcs); + for (int r = 0; r < num_arcs; ++r) { + arcs[r] = static_cast((*parts)[offset_arcs + r]); + scores_arcs[r] = scores[offset_arcs + r]; + } + + vector > > arcs_by_predicate; + arcs_by_predicate.resize(sentence_length); + for (int r = 0; r < num_arcs; ++r) { + int p = arcs[r]->predicate(); + int s = arcs[r]->sense(); + if (s >= arcs_by_predicate[p].size()) { + arcs_by_predicate[p].resize(s + 1); + } + arcs_by_predicate[p][s].push_back(r); + } + + vector scores_predicates(num_predicate_parts); + vector > index_predicates(sentence_length); + for (int r = 0; r < num_predicate_parts; ++r) { + scores_predicates[r] = scores[offset_predicate_parts + r]; + SemanticPartPredicate *predicate_part = + static_cast((*parts)[offset_predicate_parts + r]); + int p = predicate_part->predicate(); + int s = predicate_part->sense(); + if (s >= index_predicates[p].size()) { + index_predicates[p].resize(s + 1, -1); + } + index_predicates[p][s] = r; + } + + predicted_output->resize(parts->size()); + for (int r = 0; r < num_predicate_parts; ++r) { + (*predicted_output)[offset_predicate_parts + r] = 0.0; + } + for (int r = 0; r < num_arcs; ++r) { + (*predicted_output)[offset_arcs + r] = 0.0; + } + + *log_partition_function = 0.0; + *entropy = 0.0; + for (int p = 0; p < sentence_length; ++p) { + // Initiliaze log partition all senses to exp(0.0) to account for + // the null sense which implies there are no outgoing arcs. + LogValD log_partition_all_senses = LogValD::One(); + //LogValD log_partition_all_senses = LogValD::Zero(); + vector log_partition_senses(arcs_by_predicate[p].size(), + LogValD::Zero()); + vector > log_partition_arcs(arcs_by_predicate[p].size()); + for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { + int r = index_predicates[p][s]; + double score = scores_predicates[r]; + //CHECK_EQ(score, 0.0); + // Initialize log partition arcs to exp(0.0) to account for the + // event that the arc does not exist. + log_partition_arcs[s].assign(arcs_by_predicate[p][s].size(), + LogValD::One()); + for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { + int r = arcs_by_predicate[p][s][k]; + log_partition_arcs[s][k] += LogValD(scores_arcs[r], false); + //score += log_partition_arcs[s][k].as_float(); + score += log_partition_arcs[s][k].logabs(); + } + //LOG(INFO) << s << " " << score; + log_partition_senses[s] = LogValD(score, false); + //log_partition_senses[s] = LogValD(score); + //LOG(INFO) << s << " " << log_partition_senses[s].logabs(); + log_partition_all_senses += log_partition_senses[s]; + } + + // This makes sure the log partition function does not become -infty for + // predicates that do not have any sense. + if (arcs_by_predicate[p].size() > 0) { + if (false && sentence_length < 5) { + LOG(INFO) << "Log partition[" << p << "] = " + << log_partition_all_senses.logabs(); + } + *log_partition_function += log_partition_all_senses.logabs(); + } + + for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { + int r = index_predicates[p][s]; + double predicate_marginal = LogValD(log_partition_senses[s].logabs() - + log_partition_all_senses.logabs(), + false).as_float(); + //LOG(INFO) << "Predicate marginal[" << p << "][" << s << "] = " + // << predicate_marginal; + (*predicted_output)[offset_predicate_parts + r] = predicate_marginal; + //CHECK_EQ(scores_predicates[r], 0.0); + *entropy -= scores_predicates[r] * predicate_marginal; + for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { + int r = arcs_by_predicate[p][s][k]; + double marginal = LogValD(scores_arcs[r] - + log_partition_arcs[s][k].logabs(), + false).as_float(); + marginal *= predicate_marginal; + if (false && sentence_length < 5) { + LOG(INFO) << "marginal[" << p << "][" << s << "][" << k << "] = " + << marginal << "\t" + << "scores_arcs[" << p << "][" << s << "][" << k << "] = " + << scores_arcs[r]; + } + (*predicted_output)[offset_arcs + r] = marginal; + *entropy -= scores_arcs[r] * marginal; + } + } + } + + *entropy += *log_partition_function; + if (false && sentence_length < 5) { + LOG(INFO) << "Log-partition function:" << *log_partition_function; + LOG(INFO) << "Entropy:" << *entropy; + } +} + +// Decoder for the basic model. For each predicate, choose the best +// sense and the best set of arcs independently. +void SemanticDecoder::DecodeSemanticGraph( + int sentence_length, + const vector &predicate_parts, + const vector &arcs, + const vector > &index_predicates, + const vector > > &arcs_by_predicate, + const vector &predicate_scores, + const vector &arc_scores, + vector *selected_predicates, + vector *selected_arcs, + double *value) { + int num_predicate_parts = predicate_parts.size(); + int num_arcs = arcs.size(); + + selected_predicates->assign(num_predicate_parts, false); + selected_arcs->assign(num_arcs, false); + + double total_score = 0.0; + for (int p = 0; p < sentence_length; ++p) { + int best_sense = -1; + double best_score = 0.0; + vector > selected; + selected.resize(arcs_by_predicate[p].size()); + for (int s = 0; s < arcs_by_predicate[p].size(); ++s) { + // Compute the best assignment of arcs departing from this + // predicate word. + selected[s].resize(arcs_by_predicate[p][s].size()); + int r = index_predicates[p][s]; + double score = predicate_scores[r]; + for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { + int r = arcs_by_predicate[p][s][k]; + if (arc_scores[r] > 0.0) { + selected[s][k] = true; + score += arc_scores[r]; + } else { + selected[s][k] = false; + } + } + // Note: we're allowing a non-null sense (!= -1) without outgoing arcs. + if (score > best_score) { + best_sense = s; + best_score = score; + } + } + if (best_sense >= 0) { + total_score += best_score; + int s = best_sense; + int r = index_predicates[p][s]; + CHECK_GE(r, 0); + (*selected_predicates)[r] = true; + for (int k = 0; k < arcs_by_predicate[p][s].size(); ++k) { + if (!selected[s][k]) continue; + int r = arcs_by_predicate[p][s][k]; + (*selected_arcs)[r] = true; + } + } + } + *value = total_score; +} + +// Decode building a factor graph and calling the AD3 algorithm. +void SemanticDecoder::DecodeFactorGraph(Instance *instance, Parts *parts, + const vector &scores, + bool labeled_decoding, + bool relax, + vector *predicted_output) { + SemanticParts *semantic_parts = static_cast(parts); + SemanticInstanceNumeric* sentence = + static_cast(instance); + CHECK(relax); + + // Get the offsets for the different parts. + int offset_predicate_parts, num_predicate_parts; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + int offset_arcs, num_arcs; + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + int offset_labeled_arcs, num_labeled_arcs; + semantic_parts->GetOffsetLabeledArc(&offset_labeled_arcs, + &num_labeled_arcs); + int offset_siblings, num_siblings; + semantic_parts->GetOffsetSibling(&offset_siblings, &num_siblings); + int offset_labeled_siblings, num_labeled_siblings; + semantic_parts->GetOffsetLabeledSibling(&offset_labeled_siblings, + &num_labeled_siblings); + int offset_consecutive_siblings, num_consecutive_siblings; + semantic_parts->GetOffsetConsecutiveSibling(&offset_consecutive_siblings, + &num_consecutive_siblings); + int offset_grandparents, num_grandparents; + semantic_parts->GetOffsetGrandparent(&offset_grandparents, &num_grandparents); + int offset_coparents, num_coparents; + semantic_parts->GetOffsetCoparent(&offset_coparents, &num_coparents); + int offset_consecutive_coparents, num_consecutive_coparents; + semantic_parts->GetOffsetConsecutiveCoparent(&offset_consecutive_coparents, + &num_consecutive_coparents); + +#if 0 + int offset_grandsiblings, num_grandsiblings; + semantic_parts->GetOffsetGrandSibling(&offset_grandsiblings, &num_grandsiblings); + int offset_trisiblings, num_trisiblings; + dependency_parts->GetOffsetTriSibling(&offset_trisiblings, &num_trisiblings); +#endif + + // Define what parts are used. + bool use_arbitrary_sibling_parts = (num_siblings > 0); + bool use_labeled_arbitrary_sibling_parts = (num_labeled_siblings > 0); + bool use_consecutive_sibling_parts = (num_consecutive_siblings > 0); + bool use_grandparent_parts = (num_grandparents > 0); + bool use_coparent_parts = (num_coparents > 0); + bool use_consecutive_coparent_parts = (num_consecutive_coparents > 0); +#if 0 + bool use_grandsibling_parts = (num_grandsiblings > 0); + bool use_trisibling_parts = (num_trisiblings > 0); +#endif + + if (!labeled_decoding) { + CHECK_EQ(num_labeled_siblings, 0); + CHECK(!pipe_->GetSemanticOptions()->deterministic_labels()); + } + + // Variables of the factor graph. + vector variables; + + // Indices that allow to identify the part corresponding to each variable. + vector part_indices_; + vector additional_part_indices; + vector factor_part_indices_; + + // Create factor graph. + AD3::FactorGraph *factor_graph = new AD3::FactorGraph; + int verbosity = 1; //1; + if (VLOG_IS_ON(2)) { + verbosity = 2; + } + factor_graph->SetVerbosity(verbosity); + + // Build predicate part variables. + int offset_predicate_variables = variables.size(); + for (int r = 0; r < num_predicate_parts; ++r) { + AD3::BinaryVariable* variable = factor_graph->CreateBinaryVariable(); + variable->SetLogPotential(scores[offset_predicate_parts + r]); + variables.push_back(variable); + part_indices_.push_back(offset_predicate_parts + r); + } + + // Build arc variables. + int offset_arc_variables = variables.size(); + for (int r = 0; r < num_arcs; ++r) { + AD3::BinaryVariable* variable = factor_graph->CreateBinaryVariable(); + variable->SetLogPotential(scores[offset_arcs + r]); + variables.push_back(variable); + part_indices_.push_back(offset_arcs + r); + } + + int offset_labeled_arc_variables = variables.size(); + if (labeled_decoding) { + // Build labeled arc variables. + for (int r = 0; r < num_labeled_arcs; ++r) { + AD3::BinaryVariable* variable = factor_graph->CreateBinaryVariable(); + variable->SetLogPotential(scores[offset_labeled_arcs + r]); + variables.push_back(variable); + part_indices_.push_back(offset_labeled_arcs + r); + } + } + + // Build basic semantic graph factor. + vector local_variables(num_predicate_parts + num_arcs); + vector predicate_parts(num_predicate_parts); + for (int r = 0; r < num_predicate_parts; ++r) { + local_variables[r] = variables[offset_predicate_variables + r]; + predicate_parts[r] = + static_cast((*parts)[offset_predicate_parts + r]); + } + vector arcs(num_arcs); + for (int r = 0; r < num_arcs; ++r) { + local_variables[num_predicate_parts + r] = + variables[offset_arc_variables + r]; + arcs[r] = static_cast((*parts)[offset_arcs + r]); + } + AD3::FactorSemanticGraph *factor = new AD3::FactorSemanticGraph; + factor->Initialize(sentence->size(), predicate_parts, arcs, this); + factor_graph->DeclareFactor(factor, local_variables, true); + factor_part_indices_.push_back(-1); + + if (labeled_decoding) { + // Build XOR-OUT factors to impose that each arc has a unique label. + for (int r = 0; r < num_arcs; ++r) { + const vector &index_labeled_parts = + semantic_parts->GetLabeledParts(offset_arcs + r); + vector + local_variables(index_labeled_parts.size() + 1); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(offset_labeled_arc_variables + index_part - offset_labeled_arcs, + variables.size()); + local_variables[k] = variables[offset_labeled_arc_variables + + index_part - offset_labeled_arcs]; + } + CHECK_GE(offset_arc_variables + r, 0); + CHECK_LT(offset_arc_variables + r, variables.size()); + local_variables[index_labeled_parts.size()] = + variables[offset_arc_variables + r]; + factor_graph->CreateFactorXOROUT(local_variables); + factor_part_indices_.push_back(-1); + } + + // If some labels are deterministic, make sure the same role is not filled + // more than once for each predicate. + if (pipe_->GetSemanticOptions()->deterministic_labels()) { + int sentence_length = + static_cast(instance)->size(); + vector > > + labeled_arcs_by_predicate_role(sentence_length); + for (int r = 0; r < num_labeled_arcs; ++r) { + SemanticPartLabeledArc *labeled_arc = + static_cast( + (*semantic_parts)[offset_labeled_arcs + r]); + int p = labeled_arc->predicate(); + int l = labeled_arc->role(); + // Skip if role l is not deterministic. + if (!pipe_->GetSemanticDictionary()->IsRoleDeterministic(l)) continue; + if (labeled_arcs_by_predicate_role[p].size() <= l) { + labeled_arcs_by_predicate_role[p].resize(l + 1); + } + labeled_arcs_by_predicate_role[p][l].push_back(r); + } + for (int p = 0; p < labeled_arcs_by_predicate_role.size(); ++p) { + for (int l = 0; l < labeled_arcs_by_predicate_role[p].size(); ++l) { + if (labeled_arcs_by_predicate_role[p][l].size() <= 1) continue; + vector + local_variables(labeled_arcs_by_predicate_role[p][l].size()); + for (int k = 0; k < labeled_arcs_by_predicate_role[p][l].size(); + ++k) { + int r = labeled_arcs_by_predicate_role[p][l][k]; + local_variables[k] = variables[offset_labeled_arc_variables + r]; + } + factor_graph->CreateFactorAtMostOne(local_variables); + factor_part_indices_.push_back(-1); + } + } + } + } + + ////////////////////////////////////////////////////////////////////// + // Build sibling factors. + ////////////////////////////////////////////////////////////////////// + if (use_arbitrary_sibling_parts) { + for (int r = 0; r < num_siblings; ++r) { + SemanticPartSibling *part = static_cast( + (*semantic_parts)[offset_siblings + r]); + int r1 = semantic_parts->FindArc(part->predicate(), + part->first_argument(), + part->sense()); + int r2 = semantic_parts->FindArc(part->predicate(), + part->second_argument(), + part->sense()); + CHECK_GE(r1, 0); + CHECK_GE(r2, 0); + vector local_variables; + local_variables.push_back(variables[r1 - offset_arcs + + offset_arc_variables]); + local_variables.push_back(variables[r2 - offset_arcs + + offset_arc_variables]); + + factor_graph->CreateFactorPAIR(local_variables, + scores[offset_siblings + r]); + // TODO: set these global indices at the end after all variables/factors + // are created. + //factor->SetGlobalIndex(...); + additional_part_indices.push_back(offset_siblings + r); + factor_part_indices_.push_back(offset_siblings + r); + } + } + + ////////////////////////////////////////////////////////////////////// + // Build labeled sibling factors. + ////////////////////////////////////////////////////////////////////// + if (use_labeled_arbitrary_sibling_parts) { + CHECK(labeled_decoding); + for (int r = 0; r < num_labeled_siblings; ++r) { + SemanticPartLabeledSibling *part = + static_cast( + (*semantic_parts)[offset_labeled_siblings + r]); + int r1 = semantic_parts->FindLabeledArc(part->predicate(), + part->first_argument(), + part->sense(), + part->first_role()); + int r2 = semantic_parts->FindLabeledArc(part->predicate(), + part->second_argument(), + part->sense(), + part->second_role()); + CHECK_GE(r1, 0); + CHECK_GE(r2, 0); + vector local_variables; + local_variables.push_back(variables[r1 - offset_labeled_arcs + + offset_labeled_arc_variables]); + local_variables.push_back(variables[r2 - offset_labeled_arcs + + offset_labeled_arc_variables]); + + factor_graph->CreateFactorPAIR(local_variables, + scores[offset_labeled_siblings + r]); + // TODO: set these global indices at the end after all variables/factors + // are created. + //factor->SetGlobalIndex(...); + additional_part_indices.push_back(offset_labeled_siblings + r); + factor_part_indices_.push_back(offset_labeled_siblings + r); + } + } + + ////////////////////////////////////////////////////////////////////// + // Build consecutive sibling factors. + ////////////////////////////////////////////////////////////////////// + if (use_consecutive_sibling_parts) { + // Get all the consecutive siblings, indices, etc. + vector > predicate_part_indices(sentence->size()); + for (int r = 0; r < num_predicate_parts; ++r) { + SemanticPartPredicate* predicate_part = + static_cast( + (*parts)[offset_predicate_parts + r]); + predicate_part_indices[predicate_part->predicate()]. + push_back(offset_predicate_parts + r); + } + vector > left_arc_indices(sentence->size()); + vector > right_arc_indices(sentence->size()); + for (int r = 0; r < num_arcs; ++r) { + SemanticPartArc* arc = + static_cast((*parts)[offset_arcs + r]); + // Handle self-loops (p=a) in the right side automaton. + if (arc->predicate() > arc->argument()) { + left_arc_indices[arc->predicate()].push_back(offset_arcs + r); + } else { + right_arc_indices[arc->predicate()].push_back(offset_arcs + r); + } + } + vector > + left_siblings(sentence->size()); + vector > + right_siblings(sentence->size()); + vector > left_scores(sentence->size()); + vector > right_scores(sentence->size()); + vector > left_indices(sentence->size()); + vector > right_indices(sentence->size()); + for (int r = 0; r < num_consecutive_siblings; ++r) { + SemanticPartConsecutiveSibling *sibling = + static_cast( + (*parts)[offset_consecutive_siblings + r]); + // TODO: Try to disable self loops on the left side? + // Make sure no non-basic sibling part ends up in two + // factors. + if (sibling->predicate() > sibling->second_argument()) { + // Left sibling. + left_siblings[sibling->predicate()].push_back(sibling); + left_scores[sibling->predicate()].push_back( + scores[offset_consecutive_siblings + r]); + // Save the part index to get the posterior later. + left_indices[sibling->predicate()]. + push_back(offset_consecutive_siblings + r); + } else { + CHECK(sibling->predicate() < sibling->second_argument() || + (sibling->predicate() == sibling->second_argument() && + sibling->first_argument() < 0)) + << sibling->predicate() << " " + << sibling->first_argument() << " " + << sibling->second_argument(); + // Right sibling. + right_siblings[sibling->predicate()].push_back(sibling); + right_scores[sibling->predicate()].push_back( + scores[offset_consecutive_siblings + r]); + // Save the part index to get the posterior later. + right_indices[sibling->predicate()]. + push_back(offset_consecutive_siblings + r); + } + } + + // Now, go through each predicate and create left and right automata. + for (int p = 0; p < sentence->size(); ++p) { + // Build left head automaton. + if (predicate_part_indices[p].size() == 0) { + CHECK_EQ(left_arc_indices[p].size(), 0); + CHECK_EQ(right_arc_indices[p].size(), 0); + CHECK_EQ(left_siblings[p].size(), 0); + CHECK_EQ(right_siblings[p].size(), 0); + continue; + } + vector local_variables; + vector predicate_senses; + vector left_arcs; + for (int s = 0; s < predicate_part_indices[p].size(); ++s) { + int r = predicate_part_indices[p][s]; + int index = offset_predicate_variables + r - offset_predicate_parts; + local_variables.push_back(variables[index]); + SemanticPartPredicate *predicate = + static_cast((*parts)[r]); + predicate_senses.push_back(predicate); + } + for (int k = 0; k < left_arc_indices[p].size(); ++k) { + int r = left_arc_indices[p][k]; + int index = offset_arc_variables + r - offset_arcs; + local_variables.push_back(variables[index]); + SemanticPartArc *arc = + static_cast((*parts)[r]); + left_arcs.push_back(arc); + } + + AD3::FactorPredicateAutomaton *factor = new AD3::FactorPredicateAutomaton; + factor->Initialize(false, predicate_senses, left_arcs, left_siblings[p]); + factor->SetAdditionalLogPotentials(left_scores[p]); + factor_graph->DeclareFactor(factor, local_variables, true); + factor_part_indices_.push_back(-1); + additional_part_indices.insert(additional_part_indices.end(), + left_indices[p].begin(), + left_indices[p].end()); + + // Build right head automaton. + local_variables.clear(); + predicate_senses.clear(); + vector right_arcs; + for (int s = 0; s < predicate_part_indices[p].size(); ++s) { + int r = predicate_part_indices[p][s]; + CHECK_GE(r, 0); + int index = offset_predicate_variables + r - offset_predicate_parts; + local_variables.push_back(variables[index]); + SemanticPartPredicate *predicate = + static_cast((*parts)[r]); + predicate_senses.push_back(predicate); + } + for (int k = 0; k < right_arc_indices[p].size(); ++k) { + int r = right_arc_indices[p][k]; + CHECK_GE(r, 0); + int index = offset_arc_variables + r - offset_arcs; + local_variables.push_back(variables[index]); + SemanticPartArc *arc = + static_cast((*parts)[r]); + right_arcs.push_back(arc); + } + + factor = new AD3::FactorPredicateAutomaton; + factor->Initialize(true, predicate_senses, right_arcs, right_siblings[p]); + factor->SetAdditionalLogPotentials(right_scores[p]); + factor_graph->DeclareFactor(factor, local_variables, true); + factor_part_indices_.push_back(-1); + additional_part_indices.insert(additional_part_indices.end(), + right_indices[p].begin(), + right_indices[p].end()); + } + } + + ////////////////////////////////////////////////////////////////////// + // Build consecutive co-parent factors. + ////////////////////////////////////////////////////////////////////// + if (use_consecutive_coparent_parts) { + // Get all the consecutive co-parents, indices, etc. + // Note: contrarily to the consecutive siblings, here a left arc is one + // whose predicate is on the left of the argument. + vector > left_arc_indices(sentence->size()); + vector > right_arc_indices(sentence->size()); + for (int r = 0; r < num_arcs; ++r) { + SemanticPartArc* arc = + static_cast((*parts)[offset_arcs + r]); + if (arc->predicate() < arc->argument()) { + left_arc_indices[arc->argument()].push_back(offset_arcs + r); + } else { + right_arc_indices[arc->argument()].push_back(offset_arcs + r); + } + } + vector > + left_coparents(sentence->size()); + vector > + right_coparents(sentence->size()); + vector > left_scores(sentence->size()); + vector > right_scores(sentence->size()); + vector > left_indices(sentence->size()); + vector > right_indices(sentence->size()); + for (int r = 0; r < num_consecutive_coparents; ++r) { + SemanticPartConsecutiveCoparent *coparent = + static_cast( + (*parts)[offset_consecutive_coparents + r]); + if (coparent->argument() > coparent->second_predicate()) { + // Left co-parent. + left_coparents[coparent->argument()].push_back(coparent); + left_scores[coparent->argument()].push_back( + scores[offset_consecutive_coparents + r]); + // Save the part index to get the posterior later. + left_indices[coparent->argument()]. + push_back(offset_consecutive_coparents + r); + } else { + CHECK(coparent->argument() < coparent->second_predicate() || + (coparent->argument() == coparent->second_predicate() && + coparent->first_predicate() < 0)); + // Right co-parent. + right_coparents[coparent->argument()].push_back(coparent); + right_scores[coparent->argument()].push_back( + scores[offset_consecutive_coparents + r]); + // Save the part index to get the posterior later. + right_indices[coparent->argument()]. + push_back(offset_consecutive_coparents + r); + } + } + + // Now, go through each argument and create left and right automata. + for (int a = 1; a < sentence->size(); ++a) { + // Build left argument automaton. + vector local_variables; + vector left_arcs; + for (int k = 0; k < left_arc_indices[a].size(); ++k) { + int r = left_arc_indices[a][k]; + int index = offset_arc_variables + r - offset_arcs; + local_variables.push_back(variables[index]); + SemanticPartArc *arc = + static_cast((*parts)[r]); + left_arcs.push_back(arc); + } + + AD3::FactorArgumentAutomaton *factor = new AD3::FactorArgumentAutomaton; + factor->Initialize(a, false, left_arcs, left_coparents[a]); + factor->SetAdditionalLogPotentials(left_scores[a]); + factor_graph->DeclareFactor(factor, local_variables, true); + factor_part_indices_.push_back(-1); + additional_part_indices.insert(additional_part_indices.end(), + left_indices[a].begin(), + left_indices[a].end()); + + // Build right head automaton. + local_variables.clear(); + vector right_arcs; + for (int k = 0; k < right_arc_indices[a].size(); ++k) { + int r = right_arc_indices[a][k]; + int index = offset_arc_variables + r - offset_arcs; + local_variables.push_back(variables[index]); + SemanticPartArc *arc = + static_cast((*parts)[r]); + right_arcs.push_back(arc); + } + + factor = new AD3::FactorArgumentAutomaton; + factor->Initialize(a, true, right_arcs, right_coparents[a]); + factor->SetAdditionalLogPotentials(right_scores[a]); + factor_graph->DeclareFactor(factor, local_variables, true); + factor_part_indices_.push_back(-1); + additional_part_indices.insert(additional_part_indices.end(), + right_indices[a].begin(), + right_indices[a].end()); + } + } + + ////////////////////////////////////////////////////////////////////// + // Build grandparent factors. + ////////////////////////////////////////////////////////////////////// + if (use_grandparent_parts) { + for (int r = 0; r < num_grandparents; ++r) { + SemanticPartGrandparent *part = static_cast( + (*semantic_parts)[offset_grandparents + r]); + int r1 = semantic_parts->FindArc(part->grandparent_predicate(), + part->predicate(), + part->grandparent_sense()); + int r2 = semantic_parts->FindArc(part->predicate(), + part->argument(), + part->sense()); + CHECK_GE(r1, 0); + CHECK_GE(r2, 0); + vector local_variables; + local_variables.push_back(variables[r1 - offset_arcs + + offset_arc_variables]); + local_variables.push_back(variables[r2 - offset_arcs + + offset_arc_variables]); + + factor_graph->CreateFactorPAIR(local_variables, + scores[offset_grandparents + r]); + // TODO: set these global indices at the end after all variables/factors + // are created. + //factor->SetGlobalIndex(...); + additional_part_indices.push_back(offset_grandparents + r); + factor_part_indices_.push_back(offset_grandparents + r); + } + } + + ////////////////////////////////////////////////////////////////////// + // Build co-parent factors. + ////////////////////////////////////////////////////////////////////// + if (use_coparent_parts) { + for (int r = 0; r < num_coparents; ++r) { + SemanticPartCoparent *part = static_cast( + (*semantic_parts)[offset_coparents + r]); + int r1 = semantic_parts->FindArc(part->first_predicate(), + part->argument(), + part->first_sense()); + int r2 = semantic_parts->FindArc(part->second_predicate(), + part->argument(), + part->second_sense()); + CHECK_GE(r1, 0); + CHECK_GE(r2, 0); + vector local_variables; + local_variables.push_back(variables[r1 - offset_arcs + + offset_arc_variables]); + local_variables.push_back(variables[r2 - offset_arcs + + offset_arc_variables]); + + factor_graph->CreateFactorPAIR(local_variables, + scores[offset_coparents + r]); + // TODO: set these global indices at the end after all variables/factors + // are created. + //factor->SetGlobalIndex(...); + additional_part_indices.push_back(offset_coparents + r); + factor_part_indices_.push_back(offset_coparents + r); + } + } + + ////////////////////////////////////////////////////////////////////////////// + + CHECK_EQ(variables.size(), part_indices_.size()); + CHECK_EQ(factor_graph->GetNumFactors(), factor_part_indices_.size()); + + // Compute additional_part_indices_. + int offset = factor_graph->GetNumVariables(); + for (int i = 0; i < factor_graph->GetNumFactors(); ++i) { + offset += factor_graph->GetFactor(i)->GetAdditionalLogPotentials().size(); + } + CHECK_EQ(additional_part_indices.size(), + offset - factor_graph->GetNumVariables()); + // Concatenate part_indices and additional_part_indices. + part_indices_.insert(part_indices_.end(), + additional_part_indices.begin(), + additional_part_indices.end()); + + VLOG(2) << "Number of factors: " << factor_graph->GetNumFactors(); + VLOG(2) << "Number of variables: " << factor_graph->GetNumVariables(); + +#if 0 + LOG(INFO) << "Number of factors: " << factor_graph->GetNumFactors(); + LOG(INFO) << "Number of variables: " << factor_graph->GetNumVariables(); + LOG(INFO) << "Number of siblings: " << num_siblings; + LOG(INFO) << "part_indices_.size() = " << part_indices_.size(); + LOG(INFO) << "additional_part_indices.size() = " << additional_part_indices.size(); + LOG(INFO) << "factor_part_indices_.size() = " << factor_part_indices_.size(); +#endif + + vector recomputed_indices(part_indices_.size(), -1); + bool solved = false; + + //#define PRINT_GRAPH +#ifdef PRINT_GRAPH + ofstream stream; + stream.open("tmp.fg", ofstream::out | ofstream::app); + CHECK(stream.good()); + factor_graph->Print(stream); + stream << endl; + stream.flush(); + stream.clear(); + stream.close(); +#endif + + vector posteriors; + vector additional_posteriors; + double value_ref; + double *value = &value_ref; + + //factor_graph->SetMaxIterationsAD3(2000); + factor_graph->SetMaxIterationsAD3(500); + factor_graph->SetEtaAD3(0.05); + factor_graph->AdaptEtaAD3(true); + factor_graph->SetResidualThresholdAD3(1e-3); + //factor_graph->SetResidualThresholdAD3(1e-6); + // Run AD3. - timeval start, end; - gettimeofday(&start, NULL); - if (!solved) { - factor_graph->SolveLPMAPWithAD3(&posteriors, &additional_posteriors, value); - } - gettimeofday(&end, NULL); - double elapsed_time = diff_ms(end, start); - VLOG(2) << "Elapsed time (AD3) = " << elapsed_time - << " (" << sentence->size() << ") "; - - delete factor_graph; - - *value = 0.0; - predicted_output->assign(parts->size(), 0.0); - for (int i = 0; i < part_indices_.size(); ++i) { - int r = part_indices_[i]; - if (r < 0) continue; - if (i < posteriors.size()) { - (*predicted_output)[r] = posteriors[i]; - } else { - int j = i - posteriors.size(); - (*predicted_output)[r] = additional_posteriors[j]; -#if 0 - /// - CHECK_GE(r, offset_siblings); - CHECK_LT(j + 1, factor_graph->GetNumFactors()); - AD3::Factor *factor = factor_graph->GetFactor(j + 1); - CHECK_EQ(factor->Degree(), 2) << j + 1 << " " << factor->GetId(); - AD3::BinaryVariable *var1 = factor->GetVariable(0); - AD3::BinaryVariable *var2 = factor->GetVariable(1); - int i1 = var1->GetId(); - int i2 = var2->GetId(); - if (posteriors[i1] > 0.9 && posteriors[i2] > 0.9) { - CHECK_GE(additional_posteriors[j], 0.9); - } - int r1 = offset_arcs + i1 - offset_arc_variables; - int r2 = offset_arcs + i2 - offset_arc_variables; - CHECK_EQ(posteriors[i1], (*predicted_output)[r1]); - CHECK_EQ(posteriors[i2], (*predicted_output)[r2]); - SemanticPartArc* arc1 = static_cast((*semantic_parts)[r1]); - SemanticPartArc* arc2 = static_cast((*semantic_parts)[r2]); - SemanticPartSibling* part = static_cast((*semantic_parts)[r]); - CHECK_EQ(arc1->predicate(), part->predicate()); - CHECK_EQ(arc1->sense(), part->sense()); - CHECK_EQ(arc1->argument(), part->first_argument()); - CHECK_EQ(arc2->predicate(), part->predicate()); - CHECK_EQ(arc2->sense(), part->sense()); - CHECK_EQ(arc2->argument(), part->second_argument()); - - if (part->predicate() == 9) { - LOG(INFO) << "*** sibling " - << "[" << r << " " << r1 << " " << r2 << "] " - << part->predicate() << " " - << part->sense() << " " - << part->first_argument() << " " - << part->second_argument() << " = " - << (*predicted_output)[r] << " " - << (*predicted_output)[r1] << " " - << (*predicted_output)[r2]; - } - /// -#endif - } - *value += (*predicted_output)[r] * scores[r]; - } - -#if 0 - ////// - for (int r = 0; r < parts->size(); ++r) { - if (r >= offset_labeled_arcs && r < offset_labeled_arcs + num_labeled_arcs) { - (*predicted_output)[r] = 0.0; - } else { - CHECK_GE((*predicted_output)[r], -1e-12); - } + chronowrap::Chronometer chrono; + chrono.GetTime(); + if (!solved) { + factor_graph->SolveLPMAPWithAD3(&posteriors, &additional_posteriors, value); } - /////// - - delete factor_graph; -#endif - - VLOG(2) << "Solution value (AD3) = " << *value; -} + chrono.StopTime(); + double elapsed_time = chrono.GetElapsedTime(); + VLOG(2) << "Elapsed time (AD3) = " << elapsed_time << " sec." + << " (" << sentence->size() << ") "; + + delete factor_graph; + + *value = 0.0; + predicted_output->assign(parts->size(), 0.0); + for (int i = 0; i < part_indices_.size(); ++i) { + int r = part_indices_[i]; + if (r < 0) continue; + if (i < posteriors.size()) { + (*predicted_output)[r] = posteriors[i]; + } else { + int j = i - posteriors.size(); + (*predicted_output)[r] = additional_posteriors[j]; +#if 0 + /// + CHECK_GE(r, offset_siblings); + CHECK_LT(j + 1, factor_graph->GetNumFactors()); + AD3::Factor *factor = factor_graph->GetFactor(j + 1); + CHECK_EQ(factor->Degree(), 2) << j + 1 << " " << factor->GetId(); + AD3::BinaryVariable *var1 = factor->GetVariable(0); + AD3::BinaryVariable *var2 = factor->GetVariable(1); + int i1 = var1->GetId(); + int i2 = var2->GetId(); + if (posteriors[i1] > 0.9 && posteriors[i2] > 0.9) { + CHECK_GE(additional_posteriors[j], 0.9); + } + int r1 = offset_arcs + i1 - offset_arc_variables; + int r2 = offset_arcs + i2 - offset_arc_variables; + CHECK_EQ(posteriors[i1], (*predicted_output)[r1]); + CHECK_EQ(posteriors[i2], (*predicted_output)[r2]); + SemanticPartArc* arc1 = static_cast((*semantic_parts)[r1]); + SemanticPartArc* arc2 = static_cast((*semantic_parts)[r2]); + SemanticPartSibling* part = static_cast((*semantic_parts)[r]); + CHECK_EQ(arc1->predicate(), part->predicate()); + CHECK_EQ(arc1->sense(), part->sense()); + CHECK_EQ(arc1->argument(), part->first_argument()); + CHECK_EQ(arc2->predicate(), part->predicate()); + CHECK_EQ(arc2->sense(), part->sense()); + CHECK_EQ(arc2->argument(), part->second_argument()); + + if (part->predicate() == 9) { + LOG(INFO) << "*** sibling " + << "[" << r << " " << r1 << " " << r2 << "] " + << part->predicate() << " " + << part->sense() << " " + << part->first_argument() << " " + << part->second_argument() << " = " + << (*predicted_output)[r] << " " + << (*predicted_output)[r1] << " " + << (*predicted_output)[r2]; + } + /// +#endif + } + *value += (*predicted_output)[r] * scores[r]; + } + +#if 0 + ////// + for (int r = 0; r < parts->size(); ++r) { + if (r >= offset_labeled_arcs && r < offset_labeled_arcs + num_labeled_arcs) { + (*predicted_output)[r] = 0.0; + } else { + CHECK_GE((*predicted_output)[r], -1e-12); + } + } + /////// + + delete factor_graph; +#endif + + VLOG(2) << "Solution value (AD3) = " << *value; +} diff --git a/src/semantic_parser/SemanticPipe.h b/src/semantic_parser/SemanticPipe.h index 10d8888..b5db4e5 100644 --- a/src/semantic_parser/SemanticPipe.h +++ b/src/semantic_parser/SemanticPipe.h @@ -1,410 +1,409 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICPIPE_H_ -#define SEMANTICPIPE_H_ - -#include "Pipe.h" -#include "SemanticOptions.h" -#include "SemanticReader.h" -#include "SemanticDictionary.h" -#include "TokenDictionary.h" -#include "SemanticInstanceNumeric.h" -#include "SemanticWriter.h" -#include "SemanticPart.h" -#include "SemanticFeatures.h" -#include "SemanticDecoder.h" - -class SemanticPipe : public Pipe { -public: - SemanticPipe(Options* options) : Pipe(options) { - token_dictionary_ = NULL; - dependency_dictionary_ = NULL; - pruner_parameters_ = NULL; - train_pruner_ = false; - } - virtual ~SemanticPipe() { - delete token_dictionary_; - delete dependency_dictionary_; - delete pruner_parameters_; - } - - SemanticReader *GetSemanticReader() { - return static_cast(reader_); - } - SemanticDictionary *GetSemanticDictionary() { - return static_cast(dictionary_); - } - SemanticDecoder *GetSemanticDecoder() { - return static_cast(decoder_); - } - SemanticOptions *GetSemanticOptions() { - return static_cast(options_); - } - - void Initialize() { - Pipe::Initialize(); - pruner_parameters_ = new Parameters; - } - - void SetPrunerParameters(Parameters *pruner_parameters) { - pruner_parameters_ = pruner_parameters; - } - void LoadPrunerModelFile() { - LoadPrunerModelByName(GetSemanticOptions()->GetPrunerModelFilePath()); - } - -protected: - void CreateDictionary() { - dictionary_ = new SemanticDictionary(this); - GetSemanticDictionary()->SetTokenDictionary(token_dictionary_); - GetSemanticDictionary()->SetDependencyDictionary(dependency_dictionary_); - } - void CreateReader() { - reader_ = new SemanticReader(options_); - } - void CreateWriter() { - writer_ = new SemanticWriter(options_); - } - void CreateDecoder() { decoder_ = new SemanticDecoder(this); } - Parts *CreateParts() { return new SemanticParts; } - Features *CreateFeatures() { return new SemanticFeatures(this); } - - void CreateTokenDictionary() { - token_dictionary_ = new TokenDictionary(this); - } - - void CreateDependencyDictionary() { - dependency_dictionary_ = new DependencyDictionary(this); - } - - Parameters *GetTrainingParameters() { - if (train_pruner_) return pruner_parameters_; - return parameters_; - } - - void PreprocessData(); - - Instance *GetFormattedInstance(Instance *instance) { - SemanticInstanceNumeric *instance_numeric = - new SemanticInstanceNumeric; - instance_numeric->Initialize(*GetSemanticDictionary(), - static_cast(instance)); - return instance_numeric; - } - - void SaveModel(FILE* fs); - void LoadModel(FILE* fs); - - void LoadPrunerModel(FILE* fs); - void LoadPrunerModelByName(const string &model_name); - - void MakeParts(Instance *instance, Parts *parts, - vector *gold_outputs); - void MakePartsBasic(Instance *instance, Parts *parts, - vector *gold_outputs); - void MakePartsBasic(Instance *instance, bool add_labeled_parts, Parts *parts, - vector *gold_outputs); - void MakePartsGlobal(Instance *instance, Parts *parts, - vector *gold_outputs); - void MakePartsArbitrarySiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsLabeledArbitrarySiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsConsecutiveSiblings(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsGrandparents(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsCoparents(Instance *instance, - Parts *parts, - vector *gold_outputs); - void MakePartsConsecutiveCoparents(Instance *instance, - Parts *parts, - vector *gold_outputs); - - void MakeFeatures(Instance *instance, Parts *parts, bool pruner, - Features *features) { - vector selected_parts(parts->size(), true); - MakeSelectedFeatures(instance, parts, pruner, selected_parts, features); - } - void MakeSelectedFeatures(Instance *instance, Parts *parts, - const vector& selected_parts, Features *features) { - // Set pruner = false unless we're training the pruner. - MakeSelectedFeatures(instance, parts, train_pruner_, selected_parts, - features); - } - void MakeSelectedFeatures(Instance *instance, - Parts *parts, - bool pruner, - const vector& selected_parts, - Features *features); - - void ComputeScores(Instance *instance, Parts *parts, Features *features, - vector *scores) { - // Set pruner = false unless we're training the pruner. - ComputeScores(instance, parts, features, train_pruner_, scores); - } - void ComputeScores(Instance *instance, Parts *parts, Features *features, - bool pruner, vector *scores); - - void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - bool pruner, - const vector &selected_parts, - Features *features); - - void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - const vector &selected_parts, - Features *features) { - // Set pruner = false unless we're training the pruner. - RemoveUnsupportedFeatures(instance, parts, train_pruner_, selected_parts, - features); - } - - void MakeFeatureDifference(Parts *parts, - Features *features, - const vector &gold_output, - const vector &predicted_output, - FeatureVector *difference); - - void MakeGradientStep(Parts *parts, - Features *features, - double eta, - int iteration, - const vector &gold_output, - const vector &predicted_output); - - void TouchParameters(Parts *parts, Features *features, - const vector &selected_parts); - - void LabelInstance(Parts *parts, const vector &output, - Instance *instance); - - void Prune(Instance *instance, Parts *parts, vector *gold_outputs, - bool preserve_gold); - - virtual void BeginEvaluation() { - num_predicted_unlabeled_arcs_ = 0; - num_gold_unlabeled_arcs_ = 0; - num_matched_unlabeled_arcs_ = 0; - num_tokens_ = 0; - num_unlabeled_arcs_after_pruning_ = 0; - num_pruned_gold_unlabeled_arcs_ = 0; - num_possible_unlabeled_arcs_ = 0; - num_predicted_labeled_arcs_ = 0; - num_gold_labeled_arcs_ = 0; - num_matched_labeled_arcs_ = 0; - num_labeled_arcs_after_pruning_ = 0; - num_pruned_gold_labeled_arcs_ = 0; - num_possible_labeled_arcs_ = 0; - gettimeofday(&start_clock_, NULL); - } - virtual void EvaluateInstance(Instance *instance, - Instance *output_instance, - Parts *parts, - const vector &gold_outputs, - const vector &predicted_outputs) { - int num_possible_unlabeled_arcs = 0; - int num_possible_labeled_arcs = 0; - int num_gold_unlabeled_arcs = 0; - int num_gold_labeled_arcs = 0; - SemanticInstance *semantic_instance = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - for (int p = 0; p < semantic_instance->size(); ++p) { - const vector &senses = semantic_parts->GetSenses(p); - for (int a = 1; a < semantic_instance->size(); ++a) { - for (int k = 0; k < senses.size(); ++k) { - int s = senses[k]; - int r = semantic_parts->FindArc(p, a, s); - if (r < 0) continue; - ++num_possible_unlabeled_arcs; - if (gold_outputs[r] >= 0.5) { - CHECK_EQ(gold_outputs[r], 1.0); - if (NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { - ++num_matched_unlabeled_arcs_; - } - ++num_gold_unlabeled_arcs; - } - if (predicted_outputs[r] >= 0.5) { - CHECK_EQ(predicted_outputs[r], 1.0); - ++num_predicted_unlabeled_arcs_; - - //LOG(INFO) << semantic_instance->GetForm(a) - // << " <-- " - // << semantic_instance->GetForm(p); - } - if (GetSemanticOptions()->labeled()) { - const vector &labeled_arcs = - semantic_parts->FindLabeledArcs(p, a, s); - for (int k = 0; k < labeled_arcs.size(); ++k) { - int r = labeled_arcs[k]; - if (r < 0) continue; - ++num_possible_labeled_arcs; - if (gold_outputs[r] >= 0.5) { - CHECK_EQ(gold_outputs[r], 1.0); - if (NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { - ++num_matched_labeled_arcs_; - - //LOG(INFO) << semantic_instance->GetForm(a) - // << " <-*- " - // << semantic_instance->GetForm(p); - } - ++num_gold_labeled_arcs; - } - if (predicted_outputs[r] >= 0.5) { - CHECK_EQ(predicted_outputs[r], 1.0); - ++num_predicted_labeled_arcs_; - } - } - } - } - } - - ++num_tokens_; - num_unlabeled_arcs_after_pruning_ += num_possible_unlabeled_arcs; - num_labeled_arcs_after_pruning_ += num_possible_labeled_arcs; - } - - int num_actual_gold_arcs = 0; - for (int k = 0; k < semantic_instance->GetNumPredicates(); ++k) { - num_actual_gold_arcs += - semantic_instance->GetNumArgumentsPredicate(k); - } - num_gold_unlabeled_arcs_ += num_actual_gold_arcs; - num_gold_labeled_arcs_ += num_actual_gold_arcs; - int missed_unlabeled = num_actual_gold_arcs - num_gold_unlabeled_arcs; - int missed_labeled = num_actual_gold_arcs - num_gold_labeled_arcs; - //if (missed > 0) { - // LOG(INFO) << "Missed " << missed << " unlabeled arcs."; - //} - num_pruned_gold_unlabeled_arcs_ += missed_unlabeled; - num_possible_unlabeled_arcs_ += num_possible_unlabeled_arcs; - num_pruned_gold_labeled_arcs_ += missed_labeled; - num_possible_labeled_arcs_ += num_possible_labeled_arcs; - } - - virtual void EndEvaluation() { - double unlabeled_precision = - static_cast(num_matched_unlabeled_arcs_) / - static_cast(num_predicted_unlabeled_arcs_); - double unlabeled_recall = - static_cast(num_matched_unlabeled_arcs_) / - static_cast(num_gold_unlabeled_arcs_); - double unlabeled_F1 = 2.0 * unlabeled_precision * unlabeled_recall / - (unlabeled_precision + unlabeled_recall); - double pruning_unlabeled_recall = - static_cast(num_gold_unlabeled_arcs_ - - num_pruned_gold_unlabeled_arcs_) / - static_cast(num_gold_unlabeled_arcs_); - double pruning_unlabeled_efficiency = - static_cast(num_possible_unlabeled_arcs_) / - static_cast(num_tokens_); - - double labeled_precision = - static_cast(num_matched_labeled_arcs_) / - static_cast(num_predicted_labeled_arcs_); - double labeled_recall = - static_cast(num_matched_labeled_arcs_) / - static_cast(num_gold_labeled_arcs_); - double labeled_F1 = 2.0 * labeled_precision * labeled_recall / - (labeled_precision + labeled_recall); - double pruning_labeled_recall = - static_cast(num_gold_labeled_arcs_ - - num_pruned_gold_labeled_arcs_) / - static_cast(num_gold_labeled_arcs_); - double pruning_labeled_efficiency = - static_cast(num_possible_labeled_arcs_) / - static_cast(num_tokens_); - - LOG(INFO) << "Unlabeled precision: " << unlabeled_precision - << " (" << num_matched_unlabeled_arcs_ << "/" - << num_predicted_unlabeled_arcs_ << ")"; - LOG(INFO) << "Unlabeled recall: " << unlabeled_recall - << " (" << num_matched_unlabeled_arcs_ << "/" - << num_gold_unlabeled_arcs_ << ")"; - LOG(INFO) << "Unlabeled F1: " << unlabeled_F1; - LOG(INFO) << "Pruning unlabeled recall: " << pruning_unlabeled_recall - << " (" - << num_gold_unlabeled_arcs_ - num_pruned_gold_unlabeled_arcs_ - << "/" - << num_gold_unlabeled_arcs_ << ")"; - LOG(INFO) << "Pruning unlabeled efficiency: " << pruning_unlabeled_efficiency - << " possible unlabeled arcs per token" - << " (" << num_possible_unlabeled_arcs_ << "/" - << num_tokens_ << ")"; - - LOG(INFO) << "Labeled precision: " << labeled_precision - << " (" << num_matched_labeled_arcs_ << "/" - << num_predicted_labeled_arcs_ << ")"; - LOG(INFO) << "Labeled recall: " << labeled_recall - << " (" << num_matched_labeled_arcs_ << "/" - << num_gold_labeled_arcs_ << ")"; - LOG(INFO) << "Labeled F1: " << labeled_F1; - LOG(INFO) << "Pruning labeled recall: " << pruning_labeled_recall - << " (" - << num_gold_labeled_arcs_ - num_pruned_gold_labeled_arcs_ - << "/" - << num_gold_labeled_arcs_ << ")"; - LOG(INFO) << "Pruning labeled efficiency: " << pruning_labeled_efficiency - << " possible labeled arcs per token" - << " (" << num_possible_labeled_arcs_ << "/" - << num_tokens_ << ")"; - - timeval end_clock; - gettimeofday(&end_clock, NULL); - double num_seconds = - static_cast(diff_ms(end_clock, start_clock_)) / 1000.0; - double tokens_per_second = static_cast(num_tokens_) / num_seconds; - LOG(INFO) << "Speed: " - << tokens_per_second << " tokens per second."; - } - -#if 0 - void GetAllAncestors(const vector &heads, - int descend, - vector* ancestors); - bool ExistsPath(const vector &heads, - int ancest, - int descend); -#endif -protected: - TokenDictionary *token_dictionary_; - DependencyDictionary *dependency_dictionary_; - bool train_pruner_; - Parameters *pruner_parameters_; - int num_predicted_unlabeled_arcs_; - int num_gold_unlabeled_arcs_; - int num_matched_unlabeled_arcs_; - int num_tokens_; - int num_unlabeled_arcs_after_pruning_; - int num_pruned_gold_unlabeled_arcs_; - int num_possible_unlabeled_arcs_; - int num_predicted_labeled_arcs_; - int num_gold_labeled_arcs_; - int num_matched_labeled_arcs_; - int num_labeled_arcs_after_pruning_; - int num_pruned_gold_labeled_arcs_; - int num_possible_labeled_arcs_; - timeval start_clock_; -}; - -#endif /* SEMANTICPIPE_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICPIPE_H_ +#define SEMANTICPIPE_H_ + +#include "Pipe.h" +#include "TimeUtils.h" +#include "SemanticOptions.h" +#include "SemanticReader.h" +#include "SemanticDictionary.h" +#include "TokenDictionary.h" +#include "SemanticInstanceNumeric.h" +#include "SemanticWriter.h" +#include "SemanticPart.h" +#include "SemanticFeatures.h" +#include "SemanticDecoder.h" + +class SemanticPipe : public Pipe { +public: + SemanticPipe(Options* options) : Pipe(options) { + token_dictionary_ = NULL; + dependency_dictionary_ = NULL; + pruner_parameters_ = NULL; + train_pruner_ = false; + } + virtual ~SemanticPipe() { + delete token_dictionary_; + delete dependency_dictionary_; + delete pruner_parameters_; + } + + SemanticReader *GetSemanticReader() { + return static_cast(reader_); + } + SemanticDictionary *GetSemanticDictionary() { + return static_cast(dictionary_); + } + SemanticDecoder *GetSemanticDecoder() { + return static_cast(decoder_); + } + SemanticOptions *GetSemanticOptions() { + return static_cast(options_); + } + + void Initialize() { + Pipe::Initialize(); + pruner_parameters_ = new Parameters; + } + + void SetPrunerParameters(Parameters *pruner_parameters) { + pruner_parameters_ = pruner_parameters; + } + void LoadPrunerModelFile() { + LoadPrunerModelByName(GetSemanticOptions()->GetPrunerModelFilePath()); + } + +protected: + void CreateDictionary() { + dictionary_ = new SemanticDictionary(this); + GetSemanticDictionary()->SetTokenDictionary(token_dictionary_); + GetSemanticDictionary()->SetDependencyDictionary(dependency_dictionary_); + } + void CreateReader() { + reader_ = new SemanticReader(options_); + } + void CreateWriter() { + writer_ = new SemanticWriter(options_); + } + void CreateDecoder() { decoder_ = new SemanticDecoder(this); } + Parts *CreateParts() { return new SemanticParts; } + Features *CreateFeatures() { return new SemanticFeatures(this); } + + void CreateTokenDictionary() { + token_dictionary_ = new TokenDictionary(this); + } + + void CreateDependencyDictionary() { + dependency_dictionary_ = new DependencyDictionary(this); + } + + Parameters *GetTrainingParameters() { + if (train_pruner_) return pruner_parameters_; + return parameters_; + } + + void PreprocessData(); + + Instance *GetFormattedInstance(Instance *instance) { + SemanticInstanceNumeric *instance_numeric = + new SemanticInstanceNumeric; + instance_numeric->Initialize(*GetSemanticDictionary(), + static_cast(instance)); + return instance_numeric; + } + + void SaveModel(FILE* fs); + void LoadModel(FILE* fs); + + void LoadPrunerModel(FILE* fs); + void LoadPrunerModelByName(const string &model_name); + + void MakeParts(Instance *instance, Parts *parts, + vector *gold_outputs); + void MakePartsBasic(Instance *instance, Parts *parts, + vector *gold_outputs); + void MakePartsBasic(Instance *instance, bool add_labeled_parts, Parts *parts, + vector *gold_outputs); + void MakePartsGlobal(Instance *instance, Parts *parts, + vector *gold_outputs); + void MakePartsArbitrarySiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsLabeledArbitrarySiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsConsecutiveSiblings(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsGrandparents(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsCoparents(Instance *instance, + Parts *parts, + vector *gold_outputs); + void MakePartsConsecutiveCoparents(Instance *instance, + Parts *parts, + vector *gold_outputs); + + void MakeFeatures(Instance *instance, Parts *parts, bool pruner, + Features *features) { + vector selected_parts(parts->size(), true); + MakeSelectedFeatures(instance, parts, pruner, selected_parts, features); + } + void MakeSelectedFeatures(Instance *instance, Parts *parts, + const vector& selected_parts, Features *features) { + // Set pruner = false unless we're training the pruner. + MakeSelectedFeatures(instance, parts, train_pruner_, selected_parts, + features); + } + void MakeSelectedFeatures(Instance *instance, + Parts *parts, + bool pruner, + const vector& selected_parts, + Features *features); + + void ComputeScores(Instance *instance, Parts *parts, Features *features, + vector *scores) { + // Set pruner = false unless we're training the pruner. + ComputeScores(instance, parts, features, train_pruner_, scores); + } + void ComputeScores(Instance *instance, Parts *parts, Features *features, + bool pruner, vector *scores); + + void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + bool pruner, + const vector &selected_parts, + Features *features); + + void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + const vector &selected_parts, + Features *features) { + // Set pruner = false unless we're training the pruner. + RemoveUnsupportedFeatures(instance, parts, train_pruner_, selected_parts, + features); + } + + void MakeFeatureDifference(Parts *parts, + Features *features, + const vector &gold_output, + const vector &predicted_output, + FeatureVector *difference); + + void MakeGradientStep(Parts *parts, + Features *features, + double eta, + int iteration, + const vector &gold_output, + const vector &predicted_output); + + void TouchParameters(Parts *parts, Features *features, + const vector &selected_parts); + + void LabelInstance(Parts *parts, const vector &output, + Instance *instance); + + void Prune(Instance *instance, Parts *parts, vector *gold_outputs, + bool preserve_gold); + + virtual void BeginEvaluation() { + num_predicted_unlabeled_arcs_ = 0; + num_gold_unlabeled_arcs_ = 0; + num_matched_unlabeled_arcs_ = 0; + num_tokens_ = 0; + num_unlabeled_arcs_after_pruning_ = 0; + num_pruned_gold_unlabeled_arcs_ = 0; + num_possible_unlabeled_arcs_ = 0; + num_predicted_labeled_arcs_ = 0; + num_gold_labeled_arcs_ = 0; + num_matched_labeled_arcs_ = 0; + num_labeled_arcs_after_pruning_ = 0; + num_pruned_gold_labeled_arcs_ = 0; + num_possible_labeled_arcs_ = 0; + chrono.GetTime(); + } + virtual void EvaluateInstance(Instance *instance, + Instance *output_instance, + Parts *parts, + const vector &gold_outputs, + const vector &predicted_outputs) { + int num_possible_unlabeled_arcs = 0; + int num_possible_labeled_arcs = 0; + int num_gold_unlabeled_arcs = 0; + int num_gold_labeled_arcs = 0; + SemanticInstance *semantic_instance = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + for (int p = 0; p < semantic_instance->size(); ++p) { + const vector &senses = semantic_parts->GetSenses(p); + for (int a = 1; a < semantic_instance->size(); ++a) { + for (int k = 0; k < senses.size(); ++k) { + int s = senses[k]; + int r = semantic_parts->FindArc(p, a, s); + if (r < 0) continue; + ++num_possible_unlabeled_arcs; + if (gold_outputs[r] >= 0.5) { + CHECK_EQ(gold_outputs[r], 1.0); + if (NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { + ++num_matched_unlabeled_arcs_; + } + ++num_gold_unlabeled_arcs; + } + if (predicted_outputs[r] >= 0.5) { + CHECK_EQ(predicted_outputs[r], 1.0); + ++num_predicted_unlabeled_arcs_; + + //LOG(INFO) << semantic_instance->GetForm(a) + // << " <-- " + // << semantic_instance->GetForm(p); + } + if (GetSemanticOptions()->labeled()) { + const vector &labeled_arcs = + semantic_parts->FindLabeledArcs(p, a, s); + for (int k = 0; k < labeled_arcs.size(); ++k) { + int r = labeled_arcs[k]; + if (r < 0) continue; + ++num_possible_labeled_arcs; + if (gold_outputs[r] >= 0.5) { + CHECK_EQ(gold_outputs[r], 1.0); + if (NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { + ++num_matched_labeled_arcs_; + + //LOG(INFO) << semantic_instance->GetForm(a) + // << " <-*- " + // << semantic_instance->GetForm(p); + } + ++num_gold_labeled_arcs; + } + if (predicted_outputs[r] >= 0.5) { + CHECK_EQ(predicted_outputs[r], 1.0); + ++num_predicted_labeled_arcs_; + } + } + } + } + } + + ++num_tokens_; + num_unlabeled_arcs_after_pruning_ += num_possible_unlabeled_arcs; + num_labeled_arcs_after_pruning_ += num_possible_labeled_arcs; + } + + int num_actual_gold_arcs = 0; + for (int k = 0; k < semantic_instance->GetNumPredicates(); ++k) { + num_actual_gold_arcs += + semantic_instance->GetNumArgumentsPredicate(k); + } + num_gold_unlabeled_arcs_ += num_actual_gold_arcs; + num_gold_labeled_arcs_ += num_actual_gold_arcs; + int missed_unlabeled = num_actual_gold_arcs - num_gold_unlabeled_arcs; + int missed_labeled = num_actual_gold_arcs - num_gold_labeled_arcs; + //if (missed > 0) { + // LOG(INFO) << "Missed " << missed << " unlabeled arcs."; + //} + num_pruned_gold_unlabeled_arcs_ += missed_unlabeled; + num_possible_unlabeled_arcs_ += num_possible_unlabeled_arcs; + num_pruned_gold_labeled_arcs_ += missed_labeled; + num_possible_labeled_arcs_ += num_possible_labeled_arcs; + } + + virtual void EndEvaluation() { + double unlabeled_precision = + static_cast(num_matched_unlabeled_arcs_) / + static_cast(num_predicted_unlabeled_arcs_); + double unlabeled_recall = + static_cast(num_matched_unlabeled_arcs_) / + static_cast(num_gold_unlabeled_arcs_); + double unlabeled_F1 = 2.0 * unlabeled_precision * unlabeled_recall / + (unlabeled_precision + unlabeled_recall); + double pruning_unlabeled_recall = + static_cast(num_gold_unlabeled_arcs_ - + num_pruned_gold_unlabeled_arcs_) / + static_cast(num_gold_unlabeled_arcs_); + double pruning_unlabeled_efficiency = + static_cast(num_possible_unlabeled_arcs_) / + static_cast(num_tokens_); + + double labeled_precision = + static_cast(num_matched_labeled_arcs_) / + static_cast(num_predicted_labeled_arcs_); + double labeled_recall = + static_cast(num_matched_labeled_arcs_) / + static_cast(num_gold_labeled_arcs_); + double labeled_F1 = 2.0 * labeled_precision * labeled_recall / + (labeled_precision + labeled_recall); + double pruning_labeled_recall = + static_cast(num_gold_labeled_arcs_ - + num_pruned_gold_labeled_arcs_) / + static_cast(num_gold_labeled_arcs_); + double pruning_labeled_efficiency = + static_cast(num_possible_labeled_arcs_) / + static_cast(num_tokens_); + + LOG(INFO) << "Unlabeled precision: " << unlabeled_precision + << " (" << num_matched_unlabeled_arcs_ << "/" + << num_predicted_unlabeled_arcs_ << ")"; + LOG(INFO) << "Unlabeled recall: " << unlabeled_recall + << " (" << num_matched_unlabeled_arcs_ << "/" + << num_gold_unlabeled_arcs_ << ")"; + LOG(INFO) << "Unlabeled F1: " << unlabeled_F1; + LOG(INFO) << "Pruning unlabeled recall: " << pruning_unlabeled_recall + << " (" + << num_gold_unlabeled_arcs_ - num_pruned_gold_unlabeled_arcs_ + << "/" + << num_gold_unlabeled_arcs_ << ")"; + LOG(INFO) << "Pruning unlabeled efficiency: " << pruning_unlabeled_efficiency + << " possible unlabeled arcs per token" + << " (" << num_possible_unlabeled_arcs_ << "/" + << num_tokens_ << ")"; + + LOG(INFO) << "Labeled precision: " << labeled_precision + << " (" << num_matched_labeled_arcs_ << "/" + << num_predicted_labeled_arcs_ << ")"; + LOG(INFO) << "Labeled recall: " << labeled_recall + << " (" << num_matched_labeled_arcs_ << "/" + << num_gold_labeled_arcs_ << ")"; + LOG(INFO) << "Labeled F1: " << labeled_F1; + LOG(INFO) << "Pruning labeled recall: " << pruning_labeled_recall + << " (" + << num_gold_labeled_arcs_ - num_pruned_gold_labeled_arcs_ + << "/" + << num_gold_labeled_arcs_ << ")"; + LOG(INFO) << "Pruning labeled efficiency: " << pruning_labeled_efficiency + << " possible labeled arcs per token" + << " (" << num_possible_labeled_arcs_ << "/" + << num_tokens_ << ")"; + + chrono.StopTime(); + double num_seconds = chrono.GetElapsedTime(); + double tokens_per_second = static_cast(num_tokens_) / num_seconds; + LOG(INFO) << "Speed: " + << tokens_per_second << " tokens per second."; + } + +#if 0 + void GetAllAncestors(const vector &heads, + int descend, + vector* ancestors); + bool ExistsPath(const vector &heads, + int ancest, + int descend); +#endif +protected: + TokenDictionary *token_dictionary_; + DependencyDictionary *dependency_dictionary_; + bool train_pruner_; + Parameters *pruner_parameters_; + int num_predicted_unlabeled_arcs_; + int num_gold_unlabeled_arcs_; + int num_matched_unlabeled_arcs_; + int num_tokens_; + int num_unlabeled_arcs_after_pruning_; + int num_pruned_gold_unlabeled_arcs_; + int num_possible_unlabeled_arcs_; + int num_predicted_labeled_arcs_; + int num_gold_labeled_arcs_; + int num_matched_labeled_arcs_; + int num_labeled_arcs_after_pruning_; + int num_pruned_gold_labeled_arcs_; + int num_possible_labeled_arcs_; + chronowrap::Chronometer chrono; +}; + +#endif /* SEMANTICPIPE_H_ */ diff --git a/src/semantic_parser/TurboSemanticParser.cpp b/src/semantic_parser/TurboSemanticParser.cpp index b4baaed..1755df5 100644 --- a/src/semantic_parser/TurboSemanticParser.cpp +++ b/src/semantic_parser/TurboSemanticParser.cpp @@ -1,129 +1,127 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "SemanticPipe.h" - -using namespace std; - -void TrainSemanticParser(); -void TestSemanticParser(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - - if (FLAGS_train) { - LOG(INFO) << "Training semantic parser..." << endl; - TrainSemanticParser(); - } else if (FLAGS_test) { - LOG(INFO) << "Running semantic parser..." << endl; - TestSemanticParser(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainSemanticParser() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - SemanticOptions *options = new SemanticOptions; - options->Initialize(); - - SemanticPipe *pipe = new SemanticPipe(options); - pipe->Initialize(); - - if (options->prune_basic()) { - if (options->use_pretrained_pruner()) { - pipe->LoadPrunerModelFile(); - } else { - // Train the pruner. - LOG(INFO) << "Training the pruner..."; - SemanticOptions *pruner_options = new SemanticOptions; - *pruner_options = *options; - // Transform things such as pruner_train_algorithm - // in train_algorithm. - pruner_options->CopyPrunerFlags(); - pruner_options->Initialize(); - SemanticPipe *pruner_pipe = new SemanticPipe(pruner_options); - pruner_pipe->Initialize(); - - pruner_pipe->Train(); - pipe->SetPrunerParameters(pruner_pipe->GetParameters()); - // This is necessary so that the pruner parameters are not - // destroyed when deleting the pruner pipe. - pruner_pipe->SetParameters(NULL); - - delete pruner_pipe; - delete pruner_options; - } - } - - LOG(INFO) << "Training the semantic parser..."; - pipe->Train(); - pipe->SaveModelFile(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; -} - -void TestSemanticParser() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - SemanticOptions *options = new SemanticOptions; - options->Initialize(); - - SemanticPipe *pipe = new SemanticPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - delete pipe; - delete options; - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "SemanticPipe.h" + +using namespace std; + +void TrainSemanticParser(); +void TestSemanticParser(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + + if (FLAGS_train) { + LOG(INFO) << "Training semantic parser..." << endl; + TrainSemanticParser(); + } else if (FLAGS_test) { + LOG(INFO) << "Running semantic parser..." << endl; + TestSemanticParser(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainSemanticParser() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + SemanticOptions *options = new SemanticOptions; + options->Initialize(); + + SemanticPipe *pipe = new SemanticPipe(options); + pipe->Initialize(); + + if (options->prune_basic()) { + if (options->use_pretrained_pruner()) { + pipe->LoadPrunerModelFile(); + } else { + // Train the pruner. + LOG(INFO) << "Training the pruner..."; + SemanticOptions *pruner_options = new SemanticOptions; + *pruner_options = *options; + // Transform things such as pruner_train_algorithm + // in train_algorithm. + pruner_options->CopyPrunerFlags(); + pruner_options->Initialize(); + SemanticPipe *pruner_pipe = new SemanticPipe(pruner_options); + pruner_pipe->Initialize(); + + pruner_pipe->Train(); + pipe->SetPrunerParameters(pruner_pipe->GetParameters()); + // This is necessary so that the pruner parameters are not + // destroyed when deleting the pruner pipe. + pruner_pipe->SetParameters(NULL); + + delete pruner_pipe; + delete pruner_options; + } + } + + LOG(INFO) << "Training the semantic parser..."; + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestSemanticParser() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + SemanticOptions *options = new SemanticOptions; + options->Initialize(); + + SemanticPipe *pipe = new SemanticPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/sequence/SequencePipe.h b/src/sequence/SequencePipe.h index 72a0d58..2ee5d6e 100644 --- a/src/sequence/SequencePipe.h +++ b/src/sequence/SequencePipe.h @@ -20,6 +20,7 @@ #define SEQUENCEPIPE_H_ #include "Pipe.h" +#include "TimeUtils.h" #include "SequenceOptions.h" #include "SequenceReader.h" #include "SequenceDictionary.h" @@ -117,7 +118,7 @@ class SequencePipe : public Pipe { virtual void BeginEvaluation() { num_tag_mistakes_ = 0; num_tokens_ = 0; - gettimeofday(&start_clock_, NULL); + chrono.GetTime(); } virtual void EvaluateInstance(Instance *instance, Instance *output_instance, @@ -145,10 +146,8 @@ class SequencePipe : public Pipe { LOG(INFO) << "Tagging accuracy: " << static_cast(num_tokens_ - num_tag_mistakes_) / static_cast(num_tokens_); - timeval end_clock; - gettimeofday(&end_clock, NULL); - double num_seconds = - static_cast(diff_ms(end_clock, start_clock_)) / 1000.0; + chrono.StopTime(); + double num_seconds = chrono.GetElapsedTime(); double tokens_per_second = static_cast(num_tokens_) / num_seconds; LOG(INFO) << "Tagging speed: " << tokens_per_second << " tokens per second."; @@ -158,7 +157,7 @@ class SequencePipe : public Pipe { TokenDictionary *token_dictionary_; int num_tag_mistakes_; int num_tokens_; - timeval start_clock_; + chronowrap::Chronometer chrono; }; #endif /* SEQUENCEPIPE_H_ */ diff --git a/src/tagger/TurboTagger.cpp b/src/tagger/TurboTagger.cpp index 7b2068a..a308b92 100644 --- a/src/tagger/TurboTagger.cpp +++ b/src/tagger/TurboTagger.cpp @@ -1,87 +1,85 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Utils.h" -#include "TaggerPipe.h" -//#include "StringUtils.h" - -using namespace std; - -void TrainTagger(); -void TestTagger(); - -int main(int argc, char** argv) { - // Initialize Google's logging library. - google::InitGoogleLogging(argv[0]); - - // Parse command line flags. - google::ParseCommandLineFlags(&argc, &argv, true); - -#ifdef _WIN32 - google::LogToStderr(); -#endif - if (FLAGS_train) { - LOG(INFO) << "Training tagger..." << endl; - TrainTagger(); - } else if (FLAGS_test) { - LOG(INFO) << "Running tagger..." << endl; - TestTagger(); - } - - // Destroy allocated memory regarding line flags. - google::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - return 0; -} - -void TrainTagger() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - TaggerOptions *options = new TaggerOptions; - options->Initialize(); - - TaggerPipe *pipe = new TaggerPipe(options); - pipe->Initialize(); - pipe->Train(); - pipe->SaveModelFile(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Training took " << static_cast(time) / 1000.0 - << " sec." << endl; - - delete pipe; - delete options; -} - -void TestTagger() { - int time; - timeval start, end; - gettimeofday(&start, NULL); - - TaggerOptions *options = new TaggerOptions; - options->Initialize(); - - TaggerPipe *pipe = new TaggerPipe(options); - pipe->Initialize(); - pipe->LoadModelFile(); - pipe->Run(); - - gettimeofday(&end, NULL); - time = diff_ms(end, start); - - LOG(INFO) << "Testing took " << static_cast(time) / 1000.0 - << " sec." << endl; - - delete pipe; - delete options; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Utils.h" +#include "TaggerPipe.h" +//#include "StringUtils.h" + +using namespace std; + +void TrainTagger(); +void TestTagger(); + +int main(int argc, char** argv) { + // Initialize Google's logging library. + google::InitGoogleLogging(argv[0]); + + // Parse command line flags. + google::ParseCommandLineFlags(&argc, &argv, true); + +#ifdef _WIN32 + google::LogToStderr(); +#endif + if (FLAGS_train) { + LOG(INFO) << "Training tagger..." << endl; + TrainTagger(); + } else if (FLAGS_test) { + LOG(INFO) << "Running tagger..." << endl; + TestTagger(); + } + + // Destroy allocated memory regarding line flags. + google::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); + return 0; +} + +void TrainTagger() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + TaggerOptions *options = new TaggerOptions; + options->Initialize(); + + TaggerPipe *pipe = new TaggerPipe(options); + pipe->Initialize(); + pipe->Train(); + pipe->SaveModelFile(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Training took " << time << " sec." << endl; +} + +void TestTagger() { + double time; + chronowrap::Chronometer chrono; + chrono.GetTime(); + + TaggerOptions *options = new TaggerOptions; + options->Initialize(); + + TaggerPipe *pipe = new TaggerPipe(options); + pipe->Initialize(); + pipe->LoadModelFile(); + pipe->Run(); + + delete pipe; + delete options; + + chrono.StopTime(); + time = chrono.GetElapsedTime(); + + LOG(INFO) << "Testing took " << time << " sec." << endl; +} diff --git a/src/util/TimeUtils.cpp b/src/util/TimeUtils.cpp index 5be6315..4aa53b7 100644 --- a/src/util/TimeUtils.cpp +++ b/src/util/TimeUtils.cpp @@ -15,64 +15,5 @@ // // You should have received a copy of the GNU Lesser General Public License // along with TurboParser 2.3. If not, see . -#ifdef _WIN32 -#include -#endif -#include "TimeUtils.h" -#ifdef _WIN32 - -#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) -#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 -#else -#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL -#endif - -struct timezone { - int tz_minuteswest; /* minutes W of Greenwich */ - int tz_dsttime; /* type of dst correction */ -}; -#if 0 -int gettimeofday(struct timeval *tv, struct timezone *tz) { - FILETIME ft; - unsigned __int64 tmpres = 0; - static int tzflag; - - if (NULL != tv) { - GetSystemTimeAsFileTime(&ft); - - tmpres |= ft.dwHighDateTime; - tmpres <<= 32; - tmpres |= ft.dwLowDateTime; - - /*converting file time to unix epoch*/ - tmpres -= DELTA_EPOCH_IN_MICROSECS; - tmpres /= 10; /*convert into microseconds*/ - tv->tv_sec = (long)(tmpres / 1000000UL); - tv->tv_usec = (long)(tmpres % 1000000UL); - } - - if (NULL != tz) { - if (!tzflag) { - _tzset(); - tzflag++; - } - tz->tz_minuteswest = _timezone / 60; - tz->tz_dsttime = _daylight; - } - - return 0; -} -#endif -#endif -// Time difference in milliseconds. -int diff_ms(timeval t1, timeval t2) { - return (((t1.tv_sec - t2.tv_sec) * 1000000) + - (t1.tv_usec - t2.tv_usec)) / 1000; -} - -// Time difference in microseconds. -int diff_us(timeval t1, timeval t2) { - return (((t1.tv_sec - t2.tv_sec) * 1000000000) + - (t1.tv_usec - t2.tv_usec)); -} +#include "TimeUtils.h" diff --git a/src/util/TimeUtils.h b/src/util/TimeUtils.h index 974a719..955e9c2 100644 --- a/src/util/TimeUtils.h +++ b/src/util/TimeUtils.h @@ -19,26 +19,6 @@ #ifndef TIMEUTILS_H #define TIMEUTILS_H -#ifdef _WIN32 -#include -#else -#include -#endif - -#ifdef _WIN32 -//#include //I've ommited this line. -#ifndef _WINSOCKAPI_ -struct timeval { - long tv_sec; /* seconds */ - long tv_usec; /* and microseconds */ -}; -#endif -extern int gettimeofday(struct timeval *tv, struct timezone *tz); -#endif -using namespace std; - -extern int diff_ms(timeval t1, timeval t2); - -extern int diff_us(timeval t1, timeval t2); +#include "chrono.h" #endif // TIME_UTILS_H diff --git a/src/util/chrono.h b/src/util/chrono.h new file mode 100644 index 0000000..eaeec74 --- /dev/null +++ b/src/util/chrono.h @@ -0,0 +1,106 @@ +/** +* @file chrono.h +* @author David Alberto Nogueira (dan) +* @brief std::chrono wrapper. +* +* USAGE: +* @code{.cpp} +* chronowrap::Chronometer chrono; //Declare a Chronometer +* chrono.GetTime(); //Start timer +* { +* ... //do your code +* } +* chrono.StopTime(); //Stop timer +* std::cout << "Time: " << chrono.GetElapsedTime() +* << " sec." << std::endl; //Print duration + +* @endcode +* +* @copyright Copyright (c) 2016, David Alberto Nogueira. +* All rights reserved. See licence below. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* (1) Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* (2) Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* +* (3) The name of the author may not be used to +* endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CHRONO_H +#define CHRONO_H +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace chronowrap { +class Chronometer { +public: + Chronometer() { + time_span = std::chrono::steady_clock::duration::zero(); + }; + virtual ~Chronometer() {}; + + void GetTime() { + clock_begin = std::chrono::steady_clock::now(); + } + void StopTime() { + std::chrono::steady_clock::time_point clock_end = + std::chrono::steady_clock::now(); + time_span += clock_end - clock_begin; + } + //Return elapsed time in seconds + double GetElapsedTime() { + return double(time_span.count()) * resolution; + } + void Reset() { + time_span = std::chrono::steady_clock::duration::zero(); + } + //in us + double GetClockResolutionUS() { + return resolution*1e6; + } + void PrintClockResolution() { + std::cout << "clock::period: " << GetClockResolutionUS() << " us.\n"; + } + bool IsClockSteady() { + return std::chrono::steady_clock::is_steady; + } + void PrintClockSteady() { + printf("clock::is_steady: %s\n", IsClockSteady() ? "yes" : "no"); + } + +protected: + std::chrono::steady_clock::time_point clock_begin; + std::chrono::steady_clock::duration time_span; + const double resolution = double(std::chrono::steady_clock::period::num) / + double(std::chrono::steady_clock::period::den); +}; +} + +#endif // CHRONO_H diff --git a/vsprojects/util/util.vcxproj b/vsprojects/util/util.vcxproj index 842f2ba..1e9f992 100644 --- a/vsprojects/util/util.vcxproj +++ b/vsprojects/util/util.vcxproj @@ -175,7 +175,7 @@ true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed true @@ -197,7 +197,7 @@ true false WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -223,6 +223,7 @@ + diff --git a/vsprojects/util/util.vcxproj.filters b/vsprojects/util/util.vcxproj.filters index 546471a..1de28f4 100644 --- a/vsprojects/util/util.vcxproj.filters +++ b/vsprojects/util/util.vcxproj.filters @@ -1,54 +1,57 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + \ No newline at end of file From 8bff77f145234bd2e4fd0877a499d22b846e7e58 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Mon, 28 Mar 2016 19:04:02 +0100 Subject: [PATCH 16/51] Update MVS files to offer native support for MSVC v140 compiler (distributed in _MSC_VER == 1900 (Visual Studio 2015)). --- deps/AD3-2.0.2_fix_for_MSVCv40.7z | Bin 0 -> 800683 bytes deps/gflags-2.0_fix_for_MSVCv40.7z | Bin 0 -> 292611 bytes deps/glog-0.3.2_fix_for_MSVCv40.7z | Bin 0 -> 332535 bytes deps/googletest_fix_for_MSVCv40.7z | Bin 0 -> 415985 bytes vsprojects/classifier/classifier.vcxproj | 14 +- .../constituency_labeler.vcxproj | 6 +- .../coreference_resolver.vcxproj | 6 +- .../dependency_labeler.vcxproj | 6 +- .../entity_recognizer.vcxproj | 14 +- .../libturboparser/libturboparser.vcxproj | 14 +- .../morphological_tagger.vcxproj | 502 +++++++++--------- vsprojects/parser/parser.vcxproj | 14 +- .../semantic_parser/semantic_parser.vcxproj | 14 +- vsprojects/sequence/sequence.vcxproj | 14 +- vsprojects/tagger/tagger.vcxproj | 14 +- .../turbo_constituency_labeler.vcxproj | 12 +- .../turbo_coreference_resolver.vcxproj | 12 +- .../turbo_dependency_labeler.vcxproj | 12 +- .../turbo_entity_recognizer.vcxproj | 20 +- .../turbo_morphological_tagger.vcxproj | 20 +- vsprojects/turbo_parser/turbo_parser.vcxproj | 20 +- .../turbo_semantic_parser.vcxproj | 20 +- vsprojects/turbo_tagger/turbo_tagger.vcxproj | 20 +- vsprojects/util/util.vcxproj | 14 +- 24 files changed, 384 insertions(+), 384 deletions(-) create mode 100644 deps/AD3-2.0.2_fix_for_MSVCv40.7z create mode 100644 deps/gflags-2.0_fix_for_MSVCv40.7z create mode 100644 deps/glog-0.3.2_fix_for_MSVCv40.7z create mode 100644 deps/googletest_fix_for_MSVCv40.7z diff --git a/deps/AD3-2.0.2_fix_for_MSVCv40.7z b/deps/AD3-2.0.2_fix_for_MSVCv40.7z new file mode 100644 index 0000000000000000000000000000000000000000..a72e920fb8fa7ef4705198db18d759ca500900e9 GIT binary patch literal 800683 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

_gC*xyqD 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

qhIH{fq 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®L)3Xd7h!iG;|+^6peCO69wwrLBYFwX&z{%f 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%0D$FI4!8eu=D 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

HsZv4C~Ul`P1kc~Yf-uDI^duJGH#U$QE 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 literal 0 HcmV?d00001 diff --git a/deps/gflags-2.0_fix_for_MSVCv40.7z b/deps/gflags-2.0_fix_for_MSVCv40.7z new file mode 100644 index 0000000000000000000000000000000000000000..d64e145902cfd7f1265fcbea64e88febdf329b33 GIT binary patch literal 292611 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

AJgJt>@n*&iT`YaOh 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 +UOAcbL>TwXbXb4h#l938`?axovu~&?#<^ZI-q# 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ℑ830!=fQ)EJn8AO(qX0+{-BI!ror33 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 literal 0 HcmV?d00001 diff --git a/deps/glog-0.3.2_fix_for_MSVCv40.7z b/deps/glog-0.3.2_fix_for_MSVCv40.7z new file mode 100644 index 0000000000000000000000000000000000000000..8aac174d62ac9e9e8935863c3b77c990b7823d91 GIT binary patch literal 332535 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%0A_k>6F8`8*>VXkze`1Rj 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

4D0UCfW=NT(3ew#!NB9G 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 e8T273A|cuAhqw{57}CGg>sNQys{1<8|k zS5sGq-$-xq<*<4Bm#pHi4l|km z9Z3jSJ%f+KUL_F3iq`3W03H$zL^&JbmiX%M5!ksQO{3=Mf>z?*g(gEpHk9)wZtB}*d6D$1&zz}F*wSua0la(UG7!)){2o#=Sf6i53S)lcV& zn@Na?yY&^DtMttQ#mUtHB_)CnZlfrDDznodqc7d17F9XN}Ln*o*nR%I1gS( zXJvisNX~`#)5w0KrwZRhJnL#u4v&G=3-s zU~^^*TF%=`3uhG8e{zZIm#XPm+)nOR*ous%-NW!9kmsE~%j!KUy&3avsUW=1zXDY> zS|y2+3;5uNd4Qz9@QijY~rCfn{lmSAPHaVaMWaLt27Pl z;6x*<4x8MMV^|^IU}`XdHHHT>hS7#(a7APaZlH)Yg{J3D|LbM{`^zfUsl=uWVsKMR z$l{nREONs%Anq4;;D@tyYZemH+mMlf%19=rcUEeF~bNq?npA& zYVH*1S=s#Exlq9k(*2FDa8iwjFN){~pq>uuu>tiEUu@E{?K6{1)?g@@66!*fF=qk4 zqD-kHmrjY~`O4s^98o~Hi1tOP-tdj%gM=Y(u4Zp8DxzNpX*0)Xl*baW%^w#*c3D0* zPTy#LE-YCBLbqX0lOu=j3fG9GjX5ABzK}f8&{=a~2muJ41s!&A*b&sQ(KGINHNwfL#LbZ92|Xtp&ismz146?Hh4?(l#U19|R7VDU4_gT% zTlQtbV?1}VU3bY3@3RU-ptWdKC+aXwpLI$_60%MZs2=lnv2KK+xBiIu$zoKXjj=i4 zgbQxW*BCUS%TYYumoXN-#_tO7hX6%FunJ^y#*6J{anw1yz(Up;G#FAdwJdOYL@vwU zQDQFxm@Zj_U!FaseQB^7ZRSkQGc4lS_5scnbIQVAL2d2IA@Sfp2=BUPTa!xGfXC=1 zS?8c;7X!b8AIm;a6s;0{yM-Q|0)%Y=POG zrFqr*yY#ukxyvU_2Mvvdye|0pF`VRWq0(q6oFLSF`+)dU2IoO?$Lm(!dUZvllwJ2e z;km-MLv#Ut?7{MM>RDq3tE-RzsJQns^M89V2>`wl@t3t{k&iqMrCR+^a3vP(v6E@C z3Cw68x_1SG2qW|dc>Y8KA`{#g4mhyOf0I&&VMQlm4uifVk$E(RQoHU zUkz7*T(ESag~QE0#kl`(H3Gk^lfOxmerk7e{QSalz6d=GXKZ*&C^+g4{bukngkvZskuH8vrW5BB~U(h#J43i?zOIleIhKk zA2B6pV^YLwd(MTpNAduak+MR`rJU*^a@!q+U^jtgfPQQH_0Ea{smv`1uRoc*r53&6 z98=Y+aJnWiW*o4G61embG~&;?DSfJ51icyJOXxqh7NJ#!zU>YMiUTtuFPf#HS0+rn z)-LbP`^IAG5AMINn?!=lb*BLG5YDA#l)l)=$WD9g2;SYd*E@ODHB&(EIGW;4_K~r* zLw!=N7BdS8bmE71xsMY*1C{^fK8{)Bgn(yJ?_}iZOOL`Kpm*lpSV6o`^v*@fCj9hS zfF{C98?D@(b**Xv24GX->h=(MkC@{$jans#GE5K2JQtHugjE(_X{<05K+3f8HOIb8 z$%yG$I%Ad|A4Q6h0<%bI#>Whua0n!G0_LzjJ~jf8#LjHjWQ={_6HDZ*ZoR4<^A_|L z+R_rIUSJ}rpR6P<PX#MH>He-PY<-nzdIGe z?7{*MQ6+Qr3JbY|}Z)8$!cMCG?yHpUH8gr*Oh9mjyOs1XM z9)A=zxpiI`J>FPYWM`1hgX7)b}e#a&RUJ>i>C7~(z&#c>v(mBX6n0%zx9V^vEv6HBMTBogUgsYY)>G`Pac@s%{RJcrJG#v zYrB@kYZy2?f@O3%WXH8x3$6g(C{ha$Y%+-{tu{Wy&cj-u(M3$)R+*02XX>DYwD`)v zlsJ=E?!t~-)#%;k<+5)~4)3{El^9y+Tu&UW<6^n9lUXRU41qM;9FYyF zXRElN34P!E#>;Z$t46l=AjR&aa_z#w5n3mbJSz*>AyYeD-kk51$TuhJkPWn^gXS(N zN8ydAmQ~Q^Oim;33G4Sh_>08{hnbUE<3rtKqToP`WCDRkG*Yh#N$_TtEO(>J!J$gF zyM}?)bvZnw(eyXd{g6;neS*lsZt zHgF?10k4{-PH+=J`ujh#+Z*cm5FXij>(ZHaW;#6$n0Y8SlOPM_AjqGi!$iROk~1gb zt-ISA;>9ey*4^bg)k^@7>vw9zo4~;;Z)QAW%+u{|X}687=+-xMux4C4|Ha?)TjTWy ziW5QvU(`+3#dg$c!-iaJ26Cm0beI&BzLh&Q|3|y(Q2Bnnw_^+%83`j47Mi+AC_tYC zd|^Hl`_slRcm5q>e1csp#Tq6?s`BRsrI+BMrl#;+WbO=}!Bf2Q87VF>YBE>Qaid&+E9;EsK8fM62mRN+_# zEWq-ERpq5zh;9|NvPiH^y?dj@x=?yfA;01~4&Mp5)j?R<9hQ+zs19?1s_<_?h8CA1 zVa-sgPvv*3o$x3595uLT%$QT>Qhtv2`?L;rL^k@|0Dl5>|CqJzeh3%DLN;%(Hcn57 zwTK12`W1MYZ@Q0ra|Y!#yPm8M%=htsc4kecFVm0HxEe7ochtbaRw@sYv~B_47`7PG z+=3dwn)-OpZXxg@2SAmGTFh{43QxfmDda7mX$a&G&MKIgt0a zp2=S{t$!%q=`SKW1&JHCQc7lZzL=MB6{dL&50F*J=(K??pdt4rPgWz@RzEOnzHKbv zr~<)iN(vx!>-N4-vN(a&OH3_mPkb=N_Q_h*$f*oNm=5-%kbk49pL>H+EkyP&n zdW1WdRCTbtFgdQ`Et2`}Xt#pgc+R2$VaT3Pqx~ECvOUz-$2Xd9IAfeBxY%yjn!Y`M zV+>a3Cm(`_*#{U|{(qzXEB?W%b|S;(1Nng7%VP@0cp4Q(u$ zTo|~xCz^u8azQX%6KL$nKfg=`o)MbqD9r5rryG?VR8Zh94&B74m5Vz3(AyVGyb}VJ z4j&S=)W7jL76z)B#2_J4YCQKD&Y|9Nv{KH0uYX3n2$PBzxjrng+KzK^5ku#%YuUI0 z^k6fMcitHLY+Z8944MZFatAmW z`V&+TThj`m*O(ljNxsUiq^U(`1&;y*FBP8Mq1ZeT(BYsP2obOjU^7Q8bcwWq=qCgT z-4i?Ds7%B~eK>Y`eQHq$_9)4+Izk2aFED~WApkT=j~kDEijM{je4FhWZthwA));Sk z#nB>N2X-szc)^2PDZPTc;QYD8il&V{?)L z_aoC}Z8PkLhOpZGiG3czDFwnNq-l`3G;`y#T6T7G_ZKu;AIz{TGSJ5TG%bI8`T<2R z)^U&tZPGu>W~_vddiHCPm|#j+-cfNDcm4nX-p-&aLZS}q;xI9eYl26Nu=!;Tb!F{> zDafmw9>0O&(K4^z2ldD@sHytVMC#rY(c&MroL>g(KtC4*ahyr?OJJ&>rT=nKl*@}w zr6s?g3wdk&9c&>au2g^3pL`1L0>)N#)aPYWchLXdLZ91F-F}Yb3l`I2W@#VseteOF z>X7Lk^7_@h!#uaZiL|F{Gc@KRXIVg+-X@#7leWr5LZ6uf6|6aZ92r#G5=_C|9}JqW z1$hzcps-!?V3_U}jryG^<22J#3JccYV>bO|upu+K%!Q+c8Usi1C%)WL8yT1YMvYd7 z&(Lsr^ObMx`?kMAK;%jzBfWtW^55czg42QJo0FTbl~_MCP%AQoJf_ptI`+qZ(ootF z5B7|5H2b(<$z9kwfwItu$lu=c{xqRcn}k-aERk)21>alp6CJLByJlcurZXytI*q7N z3NMtCgsE18B(>mm&YDHvTDv4;pxZ-$39RTrNhnqr{ndQAU_s@ZU{ZC0>f%6aAD)wb z@Je{1s(;B!>~^S>Y6mHyiYvrScxx@)e_s+!5(zBAxA0xQTV7V6W9;5gC1s-lM> zDUSjbpF^-L1_4#jxjF4)Y@#To%PkufGvVxF%T5X_>3LO6nf*`Li-r}Kgx1S?YlcXk z@~f&>D3#$f13;QfBV-ZI&~b#UE!|Nr6h{HtXTVC+R}3XXme&$4-H9!OIzQ97YsyZH z=a?U6g^YGJ%S2J8_VwhTBqeiNI|#tRTp4U*X{6v!b8|!61qhrPUz2%Z#4JrtpoRpj zGP$21mV~y3TP&HENUjIeMJ~5F(Wq#qmwMS}$p=D4ch%M;a6d3VKDz7VF}F#4Ptr+g9`4*$TCS;Zy8pp21bU;!AyWg^D#F)Bzp z#SXKj8bRsh<9|vOKpyyL@^d5)ODCqtk+B z(m95pwb#gksc3v9g%azxvuz=?v>?deD4NNF=T11cCk18*00d3uTxzx~t;r^cT(r{8 z+E;##*dkc{--U4{$)-MW$PXA$5b(brv;m&Dio}MfZ}tPuA(zbSxKG{8j#b*EEGjaX ztwZ<_p$ZpfzVyYK?r>{s|AnVPX=>zrwInXKzYaW#gqa7ffa}ASkIg5laX1gj%{49{ z%J#t$S8a7A2HmB9Z^oT;IEnWO4wnb+xz>Giu3PLhaDHCSwUI7?K0EP^_)zZZS(9-t zlFrMTV)d#a#vE^qf5wbYRJjUGP*PUo2CevDp&`?3Iya6CgjO}rCgqMocH9!U+3=Vn zZFRUO+;P>NJ&gcucj7QI@&&)W_~pR+AuRwVsq`DrKV>e~4#zO@ypH^|;O54~Iyx#P z6u>BTSCSm3XfSs21l8VHufjR$mqif`G*l<3fSlDM{T-=4p)HoH7+P9KPOWpH1_Tl# zv4GIPE)(%x8&@Ey2?ZVs8`6whn)}?k7oIg~)fY*;_R~Acq^BhC;)cDK8@>2CPXiJz z;^j*MGj12|`ajZ~Z1#vKFGNS8)T`FlA%3~bID0t#oCZy@aFxVnH0)919fah)bC?b3 zb`#3`euuhC7sNzNe5mDf0US_cM;tCQLHZ?m|9;~E0Vo{1N1JmO45IL$BqBY=%n*o; zTz(wyt0b&vwmKhbH6*bt&`O23Egiu!Bj@-@J-Gyl)4QJI*!}5plAhS6Q*gg;KptsNKW_h?!5Mn1%FC)*C6~zWU!6M;o0MOhVLq{j z=&L>R@3Ir^F;3lSxM-b@#iAR$fc?l#wbI4$giUB%L@^;ePGn?7T-RS^se98cb2~oC z?c4z_zg}i#u!uDotW!b`*-t|-KT&hJZWEZ?jcGLS74GleVF;C zGC(g6Jsf@6F<4EAy?ZdwtHBpd~@Sq>!8zotTQ9jIK?TO zgmL#(WW{HTAtM|9SODK$WXd27=n9QnXQ{uo4EOESR4EJtfjIkf0{7Xt1{D1Y#cT4v=ViEvVZc6t4KZv2BuO+e^d$^I+lD^Nm4M-b7hIx%vUe|5J|U1d2Ra z3tuW+fXK-H-$c9N0gvZ+{8{Y%cU`c!)9V#^>u8WvU~*#GLB#@CWF^Ygc$-_Bdk%KBt`rlv1>aK3LP2_Qu}KcD;!6ox z%vm|TC7REN<15wF!KB2GWc*v+!AL%9X|;3KHH}B#_Vl(@H4)Z!;H+!39?|@u!B#49 z69hp3?w1wfSNIf;E2P1)>f?S|y$W#w5@032dIjWoS&)q7W7`k{OEBenYu=haKl9qV z2Sgb;fG5)RT6@h1PBAZc_So)g4bBr(SLhG5x=owAX0N!6MwspwUqF;B^=>Udf}H2p zn3XA9v0!aZ2fYbb)9VGiT|kH`skRptp-K)kdX2@NBOqZEx(U1xfhv>z(thwkr48o= ztQJhgVqM^~X~$VDb|hh1(|n-W)>8-(0C=F9qdpuyswI>Hv|_UN*B5;;)^)jjS@TeV zWTOxa^H}YP8a&Rkz!-_@p}fi#l-vf|fkn<8A?){pvx)F;iq!?T+qnH%nv3tI9iE!q zZbb@>N&4^WYWD1k3OY{YhQ2`@}gimH4_E$i~jdAXsW z5Q;l(AWp7IOcVP6Mec1viD*1fH5S~r!0=%>24MLAm?tVlt6)6JHIq6f;j zgoGr`2@{_kIU_+)f&YV40XVg7E;OOz^-q`tmLNnI4CeMk_)nwlx5E@}rEDX2D~P== z4J;2;p^q})E;jr9Y5Pr9^`2G^a47gPjvR!*3v;*+ zB2*~G3|=EDDXvz?btlu(7&PmPTf>I9Dg$X2)L>z ziIARC?*-2F5-nW~CA`B|2+P;|bPcZ>N~t zB&vaWiq}#MU5jN0`Sv4r`?`>*9~5TBXJgI45hy`(ATcynQG*Sv)kA+#ZYionoum-N zoTzB8@Q3J#GC2rARaS1@PBX`t%Qv&dAXOhel2J-0Y2knf{a`{}&$W4L$2=U?0H%ruWWBf7^wDqnsm5j`(`8lYfeTo#1Fmyo{a zfsazRRPrtTLHYF{&bNSchg5vEmk({bJ7$n_M8S})s| zWNY$`3cNqYwhHRiRtcjGArAic0_aAV&p6r>cu_4{of-?v@D-YysOL&+?AOy3x@~n| zMpgEsXVN&^9&`a|e|1r_>-q*&VqqE(>&LrDLIy0?sh~AoNbHWpyD)prrlnr$0i|i> z8miCrk7M0EOq8(K?HF*?jqmBe|UsM@NLS@BXlsqG$!y}9oEpEh# z!v+t+FrDN}I+_7`Q+2iM$_QhG2cj=X8aKUFLjRT8ZBbi|TOkHgiS6L71C#DL$sC=iqtF_pT!FZt)HQdruZ ziKP1hL%%6M38oj9sIoX+xJtUI(y$y0lYA?$S448zN)KgCNrZ9HN4(7KzGxn_QlD;D zXQQd*RZVvm9-PmL$l>eG4hSV5!y5~_^-mVlk!9J(N)Uj4i{=gcyM-8;mYJWt4}xdi zFkgN5sgZBM8Zh8ftE{h5lbzeqq4e=<>R$EF@O`Dj@mm};OM9;}Ao2j#$BsB0;e1T0 zzbnA(b0iRtJNs6pyc_1mCOV<33*va0nN77);#8%#b9Gocq(cI06AerHPgd`i{POvh znCdZ({!vf|NR{kYY_Y&=M?JF*p$TP5JhV{}k|bU`v0BXROCnO8Ga= zOjPuB5QRX}8E@)o%;)#Ug2`#OLcl@C_|?cJFxUMbY1TCrNJDFW7aSV=+adyrAoL(l z{DmcI3I=bL;FQnPHV~bF3ICnsh2Rp(u4;DeB_Z%05_n}RDa|$Y-8*2{=rm_$S5ZT+ z!20B-Z)GVx@FXe}A1|=*_-Rki&th=MbnydCSp0#`$gAUc=}81dcSv7b5K#sUdGk<| zE2{OIvpZ6i2HNE^Q>KJ1O?ngg1>E{eIvaC$E-S_Zbj4X+lM@VRxwoGGuUEfbDfjkP zY6VbT(bR&j*o`p&DQ(Ju8czK^I#Uu^f^chV?o23Gsf;6G`j3}8>7V*ANdL<}8_gw4 zr9>&RwrdZ@Et5gks$ujM!%rnouLHO*KT;uszO4%OgSz~W25QwBIQe(Dcw8RMtGcm^ zV=+Yp+nIwDmMLCBtB?>(Ub)n@?H$K5@ffan(q|nfl|zRW}-jFV4 zJE*(@UEBi&(c5R(sJfQ*|EN|Xk1>Cl1BIZE#;z2ZHK zj~$4QeA4klc;b-;M^aU+#lutjE+l_|cOzjU6v0u!o5d-Q;75#)*I<#qw4eMf9Q8Li zxe(RQ=DSJcxLs*ff8ZVFt7S4oJ_okv!^+&!*mqm5NWE5v|C$+IvcPjO0jPccq9B@| zaBti8D-;jojdK+lA;4It0@5~aRKD6s1oh9C(=NBNqNuJ|%PjxHC~2Ay!q6y4u_*~E z597$H)naNGR&u6eON;@^{<;DjRO2{G4(H-f!vBH-V)t?tU*W-BBKd>wGl(VXmFc${h%!Zl7Y

jHN)OVIp#ef$60=3)(xGJtI}Vu?}@1hd@HdW*3fB7%UK ze~t%UZX-P5Kb1x&o8r+c3pa(s!$NI75TFgNmmW-`120~|5rlGH6@z85K?&O1SXKls za}TU+GUy3wK3E-YP~OO@C+#(jCu!a(K%2aQQuF;P0op|`1ig1K#o`Uv|6J-KuPH=u z*k2w1X;;J*D&?GYD+L1N#mxJ)VG|5caNT1f~yfk%Y)g8;bPS-xZRD0>alc+RCJ zV|R^8Cniv29{bq(=o|~~n3Ago?t>nIV2}bs3{c+2Oe+DL2%POrra{_}FMPx4QrzV9 zA|6V`MA#edI@*K-#1a+cmj9Hmwq%1rP+<9h``g#Q}7&|p8 zKcYyxRD2*)b6x(w1j5JC8X6~>pD|Z8Rj)-?PkF!Rg*t;sr^gmkITd}bW)0bkt?5wx z6uu!Om)@Dgox4>#Ne?AbIe6TS40$Nr7>6MC7F(F6R;sl)a7a;m-B0M|f6p`DU^6$NubinxHt@jyJ5lSQHHVONKr``@a#=zt`eFb!V?= zta}_ZOhqH=uWU$q>Xh(#It(g3Ol6luvUrk1!q+2^zsFCk!J6tnhGN3+vA8o2+zfOS-Hge{1JZ)?SGQHvuqYA|0!c zm!cWRi`?UFzBGuCyFc`joAfzd2n@HFaP!x9&5InPGZ-8EM{oH|oQ{{IFp|HWp28+x z=oZ4G-}^OgqEad8V+a-A$27~$C`^AyfTqhGuk>Q_(VWVt8dcq*^?!F&sV^z&e(8jC z7xP?0^<0Eg3g4)_2;fDt5V(v10rPQU}GWpcH_srCt093Y2p#^`r5#$>fGA z@F`t%69I~svU|mv6H^*tG|-Bh?`k4#RnUEo_pkR4MfR^XNVY4fzrJaT(y*x^Wa~u~ zlxA#}(?wi{CvrC19!Ox#UqXrYzB&0bxjVqKW8#t;cQBf1qtEJubfv5GLb(5o-S4iKwQ z3cHZy_y_?&4y{-!;lA*8rXIy}6Z1yRjMbN0pnJS0x?dzC* zYGHz=!YF73Sj3Z>p_Z=Ac(1HdEwCjwtyWS+teQx@Ag+(cl;n$eE$USA16hw(8J^jxr!iJedApdk0Q`;+KsnB3Yi_Js0U%TMn<#;tWdj$y%_;wQc70} zhliNz1T@bL0D>5!VX1dwUuxJw8b!xq-|am(7@ECd6ya9Eb!9u?!dM5XAbYzy&|_Jr z24M#F&2pEswiR%)IDE)N-uG9^b>L%C5pWw;6YdYV{VEoQl(+XEA7sNnW!I``Xk=(ThZ0d9;LYKV*wS4Ki;fjS889riOK?pb(a20)VOepD#e^!(p8qF3>%R;lf_W}LtaX2cc7S^U+m%hC=gV} zr~EaXq0TbpyM9D3Hx9q7Ffe3(cE87W-%ldDQZ(elG3;vU=DY+#B?NH{2KUE9au1Qj zMA^M0xoa`C9!FVDT!4CjL%>UThledi^?Cr%+llvKKkvWU$qQWe21lr3e+LQdJ!79L zdVhF%3*%ITauC(Q_cBEJ9TwYtmA02Zp8{Utx5WpTT9LLBEws7ex{ssL%90PjtmkT~ zrn+ObuQd}F&USswGRr7V4h#IOsb=3=6%v8Pjfo@hkKen+!0fp8X<=7vP9vWC(JzZi zD-U+0Q>$7021YlF5Y|{BdoUC?0Qq;HRUqheL_irY5Y1B&vhK}Rmz;h^Du%h=zS%c9 z+OG$^`Y9>=mFgnhCk7nXYf84 zgyYx3-L&5#xCej&8Ha8OGz2jDU+*XyaQ{xuPHP%!*uVI|WZVh{5k`?4t8TP-Q}Bd( zBPv<6uO+(S6XY<;((^y~a6p!O@h6D8dkUmt@ob;z`zj2l{UGp^ga^^FPk|dQl(9yi z)xEc=${)_)k0BUW!#Z}dw4^oy$DQ5ojBTP`KFzsZ$KIh&DKqbg{#lZF2fMo@OGu+J z!iq+GUWBRo^xV`TEw{ zqe6OaJ_#BSL_NW0w~Mb?{|HjuH&t};FfUMI=fA;QiShO7OA-y%LhLo!PaQs5?nA_t zC62LHVqQpm$r#2=7%f9B%-wB{m!~)-88$Nv`oBszCBEg#?|y4RTM1zsM>hcot&L&a zyk_W7ycy8_0VRm+0+oVMX8MqB#B=uD26!ywBMGnKoUM|On8#(!q6IB_l`A;%mP25f z^5Udm-m^K7Yjtde3K7*k*%Gb$lSl5}7=)BZb}bUy2Q2T)2deM!fy|1ot{yvQT@)&S zF*L#;(Zd5NkbW_MoKEIOLoW(X_gLN=H&aCFe@N*@hn?Ftw^(P7=>a>O`!iP*Z-L_~ zynW(F6cs?xpPNy3Xs8yAT(-g9do>ZyIXuwX?-vg9vKh?fGFFy7k+XUeU=GH>tYRaaFpZz`agf{Ly>Teo8Gr(k>Pk4&lgzMTzKG;p zsPz0XF9{tUZ)t}NM7-mUZ)&#%{Qo~b8tJDZgC1}!pklVAlpWXPJuwMcvLH56graBT zPyw(m{Xy)mA^Qt@!`6Xi`BGFilp%?A9D#$ecF*Wk6g~5`ej&ZH%qh9@p-kPF|51P= zm#@>Zbkgnb>JX|6`70clEO53G^jli^Ym5^Qk%9!%+L`B4r7A%YB{#sgG^qB&D}Bp4|4AHqN~&gNR2)5 zA(}|rD4Mr&xl9&WmC(@I+gkO5f_F=Joj^>pw>(X3Baba=T#bEfRbRwE!U-r8ys(U! zH|wT&T`F8eB5F@#CY5KR1KnfHeuXsn5n&`_-Ok3~A588oJfn{DPZrB27I(&#f?vO> z&GNW|pi_1;*q{P@atn9PLNfVrQMz=>ClKeu*M%fP9J~xTGqZE}Lx0Bc+6xQKLWg!l ztxBEOzI)T-bN0QApeStlAxO(=7cL~p10q7W=MMHWxwPf3=n8*$6xp%aKs%C#b!ESA z5lQ(UK`-|TLoMs(Whg9>Sm=+$!Zgw`AxS+^lUMo8emqE-kK|$a0tLRd9~<|1wcSV! z91qoFZI0Xu>DoA+k!`Gp%IrwF>OTc>qmYPBz^`|#GApyE*Gr3Y3=>t`AJdD%F{TU1 z%csS`GDw8e)XukFumya2*+cW(!NKdK=6e5)s~0|sg2Y(=?7$G=7iBU3MTpNZ{E(5g z15yT_K@IZ>JmgZXSuFD+bK_V)3B&z=gyQo&)EUg+_q`qtj>@cJo%j!ds!$!rh8%1w znpU@6We}-EYO@s2B9b^&BUDFe$|FUYlo%_ez`@`{SYc`JwL?dcfA>BaWk0Pic|}cf z&nZW@prCbi>~16T8A$Gz+cgd)vBv)Z8M7r-Vhf! zqy6Qi3!TLRST6S*r^$1KOoWE*H3=mOFUM9|T zAa#^T&FsO&I;-{ZHfhW6W9kfXi9t zw&O0zpzRmBq>cAK&TZxSI11Au1X~-~^~gJ|SNMM3Q=ia@cVOFn4wq7|z>*`!k2R|; z;v|rQ4T}2#F9NX{JYPz}*RyU3#R03W69Ndf5BApgJ{ZkArVGY#egA@3L`*-aXk4TJ z{nkZ21IFG(xQlcXAsgXG^MBfudqvKzvLze;C*x1o18p*MsRtqq)ItNtU<%eD_96(+ zqo{^Sn0ucXPkU_Rv=4vr=&qW`sV>a2g(Q5hi z%u!>$QmWZP=z;?300lp8p)O}b&k7qeKxb|E+HTGg)&Bp^&A`oumQ^dR$M5}+J2_P= zs7mOf=lF0B6v93ZVOuJk@(i7BG*^ST6nj&&$0z6~hbbrpz%XgO835Yf*jZQ!F7KGR z=>-I&%JW>D4z%|WCk*6#g^*#oPgAVBR`nn8g4dn=>ev6T9XaU{QT-=B4ZM38XMHCy z2$*o1L{QZ2Lww%lk0fefZyWaYFLH5()n*ReHp!IX+Q_|u*)xscSa=()XO;udo+?}R zWn*?4539@o6g)i(Aac}V^hN9SaI5T@> zpSgN6K2`G)KUejaRZpeWyYC<&i(5JHDkpbK!^i$7e=`eG&frXcYUXEOfB=nTn|X zgOYf714Qo+OG8Bgi}ziNq?I?VBB5Zd%L147()+ei@z(xYwI>GKQBJ7Fnh4en7-L5U zL)bqI92Eg?GF?ut1fhTvIJQb$M?UZGDh5Fbd(ItSoAJE<<0K{&9s3<|oxQt%4f5~k zCQJ2Y77Ens!OcYcYpEHTn04Ipi9OcGnFd-sXpse-YY@yTof187{#!hYnqF6beX8j6J#a`VjyCv2fM1DdoWES|&*Fc>q z=F%cGYN@thcrYB(`C+-5>Hz@)>)XeWY6L|?N~z;~eV^ybNHkmyXe^uz(Kd{}>fl9eW=D8v&hmxpg zJN(o^evMYY*q4aedyp@y86oc4zk;Z^In9)r<^;dBkitByB?LB0)7;{#XG#uoT|JoH*YMSG#pFR`nx(fUY6 zET&|LC^`W-%uTk(0lpF06mPS3)ByJ8-KDE|bob#ACxVEM<5pb~=xZ&1KO1VQE)?p{+^1Wo_4!>X+nU&z zUNMSU1lMw&5Ttk?=m-dG-@Mwcue27BZcrsM5!FVpu1jy7D}OJBx(elK_9#l}4OR(6 zj(K|%e09AP{P0LjLhud`W$_80s!aN@OBa-BwVZORQd1?358K(e=c%!w#32u_vHPf# zm?(l#xGv0+!We=H zXB#SFw#5JrqwFELTERZUX}R%K zdOwp;h%;?MoGv82P8<%)tzRZLs%dF82pcVZlb0ZwD#n?-B3tq8%r$8C(0sC(Ks!`S zq1w@&Eyu9URn`j_oH7RqPNqfvE!@c-={nd2IIAw`Z&zA_^ifyN=$bFI>YRzWXPZQ3 zC42(R!C&8*A0n0vMYC;<=pGQxhw72qmdymOu)EI*h zDKDh%KX^_z{IR{!XeU%7T}4E0nCWji#W_YI#U53h6;pgidx?lE? ziuIPMQn8PLLPoUQ&aHBBVMeJUABNsKAWq4>xeqXz|NeJprE4$$8h`fD8cbSIQ^DbRg zylJaO;96F>>X~eyIhzPT8R=IOv|r~L0?zv{o5cg5?Pb}mt(V70pj9b8)Prx7aC8IY z#+36H)l1wAD5HRINCW_8^O~($m5o4)hvC%mQKbIO zd{m94xg0!Eb^pWVv$99n3LSxu95@)53s3i|w_JXkiHrYFD1dD8`R{W6Ts~LUKF8O} z?~!{dH<2~SY{^y$P*)yLV>-Q-i-oc9g%E3jqU+2fAe%?g0>&ZVTcUkB(>nV$3BTIn z{~*pqirxCLKUazP@ZH5ujFIhNV(lA{T9mtxYgm zSuiCp65X-_!?`(!C^%kpCUFt}3zY?@kXbEU?m&xNI4ljS!@GzG3L3pPX^3qj0p1CQ~HLwXR=)=zt@){GoJ%$ zkt1l5Mr0ZJ40p}T7h&6;4XPwO?E$fzlC9GjpXYk{P3XSEhXB2t0|m1)hR<6p(BTj& z?ma`@KLJ&7s61+Ekent_zffxLP11L&9KsxF!pQ)8^-N$eYu-Z0tNP+%LFkeLf0?S@ zAew+V!%NPOhnvbBFWZ0tqQgCn@{)ov>SjAqi;E zp8}&dKN=Jm!zR>}5L8`%lqcs?%qjYGtXL8$N~>0wVSsLu)QSZXu(MB)Ib4>b(i zXKa#VGOLPC_6w>=Z)9ofg{W;z8kHY0B{fd1o^P;YSba||l{Ob#8d^GL9UN$lJTsi~ z8>0hzx-yR6q$pa3>HkVgoFPkjwgkPFR6ON<^?w*>v=#un}6^qkWbxoyH#e!5H=+H~5x42aK28#<^t4aE*R zE-)wK8xZW>SM(`mGh0K@8CdI7=S9VVU4g?bvaq&}_BhuL1Rmq!tRiT@x4vpkcb7!A zY$PoDjKG}srQOxPfIOmW*~>3O1QPYuK}?A3ZX+AsYSCU8Add;3OAV*7<=R3KAe3+U zW?S>z+H&Xk{`^IMe8=klar-UKV2kQP?7t6z?#}_nN{j~Ck7qDjty%9E(Ags!Wn(`w z(-U))XJA9(d6M?zvw=nr*4Do(r=)>=DiFf#LlP(x;hdqJOTq#zWZ`e8l{H80-#`r*OI(@!1|x_igg)94f3$5G z=zB?q3W+s`N$py1z9egY!_aYF8GM{@KZr!_ZlpfQGnRl30y~KZQ#opqT4OZSb-kzh z0=A(ABKHttA2Dt5%_{iLJ#))>8>U-7x>|s+XTH$apLfW}_mRi=r%c3Dg^decG)z@T z<7&_Q6QBz1im#3?P*KJ$c0J?_;m+eW+;l%=7;(Xo`*=|C zobozq@swmZ_R4upDJMspt_c%u?F9U63V;N7Max?9$DQy!?^@YW233s|n{c7Lg=KFs8>b{S%Pwz54H z*jkSIU4HWTGx{q1>lAFkt84${b0NJW^ws)+TiPB>yFx1@0WiIyhj(ib1>SmS`u!sCRC zx6U{hQ?m|ZDVN@frk1o6f zfF9H7$fcAM5{-~CF4Zr1+_9#qC1i^|P`O8GTWe|dKr-(~{dGG2+>5KyV&?b`Mi$<^ z^;6B^V>M0gM^U$PXOXms48{a8S(+ySf8JbN**C$H;Q;6K#SLyj21)mU5D=%F5{*Oy z+{dGzE`vCBLpQXd(%pu4acZWK6J@dPXE@Z++UiLPNt=9E@}PeXtN6KYZTn_h*$0;ow={oSHgGUlA->+r7Gd+_F{l}V3=b>+kZ{r z(2AIkI2IA_T7^1e1jE66;UdiMF9lc=O{f#cP!3WME2Z0o6Nad_8$yU{+Cn@h)IJ_hLmZwC01QcA?!~Q1fq62TggZmkmgg_MQu+ z>GN7h6)v+PQrVkGg^8KQDQ7Bz+`U39)W!&`gMfgyam)0n^_(2ulgdf^Vo0&3R?-=1 z6~VRO8uR5v&o?2V6-5sFErVdkUY)AI?;nYbKQe60_0h+X$nfZ`~*5R3=_ zr%iYN+1HIY2iUuRbRMr!8(&PNE#izVMa4=8FPd5t8bV?~e0=Ca24uS3^iAW+#3^7B zK2fg;p}Eq12^_(31!h|g$C(&m2v}2v%ndV2V@YcxN@h`9*?x*FD>2tn9R+l>+wV7D z@_gXoi|Bn|e|)YA&biY3B*85UOgZ4D67$dN;c8t>OsN&D?RSWYaiomt9-`)(a7|lM z?oEwv^BAiIzYxqz)e3os7S>ZOSb%(rM#Uh4O@#};%1Vp8f-b4urxhmw$29{r`+SM-o8i7>lL>46H-4 zDM*=(LliG!T?-9%&aHN>NM!OPV_T|7iMy@IO{)7=6LtsXnsst!Z>}Q#ItB3HzYpR` zIW~`I<2&U~Pa9{N?5h@IC?PFg4~t%fT6tmE7in3*?lb8woblrVOyQRqUbU}FN-<6# z$Opb#qMT;lKHbJu*KcgZj9Z8$-V|4rp)(O^q_ZRptuxF>$3*oB(Oj8eCWvi zTbv-9kjPFGDC!w1!mUg~;Dk)~7A47jqaS9guU|q~LZ+U~BcaS?TBDI%Gd-!z!JbF7 z7yp+`kou0$5@mz-Tds0n4;`YJM8yH#%b)bf=h>S@!8Jv^W53Olc_W`-R3Io`h&$mW zF_O_+N|<50zk03WJImCG&@5{#-B@BhO$UN#ze09!pW$@c$Br#j#(Z?MKKo-&4pErU z2dJ2aL&>c(0qTZ)UOK25QTk6}0477ff>%n=rWJT>n{nUO&a2%jf`|) zQ;5-TzGXgpEeNI+>jCOKwiS|GLDxkRZJXk!@hzS-ebHPMuaS1U-v%wf=*7tES|FAW z(lqBNnrTZ_n%KRP5)6f+Ns;KzrY=<>Cm*AMf)!nyrPr*V?07Ne-Y5xQFj;Hm38Y&` zo4a70kxy!xovcsdM+Y^S1#OK;Ph>(WmhTep4q36VH^WFtykb7AkMdG)#y}42`<4!e zL$3;pGX5h4Z7urz+jyC-Y~z0CwR{0b8H-;Pc$m+2qS1!TtZpkoROX#NpnR>K{`0VK zqf3ZRD^ttFDrVN(FZ;&W$@G$MZ>y_@0Gj%%*zE)oZKu13Rs{(sTo@hrx41sIOF-nb z?!WzcLF19kUt29X1A=3vca&zconLsS3nl5 z8k6RC*S${&SAV`p%3OJsX6BLQ%|iy%0^PRd6aIBi?G>I44^+QGOLEHI06+-6g)j)^ zS2NGkR?}POaOIxanVBT87uv#~JPh1R9>eZ=UFv4@CO*n7Kw}S{9;+}WkQb0RXyUMj zY=kE}9<2xd7(CfpbCm|8rCsK2+8niuEu^ZVGtZGf*!sCH7*Lb3yvizwwYpldtZm{U z-pxn2h^^gt+DcGA9q^*`#iJfdzbwurtHN_F9biDrzXBPD-QWPk_994@td-T@gl)^r zvqyi3&z$lN;E$t4Dxqno5?SETipcl6C_YTg;F2->fQA2=Yv<(5FfxwXF=idFmzdO~ zNSQRAz&DnJkF8!2Ks;EZ)-B-zBinnJzpVx0>;;`$)hAz#0@fmU)=x~din5^b!ox+) zW0o4|mncbQR&R$SIAlu-EZigL;lExo6;kk!A-!Tp%J zgKBQWhR<%>wnO(#g3I%r#7b5OIqLtOzNgQpICaGcYXKH>#yFaI1p!4Ya1HYr>1Ne& za{Eu!Rky?A!fL6Caf2wTD@B?q_vQLeR$F)`Pps=Rtf{GLOE=UmIht7v`n||}Yd3v= z4St9iC~2g6rrF=u9&RTxpTl3FI*=Q8&|V8d88P%}2p7N0`)--{?1ZpA!v-uR-=2jL z{B8iq*DVDM((FO?B6_ovF$|TL-H`pCt58TbF&3M#*A?)2sDxa(zJSw9WVQ^RZ)A;; zg&8jRCmmDcN=!3!SWhN9)%pTSr#U1L8u8AafngLHR3v7VSD*=S1q$bhs6Q4OosKPJ zb1@OqFki(o&?PKtuK$Ob@Dh|O7$y7kTCJ2Gw1&2=1-F-2dVJVV$KtJDWmJHJYfnpw z8TcNE`-VjwCgLH0FH{+1^ryZsNOO$8^2(VB$79jYB>j|56GPlsRei_@b8z1f6gxbs z6Z073!BF>C)+)C(nrES+EtAJ|G8Y-(Cbqf%00cxP}u#zUG0@L&vZ&pj{+yMe;`+De{r@fCLZ z7f-IfzCoRoE0!vu*{80yuTq|sgbTI_WaIOs5iiE>MfNdAtkG8M6C6OG;qRylq96)} zI{{wzoWuGFl{}X6f4#~E&$i%=Qb}EOV`puiR!tnmAQb_uQOLF?YUY3q?EwMgKUKP09_d9Q|5xx2nVy<$40l)&r@v=)U@i6b*652W0cgE`?u2XKjK=tsJtZVG;8S-S#Fuu- zqc+g^LbW_+NQ@x;)zM=+hmI<>fQ2#-^Z=WG@&z8XHJZ(W{FtIL-s`((o`f@k({2AG zeAk;RY~^G=$s6nS01My_0wKFSNsF38FG|UsR8kmj`VeZusFR*I@duHPUwi)B=`d>8 z#!ukGxMiN?eXhsRSR#v|qYT)|q;0#)V9Qo8|Z7*9rfNvz!o|5;R1Bz3=8&Ja~4Ul*y_$#ZZ z-Jz%>C}+*)@z9$+8ZtfyD-8D#-)+oRUxw|emj|;>vaXi;cjBlOlpgg`{H_xJoxIiP;(^={af&Qj(gLg%4~cgW^fht*J5xAs%ycszLG zrRQx|{?p!_(Q%$#%Y+?hM$u!e2hJE_>!MafFP=G~?fIjD6iuEK_~I_>ZgZpydqR2| z?%^mC1LQ-zuo!gy@gleCl+vp+<~27DXVCzPx3r)bCOp#L8<7h!obE3t%hdfI zywF}=lhoWT!SYi}@OSl9G8uV^%Knp8WG zROrkPngDoAUoCCdNC1fn*%y}6e;ft}V5|u8y+}s;Fw=Ni_y_s4`K%E&+D1)IldbYJ zk-0j8y8xGa<72YJg3|%oU2u!t2ZTfF(Agi#%vLjdkyRU0shrY=arnK?^;g=PhUhtK z?!isSC%ch9O0m!-zFi)X-Y912}1z5M$hSiM*E31 zJhswtfh-CnD>fikPqcUU8Blkfp*eX*a=4x>VCKvlN64mk`q*91R$^E55 zuuU1z5l2@Hfj>lQ5x@-fj(AW}c}-u?o}v4aA-u2&eeBm9{Y48pew*wQB}iOu);}Ao zIZ~zsg=4t;8Dc^Yj+{89v+wookOJVK4@i;Fu3N8IiU8=enNh>z-5Hum%rRvbmxMUq z51FCsF@Vv(vwK04FF`OVMK=-vZwc><#M{;#*hUALkY|Rv(EDUM`^Bg_+I4oR0WT(e zsMy18nU3WlJFhDXd$r>=FGY_PJfNIt=Y1#8va*WKm{s$jN*24(_W4zkbhyx`PQ<6% zg!94n;Xp?F4F6@iZ3S<>hnz9CImWc0^!m=ek>QIr_o17{j?}eIiv_<&X3eOGg$=0b zW8kNY;hY4*7&dI#8iRv3+2W1cZ3+}>lO0<(R3BAMmL*#* zP`@yU+DFujLmNmP-iB~yTDYk%d@#!XuHj|zd-lqV3tup^_?qr)BV#b}z-S5TV|n!H zaNA!YP1grw*T}Kr^wUQUHb#kF-&eZyxlcZparsVyR&1oD@hM6u zn!MU-GkYa*G?hNggC$A4i0`2$XuO$bolrTcJgPxKZL`j~K>W#7CUSNiO)kE!=>6Qs zI<@4VV;8d~<=r86=QCx0h|6EVO(1G~;puIx|IvHppWYt|3emQGn5Ck*J^dt3Px13t zLvD{(Z8Y1ck4WG0Fz-7QkJ5Dp`(vLJ0|h*5_|t5(31e$3nhnmPrJnH#e?d!pgpm@y z7`QLMGao>$7S5I^(#E{W=!m-OyiFv7fr(5|rI9wyZ#F1$UWI-}Qly zTg=fut$GIisjm)2d!4M|GrN^dc$Z+Hf8VjdQ+co=DOB(1q`SXgyynE)LIfx-8PM|d zRFK9GB{WxB$8s0rB~ser%g{YWPo&(kRMe01q^3;E@z1SPZa`g!-# z6+At8!Q^m)D>vqBUvYM@_4j85RO5X^^ZtokAxhMVn%;iGV+3l~j{q)^!tt!<| z_QZ_s{-!sI#ZJys5Bzxthc{r3O1B3aN)U&MQcm9wt$?Vc!SBt=AkzLvles;NMxlcZ z7FQQh+uZTcRYtM6V~G!h>>KvgKsqA7uN_wvuWptbnx9yd3S@Pt@;leP)P}apkIri6641p4 z=e>v-do6n{A3FqvxFB0ZX>BkCQk6pU)aS-BD0u#=N%!}m3GMymlPyr)U08m=gWrxa z1nwinDySOO4(2Go9lFiyW@+h8JiEXzM(IGV8ZR?VzP$ZUR8B`m)oEsjNL)Wg3C){b@yV$0gmjKIHs#v?1hbcG}ONN?frG^%)MWl@z{NFu0R) z1l{bk6n5Y&M%I{2$T1w@u#2t5xWV5L=IzmslHevNS9&^kY}`ycLu@aabJUTsV73Y) z)$Y8(+Y37)Wa4R2n%*uOXe*6sHmn&rxhx=V>qn`oT zuo5#dC4*sw(vxU!Qu1A`V58iHE0W59Kff1 z&k@Vep+$TG$`?J7*$By$))X3F5iS1Nv5}EHYlw%MwqqcVh!Kauz2jC4pBVIj)9X6- zzavWyLXywP*g21yiJIXM?8+^n_4vMd3{1_pKUnyUB>0wr4;4N?VL;GPs&8ECz@3ih z&h%u-?h>T@In22uw7u&cNi(l!lK6KRs0U(P0DRn?E1#6hP&CPBMyrDyKB5=x#?bhL z^?97>@usYcksSAX?69h5rMFHWvMT-W#&0GZihrlrb+W|BPCZLB@7zwaca@qXK8WI| zMPLs}GW~zp&3z*Yxqphc9-j|-HpMSeJcsXZj!4wJ=26c9Yqpfcz6OWcB|`Db9t_wKN&Dw!|YMV8rbSU4T^SGIMY+)Ta1#biLL=I0T2J zVKQT$7rjB5FtFEfhA&*swlZ{?c0kFOfoIaDh0Hs|h; z&MwqqUHb9Yyvhi`?t2rvQ}d6kU}o&;q%oG!TY1I_Y9FEgt-x<^s{$8vBY=t(z}972 zQ2T96`S5b9lcQJ!uC+r_^)Q42unj~f!g9L+V8jlDi$^Ul2&UZ7bmX@XgmyR;(( zfx;h1kLNwbRVW#il2RPoXOYn+y4-9tHZ{{6jk^TV{2r8(voG!J$-pfF7GA~+!?VNL zyQ=+?(U0;>sw}M6+R8)ZthGkZI~q2jczrZzrl;j}E3dv?pD5USu=@z`-J4Jku)l#F ze3oI(WQd;D+D%GS(KPd1TBM0Ge$})14R0uE+;g2ZY7YmB+`<>+gTrVk3fFtX;47qag{b5YKH5@{$bE5}XMHY0G6tjuN8T2Dgk%u5hSEh1Fz*pEvZ=1~o*?W(8*nAIhLMl7TxqkxjF zH9b5~ZAT^XZm-P*WmW(h44r~U-CG=OHRuz+_&rsW&?gSWn3E+(Z zLEwO0Uw@RX7`05w#`6+7oaK9Bu{fF|c(@!6X9v~E71ZBckp@#Ndvf4tBWYt>`C2kr z5fBz%?0i76b9#Uq`B+_|Au@3!0)zO5Gt9LUbg@j+RgYiCtqn-AHT?zke@9nRf${Vc~ zA(#v?xI}afeB=?UZ`c7rAUl@ndWajTxSo2~D;%WnAo=}Z5NtFY(fLuQ`5AL5{Yb_% z_#`r@E%|&&(_H8Zi#8`?v_1k<+htM}x4}O87McKn5UJCh<9uMoH1ZMu&R8*SLoBW{ zB@$=>^Z$59C4vI~+l=L5GpUW z`noqdG?V^^d}RQ_kGJ*F91uMY%6nc4e#i5XjL?(NE`V%!k=GbSZ2!TB2>MFM72Y_= zVw;X3WGSn0yjwL@;)W+Z;uTL#8?y2(@T^e$ze^^j6k{n|Q_5b}FEX7V}|*BTv6Z3I5OJ5K{(v9R+!&V8GT0sWY>su{-2 z+)3u@Q`;;61Y)>5L~o>#T@ayBBaK`kNQj}#?zx9C{sf2#TSuF%grqy7A`S+rY2(HiDqQ9nb81OsO zC`p{T`E_NBBiqfXa%?s6nW0AC5m=K~^G>}POnvC*rxrNP23v|FrxbUt7j_RsdALpc z*_hL|6YgCQsv&ck!kb^2>kV+%S8P$3W%ttnSb;D&^5S)^a1ZrLH(|9oqPGnboUgoo z=)Z=2{a?3CSHQDFHS6u|U-!B|cZnP5)eOoUNPSO&17H)|qo_4c=x+9j-1p)j&=25| zG|I9bsKd-VQpd5;8{VHw?8!}OJ1<$S9Kd(|n1T#2YdgL>2-to>&pq!>MY_$QeD+_q zAFMdXBZ!(R##?gJOq(!@1kb*y@Y>-%|%BbvtCOONR2~C1e`=B^HA#T)hVuN(NE{i5YnnGI5Qu8*_>%XdtKR;8egX_cck# zh&4IqhG`G27o{aJ0_pMjdRfgJdB4=ls!)NyFIcV;+XUz8&v`3C_bm4ofv@^d7Kg{& z`L|NAcGfT<>pc*O*1azpTzDhgA?`I?5;$5?pXvuqkg1gu5I~bQ^$U}?K?|Qww55b=42G^ZkO|A%l?Z5 zS#PB09Hc5touOu}@CuZfj|aF1oG|32!(^Qq?_pomn3?I;sV>mi4$?!RV;3*b@8|bX z1l*}HVk+k6qd`0d{1*CpAX8}hu#vfJz^9`_+9U#GX~oKqXIw|K?z$HlK}F{D`CxZn zkqug2gc}W9$tCK^G1hat-g(H@v+$^CK^1f#BA2W9tZ$&_Z_ZE`mU#vWS(B8L#<%O2 zfz@`bYR+3!*EuM34kP(KDR?qvnOsYu>gB<5-by*NK*t=TziN{iKCYwu+VfK6>C>*g z5*CzcP3X`4yi&?Q*9lu6!6tB@m7dx;q*Tt9PtgkmF;BcKicb;H?y4Q2g~qP!P-Fir z`F0I*k-CZ@RwCDehpP;X_vzS`sYb`~AHj@hBuFG>O_XC?lY)mqO305>SK9>H^h0pJ zzH0JY23 zflC+##-sl>C4K-SYe$jcKN`@&ivSp-5=+C!J>n^rYJY8onj*QlG>VXExIqdcnY(>)eKPNC|WWI%Dar#?+ zME}Y(9~@9pnHbi76waB^oAR47XQSiwq8_Fb)2c9Rs?Cl6!I!5h7RF=1?8LE<%)`#q zhFoEN@-qg)((02R2B>*9TszSNth`L@FWMdt80y6&>=cs!5zG|u!}-KdGPfLJu2)RY z)7W~6iMe3_PsRwUW{!EwB_iLF`mVCGEYla)?w93e`zPW+VE7T31OE_}^jhb+zo*9M z*m`BkV^^z&Bl`62U@K~FamNazLTUW*VQfi3)P1(6wu92FvEQT=a(_n(-nivOBWJM( z))I}y97-=nnbuFp_CHwKKJZ4V{JFL-8xCdxMmO%zoG} z_r&MRB*ItQf;?RaZk0?LVY$rGt`3%H?DPaO2&d$`1Dtx`8} z%eDC#rW6tHKSxm|2I|sMH9Zm*Z83k8G(Q*wJa;6}i#lly$>+6iz+Yo9@an5pP#*g- zOh|d1)&`p+Y0GaaI1fQByj!Wkr=Ft50ZNwX;uac-9hjZvrFX2RoO{}n-^J#Otrm0M(NEa0CZYCh&9Vs7 za)No*cYJ1QQFyI+(SKLXceAuViFum#|1=QRR-N_cWi zY7(#hit{_5SjGtbE;*c`N+VOH{k&#q;!XfL%2L?;FB{r?x9#(?m$$;zRQ~cAftx3k zYION~)}+qFwD2?@EW(~!@FSCS9&CKF2d}U4#9!esBvYO8D=U66Mg|5}O&v)BbUwcm zMwz7b!i;Z^j4F^F^OQeim&si{`I5VuY<3pxYzj}$46g_B{~Q(J!OY`iE~cO7;8Cg; zn1P<2yV1ovpF_S;J2YYL)Lz`cC+!^fbN~jVGWV1;$p`XsVdvpkdz4lrj7B6k)i1$jU;ciu+3R?>*` zU7U1cy1R!7CWhn|$*`d=Ce+E&=K5?%QlR<9@FMs?_D6!AIMA0E!m{2R!G9STyKisf zc>ODV#P!vEl6Skab`dFPQi~+-Cy1s{Iol+Pni+9_a+&l%+2Ub~54}A8^oq_H_m9>T z733;dNEcxsicDapeOnWMCVW==ou&eM`Pn1}q+k06G4H#X!#z%*M6k2E5KG#Fm(1$- z4odGfgLAp6=fLUG^$ZRqUG9NLiOJBX-*6T>G;38#t;_rkT~mEVVBi$hLdtg<1`Q}W zpEoFCD_P5{H2v#(B&Eq0NHWDKka^_D&H+#6HiMIolc$zTJ?+Ys>?IE{V38R4X9X0L5lD78T@+!(1Aw=53$3qixn zOV|f%vB{$jLz38;s^E9Q9GPI#yun{$x0ptV4c@-xEE$uCHi?lMX#@ z!v`d-*)zw#ui@i(iL{-Gs0$<#k<9z^cbjw49Iu3REsE%i82(QF`zeZiK0stV?LEDc51H9wj8A5J8F_XQ**@$_|Kj9Jr(tEu9;zj+(ECUe&fQ z!*|k5G|E`D!z+mh`&Em#5?GGr;N_^{fVGF6n)_Fc0{9#U$kw$^lfQyX0oue`B9qh; zl7VBn4!Rh}JolZ4j@fJdX%?jD>HtGPyuTW0%s-)y1k#+muzP%c#61OX&zEQGpRb3! zV%u|c3wv(D8JkvakxBjg2oYcXeOy{~+7WwhaT9?5{c;|NA$jxY`elm`$iezkEzpCy zp3WUqfEEJMD5T5Zjp3Lgw50vvrAfrgZhCUsc015*xjm)F20hf>lt9S1~H?8 z#%dp8FrOFvR7~`rw`02@i;xd|ogsoNQr`6A)3I-QI2X2|BM67p4RpRRbPS(|=3hZZ zLbiA`oB?7p2L@(%B0ng7POV2KR4IU)%$N|cOtxDhLl)H$8GGf$JL~r*&@MmcvtfZD{}$1h-FMNr&eVLOG)_8uNYM`nrUPEzNYzj&&6}M;l%^P!ex* zOW<~f%~WrT&#FQ`e+wRqR{5Il?5o05G74WI3Zsnp1w1TG%iGF#PJ8$UPgMUj5- zzj}h)tU2CZnvbrxF7pDK1qHiOD(~#*rP<2OYhec@`_*}c{=Eo7Fh%CQv*p8DAs#dK zKs9UB`FTf~9uBgpO~h~N?IkMw93j@9l}`;gb^Lsx?^2dT_{0nZ#9ciwo9A8JuyXb= zbayIe9#=_JPg&o{bTcBBjB6f*N1)`_yR^`#M6(dJ(1|IG%y!pG$c5j7gK!I0-z;JL zMr_#6?pTICA`l9~xS~E&7IJqsp(`C{%w)rok1_VtS8Qf#4CUDtR~3C&>MOs}vB2^; zP!uBM2`tCR7GDK_8`GTlAVVL(ad4FnECxv>RwAUD1@~zW3MtvtXIFWvREc(B&|)PG z79JL7PtTdG@mcGZ%rAcy6_Y^gcB-GYY`ur3B>Bc5R^@H}!@Z__ESJXD(&{SOG4@+M zA$qy5jual)N=Zr#JxKt78O(-~HkA3xa<5A9XKxJOVq+MGqr4_q6 z8BhzVGlE7qrx8SCLIw63AAy;Ee;pt|qM}$@vzSx01)B?8EW2RA&&HRqZcV0lv=?qf z8%yS(F=99_bBwf#ShWv~3Lh7(4l|=7-+uhqK$Q4WT74cv+ZUAD22l=Ytn(Y89&)Co zeTL+gm`fNnh}MeZ^Yfomm0^DUqw{0@d>clNC}bae{52=2RzSOY?Z+TDP?C^jo|I#m zMPva$>-Vs?bEE{$MKZhWm*#6#Y7Gh@$aN~Nfd|Mem<}u~QxkXayPJ`&@NasX;BC@u z)~M0JG+I|Y69i1;P~ovY2{K6VOuXl2m@Ww>-luXnoiI*JCYNeq z#Bd|4FhMsjH?e*~Ssfj}JY*6y{dbOgY|E13H6T)YxU6TY{+Civ;%-`Dd~!PEJz0Rxft zjr)EjUii7gxCR&0=hy{B?0j6Y40twYnaIFAeLV?ZM6YJXZW2j>CL;X%O5CfsJK|$XXykoL-%;tm*GCt7{D$X; zyJ9LnpJCU7rj7n00P`>aWuSJnc<)T1hsV1fKQW0GJN;#!tD!E+T@5g!$rI_Tp&uu79`6E1u^4&YYda??}`KCyL50<`~`us4FOUH zDvp1S0&3r8*lfqF%JnrrFVUnmH0$_=`2f%tArZZI1EtsVUvtgB;o&MaMGZ(cIT0< zyAyDw*X0jlC9@lFV(O^vD(B`3G<{HhzMhNx6A>rnc2Y~lg^n^DIZ!1ig3=%Ex>7WU zZfCMFnA2!Lr8hKoD~3@Il8$ARsQ7;07M&3Kji0P*q%){nURDbrn{|h)QUnd6ZG7u< z4j~0I)ZesykQt zji}7antv3=&A$&e`84Oh$$_z~0pB&=?j1_zP>eXs8_&!6%OoB~rUM;Za$|~f`0H$k z*}ybT()iE7Q>xFNpUtz39Vbpkg>g@D{<^yb%2+P41gTI0d@&Af9=U+|vNR8SG2&36 z_Fa>%EE?3L$l?we{_a%}xFAVzli68y4}B$6B%QE!^#qnN3>aA5@JMr1 zLRovx3*m{?1cAmymAM2h zjsbhcmuKe@OBh=j0(*$`wM)W9gz;OJ83Tg+_9$1i`7At|Oi?ugda52qbzNM0WP-JU z9#r;hrDIgj4LBjGXhkdGAdtza2g4kE${UtChlv*e-@04hlq3CVa?7ZZj97ukDD8M5 zV3^j_@;^=iw(-qFHe4i?RO8)GcP|>+e<9Qu{Cbc$yV<$h!6(Ayn2k0`^F| zHlrJ0M6G0wsPl>uWKyszEpCTW_7`U#1CmTqdHBa@w_IQ9%yvj7#UL$J(_g(Zd+7fLE z%{e+tf54)fQ7-z(7FY;)Q!QW@eT=D38d&EM^Gjwu?SjD-NGhOtmCth#)xS|q|CMqQ z55=md9oEjFZ6rn!F@=UHzTck|wQF+m&}aG|0l)dW&>8iK;)Z2?{pAnSY)l@kkuSlI zLX{QdhxK@mGUe;hyBfL_hagCIP2Tr@EmN`V=Y7q3b;vkeHQ?w6sPG87YG!MzUC6l@ zFRXtQAB?#4-CD(HewXacF|&q<-u+5PrrGl|NPQMs8l+0PE23k`w1mrqD;F0m821o zx$VewBg<8)@bdHB3S33qcT~F(!{q~)>7i=ldtUt3%TQWU*WK+TQ6rm`Dt%YMk zz3iy7%4H{M=KUTmvzFo$Xk?HJ>5zB^<2*m(*x6z7tJUN_7le%GRSF4Ld5u>pu!E4)~68{{wm<+^|XH z-fJEQe%F?BJ>0A?v}9Z`ynXstv*qdodusr5(7u4w<9Ox%^5-GhB&yb}6#GY^a2#ky zj=_lBWwl-Jrj?4_46X!i$Q%=mb}jnK*&bz18$y%GZU`WDpwB-@SD=l)*qv|7rjGl} zhUfHVKy)${TEI6#rYbMvWt#;>Vls>x`tJut8tBoHsu*?A8+*(5ZG>_7W9h-x@G@e| zbYW81EEN8mr>CHLcefGIB2$C4uB2#p)q<^#gX7i?n8zG1;7n9fdLg_RNhq}VT2h@r zf={zc16r0pVf_jGG-F%7Q^27&-8*^28IIZZ+jl7Ti=S>{e&Qp2g-W|aNx>H|l!|UQ zvs&`1lMV+#YRIJPb30i#78UHNZU0?Ouz|G8g?vFF33lJDCb?2onHw=dpX2f0B>C3} zVfvFTx-pkMoO5L`M)R5F0jWIqV93z_s5i^~w9PtRFQh7xv6VMx2Db+h90jN9t)WX%tr$*Mfn<1(xI0;pL zp7HNyTO)8&czjP{qd@7oKW_y)C$u>6fC^HVHF+C>SPOB4v1+iYb{dD~RKVP#<$m~< zh*&p60`x4|d6Xq1YVCC=ZCuJ$84nBC0xeUjnVpND$1MOI`mPzDQT)`v7sD1Eu!-Kd ztHWX-LMPipq~sVw#%48xz$zXsimJf?fJcn3zABv>lVi5{x-=twtyEN1Dy0qCY27LE zUyxHK35hZR@prc4akS=v_5`wsq>l5x??ygQS!KXR2 z|NN>piimspRNGnb>U%;a&0@Z%2ATwb>f^f*UP#tSck}Gs9~>s%8YEO6BrfjQ{78y7 znueXQ<%foC!dGP~iM6Fb@4=3O83CQOQkJD>bvX^cp1SIp!+oscxe`F-J?+5Uf^|I)9NB$COF%2fNZ0#_Ph6}Vf#V}?kPc6BPk zTUlx_H6*N9(1b0RP%uvc?$Hn@&e<=`*IO+A{n#JM$uYE@EotG*{uXP(s%8s>82#L3 z|2nNY4EG^b?LVHGE}}Qyy~XqBZ4?SPPg+MabOn>VqkGw@CaW!M!FUiFRiuFU%4A+x z4C9CuWBwP@(?RRk&^Oa_QO0l7)W75>Fr3mG$;gRu7kI+k*@1O}Ukf}~zs?D_r2cvzkuI+JtU2NZqlvfGc@%wI#@pCeDT}=(@ z?P?HX^%TkH-kkGory6dX8<`;)pg9@jiV1Axn`|Q=ITrgFB3LSlS*KdQpgR!9sfzkkRJrSRU#A&_)vB`7=}xHUEEnu?7cEfhZ!aKXE{ua z@RXA0x3W{Cq_iq+bQt0DXU0G!9>I1;w(Y0b#qjbV9=CvSiHAm5*5^#vazGx& z!JNx+YQZ2MuW*VHX^)smYcsw(_ch}m7F(x^)Ri>XqEvF-3XX8B!IeuKz!kY{&($=< z@kJYdUrF2qLHVmu*sp5x&^V4U4P1#)AnZz_AY%%VwRXBv5WJ*_3=i{gD9&v#UpCtP zH}iEZEC%_`-+TI756|_!bbOUOwz;*orv?{u*K$Nhh1@DUC$>3x-OQ18V(O$!rOh1;?!4E~4!S*I;9(|9EG z7MmbT^XD$jTCVspQ+{5}$bbD;nuE*qS@5G&?DXT$=#R{UIM)xiD-g*avsYZ$CSc6b9q9HU*jCt zHT4R>O{;PTz6@mLQ6DKfbsnXtYsf&Stii4UiF+bg5X0x1yCt$PYi)_ zFj#BeI~Nt;9JNkA4Z9_yKB#y)F`jpozk1VW3Sil3!Sgm_%@01Kpv*ttaHb1R7)!=dLUSelE1pACOwlC$FrH6F0i?4oyAd276)OSpdbjM%M z%Vk~`H2v*w7g4TX8$%fv*{4}*i!0k0J}PC)*gd?myNa?ZL^MrO7_rG>4vu5rCLYgtKsokXp$?tLv^}WAW+!jk8j91w5c89=B3a;5b1` z2q8C8XyMJzkDuhhV=*k)IGM4=rgc~yX6z)(Go_iQpiAl(FQl>X53fYh?iv!rfZCk$JXEt&qd zyQH%s5$}(!a$O{}Y;#ZIg`!k!tsb^lBloXqIL*R+_=2b zQiR&TU7rX2<+%-kR>XMkZD%^^>3mDhLFV5*qi8|<)OVJG1s@@KCiu`Djx7FGore46 z^rZ^FL*dyO!*i}sf6v8>jGaCoH5;e@jvWot)=?L*?#UYYLNr8)#k5->tI@_k{3 z5lcBWr3ShKp2rkbaelbw zs*P~ZWVu!RS2YYhBLDXJ8Svctt1*o`#jr?OM7`P`U3W9Cn#XN7S$Wfd;{r+^s5r-R zb?us1s}YW5@&@2^iC&SKt4rPo?FL-Z$?`4lX>GzqaLzcAHlyHROI;h8yY%^IK?IIT z2>-L-ZqF|Qmw{g94%oM}jU`Kt@aOnI$wSqys+qK# zh&9d#pvsDjkMvJ}b8V)zK!(n$pUKE}N6FI<)kIy|ToXZmTkjvN}8tRgX6#!-y{=ty>VXHvt? z>0JKXZIddIIau;hNWJeFo`%ifsNYH(3oujBy0tEEVq9xnFbj)^Ox$q4eWLkZ|tPn}n^wqwZu}$}lbT zntV|3<{cx;-dgmX-Opyjs4qi1q;9V9Rzo< z$ykapgAE)}{h=`Tze8#)@<4b)$2(QiMTF*hgIGAjL!QlaEB)`i_5WImbwbk|a*|ME01)e!dwKBi`?;SvaLktit( z$(~L(T~stmNl}1r>|c3@DeqG`T9s6E)dc*3L54JYRhUsB48Fgh8~%ffizL1OY~&gznWiR?Z1JXHf7OOjlyyi0?+G|)Hzc1+h%LsI+;XE4_gM7hx= z2YN63f+SFaSH=6L&%8ZsIlzZ1;H6VQWKIFJ;r`(C804KV_4r`EM-WpGo9)M3_=j-} z@H_=$oT^rIhEGiz41*gyph|z#YhOy|q2rvagS)x%KJjTret%j;ssG>i=%^WDvBrkK zs>1|R4J+@<)9FP4QBv91+>8L_583sC*$?`DqalC=-YOF&e?y{M)P?lY=&p*M^S~rhLrng0dmBLw z;|9G@g46a1NQtK}ni$anrZS=XzAamFy3`0?!)LMk-zf6z)@iFOkj6ABi28^(or%t&b1lde+i4&}9^JXQi0P%f0ng^cfywfzHN;6Eo)>&FKxKONK zb=3uX&{^>4-OMK zU7z2OM9GlQR2FW0O#Zb$7OtBGI#2b^h)0J{=3rB?<4=M!YT_92J-cAg8D1h{=ZPoxre}AI zXdD(3jXb3L+Bc#h88cX3&v|)-Q}Uj#z+uWxYTG2&sF9>t24-&RI+$Dq|K-6YUET2n zQ5mp`Migx!;j{^TweKinuo8W-LB|_Rd{p@PG~xPAm|BIrI;fSR#Uql7kXH&{QxAD7 zy`I6=1hZ;X0TlK$+J(XsJ40B`5$aY*tHGKaNLs=fBH&A)oJM$o0ziKq8`Pknm$XakqC`F#M&1rK`#A&JxN$NVc7^m+ z1G$JqdJ-_`nE1JO6G2gY3$kVx=dTD;@}Ts-kWXoo{=$49y%g|C>==&QbC^?zWacTVVRB0lODESV;tuTSS=Fc1FWdGTw+WZV>#M_OHP|8<1T{``0k>Z z?ia|3=l41OYmR2)Do7xlen!x#YBDBJ99qCjcK*_v;i`*uAK6!haXes@7wgKQ(^^k% zak5B_`Aw9Yi>j$FYemJz0eq?6h2^B$?Iv{O)XWQuEjyw`f@M;y2;#gsTtKyCYyZTD zzc6ZPo;VFcobBbWBQd(aV)QEEqdn3!e{BXWsJ7yRD(SyEKiL;!deRJ;S0z-H#MBd6 zFljR3Nur3cV)9vS`hNKSdts;%`ApR6?PE>sc!rU4)|A#NEyzdL%*NJ~vRO$hL&nMW zQR%Q%X!(vL?e)(7p?8>&lgG6ua~BW&YXu3)9R%o@s>BE}^DbqOlBO^~E{GvHG=d^R zB@(`v1HOLMg;5uY;}@t#$1zytpcbeon78B02Jr{;7U3Ehu#rRWHNvYI>Z;`AtxnHM zh2uUQNV>s+yhAw=Bj>0S_{n8Ee1pp5~(b(mM|*2V_yLJQ-Ez{gnI59uElh)xxrlqQw^)+k;W#nAWr~L693I(`-=F(qFEn zp0m$|GcLafPn!20irayiI%Jkot#MzU$9h0 zHtUTk?58)59MnpOFd;puHavMMV%J_7O})rinfSop0U|rHFW9db0;BWh6MoJ_7Mcr| z9Fb_E_A4N5hK-iFm7TvLpA66TjZEj{2lkMxuR?l zKX0$EKiYZmOq4?tVz+9bY5Zo$;bg!%0-`m_y%s$-%|=#xDvhf`i#^WsRwE>}MZRax zzC+aS-X9b|(N;0IJ;!SS6UL+;F~7tL4jGPcIKt8DJ4;tPD%;re=bz(-(b{svA=dTI z_+KG51WJ$eB5fz~agP)G@0vdM2DVMLOYkbEu_}ny*Y-{EZLne$EAHX0p9TKY??-Be zfJ=wuFp%~4ii_kTc?^?{6iWl%o8J;Rh37Ewx*5F|#|~^v(oq+-{#{x#k-f)-vFt1n zws0s=vYPaB-hx;7e{|K^>#?`ou!fx$cmz;yGtE@F0%FK|Ky47aRF)qld0o2~9>mEL z4v+1qpt9C~Dw}xF*El@@O_&}L)ckIE^xqEfF~4Pl4Z!&icbRG@0&+Rl(eGz=K11J` z9gep|I`CN1E+YGt+3d(X3VJ%1*R%pXoZCL4XxQPO$ZcL9{!a%L3oG9R39g$(me>0& zpGVU_H7K+rw)W)REJna%F-|?g7IdTq90z4O)DRe~RFL!*d;pmOt4q@8h7z-}116`4 zKM!$XK`K&lVor1@>W2$P-}EXcs%TI7p(Q&(5RTIauN&C%2dB=MD!?fYv&U-FKP8}s z4ZH62;&DzYsy!2*@hFMPS>}ps#e@|xXeMoclPuEJ6NYw--P;_E{ClL|EwyG`oFF!% zmrc?zss4`Empqjg*jFCp*K%L$3FhQpX2-ZH*d?7a>$HTOaM?c{Sn%gO**>VAGIIXgH0LXGMjdo ziMfl%z|j5-7X=Oj!-&&*pV@LeaJ}!co`vLzI!#aq;hXtZT`mHl{({NH3k%S405{u~ zva-hD{c9j6PP<(Pld9yeJ%QXB`Gg+0Kzxh2=o^!MxV8LM)U^)%qt~9ikqIpsF#m~IWtkkI7*V%TP;Hl4`Fp=LoR>T zKEQd1fH}ov8Um;Bv^;?>B^-A&fq>}2O=Q}99mBWC_pEp>)CpmWd|bwW9w6*Cq6iDj zUKMy!Zff92wxuK2UzBbF=b6G6dWlj;&ZzQ?i76p7Ofi}5X1xzq z`XomA#3_!ibHT54&egpN7K_!yq3oGeT<0`??ph&oZr;w1WFa}z)O4OIzmDGmZ5K}1 zU-9p@k^b2$)qbBr3D`%vRQdF##E)*FCYJ zRE*MWWiKjWoR)-wWz{%rg2-s}r{(M`$3#0Z{KdK(<-GNe7!y0U6R&t-l@K5bo0TBy z9Y5f@poBmL^wp~%ERdPG%z0Sh9>%2XYnD4$trl5N^vmQG?x7Pv2c9FP$3kxte3#`Q;ADy(pcQUa@3Q% zT5)txVmtLTmCgAP-ydq&x{qw*`t7#U-5yfFb);j(KycN0bE&xrw`@VH3-?&ZyVQB- zkJ-c($R5e{VQzVHOFp40f#JIHHhD=U5;^9|rlW7%?wL{~aN}QCZ8UF2Ys8_7Oxa>-*kZ zyoeiZo$irb3==-S`QDavjk+zKppgv$Uwvp$liH_^!T{mnlwUy#p#KD0Kcd5aOp-ab z`XpyZ{!m^U%HU$zeNy_F^Ec*Yro_cn541>+bo&5XYR_mL<-`JEVAX`n;ki3P zFl5qdD!N5?i96^P(c559SwoS&oGzr6kp*~TVA!aSLt={*)M^N~=A_X#XVwlkydKB=GE zv$M&M=IRXY?AK%%cY4Z{zzmNRm-IUrH)X>Q`PUWrZ(-?Dsd#3TshmCZuedT~pS*5| zvhl0NjUeSZ1u%Sv2U*-)X&51E{{nyb(f9-UTyyIfC+IK5QS1DQ(#Wx~?QP>YHrxNv zn+$8K5nk&*VAJXhBCRBU(NjN?3&*5R6LG4ZUEM_*jdj-%HS0<#CH**R>P3Tq6@U@8 z^BTZ*!s+A@N5wVh8a%#QtGFkQciHi#Qe9>yvJ(=o+r;MZA*oW{2B!%>*3l7-kX)SefT+V2v8U8jLVYv*XL z<*a`K52J5pPwo%{o?|G=2|uu}sLD&?E1#$CVg=l>I}nD>;`Rj{hjRlfpP|z{DCK0& z%V7?}j)T_g2;vDa3CeqL#$aB0YQkBT74gZ(tgMH{IMd#4q)gucA#?IE=?#D{AQg(k z%zv^Vchr0=Vw8)D_|2@s!+*pDQjW6S`0(qoQi%Ofe4F% z`)7nz9`|DXBZ>P!>DFTUfv{mw|K8H{FuP*rUdo-s`8@mH2q7H|h(u9DxuBjki3nq&+2pv4 z)1k(a<#TpUMI0Ekg5=?5Rvb{&A%I`)L?| zG}RT?nTA#fW+&P3(nJ@=wSszsj1x#_r&$!7wto9 zD)?rwW;c0b<_e3hzpOy^aJ|NE!|mM9`S5>Ch32RSJA&E3ns=dl=IrIq)GdsKn(21TLN+ewC45(vGspf6CChjL69ZscL zeC7u5VpLsuS0QGXiFF9*iV&qH`xcq`hfLLvMB*#%@rg4ZD4adiU5Hriu`Lxfn4ZKE zcwJx`=R)h7Zw%Z_`U?GoP*ze)0Td)OL4Ya!6q9TgNh`-b)xxjt{0@N!_(hmG9ji8d z9vfTu%Uq4%iwywPd3%1rtlH2sih@uEs65K;Y#`k)MOVfBbhG8GEgJ&vYhqJXENagD z+qU==2XKfZ|5^#tP?!yO!HI6S~e)=FXr>1Gb zuRB64Qaf6F6FNH&6uSt3kj*b?vW9CT8QE% z=ay<|82(M{39JTxgfr*36v7!|khp&w;+7Ni;dbuEQ)QP;ke9pUsu^k_%|XH5Z}GMRHZ* zuJja#ObG}-jJ^=Y(=U*BpM2)*tD*1LLR8K(2GZPFgb|2L71J%IV8@cgxLh`f27a81 z6_`%!EEA=A^;Tqx;15T~7|{w$-W-J(G_aimTy7|begV?3oP{Q2F;iWE47si?7$9m8 zBKG17Ro7P07W?_|bvGBmtfH3a`g1S3f^bS^xCbon)j~(O;X~K%&`IXdGG$;9vUW8i zn)w&8mtTMG`#IW?f-ibD-HyA!C;)G}`tIftl!5XXC7}a=qFhVU$a5uEoCd^e!?6Q| zQle6I)O;P;0&<%|tfF+ScL6KdqxVZg#d53=>-5#~Nz!`(Vf=x4aNzFd+60=%(pj&L zSGF?=qC&+HM7gXd-voKVi#wN@>g1#!rv&_S&vh&!xZVWtGs=&T)%OtF9_BjG8qvY! zWgY^!Yu(6a;1c;bA=ZFoszLH{@3Y+s+Yl!zyZ9^tvJv5x8k%?8 zdLm5Sx)EKRmYdUl-NY=LL~fxcEF-4E>d}uI1Vsv)h=GDPWRr3RYh+vw;1ZL-e6tF| ze{rbp=8Gmb?YM@jvBh-i^Ng<>!yPxjIN!$oc_)4VnL}($%C_edyxymre=y5+u*xRY z`Uz~h5(QW-z>}SS>1d7-GxLDF`tJ(wDDnn=P~L}4DB+GUMrEE>wV#xPPEx0%P*Pao zex{ZFlS_wYFR1($q{5xJU0rZ(eM`n<+WQ(Xcmu!D}HIiz!3tm867mabrlY%JU+ z2-V1CJ8^VG$Oy>X8!MXP)LV79@rSdi2jCe(f3baq?h9#namY9%JvVb`>eC}<8x9#m zPykHy$+vFk==W=fUU@GP+lK34O0aX^=7|w}vRZ`{&gG;eW93^4T1g)(qDC`!95Fn! zB?{uf@3TnZGda<0OxYyOT2&{|M#QR(_$Xt39+~FYlJpP-_ylII;Ei$`9%uB5QW<_b zGi>PEm|Vc+7!kBL1O~4CSz92eXWOz3YZZ@qIt0)#dJ!_R5F&vE$r7&pOB#Hq_-mA_ z_=$Z4m$+P`#H6H4I@p!hfiKIo=&8@8F(%GyD8FQ5Djo+JfATqvGto?5OVS)wR)wTn zbBi(8D9&2TJ%UV3-cGUv76Dc0sORth*m&6lJ9JKz+k2NF)`(CDZOe+tzm?3f5vc0f zv9?J*?`mfTJ%@lB#w{Ldn4z*qR)~8i>rc6jLJeA5>?=2POEy|cVR&xSR8l9;hJ$wc zmkY^C72Ja|oVXkT2;RH;2Npi3`E(c%XOuGdu7z3yvB!)U3WL`%Iy=^G!s!pKgw`4Y zy!bZ8P`=OpP=_)OY1nNX0(CCN8F(;M>tmIbMckX#sw-7BaIz;B#{vuVmW0n&4e-!4 zuoyGYgi2P0e>w&;9W%&oz-kFv&Fo+Wtc_56eiDMLOfFUnKnbpGlM#Fb;mn_u$dTkR5=g{*1_xpoYNgL; zRn*?cj-LUsu@Okh%dNItr%)IS!t~*%ML;W*Oy(jOJA)#Tu=nc(eIYX0*F8;FqF;9q z!;)ViapwJjK5jKoItN`-NExrWXpGp14p_@zwPhFbc^%MYYI-tj#W%~ki+7)0KnpS& z``=Uyc@*czASMg$%Ph_Npa&Ig0Z$I?k4klZL`X}SdV_K-FmOA+g?o(qYc6BxQ$~{= zb1P0g*YFZId_Ak3pZ4!Uidubjq(-C*i1hZT=3#~~xWV>>4*F#Y@UEzM26s z?o*G&Tl$yjXFYB@sC@`O)7$;>p*tOya;F^8Yf^hek<7YcCe}wQjJObNX3O>V)@0Qa zVbx5+Q!ea)#g|x+TBaB7Cp)juPuW;s;3FXQIypybAZLF}MIa&jF6EMdd)|3>_A8~= z`2!?5_+C3%Vs0j~@FAvQd)Sn6Db6IflFZFeZ2t341et$J;+0|L9}jfgw~ee+bIef* zRb6qEE-jI^kto)y#QFibo`psxs*LCylrdZlwl(qEHzitrDQt9^4)HYe z;I&s5g=Al}SvOg32F=p_9EZr})M_pEFwnSlB9B7;W^qw=4d1qXc}@Ei$2Z!s>mHi1 zA@88p10mrUz6U`TT26lEzD~ur&p%`-YhX8Q`zhZaZ@KO3``yisM^gmmQyk+KVul5L zrlf&QRqPO2J#U7e{5Pe*a7w@4MKsaY^aqjGX3`3zwcWW4(Sl4I2FvfDf+P7Esy1K_ zBcF}$gwpN)*a`(phu$^ELs#gJ*XfN|(6O}>@(w&_P02;dm|qdFBo~!&*HH;%KDZ4H zcugt8z%~pBbW5)Qa-cren+(8xXGC!sil+j566Te;kh54GUvT`LcQz@e5wBlDTO*GL zaN4xxL{K!$u#kNCp^Fm#6P94H1Cl`(QR;AS1H~HCKVgOGWBw6S zTdE$&9gS6Q>4)w!-K27XZWrvDsMCNScEY3y@e5a~QsBZ>6F!A=aDSD?-3@)Mno(be zR;2ssp~8~RO=P0Cj3OSt0j`uNrG2O}AA$#?>MYAe5OpeAK~>aR{?#DMR~fY~aK}Tx zMbM0;E3H)oUMe)QJsRGffoN4d^sA9!DYtV;=8meE#4WC>KZ<~?RvkEz8edh`@KDtx zk*0ibvjfwT8V(fP{_i|=g%n+NonX$KM7B~piM;5Dr?)BP ziyKROVh6>ih;(<9%qRLs9WF!}$_kBbpK{}nYup%BDfC(mcvz78OPh$>BL%~pglryi zH9`5aF^;k)&Kz!o!)lNk7u)M^$OHj!8RqQbuDWll$V>twa_8a|u%%imW5d|x%i+iF z@#lOYjb)`OZsw+J!R)^6j?b@NkQl zBfz$Q+F`g&#e5O~P#J#X19beml&*^+ZNZR9DRkiYWH_Ui}%M<$Vl3V&=@p2l8$gE!QnJ{XynqUOAZF=q@tTc>QpTvS(&C zQh2JQZWa(#?`kht8$qzjKYRTNOoS35KL-*X@5)tKsq7LLnfhIzQ0EPdYyEX7?k~`YSGTaGwIKWG)H11CW)V$@n1B0sz>xk~Muh$awBlace=MD*AV4ow~|c%%YAp0u|0 z0L4C$nyrt6InBIK2Dv=Nf1TTvfm;Sl7 z4d=z04WIUgc8x*hwbd_$$P( zwI7{1B69Yl9zLwuNwt9zY)}PPbGEF?dCGqu&)IF7QPUM6KTk?#YE_g{cJ+U782(*y zuU!w?ClQ~PEK3lS0pN9LXPtV73wb9cWuO!*)b6vtdMz z(v48)@+i7?WpEV^-?=?|AM<)9T$&|4v6qywsQ@Vs_QVaRz?OTvyCBCjs}0w$L-DqD z@y@0J4ZTBTN3HyZAx(A?3tUXT7g{s&VXjOjze+Dq$|rdv?xG~%U$&oBHPXTev0|f) z+>!Lf#lLl+qU*wDr1J4@piD6jstJfNrz#ymRXqhuUsE~=}l_sGA%%bM^{4HUi4nO zv_3pM=yYOs`eDjX$+QbD-qxO`n$2%Zj8+@vU(AbL*#mUaUG_CeuQI(0Nb^9ZK!6Ky z*oUV^c(8#}Gwg&H(G(vQKmO(PxJCwAo3nHWrIy2<(a2+IjIQKqx_Bn4(&ZCzYhYJDEggVu#1)%U!YuBHDyIzo3biI%9wL)5?XcNo0M4kkD?y=T8w-*`7$4q0) z@4dhEBM1ju`~R4F4x^#lag<{~v!lG=Ds+)8Kl8=1nX&YACfi1wiMi~TxAY(#@ID1V zh?+?L3spJO`^wZzz2W=R4MB}rv|a_ zpou}f7SW=45y`0ex*O6p)=p>L`Xrq9lWc4PxMPTv3o@?P)ugg+I}f!+3@y#7~^E+VY{1c z(eDyTg3FLJa~7R!GA*r9B1-*4y2sfsImM_qu3-L<)pdCI%&MPM!+eV6fEo7&q-2Yp zS3EABM_zfvX(C>qjaI3&i++yfE%CitZHE@KG|VqZXlOpaK2W#Tgb5jc^H1nhjXc&l_Z;AHjO{TK?7G2buty-A3MS-Ed?}n^ zR-id1AvO3g25izKZGacp*7P!7%tN%qX<>30MJdlvZrtMpsV>bQRnOBKT5-Xv-h|8eST{RzKwU7#B5kc}%oMrBn#;QBzlUs<=T;k%iRK6ImHRGkO5B#k_vE}-tl)i} z<$Q!YkV)Ew{pb4;#6dY?MHRq=D&s9oUS zQAx%+6(Z5tpSd^1nB7SdJDucp4W?HZALevoL||fZ~-m zfvihRj+LVxRrihLqLnb?PBEXXdf~V5A&VyWprPdVN2URY`srTTM@7!lbK(P&-YB~mVbUC-WsHao?JbSMk1(d^}3&) zpq*Eve?ZkTFvJ^}ge##Q zB<=_C53!3`E$jYT<3NM=N~DJ6P!FI{8e2y7GbN^19T}+8@sMI4Z62SN)8~2pTBWkU zNmHFIwJXIUP%6jWOZr)W=h{h#sRMcq5iII01_p4i?Qq%6U-@TK%X1sY1Jut~i*#x; zc6z2dT)xM~N8m_m^KA@C!xgsSvG2YO?u;1NthOb_jR0t-XDDIM*-eKQ$r=M(bPn-r zONUl>!)y5^IpKvW6Wk8DR33M3|FkhIwO8K`yDrNn`^&_tc3WZ^FLh;4C zbdop9r)M1j(o$n}v3*I3gh{w73m$`#7*76$FvSO@%~dPB~y=zn3Y|~)IQ2KIu?$?+455$gvgz*s>qKF#m6es z=NGuXM6=~?+sSzokQ>A$MUy-3zhkwiW1Gm1y;)FF?ZQpDuHwbq(F|9SP%XgZKSo6a zE^{gc>_X)O14p>e=h||3v4r&u>j(I*)F7>zdL!|%FU2#tEjvY3Q|>3Yb3dE<5t%K6 zZ#llLgaeb9H9SR%#A(6^wEc9?#E#5ba;f1|3t~k9^x`>AjpPI}<1Q*3MMbUBb>ey@ zTQlvnJTSow)2P$lds#}5i=ketLo|=G3Kt(23Mv=&hE$(u)Q_n42gNFLFNPyFr`Y6v zMv)Y%$m5N(p6dFqCr`p@fZ z`G{MAz@WsekgGJ1YxX+(Du8Vzxzs1dz@%Emc(=@VCSJVHTvQv$m_ANdw7g9;`6Mv6 zTctyEHU?Y|vwxV*qkCM8w1B72rBNR=Tm9+;G85AQz$8%E0*ke|4zIS9W_QkPGPFE| z9iym2L@AR^GFnax=5i#(K{Iuc(|v>7aE%QZIU~nqt^G77Pze_z{jb^9nGJGx($hx0 zeZJ8iQ2c`9!JDtXb$Z4b(T}QMo?eP?*n<)!sM(IN{jK2jg(rJ!6Hm?Atd9={2%2YS ztUodE2g~pPPl-zCas+G6qwjZRE#I{Nv$B~pa9jUDM>q>31*xtV@jIAO4Anr&(Lw|R z1{3F%g0#7*-_Jz-@G-QX;`iIkNPP>7Uh%vs}(IzHnf`pvk^;v8r>_!xV}EGKj^vLdjInXYRMi#4 zr3*uNIQ96g)H@aRRUOx<{^xeF6z3IIJxGh}mx32Y2(k4Tec-AQrSgss`%VN{6umq$pdIfOCrN^{H!oOv!3eu?#hL- zwm)c#;Q{P`O)RZp7>)~pGd_8MH%jQA^zzg6GL(crx-<5d7=?clBlNIm^Q)hB>E&`` zxU8R*NP@s?`z&cZaX=Ra#pehC35m=A2MYlJ0V4we0R>$EKmY&?x+Mw$Xq~Qw0006H B>I47) literal 0 HcmV?d00001 diff --git a/deps/googletest_fix_for_MSVCv40.7z b/deps/googletest_fix_for_MSVCv40.7z new file mode 100644 index 0000000000000000000000000000000000000000..9027d0d758627ff8a0038383ab6e385790fc5e18 GIT binary patch literal 415985 zcmV(yKvn&_QW1a}Gb&^-Dg`)=tAgx`%tgAfi3-bMzU!L-9N%`kzCHVF-5PDr* zd&0rk##)9iWIiU(OLp*j`>FNMw?${{&5wVj*KG02{qN+hwR&svpljMn6{--rMf`899T&|O~eNK!N zJBybZssR$GH$84ldX5?NNqhJy#!~mF!$i5xx@NDS3HS6K!*ik8I6@@@a`*T^>iB9Q0Y9juYy>Q zd+f{xx)8Zp@$mr|9=hDgD6`zQV}dqEJo6S4t;@G%sn>6rVjqoYDKj_AvBqV;Gl+aU ztpFy02j8TvpAFM>etA^$)V-IsFAHRnAY=voic6~q%@Yi*d zMbRhG{l9Fg*5Z_DQH&dDh6P?5NI}b-Z;@I(6?IW5 zN3G{0aEl#KG0_KLGL(dO7yuE~H&uu>&?8I`y$e~8c$N}DupSF=96t+GC3cR}PA~;1 zERxvtDyiKc;CUK!e)CRrY&vphkl^UE>NI$LqHzS>>oo0j-*wvW?n9RRc=r@wt>PUeMi z&L(2bUsBmk-#tic#k)kDUwsBHkbc48dJ^C+i}F6VoPDJb3Ck#V3v@k5xu84M2g7GN zohb*7^Wo+yb%D;Ncjx49q2C-{mXz?t{n7a#F$7)E!ef^L&-_<^o#V71&NpI4kT0!< zv&88Oy-E>XqFi~g^U^ij;_<9R(wqoj5rv9G5iUOy9fH$)u%59TNDKL52;6V1<-lX` zu_YS%%<<~IZSmJmQM`=Z(r`1{{6FqouxYGn<=N*H`)s@Y{PHf*pgcZs$!$b#H8~xT z?#-}R3i;L3D*oEUVx~X0X5F+MIX43XU&=|6-@fZa*=w##%-aT%8!N3#9fTcsu)HZ; zVDGO@ak-ch>G40DP3;dS^I4Xj=prr9R5V6BWpZ@UntZvdYnJ0+E7+rno zZ`zM{3Bug<7F~(J?vYPvT1I-^Oz2%n-;h z2QKq{r%|&JMx;YZ^@L(u5Q(ggg#C3*&S!k$?WdoJoZ1TJ<1TLT6$Wp*8SAg8J0Kb2 zR6ZK<=kreDSWIL=A&Vgoc=FlBO-5=A3tA##{IfD!YJF35le&)upx#UNV!?A?kt4Gp zbd^8`az8eag|gBzRML zaQ*y5W)D!nw`HUjgz1%CbC3$=*aly9ca3IO(q(^5h|RA>&*)V|T7!TG>fsjU=QVmN ziJ2`Gi<`M2D|CK^EyFmoc*X?Xp}LlGrwJ!pFWsX$t}ya+Pac6y@GQnkaTOl+1==h)RVFGvTk*l z@P`+S#g})2q#WL%j-pG$nlh0MV{(U$AZ)~ZNU)b>o_<%5j?-7^dUFe;R2?@oC08_x3%CN=}tnDcu>#oi%HMJS(zcgTVU` zihdxZl=Mul%I_)nZNzomwGMfMmf#utl--_Y1OJ%$LfYvEYe=RIIM@CxC>(z=?4jHp z9#YoErvDTmlEcSQa=@V}vWZv4+GU>;+`&sdm(T+_V%*Hn3f*f)zM+^9D)`w%IO$qi z** zrUq+{B%rp_{}^j6DL0=JWoY99hI3zBarR*@CB=6v;s6=%mjGzp@TXU-izSD9 ze*8&o9~a6QSq#%XaqGpj>^b%TqxnFVmXmd_O~#D>$(-Os9VisD`(B>q&)A7%KCpAL zF3n`jMKAsb)igy831v6#QE9+WN$xLvw%?_0AAKAs)bh7lEoQ&cTV@{l7?(AY| zrrODi97MOmU$@=~p`Z#ggnl%XxMo5$v4sG_&EkG_byu3r`fGRotRm zfEnO+hY*`y?#G$7iE;R9;7p)3tg?sRdes)R-Tp3tuNp}3hxWuOPcV|3mh(g?aW5$? zDS;d{ram&fL z3d+erwC%&3PPmdjiWzU>(4-+2)%(J>CL7mqb!p3ZbiJWnuZT@WQ55%7{{^%Q2Q`^6 zDtAMdPmKDW9o^jFoH@Q3>2a}>8$zZcCjwB%=FyekORVE@B555S@FTGAQhc&;yJwFL|K~->Ct|q^g1sa{$xaAX?pR{nVK~O z{3OxMx5&12hAnDa%kzs6su`NuSd%=A6R%_e)3w>WMNku~jn-S2B-jQF=D}zFNd?H$=_E6P}nRT`SL0FE#8K;QUj*(D3-Dxco8f7DTJ}%(?P@tjIXD;CNODSU-cwLy>Eb)?|C@ zBcE05TmN+e5;HVL;w;9ZCd1(c&!oxHu~}{iT%^KouX8&}r27Fy@iQ?0g;kha*COkp z>p?ndmoew;;!=e4rrBgy1IM9bN-S&W?oJy?z&D%AMAgm@z}+xAgg1bGH5f>^h?u!@ zJ0;5Bb8xh6mYHgpp$?Z*7jIvR82_D@Sd5cMDds#te84er_y*BRPyN&3_-$1Ez+%*U^Ss=CG! z-p$!sP7WVUlaz7h2I1%P&QDtyBm8BXkk$VWP6wSEA8gPDgJNRh^nm(kDzo_pLL;FA zqpFJa-0k@AdAow~t~_;A;u>!HR6A1n`a9hY@-D`eXUlQ9TIoYbujvw}*Z){a<_XOL zwMHpU{amo<(=q{jJ}N!jC1BScM!s^t|7aI!I!|=RNgBU>iwBj1H4cj2P$21d4iGM(Ti|&Wh#PnPECWI^qwQ-1LI!LbY0zK+-yvwaW75x+)peifq^uG`x=4^;RF$7 z%a>chYQWD)C{-KG%@(5Jeb;z~{weT-e!uE=u-^q3M)J&FYH3FL}Y<)P<0e^y=Hp`y8(Ws4C4?}DHKs*ZR!3X_wH?*h&&KFDT z+VR&5;c}1))j@YgMgM!KzV=kE$2JvLb*_j{wwzmj5RK4L|9X@R*%%YZib)sXi|kn9 zqRtg374Xvbb`iSvQuUcdeieIIY?cu>vv#F$1tI9EU@b4r z&>g~K!rF3d<7Lx=%27qLH-MM#p1(7dA%__^eZ!%BX+i-NlRY$z44=a@ZuGKQBhTGY^i*LpFPSgc&d6 z7IcCl20@Rwx|75RBIRn4$L?zp3%*QVfxM6{yq+fyP zaul)q&!q9{!I#(Q7VqjY^L*lQb987Lb`LXbrbD2JQtRQ?({>JF(A<)^wBe}53WY_} zvaokudqYmNckf6zW|N2JW-=f{G)i~Bc@LxnmDY+ctNOE$1+FlEZY^1ZPRTlzDCVZ7 z8s2-*g^q=Z8Gi!Yu*M-??c+x!c|>hBvv)0kDM1|EiNm>+cCG6SSb$`AnAN3vl&8v( zm2QHpw=-J*#rUb4b46xQHpuJ=q(8C-l?Rht`31>6q+ia%^LBDLHmFcR_blEo8K7qr z_(uqfmk7dzrMzXZo)US$k35i_GW&60P`-yI4zeVkd|bCJ(NcstZnWNoJqo{cV+(nY z>_gpfsKx%yC-*`B<=$!~3Kj|_@k@!-L;cj{l{AN~mcz?eq|d_sHHKE#HL+>GcgC_H z5fv%&-M_Bale(CqGsR_wyp;uLtRo!^zE;bl1BxLD!D(>_QImb0Csvx@E%bFf=7-_p zXP*(>s*U*>9(6iyLAd;^mryo&I)7I_R&8#g`+zKI;;2Z1zWLeR?q29F{VXx@eGoQK z)Q#4bjuT{FP@W^$LP|oBM!Wg>1G#15zWi6Qh$>;vINRY^{2ye76uylu{WV#uqzao zL7KNg;=4`KQ`bWERM^>3LVCuZi7Poj%lniYp33#p%K>$(fpSAlyCvOj3=#E8^aFeq z?Z5>;E3}c?oH>6}u;R6SGgaBhJOkEH5hHXf_H>Hae9kHxR8%|dIvG9aG&c7jh*$mG zFneLPjM=pO_Nb6F_?5xQl5w99NkXjRY?TC6Ur$fz$t9zr#O~%~A3jK1ZjUM%&|U$Q zJ7N@v-?h0ld7o(fS?BEsR%lmHWsr0o-T-risB-elbEzk9@v?bDMc6BlN(!?wJ~Bq7 z9kxVZoT%$oXEq+xz5;xSvj5*~DA|gW zmeE+gx7rWd^3T}7Mye>Gq%k^xo)Zwb-zhKp_VWF^-9rNI^AkgcxkiG&oDNMp_rk6D z8P&SH@sqGKdi~%a%j-J->=Td{m-l`rgu{d-@iY<121vjYzfSleNZ{#{984mJKDBh1R%=ZP91M z>$?Qj6BmE(ZXm+BlZL;Lhd&+@Cb^MNCTwQwJ;)|-qQE{RwRUh28pvXV{HklydKCdK zWX!X%nh8x|R>dr)`rGhe4z9BR@}ixmxmmM(BN@KIaB@UU1gqr+|-md=J?8&BQPD)5RLiy5qPlMCb|C|#&*I3i?%947PELT z03~Fbrfk zx86sRZ!O5giGldDi;vSCm2rh}CW55OE$=cxb?q&QKGKi;`Wm4~hg+FzRCpr;TxY&O zIXH+I9OD1)hF+!nx1-~iiub#u?+qWart@n-o1*W{7=Cj7YnqnGFc}vZ0qx8pUIzrj zEkHl{d|ik=)2MakZ3}NjMABn3Ho3z>Gi~Ugjgb|sk_w-;xErM4Ay~296^$-tb1a|! z-Q-=HM_5@1yPT)`KCbG%#m%=oh#c|CTXw~wG0SUG2C53J;nldcI^JhO?;~F|Frtl+ z=u9yqaJ58=Xa~Z^Y{71lkv{oOTb9vClk2uaO|D%l{~B813#;YlW0U4A#HhY#GkZ2c z-euqxJ$a%alNmWH1wRKBORrRWu0NAiqWgrnf3o2|DZE<#jrj&`amx%`&dhPZiGs^lokN!^Y+psw?&@T4npn(0WL-ER~FE6@p`5=j*{6i zJJvzG`g>dFj0(8Zy6%c)EE=Z4nelYuI%ECCPvgfTX-LX8e%ahB5eor$AkdUuwl7}p zKU3U6ogSqi+Qim!EmsF?WY;7`4d#<+fjwLup>p@dFHm#gMBw+!O8{X^NkXYNuhTw8 z%G+#g$rsmp5#8%vZjG?9NT#G2x4_K6>&9r24Fu&shp(fqUMdH_FYl>~E+sIiKM@N- zO<4;Yeu}nKLmXIfoR1WJB+&P{dBCdoMDoqaiuKJ1HG0(vlB-@J!$t>-) z`oxjU|HF^?RrftZ%P;c| zUIi1Tsaz)27S{3V1vw+>uVj(FgsBFV)D=&<;3VCHU0o83*#gj}1{&ttF|v_PDX}+W z#x+HAV+56$=XJs7YBLCNMxC-Q(7{7UC~WN1gs4%V4cALRa)XtsXgu8&7$=nqfW_Os zgER4}6e?cEWqZ$v3D-M^_n(;Oa_1wd*h>f6iU%JwRvzdon#uH|u}ca7kktW3IuoUxR3`@ z=czhaxd(f-Vh{Z&3FO9!9!pd27oB6$DK$PZxM1%3#8cha2TyCiJkHj~VMd91jsb;+ zFP2QEttgKbBra{eE%r>7J*3yWy<7mT1G!)6YCmJ0rvlm}7ovB7(P%^&9x>0}NpL+V z_zOG!uWJ)o9(Z9IKlr@`+R2f51x4JO!|~BU_{B2V-?J4A2ed&R?I?a`Tcc~4hQlPE`MqP# zJ2dmr8))zO^et2ghv(`;&F(AU$1^n7T3Q(P9qWBZ7)6EBS#=Khfo&0!OBzN_5*D91U?( zq!W#aR>t>a^3xH6a)fvlY?lQN+!7X4#!u|Rzc_+DCOKp8>(ubOr1JDjI${+DR3s)TfK zH)-$)2`Rc+bzRVO8r~(KhP_aaGi^^=_o7$ctyvOd$S zIK8SxN|(yB)cIOJQ}sL5MLIGWu3)TCLNzKs@DIRoK>PYa$p<=qY3yN{1RG7SPJeXp zwUG83#tiGO>-io-a1dNdg1=jDX<+;9{nFM{LG-Qcm=lP69A{G~wMGc@k(8uq{lu>eL_;}$h8lHLj=y`* zHSn1wCUgUZ-!lObJ-+47mBUHL@gtyBFnF(a@4AgZ$#M2v2p(y5pj-W~kt%niluX{q z_TIu0JSUq5rE_c&31QvyZKsBXK~+gJ3Ghvzzt|zBGohy&v@heuynr*R(w#>54diS} zEr+${%5u=)&DfqiO;UX@7$Gmu;oBU}dvWN^tDaKaOT81@{iHV9AxuY`s-249vjNXB zi*RC}jCYEEW=EMY{Oi~DQ#>dUGBb=ud^6y@6OUg$_%ffIc@n?X!JiTs*|AdcAqz%& z&GcWu{cC!gn`s~ahD2+rxu-jBuuNz3OKnP7!rvCQtoTky@|ch!wi#}6=AA>XhlyR& zn-t)Mf~KObN@nMc{M9V6(&ntvZ^bQOKqS#W$XjA zxJngH(s@7BWjk4UV{_MXby}so_lg_&%{^ie8NpMo%;DDUVD6J&+vb+{u>mayt?z~! zQxe!`R zT@pUFbC8?EP!%jPI&WpF*?myznDNVC4MzevQ>Z!A&9*c)=i8TkvO!K<%@Tb>NClKU zIZY`H%1k)>QzF-la7iX+3^O1qVQKOs095~sDqnh5yqGQ1)z1&ICsK5u%j0|mEZ>Qa9#OqRM)WX zXYKhN)nwb6&D^q}n6>@}h|9oaV8RwWC8dPlBl5Yn1#Iig=yXc69lP&1+8j`6H=bV$ z9>!{&$u@~N#wn&hxi9A{;U{O&@d>kC5h2(%BQafm^@Hhi(xem}^;-?-!Ju%-XE$er zP!m}D@nghX?epMIZkR=7D+>_E;>~=Dj=kvIwTu(t z@xKe0qaH4VbnHH*tQf$A;2`fdC-n%Hzy>cRnMlMclvFE_e}@< zD<)l6Q5bLUE=5_^Uue;vKw{vQY_eB>QL)8jy-O5ZA2m7pDn4sTx|q?so1;xDOO=Fl;kpqq!;Nrv zDUQ9&jth4!T!b&DO#o%nxu--Ev@&5OWU-vL!O&#Wizov#qG9ch?h~LLRAmc1gvg9? zn;}XNbXO!&-XTynz1D3lhHx+m>{G%1jxLU`G)2XLWdw&ALIKs`84(EN{8IMD!?)_+ zGVWSjLNhTsQ?90?CR`dewrVzzt~hB}nF=>zU+o??@-ew}aYiSSg{01;=9t8mgiYCP zZt%>!7%EbCUP4;!mk(RrwP$}X9=^}1)b{bNq;DokYbZR@I;^JkuC>0^zy~8+4ev4Q z__4$TsRxlP54HN^f&Xe;JSazQ_RCK?9NDZR{PMV;kqfx-6M`EEa&Ziw^&Eq?O6J&f zkB?<+nY8uGIEJy66p$;_=Tr#+s^wwOnT|_NTt~U zy6-TTQ?8VA%G1y>r^7dqK{vhhj^%n@;+g*NJeQe*oh=IsP7HfM|4qv!lhUo0fc0cj zqmLBir}`T?k-bQ*Z|U->o#Yn0aQu)RE5K57+Q~a@M|i%NFRcPSXkZB}BCCfdfQu26 zBVrDXI!D($x1&d%u6e=Yr%-RlMt91O$Oq%k>Rh3#&B}}6Ut=ZKxfog?m7}p8KTg}C zkC8RU3Vv3%p}a}YM+FdD5!+E+;O7|Llyzmnplc2<3%}%yd-CGcCXmz!@f|(74#@r- zy{)sVGek7_0!HGg_U*r;y>Sz#?n_I;!I67=EX*aVOp_9PnlUstH`P~Vy=-!(Ztju` zpk(Bt2LvCLwL0COcrz+eB2bSdEX!F+F%VdO&7l&vtmRe-$wdr6~u&@<4mWex|TTSD=nn)tBKw?X5HZ$n36JD}X)9Nsi ztQI`^=3sQ*GPQ$CMLmSztNtsHH6E|gORz9dz7RIPl}`+Yj!0Ow-rcuUCb7Vrh4 zo_^nO9cb7kLN!@Z5j94ECG9Thp#D)(pF&|mY^&;BW(}@P{*&RramFkpO^7ROj|-nW zc4(nw6$?Hvtiv~$2@WO*rldeZdr#ay4pRbId|(&DM2YFE*G!tgJeg3G2afY5*9^Rs z(2ple#8FP|F1g7muP!Z!lkQEgs3Wa&lpyzR12oY_2n+S!29lk=>#6m{kjadIN{!Vl ztggsEY)Be9@p%`L^S$`VhYbcPmno!d?&{_iYog)T2Dd5mt7my)D@dg44TNlLFAm$D zTNWlX!B9=g2JJA*&1P5igWe(*0<;sJ6%abLyW{V(L7);C9$B?U#E{WF9&Hf@7vXiwXy=LwHloZI#Y4$dS>kY z&~WDC^Pq8&RGtR^wop55XIFxpt;s z%^WLc@#x_?LK=U=0li|pfMQO3uw#lOTX-G-C$a?KpD2yE2^Gdh&5!r3nx`&nGtUQk zS0B%r%jmi8$m5HC2|CrF@x?Yf@~uR=bg`|HVNcSL(?S4eIIoQd#0Z9YjO>IVB`JM= zkTNlz-c#Z76(`!(p!Hz@pu9RCIae`6PkBuM{iwwb4wI6?NZM}{(!fn z$fd3uKGiuHpyvp9djh4d#9QcI{oD~jLs+i#8UVgz!2zvNWysZPnA zdrM$a2|dU(bD9g3E5;%d)Gr=E74EnEuv_3L>ka0-c-lR?=1+Ogda!yX(q8BMbgoW- zJ*O|OfBnJOaYVD*+VC++xU9p6=c~thS_rJBTYCuXrTyLdKhCUFPz+165A*I!>8weG zgF-J-YEJbz=2G$V0;8YUO^uRvG8sH;A0jBEQj*#$_G78%L0mLy5jYhJ?BOe+Z>Q8a zx$XLQa14hX4d(!Z8_W+I%|x^JLIUo1{9k45=dy?8A(x?ZHr@KSDWF&5H1yhV1R?C_ z<0xyRLvvpt_?^UbVH1mwHa6Kk_cj4`(t)EmSt?LjVpe_}6WG_kgpgx*qCfZWUPC6o zw#Hz=ev;$f;AG4IZz;uui-H-`8i(X_&`GyP5ARdy-}>UFPCmgbeY}lwbn}C z24{TTCv03I3)E+@<_d|*!+W(Bp!4MZN2f_rf{-6ri-~ivOC=sq z9Uo=5Y82cJxpo?+lR||ER~@UW{R#S$w5noxRkX((4~IawPJ2Dc2dv=CDPi4+sXR8o zgFGwb-`no=5;HJ2??2%GL2tWl7;QCmTeVXu6BX~HBS6{1ZX%8#%>8o;< zQKe!`IMQg>sr>D1p@sWxG~qZ?zQb&Vc`nNS&yQCv(WHgWS+(hr4CK<{jk7$*t> zcOUrbUdsrZuwpB(W1Lg3a)Pf#l`^~qMdf7@ExIZv?-Wg$yP;}Ap&RNZf_q%1Qtdh%}=VWC&7F`x+k}Y{UjD^0dI|5-LM-NHNE9L%}7v z#$wwqsM|fzvS2PTO9^LZ+m4Qo6t$B2>erwNXeaAp@ZsGBw4Qo>a=8G4beI?8e7Vwc z+|g=%x~*^JKSU=M^Pz2IeO8;vpP)#j#33b(Z>V=P!k@;&mO4x#Eu;a-zRsS>E0Jbt z%FZ4%nt4I*03jH}PhM>VlY!?UuJkVk>E<=%@xjs4b%`E68Jhf<;(&&EZ2Meh3 zKJPe`=RAjww_tK?9XNnwml!r>MB@1(nl9e2s%y4TZ@1o?u1LTw;f1{OHYip7?y=>Vao$-)?;u`onyl$B{<}YYPLGpWdn1 zr19FIt6AA9ov+pM`AG%8W&x+ZSi?t}cU#ok;wHJa?^+9VrAHRZoDkw#N}l+R&S*w4 ztGczI6MG@YF;{-VBd zjYACUp!nXVb2Fu7ew4(oi5z(YIyFZa$aZ%$1@Z!I8C~Z3+%KDdm+m_(NUj!0wn-Y; zJ3_T}w!V+-j0jGF70;$C8;u4^iX%YxFJQ!`=hdR;VP%P)KzpJ^-@O zhKSo2GN@uCF$eW<0bR-AxtZ#Utd!@Qi3I00vw;!r^}E4-p^yrg{@Ue0@O(cf4r~+x z354N$$IEjTZ5QvcZ~~mYbq2{3{cV3wF5UtePsV&|Yy>h0XpC7an~I{?>0)b3fD3Hf z>z8|W-3|Kf9>E+qa>zl#MW6ZsgxN0IskqA!tbed=40co_2^&yu7G2c*Mg#MlSfU$h zXdwK9LEF}sR6oZXks@mqeq96q-tL~yC&22g6InM_0y8O>W6&&&;Yw&xvdhm(7h0hq^s%4FI7jDX zTIQ86NTm~LuvU`cqRsRNy|-eNE&|i(x<3H)HCvP}_q+a~KO0aV16bG;?m+~KaEH#g zWQcTgMa%L$Ksx6jp^aMM3r7E?nUA=d<{4R<;uXM$bT$J4F`xqVd{W8i=O1%7 zDtY(DJI-5WJfsM{Oy&gMmxBrZpqXj`r}1RY+1%|gp!~6vMmPJBpeU4GaGf>ZN1$BX z;E4tQ{ql8%iIC#04dF~QphR&1SX|Q4CHf5IJ}HrkaMyNSuO5XIdeqeU1Q_3xD2>aC zk1buhc1rzxNa@Rrd&^Sp1BZR&&h^H8@vX1%j$V9L1i8p!?zt@rr?++6^_w?Wonk1s z{jP;T!R1$E?JVo=JnWYEdR}mqw2wPkcRX`y9j-ozDMS0?-I1W4M8t$(6e+H*C1evJ ztaxPO+stoX=GZ9Ihgc>ZelxNuv*)lkkStL5u&nG{s}=0wg;2*Wsf{o+8CdWzoY71> zG7A5xpI=xdAJJpkUsF_IMV@Za2WjX@7BS!c!K0qEt89o(!e-9;USCNOTuPI8#4~~1 ze!6?NF_O;gEnN?71!E=tRJ+NCdJ@^ESKuDzFRI$faTdtsw3@6emD(Lo)W2(1kc)<0 z8+Zsq-z7OKI3cB*M5uV6$hd689=cFtU7FYl`PizyMHHFZ4v+L>$ynI)FhOvvJq^IJ zwd<^N7rWgv0Sa=NBG|N<{E?Xp5Q?EZ(GY-Rn(UQ^);_-sAeplY{_9DmG}J{5L4Gix zoNOn=T8*c5;Stu`eQZu0J#~laNMAKDxHTK@UlVZ6y9*SDcty)ul1LV6EMoX8G+Kx^ z2S(}`*mKO$Ysv@Sgm`hWw=fQxy}q6aq#6}Jf`XM4kr7&gH*t>*q_KPlAH25#EyPh8 zqPyWdk1~Ur?mw@OF&Lef^}@ZzB7FuhIqq?Ipv6I@y>UCw8B(l!07H)rE0k^xqWH zs%kspbf~(YPWTVwf^kR>fyZHEHMLL5+W@Id#F5ZjZ|BD+Qk~G>LwobPzp|!|;*PPk z1}0(3-W%{ytPRsYi?V9;b7wGLD?@2l?+-?H{%&O`v}MkFSt)Q+Bh)bgZI}=DavOdv z?wt$r##_xOy`ExoWH#=Mt^!;-q-QecJJ{gEe1&MtJi#*qwaow0-@if`&*>?6P+6P5 z<3sFpH3r6`>gsc;q>wZ7WJn^lm$f0A`m2BpENtGraSq{A;_Z2mKiRr+s?kvPozr(r zmmx#TFZVhp{&FZ0jddij`!KR$WE5g~6}a|zvp86DSwZulH>^z?uZ+uDiMaJ8zvD)&TqHa@CX zCt#vs?x}*1kB>ioH_J7bOxD|WJG`Tg&aq+oQ*FMK%jUzuRyMkn zwd=h`x-g#<9I`KK-tx_&%;o?9!=bzTrBq?2S+kcE1UC@!d3sM*ubPeayrm$sXjZvX z3DmA+`<&f;r2qc;f8;pY`)D`HoG_OjUcRtJQbDzjY$SwpNBx|mCyohSyXiwI4oSX& zeT@;&YoZmvEB_n25rOenVCsmem=1V=wKGP$9{Of zoTbKN0SzbY;y8beLM#$3GCoNA5C||R-7{(>5VTqHjK{%$s*P5FchE~C3m<*9dSH<7jkKB0L(-qK1h_qhjphtO%*(5qEMGI4g&a{9Ezjg4 zc!Xe+eJFGX1X4c$xrRm3x8x=K#qy!VId$u$8wWKjv4u!I6IT=$4GS=W;Bhq@P$jRX zZZSQ3vD16hjQCf~tf8aqfxVu>GF=@BAi32PzEFTFDhW|m*L-W*(ug1J9BalOT94M) z{amj@yKhde<<&OZ#3jDx@e{^oIy;-t@0*6W_J!jz(q%vR@)%;JN+5}Wyp?9qE(k)W z_xogP1#Fj_ngYF4e&JLIA+3a8>$&2WCZzQ@XYy3o1#q-=tGhsabB3c6;E}n~ud~N~ z>(p*k)OlTccG@%ti8Jgxhn6H0Bd|eInh6X%wgy}bkfnndRhX)VBbWM1RJFu^Ye*BV zV#_6Fjn4c*P^EQ|>eLdYR$;&jL-z*fq%I2~v3RB=M0MfWrHI|c49DDNmo^i7>u1`9CY z7}+TgOD-OavJjQ45ZFHWzeZ#Z&oWYXt0+g+!1~wAN^410n^0ZS~~QhqhngqxkVcuy};>A--c#c;}pW_4f`% zQkK1BvocF{fT97%);1!3VSwSrnAY(nOaSMs9?^k30Cz6JT<{h3+Z9v1q)m0*PuO_> zxwWyXH(I;}c8yDvbF}76v_0-7iKjBH4SQUKip~9f;@}P6e~r|q_7W?2RzZiTr>6n2 z`V#M^iLt9-qA&;KzVJ~L08+o&$Ae zpHD{Kb)!9XJQ6cn%3__X@gP1RpS!QQIrZ(Bn_EZiwp@lHd1leU`7*Z4j0*l+H~I}A z;L>+}TQnT#^qKTjI(xsass|*2(wIF$+P39{xP~|Fd$ZvBdZ7g9HNls}f$am2)sn`X$676!RcUS{PMceheN1&Dn(8Ab}oM5%Ls@lh#_5`TiRfW^hozc2M@W0h(>a-?I;IlAIhRN-PD=c#LaMRCu<%lvsK zi1k*fY^})#We%=zm`ovqgerWDgP@<(pQcE#N1H+a10<&Y(kk`H*}-1xKp2qQq?WX} z^@X!<9VQsNnEvTbK>*j?!vI34w7`*(5hU25e#KST!s@_&)J(BYxaq*CVWT@4oG#MG zH?|T{gpn?*uC)=C(eL{BMW1$VNoH_uV2`EV1=V4fJW)48KT8?Mz zK>y~jE6Rh%ljznFa>cerPM|7|V3BscGdiCqRLG!htZ!93VfyQikScn1msH%M@7nrY zSJj7b0r-k6mxnZ4mdZ_jn0&F4RvekK-5!*JrY1-gM5fP=sPYBGaj!pL$Uh!V$>_e) z?=r+IT;y0ie}kwJEGZsvU>pN@sNy{pwZCk`Z|z$O=^R*p|596n1EfB(6vczTg&=_X z-ZE|@RH*Gwo_lU?s7w%VE677ocEC41sx*`^9Y}o>;jA6 zD$jCfq@Ca}iC?jEuCF9qk9EqdoV4rp-CD)zGFJJgjn4Bk*|y-^ubF~IiLh1UXKzF8 zGd_gAlswpXlBq2%I6%LzJ*GS!$r+b&=*Wb1<~R#6Nsiu;oM=Z%F~q;CO~_v`rzOrb^= znj>S>RWKBBJturfS~|!)udlYNQQV1Of6MIKrBvT^!S4cB=hBt)08{QgCGe^e>~DR_ z1IAxJ20`S^Dp!JzyUNOkzJn1F%m`VE+Np)&-xt+pNB<&4FkN1XM!e)g8N#d!r->eQ z?3(hG`j%BQp<`<)KQkUC-1h)H@plb=YuPZIXVnXJMx)NeKHGeU_vsCr5z9*N0>IAh za9!FS&CNbU|Mo`l+I6oFz|nc|Y|ApW7`1!&(Wi;2sB+&Yk`p}00~Gczd-`aj{Ck2uxT0JcocCTM!V-;QdB-M z%#DA#Fh7ITmS+9;yDnJLf<(?>+xVQH_ZQj}=FKj(#>=?cH3~Tw)C3VX!Wc*LKUgFD zNVnkuJ9~qQta(h$DDCHYRX@-93kddvIP@O=`%{aote>2MMNitnHxohz4N(7nGBg5A zC$fgut}AjHketO)Q8C9Z(wKc=Ge_fFB%MfMqcm+QA)zn>cA?+Rs-t4a4pYR+$XEUY ze6@DSCTsOiJ+xo@^y!+&7%26@jI%BN*;r4Vk;B-67F%=aGqqYjA?g5NOBSU4|+Vrhhmv8uf$E;SS5sb z=u`dMw_SSbW`1XPebwhL*<8>WHk9_s7Ct4Rpj3t3C z6mZvqEs77>gwRK-<@WHEvETe;%BD>WhU#{7X+_7WuTgSj_dX}lh|^5T@LSMi1cS4W zfE5;qcNutt;QQcVK4BMNNSuB!q66aJ+?PbFK@6aLN9r~yUxpo|@x|S6bk<)X03r%T zC{C$BgWUg0GI-{PXedhR>xdHI zgnnpL-Os9ZLg3*zyy;G9qw#!?U|W|-WBd)uURxIGC(;W$y2n{-7mG}7m{V_dNX7Iz zSbZ#@olMG_pX17i;9HT_(OI6G(bvp8`zv6I%lLFz96&IQY~U`Stmi-f!_T38YX;%T zPlQsBr>Sn7*_pmZ6B3wkh-*PFj&~1nYT+v*G?%vI9*{X9fZn5ESkjPb%<6Z;`x`3n zO|@WWP>biRFh0Ti4YX4Dq*PN}EnrutDSgorMrIS`dOs&7Z=UrF&<}#T?I8dDP-#Sp z>?+>dKMEaX&65tJ7mIzf1n!)db6~kKaJ-V2DPdX&WJpcSR7@#f|Nvl z%*V_L7?(_$V;j2r<@SNVaRrchFrjvGaj(jXmrgIFBX)Yk5E0hZv|7Ot7a%)(I4O&C z1`HTeMT3bwxw|Vxp3W+$ZSDryGJ6%l&XHlzSJIYO1xag+nS<+^x2w5_@@k@^z6KL?dZPJDj4~a`!-T7sUFxTUJo{-K#j40+c@!QFJ>{{uX&7X+C z27VPQ1@k8YYP&At#|V@gJs>};ny*;lsd`;K-60pQ&?Mtt+gTQS3YE+J%^w055lVhH ztF)%Z|MCp31+^j*SZ_31?VpDKECliT;T(V2j)^CZl9diSKgDC|Va^-9 zOwe>0H2>`?6#*b_Xqfdn?L&paZA(CSm<&L{{iUpvi7gYdyz#4xFSV{gTv4`&^wOWpd5h*Nsj# zCM+)nu(Z;b{$geYJmc%{MhtahjfNZxLnoY;)x{GUkUS5CPV5~FqambH1#vpZGJm?R z_Fa?!fxaA*GfQtk8|v>i#&UTcW~N)J+`%Z=fY)w>Gw`L0|NTq!M58S2QcT4{X1DErqVMu!|SIvglNQxyd_B>>JJQe6-A<{NpJX!*n z!yP~bcFp!2$vRQNaQjT_D{@$m+cHMA#+z_@j-v1;$ZF%_$Hv)gT!~AM1>jk|`s2LN z)4+rqA+D?N|K|8C)QcGy83>wE<)Em46wa(XBDXz}w!>r%sk9*6XN`RUaTY4J=0+$X zKzy+izeR6X0|mXjOQ2~nM!NINwluIT@ci3t?^)&E`ha@h`dPM%$Z;XQ;Ts=u1F*LF z;6^K}1A>XXZOou+wK%Q3gPMwz_>a zn2+vO&vYaOm|3Ivqx(=^!jCWnH4DEGrll<>mWSs_(E81~uew-HzJ6zMoX#M11iBIK z=N1iV@ruG{q(f1UL2WZJ+tLnWsgKCFG~)O4IIFt*#&2^QMu#$%X27CDqP{e$vY;JI zBWVQj-v|U6`%q*ZQ1LX3Nehd=N|lC$7)}?N`{wvJbgb=+w5;uc*whwsWJ=lg68ZRs z-9!M};=A>5A2z)szPN0Lz!gfkhK?~n76uLGV;Kzb@(nBl)UuXCL{M|SJC*W{wGga8 zHYftgex|SD)1+hlfT4Lc7N--5y5P$`&Nf8T1zC2<>a6gaX&yp>l%*{^3++MHGtM-u z61CPwlf(@prJ-nu8;>l!50FyQr)e1Av@iWB7&P8Juuj=gH^#2MZ=529XU&%SRoMA)lH%GQ3tpzm=J_3R1UX z9~TYc-rTzkg$p5k6=(lPJ___1y>!X3WFB*u9VrI#WfLh-iL*I>CGU`>zN)UDurJPTB4RvS!!`}vL%#yx>mRWcJ zY2o?b#xxwThV4~CR41S1V_&zeYJtuPI7ng1ytF55QkJPGeDBT(=mMw}rJ77Ly=^c9 z^F^~hyFkmoOBY3iL8FHu{zv_v$E}3u%*Ys(;x;F^8|+@LN?OFn*9xsEzL%4gd*p6H z=8ulChG3OMuU<-k3SoqVm_1KWj%Ry~hx%S%oNSRmZkmF(Q<>~zskqOY1dS3d4t-;V z&(m=snwzxXa>oFkX~i&RsnUF>$1he9)CLq^L>ol-`WQ3tq(%rNBtLEW?)oEHnr>_& z2Qvmp&a^rosL&4OW+g&tDAMYb2sPG2BUSPFi)sbPnHh^|yPBTGbr`uzWY*1)FmZ2$ zQSi$0hbb?0vjfu|Pv?2llBj(S$LZ~wRcO=RBvUSe9D5@gFvLU?Mg}|4KYa9=lm$x^ zh7gHT_5bXRp_dy-iSj(0{qoN4L&uKV;_u4!*)FpT(Wef*5%T5oYjskYz{yk%FOP=| z)|=rK-afa1@Hi5V^N-L3;lR?0FYv=bg`EGA=+guy!e`vmjp?zge?oqfWXQ+HB}~BimWuua{<&ZPD)3%t;Tzf`Ie5Xf`B5W51&>- zz~+SG6BV@u5VnUvfC?ifd9(VyY-zO?=e`|?m+myfsF zryO+rg33|<#hYD6Y;4tZe}-mUgf34O*~KAvfgq5#v>3|h;D~Bm!lWR6u(TfzOL?R0ihJ> zhfTESkZ*;NytpD`Ym+97tKCes08;nx=pf_dJV6I_d$T8sL@^ahsNr$+Qj%dZp2r6y zn_GcpZaJ*5078>`y+?*DzS(y#7aSU2%@BM(qf^1$`c+D4yEdM3*+zwzxcQlR^s}c( zuNTy1^`Q!PSA>b^&<^a4;ZblOwonvx@=wVnaEgEMGuu}LS1h1*J^JMVe4Fsll7 ztWOntdEudT&oDJuz0B20*(q(T9lu(AdMr<1pTxoQ0o=hWJ9UHrf`EFd2O$&511zEKoH%S83Bb6X+eYekHfiM|x#Hy7JZ zDBn}Zc*dF!oKi)HYk*TA=!#1!#-4qRj0~cMjO%xvFcQc%;zkZ!rsSglB!+;tRdfx8 z8>ohmN82u$CZm_A+g0`kSeV1SKp#eL&eY+7! zs+_kOc3vmRKc7e_=MpuQ?Jp}VMS38cIMwx}mD;j=3aS^$O{T~}4ShWsY?MbD{<%O2 zS^GTz5l=G3C4`7kcBI%Wl{v4fV~=3IE{)`A+v*4H2uI}lF_m)0kF4jr5{>aj5VYHw zD=Kv?6Un;>>T#pa!~J=fU9=t*b|w00yC4}-j{&p?xX?Vm_11+IZv}n0wiE`@&fZxJlN{OqNT{`S^NWjVdKlooa>_0z zq4}Q4D__|%)6J4cOWiS<%Hd-daIoo;2Za_4XEvtR{9!P&KUMCsr|V`Zsf<`p^nwHk zS~8&5fR(6`e8#z-f8kQA(Gjt^Pr7#Q`5n?}YQ1=&YD;cxF+fCm7H5EiffnNx#Hib7}DAR2= zPc9Kw?uXNn=jzHow8ypk$z3&xDEY2QR>yr#oBtZQJKS3y6)9PBpl|3J#ww^%lHI1z zx^M3v;Sf88B^}fVBTc*nKsM{q(Z#m+(oGAp48DxDlX6Vxrk{cgFita7JGxm?Jm&{+ zIO(aqhcwNI>aSK_Y4Rr``7N8W0fXDc=h;iET5T@AgG~pafu)a8!{16*SrB22R*`s< z>dFs`pERV3YUhG@PNY5)u4K(b1S?5Fl>x7++(dGSQ4lpjRUDhaJec3hPbaI>aWUry z=P#}N$^g93jT`dsVhWk#hPAI7xj@;@!bj9;I_2v6dnaL|TCQfw~B8uJ+S<_FsNUfL6^4=%O50!6a4*PIdq;P-uo%M2`!bOsAShY%Kl)y>;wfMJ93EMPnEr2Jzol#0S7aWy!1pEy zk<6}1@t$f2lGPfg0UOpzRB>Ef$ea`_M0DkjJQFXsbLjZ3KI@_udwX z9d+VV&_5*Tf~UQAt>(D8r$>bdH^dw3bqShK(~#QO|-&^71Kl$8MPkz9@8#suHZ zz1uNML(umWw7lk42VyilACO(g_8M*g@pMr`b|vK4Om|*622w3|=GF-fVSUV&(Et|4 z%jAu1I2KHd<-FLQS)4s=cZBhqqYI zWod0L-KTq8>LHY44;<#a{iCG{$*uUayfx;#tVI~EPA%trwBmT*Qdhg}YSR4Zr_d!m z0Y!yRInXJ7aP&}4I?w9j&J>ST{U#Jx&OQ6brFSE=X3BC-Dp zyS^z8%LFuK3&kC#JSyGYpdyAJTy}|baH%X0Xrrb!HGYGe**w>h$i%f04T$T((3tU~ z@81lLIJo68YBS1Q-JhbxM2g*5-So;zRNexM$LEaciV}MhpEIeF(`Qepp$xr?p+T}i zPr>#4?cOaRR$H^dnOXiu@%Rh_-|Y-)yF)ffl!#H*Dbzg&^-n8${qrB13iVJ7d=$&;;kwtqYe_`Ky)h9GRY3kA*s+K=o7``4V?0W;L&5}n z2XkG}!aos@T}Gr6Nf30TNODjHpoO?dLdp0X3^?$wMSC?z3)fO;s zL5{S`8YHhG<;Q`lzC&8zX5cCk2`6ogJ*AqK!8z}*Kw`lD@8_Hp9K)bJ!0(Fys5R=X zb#)7Tgn7zTQ_GmjjJB=~7L492zSXk%0=;q+>x=t$DpXPA52s@MLoY|ldx?^%%EEOZ zGWA{Jw<~pHFLA3i*LpJGdi}b#BBlonR&TQl_ZDNep&?&r^myaQnc2Q=WSRoN6wjA! zO#AXA0{UPFiC6L0L`u2A{MO^RZz}}Tju{WxCV>sd6Zh###Wfpx;`s-%%0F19rb}?A z3pcY(zurg}9c_$1CvfNU(o++Lij)?2%=DrrL&$#N+j7v(V<@FA3icM}G0v1v7MzCv zeQuee^>onDzO*q5(7V3Ay(hegNw64aqtQ^dnbfO^x{-{|Ms*`wLbjWMuStl0_9)PW zs(u)Vv0N1FRT5a2QoLGQiX${1q$vaIk(v(s3<4*=z*-)}z#;@1lLoMpAcTy1Tct=& z!Q$q

%MFFyJNm=R3L1=CYO6kk-yIbYN!in&SXowR^(o81W3j49yFuQ?PpD}=r8 zw`@j)JoG%m06#R+Da2ue@hnCPRqjU69Z2g|5l#{OTNJ7Q_vC_C;W^JWxT)05LP}R& z@cCA2mY;y1dxsXGcSFa1jW@{hn?Jq*Yfi?AbO2_G z+Aq+GzFx)SRg^SR{{D!aumrY=z3_fnMl&DbOz=#oK6FmejTm&rTe)EZs$4j*^#*&%1kwot#1)vD;%!-I&yQaL8(12%?PXZXBe;9JdRX>ZCBsjFsmeCFw#F zK7yL`#1zVVYG@kO3z{V4#uhSYeWC|c2Ik>a>HS_c%GdE-{akR$ZNTMJS z2{zf$Fh@lk2$hMu5kAqxeq~kq8GlA_mU{kD6MP~z*;l1wnitTf+r}rCPhegX2N@IZ z^_*^KI&NJIM?+(Q)If;l>JIwtqDKL{gEMtCb@htcCD!QE^>?PSq#6Q`b|B+t}*e22Ev73}{@?)CQ>i z<&bA#3qBrTu(qgOyw(O(%OaC|`HzAw#vRF93b}r{L|;tWHbm=9yx+Vy4vw2`$;GI; zF|R7;LcX&&g~jM_xz7BU-;ao!)}=IGYIMh>ART|$$KaE=&oU8w)*G=4u*!t^5}0^e zljySt^qh=?|CiH&x0Fk@)4~VH0c)U~ye4%aKkvBsCdoN&e4f7hZS}ERO#THW_#8p} z(jM9=TdQ%fqlY1Zk5=Tq&J6!NKd(ab&X2nHehZ5r8Ff~=U3_x03Wy!K03kb=v8aEtG%evvw$2Vr(kKi;^K_zOlT4;c(h+CFr~ZSx#Vl zuaRr`%*yR?QnE0qtP~YEbFTLTHF1MR$H&X@q6)mNJjCX7`k6^^wp=U1b%IoT_JqzD z0eXz&L#Xj+$xYduZyZ7<@CN1FT5H$4em;6nNl+)EAX^aZ0tE9d8tAKFQbTM$l%@hU z>_0+_0!EftV+OA&C1u4SdWX;|^5x^WL0DLuxe=}tetk*T$CY{ty+o(6NN^rky zT;{!HS$vF`@pYqOl~IRMzPceh{!ifBvAM^nur|HX{D)fpUyh%}=oAzDdG^DEP1pOFl5`dbf-;x+X&Mjhxh|lOV=;nwxKnd3 z@h**sniud*afPr9 z0}5|xb)1ole4`!AGM`kdub^9TFa^+lete^ zA|!Nicl%@a&hDpvLCQ3$FC{@9MeNmDY1*W@VF3-vSTHDJh%`Vo!neaLkH zmmvz(vBR2N+lE=s0DL$57LVWMb@PQxnLfNLq^Ul1|mf$m}f@LKK&c$N=$qF|BL46+)@bsJF_i;645oyq;M_->ffk$5Qb?la0Ongs}p! zavXPK6aT=n*7%;*O8L(jWs|cIRerJIwj1bs042Dme$VIYb$o+acSHPtSea;UE()Qm>?J64xDI$4czxQ7unJupO?hd& zd{#f);+1(!KoI^HUtVUV)+xJy$D*5Qo6b&uG1hnWNGuz;aS^CdmCJ165D zQ1vR4wN7p#g6H~tGWFpqMcYk<2%7fNuYnl7t%joPJeH*?;(tZ zKAy|PHN*0X=8WWGmGh4QVHUJlTGNY%D_+;fA&yR=^~1Ld4Ac8Ur1QjUGo>rOT*K{z zxQeJd0gRi_zTfZ4-YFWFN>tZ7u4ITdajhopt}KDF{1oz1XD@UmcU1Vx0z3rwukP&y z3v~`Wa^9Fm@$}J=fvW=tJxBNmy27!sR}yPv=vBY<_nqXzIJHQg<}0l_vlrr zD|vU!V=Jr%1$c8TIP-eQF5HpJx36!+o+3?-Cghw73iM z!k@?C)qk_-Ds$QO0fvr6V@m(594*~OR`C4}YO(bUK;xN)9TV(8ovqOxQPRA-Bx10l zuR#BhEy9v=9^LB$4&E}fOFO$Rrbka)0nmE)+r+k9TEuI*&vU{Stg~mE#H;pTq?|-{ zcDWStZ0n052VR3IQZ^J?ejDbG5i7vSxqPH$>lb{VAY^iG>-gw}N{-KaRqnF~d)pHo z99&g*6;Q(b$V4|-09XxLx8CMunHO>cqtN=$W#jiF55Mg9c*2`-i%xd>TZw*vV{;RZ0n##Wn=|T4?xxb4x?^CT4FVo?^nU zt^}awi59)KG*W$-qcKmmF@)WvgFWgYJGotM7xg0aD)LyWC`fb#*qRVh#y0u@5v-N- zNHE@3DlP@q^F3O`nre78U79_THeA3L%sNkj?H0P2`G;6w4W-}&VA^S))9SVN>ylj- zlmAx?xWtzAr)V~@P1g>eti4O(Kd8&0M2anTo-8(RG>&rqV+>I}>nW5mgJ4A6kQ=NH z9$i0SBv}|>iT5rFYUb7c(vEqctt_Ox#U(!1Z3oZB`sQP!<^&i{1h9-uD4v=hE{L8X z*NF;j&Q#>SLOR8Kg>ZrAiHIe?rjb%2E8N-jHwu=MAj7_l>eC%87Hn$m{93-^$e+#{xvn7uBK`NY(hm>8C0Yi{l|-RZc<>uK97Ji#kbIJXXw32rTROY1UvfaytVX z1&3m|g8@ZKfzwghdWD_H@Gl0gCwxL@$}*+YqAu_r|6VuXgqB7?nPP?5(bSL~cBE z6{Eat8Kfii}MoHdZ_y@~EZi=tgl z{phu&KfA@&-X4tgJi9*5IHJlpu0YxDz;^6>h~Pf*Fc#zVL(_?}4AmY*E3`p_Sb3p_R06r0U9U zB__NUJSBLgq_UZ;8m>K#3WC^mjxtlQ=B#;HY9Bv7lBTld8Z~5i@w}VCU5w4yX7MuE zob+N%mFdJg;B&X5XjJ0x-x&Afulzqj*(%u2Umq{GJA)m+GP9Y{Zma8XJ&Ax3^Q<)m zj1wgD_6yWWE89ptDLd`oiC|k`L_<=Z8VT6tpgOdfT5z)3r`jOf~A_Fq6tCQjmTP!u16GwZU}q zJZ2w~8dMohx4h?(?E%3hM>dmHPZj%R?Z%x$PU6EFftu`;`{1afGd+^?xkauT8AKpL zslaf&g^Ch|e<9ee0^0SvYC^1qhVDiAgcZlLN7cJX&>(}-@&MBiltMCH3iCZN-nySG z)NUz8Yr1Glklob&e_(CI_}RhyY*1z>C>x}uXxQ%N7mb{G-NCZU=mZ8XreL(wa zCHioTNB}grQsmsZEZVB#K}EZL{|7&!*>Wyzb$De`1kLVO7iQ$WCmf#5cu#(_-KW{U z+-KjoHb2_#M~+5%S$S^_Db*8H zx3&=>8kwPDh)*Zcu3>%e?Z8miS?8=$H`N#^8}zO@4ea=^97i#z*kekl@36ELODNyc zyzrs28(>O`cf2%|Y)ab*#*Mg>#JsXUrkFZeN8$LQyE}2$Z}#ot$p#f5PuD;Dcx}@* z_Uy4^QxKwICqT9P2wE%B{>mHQo}iI4xXa1Pf0-MI!R*n zK$4Gn`Wi|t4U&@dc=kLkc+x<2NHmSQ5eYxHcrni%rxQHVXDY~pizy#aK%y@XS|aE& ztp+peREY1^fT}B?_MeEFqq&6maXiiU#=S3aWhJzvaD9zW<|U`eq_@r$gHBSwFrJoZ zb_|RHYawACnjx&zT25!g!wkvUB0z0Y3A7?Gj7?)g^593ihpScOB)er>SB+)dtT81O zLmW!xR!BW*xC%o7EGHz;1_dJRkO9#A1g_4M7cR_Q8?-uD)lz?5i$`+1Tzeq()%Y^v z0U9q)os{u!-(WH$!#H7AbpjSAQ69TLSWTwJ?kkTx5Fn^G3Md^Cv6iZvG#9b+p+MRvGckb+7acBk5nHvJ-2VuFBc!Jdb z({yo=FaV+M()RwbR#hdU)=OhUh+1pivp!y~vM2R_eMO3Dq)7U?*~K4pA%`ygly@S| zoh*kYx6F||w7!ssntXN7vH}OZvPia$P5t|MsS37voCTBFw3e)7Z7y09W_(3})JS;Z zbaSI)zfcuK`bPjV5~0m|`D0KjQsCJ3c-&NKo&sct4e<9u`hVu|QoboRBS_a5 z&R!cC=Uuvyhs{y@OAe6b2=KQIk#)!Pm4b5B*1J|> zV-wGchQHvXYzf?&r_Lc+dOq4UQ~kZk3Z009Kd&tZuU82lf$}3r-w$4icKfzkgTi{X zKKF;$uwHF8_@KMlQ=P0wK~n+Pa-BF)jN9|*^QxB!H;^Ko1c@n8UaVk^=Pa`8MvbiT0gu~IE&)*kZM7Y6f)8nPPT~V(aD5od^u5#0rS^p!%;AX^Suiygd>AoyY zzRRF64e6iOozT?()}^9c#h@2gee9l%5r$pYu=tC2SsMv%rW&`Sk3(`AiLIx%tVO_X z_a8<2jTw<*pu9F-V~m#aE*0w^RY6I{o!ovUuJY66S zls3MGIz;*YRjSJ6*&i(9trA%* z85z$S)!Dx&N{HZBh{(M(bJ^{dOj5mi7sA78fEgG1_jObzj&F3n4Iv|M(jXag(_Rb2 zFy_O0gLE?ZBH4?jHspPV7xw`v=<}Xz2jC%~=bD4n-Dxgso6Tn|N`{wL-iu1aY=Tn} zQI_AKiD1W;@S`=+>vf-X-0P#@KDx!LPMgeV*h&JzC^tG2h5`eUw5&&04nJi105s`R z5&EoJvV5Tx->CC*<1v2{0bWr|p{zx|<+tB!t~qjFIk54G5#JUY3N$vqIHR66pY#4d z>j6w%UEH*Kg>wY-mmny(Hj1v;vppibTS*cdex8rL%IsI2`8}E($8TTDNY=n0G{|eT zbK`}Gb6V(bdAjv%Z>6-!%@g;*vi;3CdFN~5HDpjwaX;06SiwVOc;}F8Tt9keTq?c9 zyI7%h9$&tKH7MrH5A%$7C%|cyZ8`!J&gnvcl{<-MG=;f%N(dOKeL;&PqbCp?H}5lI ztNNoW-v9)kS)NtXy zdmY-3Tib|^401K!O$Ql0s8(1{+nCuDuc$=mHJUfXPQL|!y1}sv^QS@#s9?K;r+u4k zqNumTq%KV5`8Kw6M&#s`hQ-qSAx)`5kAeF1Y$PG@`|*csqY&7*OQWv=&On#^Hf*WCNm!X zKMnY`XGXUaZeE_l?3w{z>#>JUvRC70j3KNm1dj%J-YF?%G~-P7`!=QqE(O6FazK!> ziT%V~VmDRA(wO73++k8J1he72fqM)`<&G)9SOcHCBmx2=a`kj| zxDYEk3^Wv@Gf=yn3r?9CQ6MZL+HR|EG_Z?h@p_rah3OcoW|5Z5_%@ywSrL!vhgUuDx3q7O^7FQbwXLC0mzFmmcw579g= zpqCW<(`2pV?R1>$j!bwHf}Ob!SL@*Yl8^Onzq+}&k?S(HQG+RCFOpX$Yh@0Qgybz^+*)$G3jc;mh}sxp82@d`IasZ*mt&p35pvIYZ3EsCVaWqIk2Bikq_D z*=Vu@CNmi~o7o^DHbZwIwHZcs|T?kPXFB(pzk;e!JsNpHGS)#qq z9@~gWh#zKd!q%zze(l^PuD;s{zX*LTrZni>=Z=IrPG9>(JOXQ-Dc_yq48(B78M<|p zLz0$=Ldzw*f(xili{%)m$vlz^I4~~ZzR5S86za|TB?Xy=Qvgv7ku_x`{(xQjnZUKo zycNeu!^`h#nHswfVpXCJYQ-$(FW_Yruau98^(w{E2E^E*{;d2W%$6Mfo-ojp(37Dy zV6M+A&{6o>6K-d%pvNU9tqQd~AQkPOa;yNn@F8~i^s5-08Ec@3yoSKRYF~XmQrFkc z=l@HPw-%O2aYYNs^Sg|5iElipYuG)n`ZTjxWh01>bbeY0rqUz zH}F|TMnB5(Nq$6aHd+R!^KWPxis%f}Z^lxPSFAaNmLoQCNU5|SmR4_XpER4AKA`m? zh+%XLjPdtf0ZJ}mF;iXpPDHh4hZPTWzJu+- z6RPdreqw{0dOf{mfp4L-$t(SCco%U+!$wgOs5|Q(2ru7b=R$!StLBE14N3No(3zvd z0Q?}$-Y~BKZ@85!7nwF}1vyNkKIMh|0;4Y@C$hW}CNO@i`ye9thStYky8q)&lA`85 zfK?1Ny^5c~w^`b|N3(Wux83k03j~_~YxuYC99T@Y`6VBFyIIVPpoVB>Hu&uE^}gW* z{%}G5r0WKRAEA_kX$! z$p(5<3ZKVs=I58cgaiHFT>&~qc;WuOsf)l zKLP1p(+_{+y?{Xi>R7`hVgMpaP`%ULO-w(e7MQ!nD}uybw8f)L*(Vaj@W{7(Z}yZZ zhX2t*%3)W!^Y^G7w2bVCUvXQUYxEMeR2j1MrIlMRf3b`k_ICzCIYHILwB>&(dUv~$ zPX$vIWL_=NT}r$eao4nVJL9>45LCUN!X|G$M0!2qH9`0+Vc<+D2$j&M5EPtkFtykZ za9(G#1RfQN54r{L1uk?}Vw?)5HZ#3z9r(dQ>4 z=ncc;a4B$dpGt%W_hC>LdlGe$|xl4;D}lhRJz=L_%^3|?Fw(ZZ7sf0t)^{TS#-6H#cgTppn`1L z_nHyJ))~@%6`&UNqc%1>-oHa@VZV>(n|_Rnx1SgBiHVNd@z|?XzoKEpetG?=9?Q)c zYRRS3IpS!#?E+{M1wMS&=ILMez$ns86eHsTOVB*M358p~9+dKYH30!89LlT)9(t25 zTp1}71ro;5N{ZGe87|FxjIokpLO~ zrnA|A@q)?=gNwoo$pX2`48#v=zri z6Lg+rL1l;~ri@xt?+4qpSu)a!zkk;6Z>PiRFs>=^Y{{r%ITTJC>>KRt^1#VQ*ER?e zm)Fhm+t#dfxI&7^|81Li?&1pDK^Zi^^fbG4r^$1JVknx)E{kc8H|HIF#!=BMvCqSr zK+5vD9X!w`K`2|ACIEeO?M!ooSsfZtFM6YRH3b;EfQn`Z$kMF*kMt`A}BHKfG|)? zIq?Kb5myjZZ)a;z{Y zg&Xw0djRP}kk_jG7%>F|2{$wnjG_xK)7K|?6btdgkaARtSpYOZ%fHFJNqdxcTwpM2 z4KFSzNGN>Ci^^eBvYCLeJq7{Vq4X@5hxp$DJ=n{_4eI_`WP zcUK-{2S4lyFhG__KpPdmnho4sCxaQr_K1+XomIYL7uZIn(n6gaIOtI;+UKK1F?H#t@1P5o2|kVNN%gT4V5 z=L{>xaTE19WinS-e+p9Mm)}*w2KdkT*zdWY%%fmjbHstFkQTU;344*72GEI^RbCJe zOnTrqu>i7KLbCuO!R;O{NtRI54ffDumW`2!Iwb&}IEnI0_`G(Q%fKXwJ=H-f#(lGv6-BN#^_7LB5yH!z0{uj76{=| z5);BdH{FuGB)vA6CpvdDT{OQO$s?UjWXsQRyFefn5&C29vg5ffXPv8XIct~@)OiK2 zeOP(YbmVx-=t8Cul3}AmrD{P-NCb*hakUk5zRbVr&&t+fYTyN_&m%Zeo2y+rKtdHs z{d@y)5^k&Bt!T%g(cq%dnYTINQ?_*r64+o=%DE5;D82JC48b2K+D_@Zf21{=>kDib z(w2Z@2)cw*kkCaR`WTeAj(`p(F9{6A4D}ah+`Tdbm#!_{< zt*(XM>_BFUm*-r(DqmL#_+9KZ7=kNfF;LHL!QaE|Tv+TrV5M;a8)}2AX$`7s(gauA zse>Rv_Bj{~F9qQU=#a^x>c=s-9W0;d%(UJ+Nyo^}$NZ_Mwu-Hx6eQB5u)P)XWPS`T zF)w0*90zOY^175H=ICApm}d!nM?@c<>4>Ov`>cHM>{E$4Up#}K6r5qH3>z;5_8^F@ z(e0n#`GXg3A100=8Da!LLn{{fcx_U~?se-(iI?hkc9mPz*>9~W1zhP{=#Z{&+u>nK zjw}2*X6vxLfwBF@Q7Xo6i=>cQN$vsY?GXirYWe1@Ovtmm& zV+M$zOL#v#p{Kg~qR|rR^_$8?Fr6FU2KTok1mv~`uk zJq6;}h4r6AqVm8rYTBTG1S~wyHMHREhm%u3sO!y;1fX!n3`Sfp24%kvUFqD}cRI6J zh&jV?Nhivr!&4x_dk{QvD9XTJmNqBX>c!O3AYTUI(K_NNbbd{e0c{5$Tff}iaZ%3E zeT85|%ASY@iGjd%(1*R>K~(z$W0iZdUYg{+Ae766+FXQ)I-`WmvCQ$~OgElYUp{Ay z6$-=k9}v%MdG)sTZ;^Mp%9k{Gp`tb`hxcl4MEsNa*%1qt+^0Ogdxe|<-bY!@ZC5Qt z?XGjcT-^E>(67o&hWRqwXF*HW%H=QDq>e+PC>ZZcpO3A9MPS}I^E|w{hRu5#V-rx> zaiMGU@UMr3)}*dl)j0~-CtTVoYA8m}gHsmY;@6Z`QOj7e%pfD4Omg~W`faj)^x~Ub zaM{6nn14%X0OI(v+mz2VPyWG9{GIh95 zCeGZ+t?Sl9ox2*mwS0he_P_#0v|m)>eaNjL?m5fqFX(F%S9kfXYkJd1n8yVSxx_z4 z)M+vq0rH|Sytlzq;ueXZdVBQt6$lg!VBF;fb=Ihh!Q!`xG-tW7wC5ayFo-fHQIh;O zucnA|Yx3^Q`JG>7VQzDrM7Q0=MxtSUWF$P8Dccx0wISs)jlqw2OsVn>U%3k&7-MugfD;4pR0(pzRz5m;<+S98v%2@`4has>%Je!=n4 zeS3hB1=u5YgG5vqD#9kkZf-%AaMTV^s6RV#EChgTakbi0X=2vEi(>iHD3y&ty{o8z7s}@;GCa_ zseM93dgbnsZiTQsZyy~f@up&7AZ_=(aj~fj)#ty(#+^b>#vr$L3M;yBQdn2PX}0Xl zsgR03y=*&gb zg$=u=;mRTpj*6wbnAu>Gh#pjTp?p|*2{pZWP{VPXXrzoLM=Cm-5T(Jt11z+ANsBbX zR*1l7Jrt=1h7g{XmD!_hop8d6_Me0D&6s%cIiukyZfR{LA!`w1*N2Ps)tuZVg@jCd z)Jy=Q+XIEPKJ3BQqwB#%%uHmHwVrA0)Mh3e0sz*ZYWi(_m__Rlj<+dn$tPF|rqG9a z>9S+Z9qXy7nxbOWx9u6fZu3Rxl1AhcQac&M8w?suAAo2w@zjQ;KbfXe8@Fbqo{@L{0b?xs{u*Ojfs$2!4j*aJH99FjRLGOZ#7 z;7bCOi?lxbIOJbZL9%NwdX@32bq)6i*mW_``bN!GXnooWbw(?gy*_HI>`E6|-34S7 z*g7cL-@k|10u)i>4MW0-iV0yIv+c)vv*s}wDy05)1#Lu&?Z^hKrL_~5)gnmq#Q~Of zvvPqg8wA}kdHk&=#GKC60%3f%7a7_=n3)@!{@Li^kt0(sa)(1kRUl_cX{(6|Zb3C_ zj|u|?X5Xsf%-`LbMVdSJiUW&kP~L^cMH4g~mHKUicEaa&xEN5?=_uB=r@Lh`W0)uG zpY>N2K!`8s`+BB9I(SREunOkEXn=;PmC~w=kOl&i)tpyzheD$# ziVqZ=+`b_Y@s$jdUtt%v+GyBAF*klo-T8Dr=K+a*y6!1rH`>yG7kv1Q>bbI_JR#Ik z62GBMk^fUr{0I0XGrV?;{&2N&@tjP?|8saMuemq)qsvg@+|}LXhM)|z_mGXr?ki!s z?WX=Vh5A6s;LschlQF)sG4`Ml)s^oHJuKkw)3?TJP{3TcdDA#qWjhqoh?lxrfE?7f z!KT3BNhrjSa8k>cS87becJf51OXSXe*rEb1O$X^pSDY&aF4(rHaD;}KOb5&#?qX8L zvI7APo@0mOqr0npwO=K#7RTG`**nVOGeE!H;MTH@id;(NT_}uLbwu4RH4+*?+ZeUHX5^}`?b;cM-U|7Ju@JheRB&DTpUh6H`sDl?C?bv*)K zNC$SKf^Y`_4gVXMYp~Hd$<|yrh_m%jFhlNA2J45rR#k=#fS;YM@|s&SWircwq403* zKdKeu@qLXP340$g*U)OT)BC{7BK;z^Sh^7|@&p^qC$g|~^J!I6=)1)rTEUZ}6loKK0hBNu zlD{rNRQ^uvvLe+lnBG6gUEEmU_lBdgT32#G+*KT{m*c;!y~+VmicG)s>o znZd{3PCj9VzikI7dKJ<&}v8A%sKBI5PRj?M`@GO1TnOQ?DH(9Y;P~c9&?cfbV zzrt6&{ef-)>@!8M4B}Sm$DTo+&k#EWbF9cJMgra7`@!-L4A#Z`jtREWko4vSegy!r zF|PEte?4dHi$~+LfM+JvAMGSmTDBGIx~iv$`jg^(j+KsgWGw-m>=a4bn~R>t?4Bap zP5M?My)8bM557FlWwQA|NXToT@y+n1TEpgRCaioJ^%0dnL4Z9-jBTVlz{ol?o#q^P zrs@1$ClI{$roc?5&wOWK9JsWs8)?KtaUyeN~tkJ-yYR4Y0wk%X3@ z3VW4X_{my{Dp$^ZyY!eZxJVn7?U|k1HMUD3YCjv!t$W*jI;E<@O5m=>>y7|3+X14V z3mKF+G5{>@#KeJFpK}xJ2FNAgvl=ZQZ{pQ^;$M1=R_ZI-wTH;ietJCO=GqupWM`mr z0B`9748c|V9iB>V(rZ~0$`$ONP~;jF{Ggs`xsn|>wJDk97ncX=T5lMy@LxT{w*M-M|PUL#wDm=h|NP)bqw-n5{5u)qsNgQy7?Qr7|OW}(s{RB&A;Z=Eitq?q?mYGm`T zXN0GLAQ)E$EKbR$yxmXP=;^x&s{M2j5zv&rp8~F>LvRr0!?UZfYC~SBoLlTOVYm4U zYby(u?VK1Ix8?iKv#U=i9@T(y2UB8T>WudCE);;7t*dk;ESey&f00kVQ~_GXr9bu{ zP6Orptbjf?!mm%owYFS*ed;#0lTCr=jByd$<=8C(kLZF@Ibl{(v`5*M{&%T;h)BbS z5ZG*Nlh!DM*qSKP|tnlp)U_hS3(@U#0w|ahC zcXf=^cI!oay-3PEFFd~-&rbTWsg5Yb-3_jg1=u8LTIne^mi+4e%)OPH6u9Js(AXb3 zEK)}WdLKJwvzSB>Qs$LpeYfpvY*x|PhPRp^PH>62on)<2t+K{d-l2tMjG`_YmF2MK z=DfVU3mTSb`PHe^k3_fr%v`#M5f|PrdlWMd$z^;gqxG4SoE_(X91I=)ITjl0u!gz9 z;G_z+v~(B&BK@Cq(sl;8jz41^)5_lQ>1sbq_VjapFC}gtz%vf0b+GT}jZ=aMV?wx;iFL*e1mrVkxAq+G z>8)q)-OuvcN@I73vFSCtubY);^1R$fC4#=VGa-6-#B8Q+;AAnJ5{0+>q)3I&N$F2m5+Mu8wsUdRjq`r6HvgK&0t2ThI9y03fxWxD;60uXHtiGq^0`WJv;n{7|6QPr@=v=PcMmRx4w>EYdL;U83=vLOc zLaQ?3k4MTR1Hoqt(KVf3Mw64$7;`QfTgQ1*qD%(iQ2#@fG))DX2lS5qZqnV@Q7(|6 zyqU45HB)D?-k7)k**(!d%m-3{S80J!5l9D8NV!Nmj2ju&?}vjIWg(@#`c|D;OL&~o z{UPITv>#96+-10d7}wt^!km9oCQGA;KsPKjrdHWktOt>lwt&=7!V<%66bNt8P3&Wo zK!j2*+hutMEgJhTB;!!3m0P6S7UY6>wffO=70M}9Z~LMbq5Hk zDq^DP356OvE9O4+nEyl%3!#m{Oo>ayKn+Ol!+-R~d1e!YCUomLsbO!zcU|?O@Wbnp zr7FmTYL#ty5n58;h7K>8D z9XFdrS*|G9|0yXyMo?>h`C453qF86!YXr->vv+;6nwA*!9Y1)u;BK>7^@IIwJsk5J70+Vtc z(HnOhI&zfAz_Yh!VhiK$G-{)SamI=6*t=TT|Yd(>y#+2R@qP6nx$e zK6b&X9I$)CB$dcX?A}~!)bZmR4|mWQvy;WIi4_Z@XwG{umQ+-lZ?>D;hntX@7uZm^ zcakBcu~tTPWMSu9;FjU)=l+|!Kv{LFdW6YJ!~2e~uwi{oQD>daP8%SAXs@Wrpv>Xk z!V>ii%gefHPuz;F`Wq2FZVksO{N;?$j@rEy=+0EL67y_-VP0_0ji4Cjx$?g_J;JFx zhowSYBG{nbz>GixZE&TtxS$w-?vPtoG1#OP>!BO;4NAUq+bPZ9N+ zu_VW8XfrXz=I4=7TuF@|5a1Yp<{lCi=L#=AybQJh4HcaH7u(zxr@iR_{M~le4=S$0 z*fzgxyPv(2U-JOGe-E%|Ia;J5Di{I|L%+MhXrXXW^YB)JclsL$Lv%k42Nt*7=Fw#Q z2SsjZHA*)dzyXXeVRdVBY#%}`2Re_mSVjyi_0Mo8urAlQZDPN!Or@S24u*9(YtYH4 zM(XY`am|i=vX?z?qUuK)QQ7{3k(D=_ImdQh<4S(ybPZWm1LA`z+5|-46s!-*+PWhRx~ba&Axt0Gdo+e2p;3 zL7+-JP|T#Fl6~k=vdn~FU1!j>@vIEw8F*JKt9b6bQsHB?fPXTzxB0ytcoC~3p{n~-@(Igdc8;!FbTLr>R3w3hrTdioR_ zP^-q`7(&Hfr6+QwG|y-yzf&c&wZG+$byG8pj}#Zb26Ufm6GZLTqseRt_8Uh4DvQcv z*dLgko*`s(s#W|k=KW<5b~&l!R8oCFj;Tn@!u8&=li~kd$BDfkbsp(IE#=-;diB9r zY%PANoY;Ydl+N~znbZJkNRt=iZC2Qa-R@n;ZmV)>c}c(M8LM+qb#W;J%Tb4gmb@`E zaAGo6yhfrSEEk`((RD871dIowZuljoAi0q?0>Z3!BmB}-{GQnd&dLyuQj4VF`PzY? zu|!?q>Iuou<5~ojO#2=~eD9vQATSgXD<3j8zdC3q!LD97CzdzWuO|}?M(=|XY8#toBeM?&JbVbt(S5lN; zkzOszJgp0)+L%&wiQgB89or_cP4R>b?#@G>`-w!7+O*_rJl%Nt#?!%I1)Jt_^W4$$ za7;rIk0M0(jDpl_am{k&8GWAIO2T3!29Z~?ZR-%G#C3Rvd z(zOU3JS!^abdSiQaZ40)X#VC`MW#KGLmm)9ps49__Va%)8B#Jr$F>vo>j#ko0z?vJtE8ge26UXb1$!gv8~UoUSrJzs{bH=^5x)*9#EZ^bu&A%!K$Bu`yHOSs;9>Px!L<S?ffY;`TDn=+l3H<`0ISR=wouqr_Oeo7(pI$blP?pPBU1IX5 zf|#yq;2tevAC41e034x#kD-lvsJuBd@X$UoNCm@w$>HoBMj#$gVQ45etF@X%pl2(m zbuMMQA?aWW^+;x-93O{y_9lInwr&;pb5}hY5rz2o+k3h27{MY|F~ak02>3_HbmIdoZ(O1q#O zHTLbuR5w|bf{OoDbnemoxJ$5Ze2@OGU@5)H12BOQWEwfj>o92Y?m)%x5V?!+Pm!@VKTQb zq?%^OmyXt9BYCC@zV%XOA!?ERQ3RmEfy26GWSk_~l^(6%=yz8SLiXV0ZgGf3o#ZWB z7ofiiBx-OdRgafZIuep3ae(jn72MZsYjd!S2J^sV?3$mTX^Q&uKGE^=L;>NP03?IDSuUvC0dQ zxfoC0+SROKCS$^^$LOx$SIQRRwX7o4IiPKp(~X3P_Q1~#hevXw$O6T>^2_%1E7Je? z@AX-q7%;oGZL<&v>av>fS}wVdWlQJno3(3-HN_}OU7h6D{zrACQ(iG2D3q-u#5$jlgx!v zR$xD+Ys+E9_cfnPWervw&R~Y8W*K{}Ck9x%sgG~{P4;#SuVZ?TxkA>pG_rc#Kvq0> zm1CO_%`#&hCdUMYW2@szW`yWkV!*_P>v;POFCE!=*lmRIphM?($uDO{@%MPtFjCQH z7n+)Q0mp{C_vFTv1zVKwAe)zwS0@Hp0(fiI7x;1=h9#W_d9@}5r(s`S*WP&H{ZZzo z8e))Mxceku)t-oZ zyxlS%ux`&mSitr1h8caGA0S}N|f zeM))S;Jb{Q*W6*!H&H{Krfe{wP#oxL^L@yxu?4R*SQac#wV#Tjf=Nh#u=o5(CdHRd z#hFu}eetP1i3ae{j@<+4I#`9HD33v~%HfDF1@EWiFRh6{WV~N9-LoflA*|9)BE}~>sk>Yd3i8Qw7{t8M63Yk-x&^p93NTM~HUHoB) zPlh|iyr^Ljin^?qII^g4iKEB;*Z^SQo_4N;*F4E~rR<^q@<*vg#M{%bw0bjz*Pvj| zLx<0=IJ#e`MkFbgBtW^dzg8ayvWMnQL%?5D27C9GWT`V4ebjTv!ms?$ z9V6Pz#i2a;#N;-0N?Z}$w*I$|d6=%<2njM!L?a(=ztV7~{OBiH)$~6tEnJWMl|w6w zqHjn9l&NqkS70J&c1%oA%Ov{{^TJ?;nv>wB{}ZDN&MQ1iTCGdU9gN0C;x-oU{!@q# zlU;?Ef4{L0IxhRfs}RI8u=ePtnRgR&E!Z4`Q3*AoC<9!@olTH+y*8{diADXxL+*Pt z#6-D>Jr9CkY5E_N2hoHFR1~l6-moK@5Gdv`J&0)+4L$3dgwhU1LrPb)H`;gO2i(%b zC*gHi0g!V|Y6kw-T43$*AqnV(^Iw7)!%DZp)Jlc3r(5}Vk;09O(SP+H^)MG~kxQ)6 zC-j9K*OICPU5GfI~ZR7kLn=`WpC{EE}tvp-!x04zc<`A_h(_oc0zGQnve< zdoAC9XG&eEb|}SD?WpV>?Did?ulHav-)-JNC`#|n{;GaG`Py=(b8CZn(hqPSvku83 zEIZ8w+bwY)__1)if!dex&W7W%>-^dWCF@cfv<7c3s|9FzA1=ZW-L^k~(hIofi`!^J z*+TwH$k?_;s6DJsT(LD+-hs&$1Af~OCO@cr z{RP56@1iakz0Xq2(qmGFh<cOeAlRiKlcqA}lh@@a?fVpb9 zbSoVejD{)HZX2pgBfBa;I75K2!5_HsrDUhMz`_@XwuvJLdwE#ML38@-ei zZI@0f-ra?j?q;S(unv(m7x5Uuk$c8TtrJ>-)6Nk7avtJ{xuUqDWy6g(Bj+Ucl{E{h zo99@F=YD|vE0^KybgGk7T2Y+lJ9#DrYdC$`@EwO)8kUc_=8|3>KD{4L-ajxc+AN&lhQJ@WpV(;l;=UD<} z=xWWCggt_}che&m@i)nahX#T^Drq9VxLt1K6T?iSU1zfC_;-_^^~Aq@<}QDsGgNhm zO!1rP6sQ?iq)|YjV>br=(x8BNuvJnaeSID4<}hHKrbe2do1d>KxnV{H`B=c9Ecrsx z<#0Mr2Dl)B{uyiU)}a!jU2Gp8*b$tJ_Rd&b#cx+RZTyW6ErL@eiJ0WnFqoIFa+;}J zM>IWVz$Yd<%6pd7IT40l#G`M^5i)3qJ zQPEU~cHFbn$ZW9mH3+j^m>m>wC`V(w{BK(Ey=lbQvQ7G(o3kJiJ@SUT&}m2i`8A!xKs#qMaj4 zlh-`MUj)c=2(*?aFB2y=19Mo^CgpTvg9IttA~^5J%Xqf}Xq?iX311;ukZ5)HX>xN7 z!BTqV6G&R#tXop&D9~t;M*M)>JEP4mHPP~SqdB$#NbM0(lFjxq4uj_ttsGZjTL0*OQLhRag%V7d`?u| zcf(wG6~VZ6#;P+)<@Zih)TjadUB6Ni6kttq$X|U=?r;r7vh!&+Hs$zS7OoN}N>z*z z)n37pm(#?Hg1LUpy#Y}X5Ec)m*Ri~9APn))JRWmQDAgYs77NXywYch>>B9njygcH5wt<&O($R*EH8P$1_@$&VqS z3oqB;qVj5`LZbYe*Ou0cuIcuuYEws_TTJvYQO~$zGhtw)ojn5JWvt4N@rHJx&7CZs z>g`W+f(+(V)us z6ZB|M@ft!rs-R=6O@h~^la~P_U>?>WC29yyttlMhW}MKoLi=k_0iD2tRxT(o)n^Il zh@={rJiz3A_9}rgt|ssVaqRpN)u8Ddi)vhm15SaVLgZEWE#)N8{jd_2XCre>;O`6V z#Xa~*1{&C>di@odj52(`Cjk=ZtE{kA#IdsMfdXT|kt+jp0reNFguZC|&q8oBQ*c5V zecb_f|JY<^YdYmmyh!>Qed>k8i0ub+Kzqgkn;LKGRpb^&fv8V@waJuMPtL%&#QUU#~Db%9_`zl}|nJkH!ax6F#4oJw-vFDwr=4xo7IjOwg~RY82!T$R>R_a`l(vP`#owp4`Ge z&7Ne+6ssQ$H_?rDl#;WZ$*@~c8kzAE{sk`f!^ioiRQUCQ_^tNt%+$DRZf*P^`qKz^ zQFx$uq{S0c%~ZSlYu?zf&%N)N9$=!miiQpHIETPJDfG0MDbI@b`?v~wq%3M!L?~ou zySOHFQ-+*qo-fF4V{UcaWdf1R5}w8`*7u9r9?vGJ_?J9O=H=+&de9y64!$ znqc&UD}gg|yIo+JpVns16`VPW-8L^XI=4{&jWK@yFiod9pbh%JAC7{y2KErO{dcM! zaurpIX@i~XKSdTmHJ9l24d3wxPL`|EtRO?3wUz?JHDt)f6|4_$`cz?O!0xAcbu>-v zm#8Co3jNdl`0?F5Tz{?K)Y9r-8&h?165*UEUKAz{{5cWsm%D<(_jf(7C#C^I5m_B5d%NZ^~Y9 zr(Ob*CS2t;*n2C=Ab=klA#?kA%P+3`_*4AvBJerQr{dcKT#u2#I!>kGED~yyY%AL3 zQUes`x6FJiSPcGX{CGIp`oh-E*IDOg@&m1I&_8E_E0k$@^9m`iX+EnuqP@%^%~=A3 zBADwIK^3qY;tV-G5dUZaFzm2xbw>(Ca&VJ0wkcW}ROkh%E;;!*duyz7Ax7K7%yU!X z^^7wl03B?M6H_9I{xYSHXVqobPLL4o|E{U)CBt!>g;IKJf1=EQxr^hOz>o`)!CcKU z)_FvS-=?!p;PO9|zVfWL$VcCOK*)i~`XZ?V3o7n*3Z?Ta8ndofWs(#y-Yr9f4|NtB zL9OT-cfKRCR<{qvN+7(oOhBe<=b)Pn(LD(o59EUhV-{JF{V(EXMqwJqoIgqHsWlgR zeU_#6ShLTE0OF3#J}VRoY?ZE5bUuA;!*o|UFtc{uES1c{_Ds*XreJW z^u`59^3#o zUb|wDL*ZUh2lfW)!`q8{G<{ea;>Y8A z2ur41u~mJH0=0S5UfDW2MP*yj`8*!i!F@C_rYE8 z{=yaF{U9AAJ9f-fQ5CH6a|XCusU(r-r{o?juM)Z)N)h~{%m6P6u|Yn0l|y^?>afQ&Yy@3eu4>$23zPaipAOi+9Wnn-KbF)A zShO^ykjK-=CQPQ5FP6Ss6n%Ni1y#vc7dSEKM zRd>KIh)NWppn{nrl)rxIm@Cd5_ojYKQNf#=-C1_iY=#LkoGB6)#FYa-BDjXf(gGMl}CE*$;O%+a#vQvGasNd!zW@rm_ox)j>Pa4 z42pqqDXMPZmu>47W1W*-5&e2ed*EyTVYbPSTTa7_5i{p%q7R4yKq6G4h_~zn{k~|c z;K@IVS?skD2#DNc>AyH23-grSGA415{3!0U_u?%L7 z7Qi=)80^6S`Shb2@^~D)Ay=~KlB*xN*tp9-L&89&w4MEDJ{(=)$cKi>BnELHgEq|0 zBQc=7a!c1yn&uVjI{f|&&=SnD`p?D!AcI3%+@m_Phwk zoJG4>=$ybveF#Pf8=bIWOTw^d%NQZ$90C`UpY(D(q9V_D3VZ6pwR6#VaIN`B0_wJp zBNZ$HA>dzLv0jEJ5_I}FE+S61XJAkPa+8bhCTvuLW+%I0gBmjz^7dI`foI{+$$r~ww8m7scscGK=>i=`1#U0h57Z0l zI}b{HOq_+`;W86kS$ueG7@n!}Mpw}Po}FIiv)6X7@OsPV=Lt5H6eY7|R~IYw2as@8 z?6DU?ZbxQ^jPL=>eSP3(V?Zk#YS0YW)ZM>nUP<=G3-a+njJ}l@R&(dn>hPm2d&ttW z*=%-YBf4gJl_h41lw$Q|PfMLwhtzoj5C9V{_PStAEa<$mx6r=oMlmj1(2ub5FtavO}e?y~WU# zFWpSCI-bFewzN)A;mmRirH-1Q3S)ud;6yxar>-G)9@`@WT2a|S1B85=;V*)sR_xOP zRkHfc5?25$2}m`evjQ*MnK+1%QR=V0f&mwi&eqR$D*E{b4eS;p4U^BCG}TNM&X-0g zlxi2r(QJ*Br?V8Z3jq-xIrQmsLr&4f`hL+}!OPJceg7>dd||a2m4@Bea)=tiA`(26 zK9#?r8#%}`{!|^B6)&y0vW7Q>^#GF4lgbXs6pN$uC9eCpEM{%?0R@v_+w^HVSBx6v zXM`zSa5gD14`N#{`r51F^7$?rcxBez7q0r&*Vx^@fl*=A{~-^n>P%QR1fWIEvOy*b zT5XMQC5-z9lDP0per;gWzv0NsxRMxM`Oj8P&UQ0i@PMnpxn?N{(W9bi6d+BgrC;6t zgE%^6%EIXU|1X<}VNa0*9}{M;iGS_^~Kj?lEmJ~44FoWK}U4MGtOQS zcos_UEG8+4i{#1U7W9_T#20Wimu?9RzYhc4a| zciuB46Yb!4u&0o52r5uq{ri~60Z5zY$=gER{IIZ{S=J&Qo0S{jO^KW$H`^WL4BW}F zvQf>5nvNE79Za;W1E$-slW@x?@D6iv&$e}OMdlHrZcv}6;K1LOm!5h_oumvSyb@cL z-85Poi7>9O*<+)fIuv&}xfAJ6 zsoDzK+K7Z^9X8$tEqZun>S+ieLCp#3q09L>U@kP7vVlR2GCrFbe}cO@7g~@hNMf+b zPZiReKKE<AXi({e+^sa!%uT4e;7s8rY?<^e7MzOPo40O<7rd-F7qk7m{t9Ec4E%qLC)C+ z;KsaiS_e`BQH*E?7_G-JwQx>}3l<@gHKHR`9vH|q2(j|B-lM2uT%j-`_uw0aTIG-Q z7@-f)jehz6*`J{zf?gAiOd-xe8S%8^9KMsP_lYOl@%>6VB=;cQ1wubq4Af{%{eUPW z(Yo)P@Ac~;L#IwtO0WQp%K#z0gH=RA*v57WwM>@cc0MV_ae8I6a%z&PHiYyXix5U6j#Gliq08|?@G zM@5EP_$G&{6z;PVIhI7G4{r1Np7nETU;Z>0)RoVN2FQ}M4Nu_!>s?vPHgcQ$*rXj` z%BnYWqoE6!FeY4fZFgT%)_dH4W!yMMF83yDPgRG*3n7*WW)nnFnHw)(Pj?D|#0;6K zzwxG9{Mo?c1)GPTOAEC8>Wf{7&If#|8p;e0tuoRQe08WEXn)4A>5!K z>dbxQ#wdcY5L{m5rUQ{gEZ(r2u^xm~m$BK(jR0;~Y5aXvdB>!{i=|{6M@Rz@8!Ccz z=~j~YN~bK`si}1P$j>20_VwB*w00-)#a=Nez)LAs=O9711^sygfIExHymQ3sv_cuG zH!6+VBm@~solZ)_>e}*nC5H(!#!&;zl#mssps8n?3RXwi06Ttu{q^5(cMW9V{78DA z>ePZSy&pDkYJdKOo^Jx|0D9EzYzO_&j(U0h(h>=oN*CRh(Ky2Vz>)P%G+>}sT1*1K$Pq8^_l=DK-j-w z;l+|g%#Y@7ZtP68bha)4bq^2t>3lH9-{wix5dMA~0@Vqetj;)XpVT9E1JA10fwK{Q z$n`p9;9NmpwB4#fZKH!8$b|W3++w6BxQ_TI64iA0?gCt9gDTIh!&xhq%?tYm@9f=1 zrDg>C7OJr+nwLp#HOV;?UXSSF4{XaoVO6_9X{(-x)W@WUH(gA-26ZztxiAks8f6;8 zSTAb$h|k~#DJ;j+t)CEm!E!N0Q>X7sgxbKNTX)I|@}E!! z$T;tl)9)hNcWyjef{W&E*ya-->BNssV4SKp$OWJ*vP$DIlD-4uST0<7T)> z=aLOjj{bJ99_kjZlB%FT=QX~`z^lKs#m6-PB+t+{t+wP^;b1HjQ!a}@nMD%w1!_lS zjVcqOu{kq5f#z_nlE$Z*F<53}s@1JF7T_m;x%PEHj=#QQH<+GN-$gX~u?I@z^Wp_L zGSU`pL%hG_m&di(9)B06zO@(<-SxZ837?cXgy4ECxd(CtWzSed32pU%`$gBvss04yMZ zdE35fJ>2SNlUWC*pCDtmT`m*R{NaS@*Mtj-dwEZmsvAM7Wp;ue3wowubj?!z82qgb z%Q2?5OjL)4It!eztKe#T-pbD1>l68LP z(Hoj{^DKsSVkf2HU;97Uvh_b9-JqOo)#U|*mbN>0AVrMwtC7a-8GOw#Z@vboAS(Na z`d~(y+HZ@Z_OGjIX^&9E@9~`#g;vUEKAQ8Mw!qu?@eU!I^AmD#6wJixHhG)^1s_En zF4wWI6dSN+nR5#~4 zsW0tVf;~JCVa=%-4V34bxpfv`@LW8!K&7tjsiX{b6mb2iOt@su4t0~U z30hTTG4_ygS9B6&8>3+=%ll|#_MXg-TR*EML4mYCbV|X0tGfRld_#HS^?X8_Vdyik zlVel?6NXO8cj7BG*wcxzwB{x#PY=wmW?rU{rOg)?99(A5ySq=>7a?<33ZTyOP$xL> ziq7=bfw;s6I zC9*QCh@gTIG+_Pgc>qT$>Ab4vg<>7xkNP2wbe-TnFLJ9GD(k&_E_?Ve$B z!y%nJS~p{_W_ls)vGi0t49gZ`Oi85HR?2B?;Yy?15mWH?9L9a2n7zNM#8i58(f~T^Yu$4t<1o|&@S4xjT8saQf7a%|# z9t`E=Rf`?e;E@xM<;JBZ_Y&88OiuIovp4)Swy*=--Flg0A3d$zJA%L z1Tb+V!lm$5{leB;fR>hFpo7Re6q?I0z&)hCBAk`9?7U%AT@7{ftL5j?9o}CtbVhXf zj7mMkk|sZ7l!(Y~{|b-C-IU(Bv;p4*`>SRoTLGW? z6}zmWF@m!Gi@4-O*;EdqRQ0=6Bc!diQP`X|>0+eb+d-)jUMGJY!TZksoOm#~l#}JI z6LWT!V*s4GutHyU+6NOpP9+LWxKWbhMv4UNtpoltV&#F}X{E1Jk$P$!IQ)hR=XIpU zSf2fx|@JECR?(#ULuBif50k3`? z6~`YEUQQG_zTg;_LvUfA3Z0pl0M-*9zRm)sYN?0V4iq1k=_ZBMHVF{Boz zxDL7GJey%|Y2QzRG_!tmN-H`NfA$U>SrPw0bH?1go1^6#zZ$Q9Q*invvRaIh*Eyy# zo!m@zc8fa?=%Q~2se!B;tT~w+SZ<~-6yIp15Ac%$NKZbJ*87cx!DLh5?du}0{xtGb zOZ0tjM{Un<&;yxCgOSuP!LU5&c{HoLIg5RLR=TE9_f|yxQu4P$v8_SD{nTR^BC@Op%?Ea|jqb*AO6O9d_lOr^4 zDiB$@@kd$_mX|C0$?lY5<73-+qmg?+Lm0kCVhhi{(|3xraY65J4rUEmU$S!AK`ZN~ zuQblKE%K;lcW<; zEW2%@FglY%qTUe)JuM`8Tl2n5>Fw76zp!4!mXlOR@^1WLfL3Y#SB5}m&+Cy`Z*?dM zq-|TrUA=48p2&U9qx2-BYkU$)pNDQGsXk$vtNFU&$>*HTjR!1Vk8W(xwAM<0)FF_! zCbAAP0Yh!7mO0(k#gWL7`#xYE1k{!01DmLYp@dqIJzGRO2+K*&G+6S{xs(5DeG7^e z!=Nl3&8|q7jDn4Nn*QUT!sVUrpOXC|A{*0iR9HR^nSX?=C}Dklf9)Uz0$Z*NTb|%V zKzAg3mhca4s5^KAs}0XXWs30^T5#KgAmLI$WBi$un8{ERZXBz7@7+jt0&birFW+wd z*-ubTUtZ?fBLJa9x@j6wk(%>QIH<=kG=-r#5`wD;S&CoIm7o+F{Sw}l-6;V~Eo$vU zaM2e2Y_EP2P0?tKQl0Z#NKEo5f1r8UqHQ80fb=e31bDi<_6aC0N$8JwkbtM;dqnbL=Gy5{Tn zN>;*X3T=?ybSjaAzv49OgHNYko(F;qy|1BBX%gE%sYS~CdT%|IMPIl5VvKJ8TpAMj zhg#E&L&>`Z{0>_EwtFW%DSuDkVRWVE@A&q6;TGY+I z+ZKK+MvVwlBtEwVPVVPcah&$sk}Pr|p>A)Cv|*|ir6=(3v+B3CaAWz$(5$~7=UEvA z6@W}P7?)?*jE|wJXC)N-4f&Lc;Dex3fH;yYb{%ZLCmGCIRlIDp_*E5X{=Vett{CI_ zs|HW(Dem&brbU7h)kesy=JqK(lyL{6S3)8+H%il4IhQ@ONXf`r=ujaMQLN;Apc}~& zk`05kNGn{VqtAf%;@t&={p~xNp0N}kfm=~oQfW9~oJ3-BflnWh!}%yM+WJm#N>16R zHZ^1Kx2mq}_xM7|ONwJJ)%t&9Wp;GtSoaKcc`*fN zRriWh;X=ouVK7iD*5k^oS*Tv!!{USi*5m`bx|62|s`~QAeI@tCnMqbAl@ab{8&Kv6YYKJR;D4L zn|OGU;rmRPbf}^KXrtEcAgGpJ5Q;Ol7v!CQC9kSQtQXtaar8dc-(2yGMtSr9Kk-em z!o72?CrOwe3Y@GUOdufF)~ePI;Yuh|eHc*u8QWH_IQ;1}iqHtCN}Uy@={%m4k5vp} zbgC0#oBRPV4R8>DJBSnv8E%`GJvG)_9cj))i^KG1{!{}ciSG3F8@=Pb#-En_e`rJT zaNvo7KHcymk^z&V{7?i1Y5J!9IUWNk>&bx2ULlHVq@g}lDCDWsCq0h4DQ@ta->D8H zw31~6no4vRYM3h}W~JjyX0^#Oba-oZxTY4uUG~3t>8r^Pe^bs&^L=4tMGF!QVD5Bl z249^D>b`o0lp4njo=pNKu(x2m>PhyYo5prdDog_TGBEp+ptL?6n;xR&GpG!L;V_BZ z9tDuhPCw21!YP11Ez(AkKwb*xjJ?;*4krRlR?krLXBTMbqXwm77fr3fq(adEj6;In zDIC7BL4~jD)OiT^l}S|FNr|&3w$-pAneH&=$;<>Dg@^shc5107o7x#6Ladu_5Qkt8 zP9grq7zd@Tq6W2QkBf_~t6VaQ&Q%GV^o{z9cf&oM%~krn|CZcfLa%mcn`k4Q3S$Yi z&=1BzT6G0)3j_jd`S4R;;x|;!fy$T@Ph8u=uR(FLo1>7B56&@&%c@L2_$tPYk-O9c$t3d?{-ozaJEW&Vu^v{xBgZv zVnMrN0HJ3&ib9@!Yo909vK6ZUSHxfie*29e_2fnRR%ODz8D0S{B+P9AOcQKSnrW&Q zN6szz4YxS&>U0LYNr8_ol#oILDXoi~ca?6-%4oABH(9P{Wx8e0`hVN6xh=3x*0=Jz z3yBHia>xN(s+{8>$7%vWCtXRVVi7LEj5frtR1yDk4pq2!W8q>%x3L-}hdiljFy`1j z{l}+y1q74&;s*x5>uUDJld`ud{idcC%YWiyLtbbKW}Pf~j>Ne_-Z7QyiO)vAI-cMh zk%|98dR?ZE1o^o#qCh3HYp9450ltlU3R5&IZBv^Dw0M|tZ|AGmZ4P#etYe--bt3Il zBcUiPy<)aAyS$*ik2wT7>&t~M0PE()2IR$cu>hde>hhSf zfylgJ`$vI^%XjJVHF>Byh_}$ecjB4bnODY;8{nrh(kyb~ZiZ8^wzM@g%r$=p(K<>FOr6SXuB4ekNmm;4%%M~;scLcHSAMBYc+djj;EhOv}ho0e_Fy}m@1RM#H962^Hg)XH`g`Lyk~w4PQ}0Qb?rVae(K2=eO^R_ zr)*%z!ic#gDJC2H`Hkv{`TOTRY$F!a-X*6&LrHOOmhn=?I&IH%6h!}JGsj(WOf(HD~!N}C?93lxT{ z3)gcPQPGaGlrK^?s zKZ4xAfx$J2v&&@ZK9qusdrRZGjkn54;nbkz_!1%3X3}nn%C$i30=^pBHris8FZLRF z80}$m^fN2vz~g1Hk|#SLwwQ&G5X|G6E7yZ!=ef$Rdq+6x?#n&m<;Fnb!JPUu>V^&2 z3w$4whv3XkwT95RShaE^#t-iq@f+%^jR;}q)pTa}pQ>PvQaZtyl*M8vqe!DQ8L3K3 zy*0XspFda2d*`r3EiQ$pF7k3_h9>%GJ!Pt*;ExLaqZO5lt1#OM80H(HxX*G|N1)?s z25!zyZgu7(3&4CO`n0Gg5pIu9PfB@_XdUctYhX8(hXZ3iOcbCtlXyQ3YjWPiVyh9=`O zg*Znx#$Fju{bU0bz8};N0Hc{@5D9%@e!rWBaUdK(otg<}ZS3ImJBfvsg$q?kAHYiS zJ`8yaSB4U(oJW&O$J@XF&}i1#g?O-gZHv_1#Z^@)4U`z%ECeR8PA%-V>Y^9qa$~Wg z!U5{K7%8mXb*+y1MG|{re>~5&{6TC&a&VqMh;D7@$e{Wm??Fh(rydhN5-dP7kU&Sx zi9*-sE+@o#ioQNqNg@@+FZr?KEJ6&L6xX6hW+m@L@Cam-dTwEX;pwoT*x-le=5W{;y4qtujSQ-45U{E+T{C}agW*4Xd|O)GvW7#4R!sbtcuC- zg?x@_I_rY35v6V+=rl8V{2`-gVtGLvai6M~I=yN>gnkvR)A@_wgv!QazzyGC0Mx&` zpO_n({>S2DsTPIXh=?@paOPtsMq;Xf7RW=~6oy&@?3A|3XNtf3(y$=wDB4=Q^=>88 z;m90uFhL+V|TS}cTvFS8G&o%XdS@|7v-da!Nrv%%=h0>(tH|Ge9gM`Q{oMP z!u>Br*9QHuTXBZm4r9mWpCPkOF-z^}biNhj2I}MpI3<|v3!=z84JAlJI!Ne-#zd;>WF%r;KP62VC`HfjV&C!56 zRrd34UNaeBMDnB$1ljM!=ko*WcxHi_`Dw~``SwkNZvK4ORRj~veu4kYWAL8duy}2% zIz@s1K3h?m`}kNwv}2!dO3ncGSNTEUKkQs^qnh-O^Jk+XP+cB0`RlNM2HT?nUW?l7-%%`am3!9~!2dluMyK&yjk(9H_OQ>;IlZQF$@V@dd}? zH*&wAxnvgZVN2OrMy}2W&DYl*Y9!pc2AdB(INdf^bH!uI&-T})q5+T(btvBxZ;P3G zbpqq@mM0>0_ky^s!$EehMw=3Ql>B$y96?(>Pmsj2q+uufogezMNLlX=R2EhNiDP3L zz|9`&d4MATY^FVk7-Ej)ODE5~-&i?ezEr1Td|@A5C#>kl%W=yTjGCw^Hp^gzZ#tm* zQYIV&A!Eux_`_HHm!G*mm18`HZW2`a0Y*3QP;VD(xcR@A$9XxdiOCHZ10H^d|PVH!2aKOw)NRweDA~3 zD@~<_2|{1~_!LiP;v!z&O+Ese;qe5Ex=NXWgKQ&6#79*UmW zce=AHPv?K?l3Vi*J+X_u{7Yw?E}V@-`CK8Wpxx-Faa5b?p-NyhO|XmnSDP?=p2VLMWLdT!(A@ENBjiwjSE#A zndhn=+BWn-v}|1xiKiT8cs4nx)FJu!>B4{Wa3m7Z{}tjv(%1(QGNDW7hiN5LH>upX z?(54LOTEtBMR)}1;k5Z>w55A6PvhRmhb0HqxnnCIpl97oi_}$Xo;@(#X>gf4i8E|v zq4eDY_6>Xp@`JIL0UWkGJK|Chm=_u{iZ)yOflF5(pb`Ay$~SSB>i2>fkJ z%OiGyZr}uReE2lHqFj!W5VTk~6V9l5TGneNkJKeiuz|>9DT+{%ctb0h`ER|2-fwhL z5N_R1@R8%ZVEln6(WL7_UejiUY3&=w5#sOFd~yIdZb`dk7KVF0!wSOZ=|Law3LV@; z@rc!*&nt4igH?YqUeSp$=g0@ZC{HKb}Q> zz}|tJve2au$$^p}ipo!|reFLSA-yS(n^iA@fzRcJxHIeNIvT#(%a~t{4UqNc6;flK zhbXJ1%T52_;&gf{_Cu-A>F!-88~7%T3yWYXmN#*F=`HSFw>2z+hKh%dm3Y5P$Kn*dJ6q!II4*C5CmcsOuJv2%6G${_Q7i-%Whh~!vEyvlRZ%JXj%z2 zPV*DuapQ24dkjv8pjvzZDs`({MQ|WF-FO|D=flra1-vfL!~S9Grk?{^jk!4!NQ`sQL@B+hp~i`HHQJT zPy?B976**OwY+2343vYh^pFJw&i`Vh((Uj;SssU&%;iCv`u~Ukkw|DYh+}b~H>p-uv7+_-Huio3v~ zCJt2GH^pm>k4YYiiFL3;AmUokW((2cBoL6V?L<8U%Ix+CbVYPilL8QZ^M##G1hW;n zUi7IiJq1`9Ybps?Mvi;+jqM2+be}LxB|-GqHUdGY2zd0`Kc|1!yZ#Hq|J6i1i^!kezJ*~#?CbD8jvT@sES z64ljK8{aDG-!%BY(lXxh7hMcUhpnl5y2h{qcqiqzyj3G?isx;}+p%*c**GL9PRHv7 zO5Z!HhcAn4y0?uo3%O&HHzDAJpsyHC5;lDRT^H}QC}g_*3u}+d%E)Qy|a!FB)^%D^=wS{3(b z#9zBV5L~2rfi}O_eZ}*sabbR;E{{uGDo$DHIH2Da+Dn$fAi0cKA@V!u1#RJt3)2#JFH-QSU8?2u-$9h9s=4a*vP$X;dxXnoIpwjT>aQ!ux%ro02?Q zfxk;v)-Btso2B^nWGsu5Hmr^XrKUX`>IYn3MNvy(HhyHfA zIV<3^@pCm8j}mGzdL|u(O8Re_;4om5Z*t))mmAB@R>l$`cvDw}QZAZ-8!cVy`c|yY zaDKsdJ<*&M+Xx{zlMJPvayzB=V=EGx1^?W~$OZab$EBE7V)M!M|DaXL#9D{7#RriC zFlV#r`~v#z&N|ui?h$nvqOMFQSVywH9?kEi^^3U*0a&R-fo(z+Mx(9`8Mm7)Gv5Oc zTOMRFfaue?p zJ_C}OrKh$TyN>yfRIpzga)8VE<0!Xw0a3k}Rt2^l%tU+ydaXp`#DjLhb^*R0>Zi8` zP3uB&B_RWcQ~db+v_hf>p13!skyDO8R6=Y_FiW}jO5|{M;H^9b z|Bla-%zgcjF#v`UN_CYZs%KOGMN{HyEJ<=hOzq9L_PsBZt;`7BgOrTew#sd9K}J+#RCQ6&71 zJQC1#=$#9N@2!I2QbTL&2n@BQ#P|=!T(W{Ej-e(QdwBgLXDj4=RMC7k#$Ria`bxm} zhYw&B>xv0N@+nDO2h#l4pB@pK{V7~a&4XN5vvy^wB37NoAqjRRwL&;f(5hfOND38@VpZ2+iEo6Wxr;CGEb3QOkszKic5 zv%pU|HoHG3mnqQjyUuDg z(X&JH_s6%s^70nFgq6qvIT07v-RINI{Dk4&qwEpeHT3#EyZ0JS2qBr#q=2p6a3ytW zPZ@d_Dv?(uzu84r7(uKwXMA6yw#4WUys&q7smFTM0Fj=;GK&+s3ZAPqYUz7LEax~Y_axQVY!sfnD23v+)b^Yo=r0x1fYv`t{`w(=`9* z<*stdJ2@~NG`11M2%hy`kz6;|h1*XbO2)0OY~Q|;hmp22QcBmT%J-T^DnmzNM$P2S zowjRLMePHR=Vw1v{8d@?G09@)vRyO^0&9{zx1y{NnO|f*g<#fC%bd_H)~M<-?j?>; zYJq0z0p1`u`;b67H%bvBBkv9maQ{LJxq(6PI8;;t)U*6Uh5jr3y&MAgDyjww@=Kzt-sw7^037{)># zhHe`C6eO!w6hR8fbWr0!&0O#$Q)mpwv*OLvAt^N!xZcDswnvl+ImCp^(lv{b_vWXd zxC`jbtwn*%6sXNxzA)ln36VgMVLY5CwsRjpOPJnG(~+?ZEqhu&!y96)i?_&D(joZx zRn}D;^>aOlKC`-hLWPexQ@5frbq~V2VJ}i>JiMa0#gD=jQ@fI+1vhyfLV6bGC9fh* z6-)DikK4L12}rqN zFIy~DyjpVJsM&aSmux$n9#c!Kp&+XESV#QdrjT6TU2uTSzdJ}{oZ(rLbfq+#y91vc z0_0kxPaJrIW&)IA&Ru996a z2!Gf<3Tf!<|C;X_F@cpOU`;_Id)UBIh0^{@e@6Y#s#}CnnBINq0#U}GWIFT@mXPfR8M)zV-jel!$VE{_vU zZ!3Q4kC#6jjniY%5dI_9`u?sS=+(PBwUO=QV+{(FDYd6aG#8=Qzd+=<&YB`s%*|;3 z9_GmGn+Jc!=`!k1q%bVXcbI*w`}SzLE0cTTmbmz{xKBKCuvl4S&Fk}>w$dip39kJY zwz-U2E+%t}Cud->BlJc!<6XiWv_@d5*5=oX9v8#!*(s!M1FG+7APCq~cDJt<(3Ewl zJqV_B7P#8Thr%QG?^oSQgbIzJEw{k36M~~3i0%Nlkn>~;_2Gi|99lO2ZTcxK$ zzFaRX5UX23?4_&a6C%(oeD#lMJ3L<=0?9HK74Q4d4n}*MC0N>4Q@U&k&FlIE{9qx{ty4Q410{79s1;pX6&NjSp{Pv%-K$#q)5JyY zLPsuTls{3jZA-CUAbKV(Z;TU%K#rC%Wd-I(moIM*(meXsQKn6;{{BKPC4qogQB2hL zTPrn31Dv@XWY`g4q%+2m=&k1S8+$(PsVo}5(isd;9l%2q&r4sAGQTf>e+W#+sjwq= zt$xVtu@M{b=63f_R>@PgGAtK`o;edc^Y%~Im;o#Ei>;%>x&V}vlKQPE+9LPIr6@IG zAWvd#JPb!?S|C6QO)!1URN$yPqn!7-r`G%Xs%HR6T9z%YoR_kCd6+m=3`rx=l2^yI z(f}-kL*Jn-ED%h!q~Z!ME=R^;Hk4<-;Br7~P$;~zn- z#eCRdyT=^ZFcC%*{?#$Quc=U%>=jWV#UgpM28JdwhP@)M|KI9iNDrJN6DQiSifX!3 zZS3n*d8!r)b*faE9TacCYGCOQ(lxRwZFRMZq%hzto^)^*`)oSQW;wV z+|8}z_Te4;1%AQ(4T`h_;rr?LH(y=RFe0iuaMNvf@)3K?hD!EhGKpUZC}Xm->-`z% zXTtXn@G1k32lxVUI|S#r)DXwswrX9my!MQ%rvOQz&sbFVZxOquKfIvg^#PR>_RD5Q z_(zyB3P^&6KLQE~vUzhGHBwfI3`Z;KK&-X>vsOpA5}(M{mk7V`XC-xKS(A3E%oGp! zCOCL=3qn@D)nO^(7ucOWcr9&7^JOK$Ro;JhxWgBs=j_}lc@MS5l{`a$q}{g3Gi08# zdsHbZc;G9kKLwDdaF?fJF!7rQ@+hh3;SL?;!`-04%!31k|E}}Er0mi6gW_si-OWwn zUr}8@JQcChsDPzQEnyiVCl{USR_HW z-ufDgR|3++0ZQsLUF=c1g+g|x0lhvKhR#a;GnK_3Ipo8d2JwmfIg`nbfE=xEeN2{% z@x2(cw?=*!YYy@``;|Umr-22xD z4@qkSdk3OTvHeyi@@@9&Iaa4Cp)*N2P@_sCZ)d^{Gyx@0i6gxJ0@D)@M3Nm&$KjiAc-aeM|2 zA-6^Xvk(5}bqmQRN*PiWEELPSB-|3iZZ(SAHyTlzcdX!u_qa0E;ds9Xdcjkb`hL!n_XY8sO7O#;x)Y|MzFxh!CM7gpM zw2xf=)22J1>o@i;wOaV0Ix5`O7Bz6KRpvGguHfMu2W%(;8li$LZfz}8A4U8+&W6=% zcvqgZL8^fr8NLU!OcAVy7RA=>z=!Z}&lX`6t|S7d_+1GQzZSSQqi(HsRC;lA??pb5 zcbRKQCsw3PL(~$Y}k$nf6rUi!BiUd*xJ7`Gp9;ct-tbCG)ug(`V(bFbh<* zbb~#@htmDZ2-CfEg3U!Q&({sOn)G2Uu3#AoqfjF1^NqQ>ekV?L;MHXtkEqB8q+sQ- zktbzL7QWsp4m#|HwO9|0MQ=>d7$5rq zhUz0pqSq#bdp{>K8|w4YcyoQz0q7HVg)(}FEUC1D{89t(UXpK!2zCn9b=SAx#N`+6 z)#r2>RBm3zQC{;=!QR-TfGE5`0(TVLJHP{qAWG6@;=ZX>rM7M&UYZ10Yu1aELI#GT z{tva$0dmZ*lD`S3X3N}S8Q88qgRRfb+q{mr?)Zr7GbHMyfE;-9v+eLIw5XngR;0-S zL+D}d9`m`g5UiAc;y*%a+|!gH6!C6Wk(t%MrsmWR9stRF1XOL7Xgkub$9^T{oc1Y@ z2DOgy@~ek4gU&aKDkre(gzerMgjh;y#f=F7@5Ue06~D_O7k00b*CHMR9R1Mg zy(>`{ASZ+@tZo^8aD@s&-F9|*Zp3Q86JLEgn7-yyMMEOiVf$!;*Rccn?1&M284eeE z^J3-$0DSczf_`%;EK81~@B5&TMlMtCkSqN8T$*NG3lV7XHC2^=3UWxUEgs(^9>VzIIi?UkhcCNv3U}Rbb3l%NPHzLI*DsS1X7LAKK;YMXf z%R;T;{cd!{;*snJS~W>LfM@v1H$aF+dSocac67OebfT~!p!5@xhkeu|l9;n-2ooWp zb}Q4*DFb9Leo@b%;&aN3Vi9bm5I#+-x}FO@`-!ko}BhVQ|r%06B5I#?RgnS!K>^I38y-PuZ@p6|6SHNi8Rm1CrH~w{{KvZ#PnEEX(Lkrl{l-(0}O9rb1m(@K(Av<)eW6aZ&Z>NNlMN&h6ks+x7Cq<1wBQtiThmV6qqdarQsf z;B>(NVduo62L}bM%y&O!e~30CXcqN!TcE#Sw7V}HG<^_nLN)=zTU1=*|h+3e> z+zEEm#YN6*mJPS!>vRZs_@{=)1ve<*7+q0m@COCwOcUcODbN$TMuE4D%ihLCKEk}B zA|j84Q18?2f{VskhKDp*W7aO_RS|(gN5BAto;eOYS|IY30(@AmX9}c324`Vn5O15m z;J!RjY9Z<7;tM3mTur03fDeoZjJS6~wzRaSsEzB*xxg=U0Or50!%Yq*ORCvIYYsV{fi;NV$L0 zn@lAj3tR_(N-1YctQpl=lOjEhXE_Z5wy-jT;>V=89JsDQ*&nXX)}zu|&bF#r;aqY` zBr&4a%(f+YeFlk*&yKWt2i2CgzGX%76e@-8fv}23GvAsfc|jQzo`m&;%bm#T1-ejE zP^d|~srxLqxs*Tg9v^3krdRWlF5D8X_VW`4-D>zd>kGbH@(?3+g(q`#_z2EBQ1$?$ zkl?fwi?tR^1~>4;Yg#vv%T!Yr)<)+1YL>&cR;D-J?IiLKV+uQ3{BbS*k*%xIgoTJN z3VoI0u2ZFP9K&tGL)1AM6ZJ~i*VdO!93bl+f!cZ*B2IQHvG9ni%+x_w5NSoe6r#tB zThjqRTq852hjBU*Puukvd7V(^&PZ^PZ*&*IBV?Nn_i{g98Pssqe?Da>-L|tiDIC$s zt}K~SXhJk>q4t2@l8M<>(LG7x^=j*JFTrG567H(X@L@%(5&gO=Aj)fxCd9r>rcAcw z?w$JO0qm-r1DURPi=DK4S2ju^oje`PP}5`Lz_h|37P@=S9+01W9TG*|EqC?>C-Mi~ z8)|ehZuZdmnfR4W+HBo)1z0qClXKp_M0eC z_rD<4u{1L-@c~Y;gg;g}710L^wKm0fn3D>o;nB&jzZ#+QjoI|{&!~wpe}i?@s%HEP z!awu<t;!#twN=My$du%pfLy4wmgJG2MZPmgf17!^u2;wDeM7$b zmC7`B$A@*;%x0G;u8QewEIxv=dpFK6<;zS~q>dhTho8^*r4ss@HOICKr`xt6!kKyP zq($T@X>el_2@>{ zOTr9U$y>@nF8_4@`u`uP1LGXAGtYDCyHbA%ge8ewXz~v!9P9vnB1<*!1ha(aAS*Vo zC52lt)LD#fHrniOxGg{K9AL@^?s2dto_a?Q$N19CkK{(zeD8(Tgf%{_U3sS?S{A_+ zd=cMe`%X^em^pq=enX_o)d5xhl>SfmMBnUqa=fi!k4)p#dA;4YO`i{K!q#N_%A_%oemmA|dIgsUNBS*f$K3Cq^e;25iMK^!#BW?XXR`1MCCQ*B>&Tx{y?1 zICFswr#WrTzc1D|`?(9CrGQ}VH+Gl9aaYV){@;p}X(a=F5A`9%j8Bl({K$e@+I?+v zXP~RlI7W8Axh{E!Blm)zbHVv9I2NR?9)RMcd;je9!6#XrGtA=J#8~XEu+X=k82<_i z>h~>+(!%?fJ|TyW(R)6V{5hgQ0np7|G7SOeyh50P^c8|r?o_8odspQpd$Y_46UX?U zuv6f+8lR#{^gyU4jBvtl3PN_;+0}4JjPG;bIH^HnU4`hMBLm#$cy`j?g5%q#4<5WU zUv7hg5n#oP@C$70x*Y3xXr?R!EsR(*-*I{pY_`HZ1HrU4$9#AIm0!ouFI(sm-xYaUyoWIJCmD$Fv zZG)1#I8ZaL5i2-7YWY`o@f-Vm^De%$8y2)!fFcbzqsu~DzI2TT6$b>v9b2wP3AF`H zMW2v#bUaGTur!o@a?pAQ6?fKqD9%xMvYR$8v9t+E3ay{bs`qLge42~-A$;L6^=G8Ii5!;qn`eUurZW{y*?%p(6sFN@IFy(DIh)$dq z0_}N0^o~>RSG}U}Tl5MS2vk%~M2-PLt$3Bb@8m{}`HMW2VRsYE z4qDe6i4`|Y&kvyM^;la8Y514C%6B#8_YB&W>`RP~n$liq8(i&1PSr?qExuTNs|(dw zYddICPsnE_?9^o%tBG|%@wF`H%}WF{4`wp3Cjw@T>&!SNi@&aV`&WAV5k%>^5kbtw;R!FF+;)WVW;E z*-wCpt(_*7wS@VT!g)ms1`;)pUXRczR%jj!i>;jLVM0XsV=Iil!^WdvsC7=n>gyyT z0r&o}1A2!KrN_HlQ$tu^0EdV+g^+m5Fpq(;6o%@m z=^wfniMRcF&$3!^Ycy+%mRFrW-t(ra(FkE4R$WgLRq9qUD%jzKPv;H^SM+ZL1c$#_ zM(+tv8}oTn$akQHZi_7SQu`jpEO;-4<@O0g&*#_6Ywe1wq*A%m^lm1G0*Q8G{|zhl z28;dnJx!MQcHtJ*Uus%k1O$tYG+CAbXENkYjVX^Yje#`_3C#ZQ(~Cx5q@A$B7$6co zV@>ZgY8FK>Hj&$Ra$YFfC5?a-yo`s#(7eR!(&{LK44ABylT%oHG~> zpmoW}>%tP1fBBgc5J#ISYg8DR&!R~@s{Kf9aerTe5AS_n)-Q72IdHk>gOve2g}C@A zkeKV=&a!!fE2|BF!rO$#7Why#k$-mI5aRB@;1r69?}D^6zECnfxhRM{DwyE8fb8kc z2=R2Z67jEI_v=p%=5{@1;5fymM4o*P|F@=|$$Wyr}` zYjrQk7#x)&Y?a{sV7+v#MF8SzADo6U$Q-Rkn}Af6GK`uc{4r%KHhjs9xl|4?=O!Nq zAwpxu1blgBx1FQ^NfhkTP%Vr%)w95tv$wZQM*-d`-qU0mBx4IJ+iySINLm4*|H$hx zkSfK2w4lWQ<$`(kaMo3LU3S3=#Gt#|Kpa}-e44@}9?(3Z5cl=e#p*B;n}2g}Z7C7q zEY##Ojc4t~j{RtEeP0Ki%lDnawsxLw*4U{{F8o2{{{X~l)OhJTGi+d&RLh`qq4igm zUUg}_*J}Q3QWq%#Tf0y*=xWb$a>dZ1c64?v{p}&;s%&HJ>;BYU zr+gM@FQ0xTmTa<)OUitKHU`V{z5M?`1@sJMUo<|p_csF8|&1|!$y zsH?MWu~L%=q9Mm5g}t(Cc}7?HQ##q${pOP{?ZnmCgj^D>m^1yX=xTqIF2=kQ;gP?- zc@){P1it(&M}zOp4Xqgx*hmzmp2&Nkj~3OxL+M>U=;ed|;L z-hH-H$~9W)yZWcoO|U#Gk|p4{av(J8WS2dLo@$u?WFp0 zYcZ-4)%i_dO989-Z!{s@b6y6+9O*8K;y)UnktCzN{tIml)K7u&h!ok@mh1dC>UggK z87en;*O!F2^;8dH+<$(O06)h{bF9K1mVr@2%RjPGetu64fV$=?I-#Y5GgaL7K^jOc zRe~+U7vNJ-*E!pKR~$>8Un^ga!dDJwBTI~7j_1B1g4C%6@mAI1$Xbt+l##(}@8BL4 zF|0e`5@E!h2OO|-Zkr%nB$4OA&P9>LwE3HYS_qrKu!X{*oz|%Di^^1 zbhP)us?s>(JPp$4wNd!|{xMzwTZJs+Q|#S?QJh*ZzO16KLgQ`AvJX~i&j0SJlsDQB zw)k+PvJfnZ%+|gPnm>&V;<#KWLSg8%G-3VHa%eqW+U)qk)nDu1B%)&9KnO(*G015@ z6*g-faNDtQA^ep~154Ais(}axOHHhlo1IV+$@sb7V~mJi0gky-t_p**cD8IQ7*<&j z0UHG2XhrA0n$5&HFaoUp_z(>3eaj z8@u)$$N3K3L|%A5+ACYC?P#c+lBj1S7087qQeTU5=-uE7qqP4@2Hl>}{8=KrA68Vn^4#@Q*K%SZNbKG2DKFdvUZKZ0WIYX5xumRm5O9BW_hwf|qTAp}C$b%c9^N{E4!1x1BB z?e#>LzA<%X);|rsvYf%ZR6m#F-QHw^W&{{p^4Nyg;LaE=**NpK z6+^_(XSKsZ=rdIeQesE&5n9RE(w=4Q4xTp|gaH8b4QEMbTPFkH?bD}!R3wdO7I=uc zu?%Z+JeaRiMrJh0Ph)mpb-Huu8WSavBIZt>2dNTBs#X5^q%Ewi?0n^R1=VF?3U#`Os^tE2AAF* z5o(%hsoQ_ervA0(_=4xR{#a=I=3sdV_6UkQ9RLCpH3sxJ2Dr^a4`NU#Xb5e3RB8s& z2AVoL4sqwsE-nM)}b`1=VrOcPUD5VV(BmSoe`SLhr;8&#C9Ds;?4v8{$+@kKeugxos$er!|G@ zwqMs+n{X_ncVe%4ep8D~QH6MT4Sucuuie&}yrJCHSK<&c;J=Ldb>q)GW8@7ej`{0U z>BHm+zW4OY0guH1GjRS_ROn_?YB?b({cEOpY9xTqS30mQIGb= z;=yn5WCRx*nbmb=5@~O=nfvZ@!-YgtH|a-I+N-7IL;9m_#dtUWRmSg_u+znXbIVHT zKs97y*(n>Bb>V}$qzH|ZhQja*^}t8yIr0uo_DoT)X)TS9fMFZ`xW-8iO$9q98n20u@cn;@CweA^Ssk6HGy5o)CV}w2UOn*=F zy(kx}Ormx&-Qq0`^w%QdV7J~^(eFpb{H*)hSH6+(YLm{;js&yLMp1Re;e!JRt2MrJ zEEdH8?Pot*Nhn(`Mp7)4EoV|6T4ezUWi?f-SL*Kw?stloA0q(o=%M%nG1ZB(hSwmP)o* z^CtOojca@<32t69UH9#=+_;igDq)GoOqG|G;_woR%&dxHW%Fu3$p}~d-JZ6a0iA9F ztpRV)35@#3ruY(vLFsKXTpX{>(G>0bQ2A)w#7G=CJP3q@D`jIibPnoGd+IiSal5`{ z6%IGvT4O?0iEM}FeP>~@Im~NYIlHYQX5_Dj%o$|4z5D-}jTdx&dZL+9{)^+l4fvV^ zcfS$J4{UJktLQf4(6WtG4(HD2FMD3?m(Ot8oSpO?M09gMeKXt%3yPuS9O$i8OvQ2l zpk_=4qklRe2}tpIXX>Sx@=`7A$4whN%Fn93<@Gk(ER%N{Dp=_X!<6h1TM9^QP)2n9 zE)wbJwvOD{D@R4e+cCOJ59)v&p3~iBVhBy>2HjTj>mc{S$BU3WI zxJXt|>Y?*e{>`frds`+-+`7@>SOsIYNvCl&Z)nkOlp?e&W$R#%!x&sV{ndvp45OE< zsbX&QeSabV4CsZgxCAHwo^3b^i-2{1BR(JQVd4rYVTP{>a|@krb>BYRz(h}~gsR&I zk@c3g*B1HCLKKT6SK-$JQ|AQDZ5HIB4RZAI574TFHD?VRXf^515K=*^RJVkEV-J!w zocmWym+9Kv%%T4c!t^4BRB3Vz=4+~;bn9$PwHYe%1D<`ipT0YO(PFf1bpt8qTS$Qy z}N!uEbiyz@!}y!_pPFOv^Ie^R1q!(Yvd63@y3D-hF_r+t)APNG8CVgNTb zvr%q5vTlztV$fhyaE|okz7|>aK?pzTX-5|f;7BATz6l>BEjrLMU>4N0)jdh@l&`XN zs(oaX*Z<;uy$nx9q^<)NWLEgYuVZVPhdY&0*3Z5aqRfB8Q@e~Y4r0FUBq^zHEC6Xy z)9oDhUtN{$u6VoGsJRs)ol#P932>A-4lPbb9#JFO0DQy~sLA|h8upCZ@{8!Ud~R0? zK}>r(5aQq8E=(6Cu(1sM6sFt@WrS)*S})Y2TAmuyx3eL2dt{TWzFM*s`?Nk&s=N}M zv2V94w+2X`s;P#QYVSQqn$7`~vqM9=+mR08KVe^rfHCj_b$l)G$mRhzdVb%A7cKjY4oRZX)sALoQ@W|wO0dzz&HsD08-buDtR*9Ta z0|Rzr8)Dl}wK|Nxh3&zS4vQqaq2X!k+$hY2_63+TKR!)+C$hOFqr}{|QTS)d24xt^ zrlMs&Y$F~N=15`KJvkT40Rcr`F3kE!V;NS%bUc2iG%Q~)%$c?D0pF{Vse@PnCy#D2 z#&tHqi&G5B-pd>89GS7x!QPl5pnpv1O@;iY;^vH}tc>A7y1jT0Z z*;SU_)YRWZ0aD@{amyGr(5g?+;g*Xp~FGk z00sNCr^Ihpl<<}SSs|BPu!dI1*?IVKLn;kbpY!TT8!XbmQ+&#!HId&nf{kcy4=LLf zBRtNBEJ3icKMm@cuLMs@wXG8u^A1e<-=;P&30Kb1f_$w+LHIi?ns6-Eg86&1FnY~oks=Xy|MY9k@>~fPlk>4o zD=gCkVN1P>A9s{bwiZD@kZHK}8PiHVrAPYcR~WgOzFSpK57lzx&(OiLP|P)|_9C?5GD#bS+rz6L88ktW5j>`+-LCCTMi1v6u zaDVi1A-fqF2NFcmzQ7^C)1djBhCA&<$UhSLp$q+E$Atw4Efve65Hxs<#+$iq4vT@j z!>UicnJy|zw0-I0pXw`SrQ+qAz$Ha2-nk13W4gP0#9)Fa7=$ z&q)k^a1SxMPRv+u_RV6~_zK zWtMS+Rr}ThQ2lKCGInIF`9E%z5F1ydgld*SIm)y4=}Hk5)1iX?xW?KF=y|ZZ3K}w# zbQzLWEs0eNaqP+hB^RW_?$&}af@hhDBI)lklM-0IIPFU;_yRr5X_IJ0<|y@Bm7sJ8 zdgk`%tduH-#JU=neuw$&K};QjRjD*2JsWb(fcu^|;tIRS*W1ol+^zChIJl;q-eFIB z+;Bz8*EdK`cYMWTn@@)Qx1cAK``q0Kz)V1SA%~rs5n>G>PQGqtnKS^m|16Fqm+VQ0{$`*{-GufPUe`c3$SI=ct_d=x2&d$&xFnth8VC=o) z9`8%ot~HSDW9^XUK-NrWgyv5OcoDU&jxfuvA^l&!-Vdd-TYp5J7q1_W+;2ZY6|l2y zLEqk#o^++8d}*n26?{t5?A>~T)&hhd4wugBz@xmhyo)&A4e0(%-_~~(A-x7C=2;c9 z{b2Y41-PpJ0m+XVJaPvr!JKATUf1IAu2X zQ-Fxav%gmXytWI?`LOG8V_`cBVR(h>Wvc@8rL@o$bQUu8Vhw5C17nj)7P6m?EeEP6?oddCbw@ji8mIwHA*>t+^l~xPDQ6w*QT}5PFV4K4m)}2g?MNfuGpqzyggT=U0LDW43K}RL#W5NsA zGoVOGqj0N;Kz(clTRmbI~P-z}iY(`=wuyrj3*9rAS@y>_=;1 zv^@J96(VDc^xw7U5hm<=u{03{t&j)dPZ5yw5VqC`Zp^)LNw&EFo_s+=I7-7S&Vi6Q z0i*UuIVI26CX`7Fu=O=leX_ZnK@}{99qCYAExiToDkW1Ot17Pc-9estI$(Y4R`aQf zt0QjTCyrW4G5y*a*&pbxDr&bs7^URDJ}-=}rg^$A!%iqnk5C-TvwTXYuB)`lKGtc9 z0Q3yU)iOGLo=99KtjF!z-c$^Q{B4q9r{}1(H{Z_~REh#)T*G>g(71JGR63pS| z#GhZ!6Wgu?+Hu0#&wS=LxILOzT~I31|C?FvTdmt5fUJCl!E~I|1+Rzo+vY+DJRPLQ z-hNf&PBwbSA)S<-$tJUk^-nrE>$ub7ILeUaFW=MgmUf?0IWXS{-x!g1UN;0F%xnDO z$qOy=a~)MUP?t^Pe?lD*ecG;y9P4+6O*0YjQO0j3;f{au_I}yM>$qU>Kc~X?TRHkO zMc2f3`&|{mLpaueo;u_ zJH@w;^JhZH?;7{wEyTo+y{*QuPlarAQ*9;AWlwBwkaz*AXVvj`!^(j5-5|?>tkKL1M1S! z(0paeP8y@;%0hw$fXX51hMKf5US;W9S)y_mE@9TU6FP*^=}3x-{Dof@1R9O_zg5?t zrt*fwd94pX@WaLV36Zj*sH%5Dgc~P4f~v^_`Cgq=Socy^;#j-Sa8eik*5oV#X!qO! zJe5!`m1C-K4e?5GxRk15W)3MT{s;?N9~1ZfiEW9MmE~d{oL#m-&^ASmd6m8PL3BrF z7K3lqS(&~y$P(`C%kmT#HF^k~Xm#j~CDR=I_{&=NV#D>hKD8(j+=hPx(p_E$PJ@hj z)^lR&<(EXCPFq`5`>@WR(VP+44_G5?k||^C-d5d-cUkg&OSKH(?Dh7R z&jFk*iqYSw*9+y)qg`o+Bvg^hiDW}+EM!znApS)G_M<)6@U-;88` z638Om_r@JQHir=Un=b|h5Nh>kA4ZTm-YuW}o)N*C0n+U|;9<<9myhno|#h82xsANhz6f=h4FIkeB zVEBh~slBmvoe$t{=ArM{&CqQMDM7Z<<(L4|TCi<_9T#|~`5K%mpi6{Ww#e%aKGowg z@PYr05LzB@IJJowg^95_Q1WFG(v%7VNlFP%W9e_@Y*L?PqCgimr^5Ka&CfEy4RmY+ z6IKMpl5Ngb`>{8M&%{J{D5(iztX;BXSHdNS>p_yq&bXHJ`FPn`(Fz`+A$l3@r@Nz7 z4dJpsgTRU+MI&&(!&Iprt!P&(GHTU}%6Xx-j;)e2tOXgo1qZpC15)*DMv*oe$ngQ< zpDY)=9*U;z-XnGtRb3ya*2^>)HL@j8@J)K8(AOii_e<5EOZsNi!LjKGdD6}Jsho#p zHkQEgXOV_E&|=m7Sf3}I);=rEF9VkLAK&CwrUUHoV#7l+!&@b)LBw&XSdy-@W9zfK zM5-nVuK%v9_7g>VOokZ?SHnm%^!WxqFmC-QwKWqg^Cy{cT=CHZb?duNvj`EfA zK6QkLgGv+Oo<1)F{=z}4Y&y7~MTHH_lHqE-^L3u-TdAvF<_bO`U`k%&8lw67ZjtZr zC*qYA^@k~1XUewO-3;F-ilS}tS=cI?r;_OKMv(?7#iz~{-_B*&r<(dK+UKlD(gy+( zw%*|89|i{$E(*}{-r9^#vhF)RcLS5%p*0(MN;l4x(7fQZGeFjrLCqpSsvWXv1tJR? zTmNj8<)K#B4#eV_)RYOZ?s}Q@LtM}5Fr67KAs~_SKfkoIzK6$U`g2doR2b;@sw$ed z!KK!du$%Iw4yrwU7=)h;xny34&BH*AjS4nNCbci_pdQ-p;)1~FtDxYukDUG?)P2S9 zvQi>M%??Fk#%qcvD#wwFBK3$OY|xmtg8Lq7-aR1Hwyh^4jj@LG2D88H)Oy6OEKQE2 zdp3UX1Vb^yXNkh*rZ#(Iur|7lKU&N9m5g16XbT1K)}I1<;#EhE?N#GN%%}OC^$~() z;Qe;&r>Z>oEbWhEpFd^7z}Alq*w*Gy?5b&YKMPxcMHXYNbHM_&*1URGMO(w#Mcxk@ z*q7#?LE%S^1)P?}S`zLJU@P5Zuq*YXzZC42#b&Kx3Xz5B((UN;|H3_tYf$H&<>qW% zFPB^Rc~4L&K3-k&kUU3OA4qj8)ajH6Kv%XvI=Vhh09#6VZIb>+ko zFF$yrs%)dpL1^^CP`DNfeCuh}IhRL3d@ltj)JiTDli-GD|8JCWR1cOoBJiK3CcV0% z-?&nkXd=ShCR+hkDUYqCc*G9=IJz{dZn9sE%pcg~rIteUka^fcSXfhBx_&+n8a!xM zlLSQoXx8lKRq+}$L)Cg34TVs8ZdUgw;6@iBZ^LMgcpHvSo;tvq7T{;(GVGXz!?T7Q zPD=Svwulh3lhVy08tKGJrL87+T45#2)V)%UT%;Ct+;nZ77VznqiTS3yyUo;UQT9K_ zk^$^Y^lu89K|MQA#VEI}mZQa8g~Sp`q}B#4;El28uGb=y1=FTeNMZW^f+hO&{#tR+ zD@dM{+U5K*{3ipI-=zoGIW{^U9gr@=ao2)Rh9|jJnXGOVmU+V+md5b*?%B;^DNVQ{VubCS0|=IYznY+%+JPmNs46t49il!3}LR`&|E zX{YRmex5<&Ed&Ico>ZdPWyE8vPahfE=KADL0~-CJB$&?n^7*$XArlxXQZ6hy+rGR} ziL8VE&bqD|FKxz|CF>})@t7}iU>Kr|03WY=5Z!bj!nCdemsAM5=gSU8MWAl(U;jK& zExtE3HjuzqV$NhC56=1?iS)+kG8IECl?zke=R{8Nnaq$NQY?fmEto;0#8yZ1r^4oC z0O^+ zCDUGkJWs>_&FDbDZL%Mg0)Hq`tSpr(w73d&ViTmWy%dAip?uWKK~9U&ihzlGfpCgs zqyOus!_%Oib&<`g;RlP!UjxgpSSJrg`U2Lv+x5`4syM1vJ%yCoSRd5X*6oQohxxS~L>1+*Wjb3w&Fl~nl55pSdyjP7 zYNzuD`xFL$D3wlDkiM|@55t}^kq6BpcIfO z_;C);s)BX*;sg+UDF5_RUB?MDVkuO{RW4B-M|zV**0hVBCt<@o*ZT^OQiGgN-&wZn zq{^1Tsm!@YYRwUyX5uxx$`Au#HunK~pB zPBXO_6zV|u@Rkpi-XnVfKq*a04+R2D#CgpZ!CB9mnl_}BZSwIXM|M~S( z)QSeEKT$~Y=ksS5mu{RDu6+%^q7Dd%nQYilaw*NRex1HPU%V8}`-#P>vKZdDdOfo7 zt|-77tzo>mveds`<=%{`Q6(zu)m5}@44%5Zc3a8i@sb~-7>QqUeX~MbEBF6hEt^n! zi#~Gu*Gjl{Ulhi6p`JU-1~%lkwZR^7@!n+Wp%2EY^WoQBx= z#*FcnslsfmeC3P+0>SE*%gLIOyE7pjT&|QXW-oj>UyMjgo>eIzqIj^8KXXCJIgl{L&gq~X5*VsywQFPDyO~1lM8+QMKS~yJ372KspkRFbgWo=DLPx#kiA!u*^IE zm@cKrdh1ICxmI>h1!x5ZJ3&8;2J9k|tH~QQza3hh8m;|8Q}UVsxe1A@h-*=akP$a) zYJmOKWM4Nld|X<~2uA05M-EBwd_A0*&`D^?QU)9-52AC9l&i=a7pNkhElqEXt_tvf zmUck{Kj&HP>sQXgUQgwYgXG@**pFkcrU1DMhhoHX&VjWf^|=I=d(v7h8PB&#T1~mG zOmjRfSw*BtD5|(^*X4|g583A}0bwm$;ayE=pDpF_gV^eOLHSoPp6N&)=}xE^%Kyx? zD$yyRh5zd`8XFL7;RIBJ9R2oNvZ*h*D&y%45;VNZDHYB=h*qq$@&@YRl49r8tr4BX z!YG|B{y*Vr0tYNAVuXNE6k^-@duMjuG11*k!eq5h7pwH^R(7CQoNa@DhGhO!qab*i zDgu88PEicpoP=h&<_WpNfTUzeh>E0T;39xAyWru>-T++g+;}=qP;Awcz@qJwQ_IXv zf?yEa2Mxgkg#wIWJnXP>?Q#cI`t_(E!RMC7Fi~5ZGKI{<0}8gNlmwiK=Sy?L(u3V6U``5OMM0lT zWV6&B*e@le1`~x-qmAdr&@AoGSOW4S2vt*OgRapHTJPW{_Ng48WojG2RW&Qp@MLDA79!t!Hs7i`lO~y zyTMHvdOF;cSgG#&Nk-T3KFpJJTgW1J1SudNmru4hzd&ye07eL~Y!&oyM~5N>P-c|F zq;encYQJjhQkC-eQ8c1ng7#lBh2ZAZYqT+aLuVEjh<^8aK}8nFz0gzK5|e-bs7U+ZiM#`WU)C{BT)wk`v%b&}FxaKA!9-SYY0$Su< z7C&lJH3Iw_)%TSb8j?Ia_rePHkYBD`eTSn*@?z-Nh)GZ7$?h+@G)iKxR@S#dKj;D~ zXmg#b>t&K(F-Z!SU@E)3`+veDN!@#VTtgXxm^2g_!keEo$qsY0cq2zY`P)Zn16p9J z>J77Q2iLYDpH0!(y6PA7*9>zhY6Y9etX2RpgswQB4okBmY+o-Bv-c#XkO5UBf~z&t z5CB=8qCQ!#>&}QM{b~Ai7liI5!`A@&@4nkDYkgTQeA{m`PzrhS*JI#1>97xb)tNY8 zVvnz~^#daubHkzAnCtM##CfRmwXXs3!93;_@+E8yTt=Vl=S_VQChI(AVulQGCrtS|#Vx zB19$fCN$gy0{ROO5&icJ=zbwgamkYX|9ldly5~(LZNr8fmJbqRO)^}VQG)(1lw7%~ zK3}eZ9SyZw_un{w(*SfMZi;uJQ^W<+z2P7Rqv&JB&+SMWlhFq~9K###Ad;gk>PKy* z`W!;UIUeqa^Q8$E=GL(!pRsCeMw6)1WIydN_QYKZ?a?#3AJ7k64fTdT{Z)b^OxdpL za7$|~AdKo@(d=EuvGf1Y#q2!if`fUZw)ARQkBb|)Al=OnhU=AW?@X8DW<#tm$p25X zwwF>wu6BzO_kDz0Gc?OVd$038p=wWP*lhXyI9pY-ctW=6geo9%;0j~htl*J(QzD$K z2?OIU#539y>O#JwEf_dZ2FKY}!x;35IZ##Sz!qVN--c;_T2_fM21OioPF0>3*$>Kcyc&Pfe*e#+^v7V=migc7 znABxf*Evo8lgA8_#w9$wBcnCv30il!h|~%!ImPoPwzvw{T|wdf49_f}&=?B7dPT%` zWRGgsVu>=-M=Cq6Cfx8z1IJY(>_bm$h85+Sv``bHBS1VciOf*IKqoZ=;l#XW(IFmP zHd!PMZNwLXuRv%m0K{`&5<s7aRgA*@isP z4xfH#=k>WvC+r;R((O>n|9^2dlt3D=(d@LN9!)&&JrG^F;&o;Fv3rm8jkwxq%U-#P z=1=D$SEpTtYe}oN_H~2zzH+?en`7#Ol=~Mo>s^`GT{2v^x0=#)D=UnrdTF>Kg4$ex zf#)wcv1Y~=B#M54Ti-zH>f3er zS+v8PocfDW**vKFkcU05`G|zdws1@7l*$5<&#GQz2De^mupNs9i{`?5Z3jCWu^>~x z0>xlS(QaHTE?MkFx8&z0lhZ@a>M_mGg|l(x(^R6;=9$T>0$9`@bq1<6JsgD`LsdZK zkBI|)ScYcr0X91>z{8DQ1!>;1DCgI`XTkhzh}67X8o$X@Op-J0E&k>%q~yGhmuXvx zi>F8A^$BvJB$_FG;+D0?m*jSowf|VGhW7LsvmP(*xT3($TNd#I?3Z|!sbd;gwEKu{)yr4C*lBM`2sr7LshTqRC+2MjWGB43T!eLO)PQFcdYi9d>|zoKi+7& z#xzYS&L_Y$RmyF=NR86o#(!cY^$y50YJiMgVp-Psf6*u&5@o<3D;K3tCtZqKj=6J; z|8NcM5+YdEoU(iruvEb>k~FB9oDX?d9Mq#4lTi9eW1tfUrlh+A z>eWZupD_50^Yi0q-9Wongl%ukn*U{k&j~)eLfkO50I*f!D2N26F&uVE_Ndl-K2h+A z6Xzd!QC2!!Vr~x$^RU7{Zs>5FUp^?@zA& z-9zBsm@CQa#=x@(<7UqJKW;m*f(RL!kqA$QS-VXuEGSP_l`UN8cm;N+IM;`y$# z-R|>Fm2gP^SsGx{qO@2gp2Imna4zK(MIEA4n8#YwWsS=VOmh)m{glM{?88g{9)x%Y zg3I$!WP5wLe6@1=7S4bE5UwS}=~1%l&~YFf8(V}!&O3YfK^#2Q)IH{GbV9%ESL6XW zNokD27Cg(IlIcg7$$e1&+eHiC@?%m!OHWAj?buI6$dxFbNCXy)-)K|61cwI1qZ$nJ zIM00wNdrqb;`?5vS8j;(W8J<=ml>>pNkk(wrm7?OTG&AmaLl_H>eN}HW^iS7P zfLVp#rFB9Dh#lDoE{eDI6<%zVkv8AZ7V{WLa*p}b$@z9-Y zd;~VaZY72(9D6N!K?X-VIckDP5NIuV>lrE;U0!Av_sD^!P*3l(uyI5+d9jg^=tqG3 zl-U-l&D1^${-`&i1G2sRMTxuaf#^QTu&1fR(7-Ju?CEVTRyL64W!(t2)~5!J-2A!h z0tDnm7C*;fQ3j$|(WdLV8(LRdMFjaNqVORpoh2o0P_C#aO~L!b0ex9C#?<}F;OhmV z)8DJ^8r4mS5#2Vg`1TV zgdo}Ynv#Ez2YHoxN6}~LxLONH+B{?A_&#f;=WD3GZvCia)1Jm=Y&XV%7pmXu<4jnB z_wWeDWNoFuSs~lB86Kyl2aRV_T;V0ERAlx}+@41t=k~M|&yU4_mOuC5G+Bu;Q@|IA z6pogc(Bit*tnl4m-*CB6YY=8CiB#SEoB%ff5hayI6FtW?}2A%@f%aOB0;}V zsbSrhYjURO4y(E_IFq?ID2d)C5z=pj|HUxX3K{?fo?KSA-k~jQo29JdC!-iKb*Ik? z%J_)%yh;s*$1Q2sn6#fXfHGIYY-~)rPm#=LYvRS{3kS6g?+96Z2OFNDWzVM?$Rn)M zanvw|b3DcQOa!pldj(`#Uo={ZP|QJLxjwnoXu9eeFSQhxS3YN9F0veNF`*+?nuwSChGM z9YQ-zPc_0&nIa=vQf=-9y+n!aRmfXpZsZ$M&hJhuDZW3TC#i)7(&bh|(cRWSd(*Nh z$N3&-KB^lwm>#|RjNOU?&oth4JpaTDH;uGQv?YUZmWgV7nG1`mLK{&efm7C-uE?AA z0VPLULd-prp+)Ki7)?^KoO7?fQns|VF0c^OX|5-3YYA&KOBiu~;y(y!WCaGtakn57 zU+|ggqTi(i2PAf9U!(pmu_%UH* zw*rFfyvx%>r)ThGzSRF4QWRa%XY}TP&}RXk7>{5-SV5GnJI7}Up#>I}x@;|?&-0x6 z>n>q77s@!uRif{rOe7RaZp6vB*q4eI>Fa3XB?D4`6&eC?n=QO3yXG0ni6)yla{T@VmPKyN@GO^J;f zV?v6thS*yPgOn^f2@_yxrYlEMz$q?TbLv@oYa^xClkBm^bO@V&l@HsK{=1?WEfHSz3JN}HVM(JbZ6&=5ZEAq;twdvRG0%K57f zI~{@^dnimF|H8UX(`I-w>zYQpJtBugxJO-!b#4kRYG<8@LS{_^F5P_+L|bC`mRoTw z!xM3L8p) z_h^<|aPW*Biir?wNuAPBY0u44huD$Xu62Zhm?K;|oz9-T+jH!kx(R2F77aSakpmyo zujY5R-M}C zV;PD4re^GPDXW;3@gm-Ce626(;3b9FpdmgN-EdJ-Mvd`U%!Q$n#2*v0J7CwbaJu+UVqwnk&pDAemoS z(xQL}bfQf-I&>1i1W!$nxoy647=XSZvRvvxIgC`q#|B)V_)O4$=!mz=ih(^I$G~n& zE<>QfIBrp(tAbn}2B^M0xvLU>6Iq@+rtQwtO@D3Q`(Q(c^3C1{zfE5KyT~Tt88t)l3X>6oxoF;YN?6)Qy))eD+00$qWX9nWXW3pD_VL|-95 zsNRES@!izCS=}CYz}e*fy5ArTZTFLqOidDF%W^7oD!I-;9Y;t2ZT|gqW!u?0Vdohj zxMD-~4Wv2ey)F`&KBhLGW3OxE2U1M51?kh-rM2IMTzH*maowb8#xA9vn&uok@$!b> zL;(?%IdD?*fv?Q!Zn8SbXehVQe<5V&uDi8n-Lh=kx2^*J5;7aNlwMPNrp_jvo&Mly z0D%08bz9c^@O~jeFVkHntz93Oa7{K?B1Ygr3EX!a=`m=8*h4kSnU#11LX6d%yatX} zTgfVXpAA;eht+`4n`bC4m1$Pzkr2@q%)Xml4}whWpHyTy44OAXJTr=hTm|54y%>B# z3elnmvA@}3c6MSDm*ztd)(*ps4njv?KWVT&mG%MlyjixH-Q0}zw3`HH%HQhBkdX7fqxYirCh-nHB zO#B_Q>Nd3vGGBXqpqm=*@er62S^dR&B-3z*(wo#&HmT=v`TIernxNeI9(H=DC4D;P zM$gNs(ySknd$^Lq;k*vaj*tl!e^5PQ z*H^+E;6h}M`#Cy@1M5vRhMVL?@bJtjNy&OmRxGtWk{k2{PHu1khWp<1YnmNy+GXI; z!{m_YHuMa6^{}USb)L~i$Ts5KKgF)R)s3cMbWysqMA+SI$7!av@-{5s^hM+>&W4EW zppvo4wJLtbVc~Xr?4Q_AC3brP8zOBKCaLJU!qSaG)LmAVY(pLd= zOhCQhWk`?aSlC8P7_g&w%4k;7WoKOP&M6%knl*qskEB;jicTN&V}B)J06IMtc&3XS z=gM01-Aw+TmkIiaD*i)o=ZhIEb+t6OKFve&1TR(s4Bs^^mebg+iu)oRE&2A>l2ZE` z{XjMf^FbLaP8sO2o$1BQvVossrSc2mmK~Fo=H<>|)8KNz9G)+@!O>+JZjZLKaT{TetPu_lb1idH^}8EmgMy-DKEVEzflxX^SG zCge~6Wg?dhzGjtlx&;|e1Z0=err=#osPr}@fR5Tw4a0bkE^iS%I)UQD|NbN$tgn;& z0G3w6|KkK9Z13lNp&z5Hqi6Bh4%+-K zI_)J{BsT>72Q)-WRixG?rkXmy#Z*WFjoGPcU_^i!MBerwNT000bfETyVj2$|=cFbj z{y@`OK2RS&Xn?G5EO54rZB@?nq^z>jw{6Ja`)H+5r27043#22JJV(2CTy&J9XE@*u zYNQ>{{TDe@NKX!1R+=Ry1--iXE9%$?g92Yoo_i6cKoSq^%54XOPH$fn31s@w&L%S@#5i zsbxQCWYe5i9pe>iyNUkHRa^wwabU*QWwo6tXY`%8*yG8juwN{0xR@_`X&vdDf z4evT$I60JiJ=Bj}bE!c6#zK%urJZf3wB-Wh2VfJ#j9oU*vw)xlzcx373O~*ZR(IQU z4-1j{HY&&w@Hv$k9yIcsE=T9HrEm#0bb2T$d^&yo54zPDq0m^Nw#L~KZXSEZSqlUz z*sQsD6)3&LEti);JrZg-S5VEU(KJBYkDEQp-{3s}f`Sc}59`#_N}!pAS+O^dZMAox zNf1af;oIt2CUM*?XA{`Q~pK!t?n^=SoCK9{~uFW=J!bmX9swBZ<-rYzN{yfbrS5>v@$@e{Wt$ zfgX>aGi>a*E?t@CeJhd0kmu?W=u{hWuQnYfK=(QrO~nmS+2u1J)<*4(E|)iftf=m8 zf{0V{wglQb>rb4RlGh~M^J-ursh|CQ*cp8eGW)@Lm3Su*~0n#i2t(n z)5Zuvwx_HxI8M_;79-Z8Yj@D5%Lyw{OI`I%^@&&GYoB%o|MBxFE=qjA_rA zHU;>bS9my7w9g=~xlhIe8(Y~^fJ*me{7-8Ax0TeJi>tZsac(_gYC$TjU~`o5)OdJk zys6cT%lvJFQ8&T>6Po1x!Q&#<7|_I527kDP{nCS*sPsV@Y=Xn6my|NINiffXEslMt z(26C4oS1^BM=D4i@tK(H!RKI3^>k{UC!dkJ7qlM93Nl2FY5o`mBCU*F3Fd~VTHfy+ z5eXT5JtFJW1wk1he6gg<^X`!0a)tX(KT}vs^1O#g@H7GMLg_1QBdRW5v2Q2D7=`#J zHKKvI|4niLUMbi9(qpi5#H8@ zo1s2K&h`(Ht~npuh2x{MYoj+@e(|JjH2NxMkZyqYrd+GusZ47=1FLJXdLX$SG;TL) zCn+R>;*5R3l^4z7EI9Vn%dF%bm2W}R*LmqDQ7AZp?a0lR>5i%|Az4mh@fr~ zbQbbwc^Q=PjRU`6gA;IV_X#RNZaT@2ZVC+hVL#NyR`k{;-l7@uQ==GG9dQnPZ>M|n zgA*GQmpGQSos?>_1?z;LuXgGRxEU@bNepjm zDj9CizI?Ag7xUP(s)MPSo4$tjZtdB_Q3aneu43UW$`^l-m4Vj93G<#5O)2VQ-qT%Q zIsL68u?%lFz>%vT$a#UEX2eZCc4KQQB#-3ZyIz>atx*Mh`Z=un6P)3IaSOLdtJZLI z=$CH>m6f$R>;?5bIl(pvaThT?W4fliK+7aWSXt1Lcd5$>t%k(^5kIYbO=j9qC=>V> z-TKw0RGsf`eASCr&FS1b_<@$d)a<5&(#!RO<+1D!r+SK>s_P0PxJxj%z;Znw zsXIJh0_^aN5*IarS}*}G$b=Cn$}>#51XCeAdKP)?Td7=MyQs@3ikzI#@?*`K`Zswc zIcCdU=@E!tlLS7HtyJps|$%gFd6M21< zTk@W@OZ|FP0A}->IQ2ReFqV3zI(XxS`V)uEDYuoXR&=sr^p^v`LQD~859#7#ZMILjkHuhT$|Ou?e?2y*w2MyyettD#i|xrOHC9iLz7B+OZLS2we^X9dgrUnOYhql9(o>`OP*|D3KJpI_`~a|rOG@gge#zLKpqDX83N~KdXjJ< zSr~61f`N<}&oaTw!;Mtvq`gATS~9{~`g#$Q&BO;z9NZ0_#VsdXCIiEZA_A#3475Zx z47~H~zbdbY&x+uejob`)g=#W*ziZ)^uRQiW(jKCbL&J_;W;da&WCVIS8H~iE#fd5y zB<)4v5o9%|2rH1*12Eca)E+3AHINTWL7j_Qn}!s+1811N2~gptM_$^uTUjyYa-4Y8 z5e(CoB#W3*j{zroN`+h2>k=$gTsE5mE|QkQVv81AtRasdRPQCxAxf?og6ct*WUfSH zh3N*{h}Ohst6s+sGzjO*sega>&3kUG=JLuyACx#+HEr*~SJ2DJ)h?{MC%*9)#Kb<6 z%gp^s5B24lSdrtP?0SdDd&>#QB`WWn-{99Cjvb}>3V{=2PGbiZy5!-_hO!N-639$J z&g@f#K@n=`&m0y1oAq)>(G|Sz3W$GXBL=Y{n^Y+7uM2dHDDe%}Qz74Q8K1M(G#`qY zME!&PTnke!wyjnl+CdnTC8weGT4JL;@{H21Q@QuVlXrsa8l-q@Ji#6DJGpUzcp7W& z@I^(|siV`~PyImIg`o$r9Nd0#?~t+0}?wsW!Mpi=F8lLao0g@p$xcn10^5d2>4 zhLi_SN845d1b{~Qyu|K7qP}CNw3#C{%DK%Cr3beQf3t?yGrZuQ6n_4{ zT-InkfoOV>0pi{v;Yzigwb9F%Yp|b zK4_*Yp*;r{j2OxF+b7u(HfgqSj)%n$2at)gPulku^ad)DO7`rk2f{nNh?25S2hwQT zv-+Y(Qx*@%RNBQo!qkHL>lijpD-s&qE^$lD9B+3H%!DgAfDp>42)IbwdhHN^x*7Z~ zloGWLa2z5mB1zno`W#F8qnc5p0|=*it9oD-;_Y}MJZSe^P_o$hVU9yNy;xnu!mkMY z<^(`#!1g~>ToR;-;SkTVVC8^~mw2Xf+DYa{N*Uk>v&l2@rSGiG1535U%Nh_OStQkA z(Wz8-4m+~H9fIPWdf8x#zY7o4l6A6rWxnRQYRg~4jCfH>32*rcaF(Fcn_$*5pSyU-aq zXe%~o*eLQP|1n-z2N!y09p?O>b1h&&;Q=dag^IbSTW0TyymV;Vo73F1{kaW6)zBRu zfjks9JL^I#Wx}W{wiTFNWJ>TxQkyR?48P=HATy5)R&e+JQt2iopY@XKhpVR{;_`^> z3DF(VJS})q(CV+j*Cn7KMEG1Eb>OPwKY@ib5lMYBGQ_qwUaErZz&eA_L?vht8IaPl zx69#Th^|WeZ|Qdj@w{gMl~1R$t&(dEHC04>9o^0EbuvvV961gOhZMIkuCBq$mZ(b0 z!A~3b)utCc>1xRk1eMXJn+wz!>dIM%rGaaPlsiAxpIh;Z+8OWbB|a9q@|2}{XJQdx zcz71DQ^PchMqnJty>Ly^G0+CqdZf3P3jB;<`(>c9W@sl8?ofvg^YxD}gu4>-;hG;- z{>}GyvAQQ%Uwg#Z64ts*?0Lk~ciaf&F?mMv5RR6L^W;fttIzQn$ktVn%0r-KPFLr= zRgq88NRTQ@-81G~g+eLgTMTPsf*e6V^m1L!}DE zfHo8Xw-MmYFZ-&-zuatkW08`;wvu0|LPfmZEa#%AE~yW$r!BJpAO zqEMfF4VrNA#U_^w{QB1*N=uj7moCIyVXcX}fnO()xOi)@883_*7o4H3`i zC=jmi`1`00>b^~5wJlOab$`X7C-@y|Vi#_Y_ckIkGnO#m+N7X1Z@q0skWVG7@z)F}D9O;DU`fm%1mrXETYt{*1%btAg z%5rC6S!vyiPn~qm4Dl>fGX2T9%cq)@LA~VK_*uP`eFD-`|Ra|q08R& zg)by$a0lH*QXy){*bu0|O3s^FS87i8D)Hqn{uG6~XUdT#ofhI@Rgp<$%=gSR8Nx57 zW~b!)J_BwfRN;_=d$&u1r|U=7GdMqqJ(0IOCP4YvqAaPg>-l<84d)Jhz7FQyb-gc~ z;32NwqX7fkr^4+B*`n#0UR3>0SaJOyk7NeKO_3n7C8H&pF2~2{ z0Zt!(Tab^&!KC9c4-zU~rxhy#t%e!KkN?fUuPaeB^4?xW6$t)xuZ1ljWC}gjwD^Oi z8|Ca6x|5I8;$Tzaf449kk?dvDC$tf0kt>JQYJp+bc4Ymo?bwHTZzW%=5x;HCU;c~+F$s$_pCOieGz zX!2E7C4#B_P)ctcM4$9Zk<*VN!&?A?Pa0VPM=M zWT3U6SGV|eG~4cw_{(v1IixOpct&i{`0q}u)&}fLl)?kepp&k=w^5hosA8}52Pa|N1bPIfibnMf zy(1{&1S_*tdKdxI0%i45U})0?ug#?Ths=$`QjLUrHt^4{c4@~%iO1eej@|uuVI32y zYw9BZp7U3`|3FoyQt>=tV<=EZJRIQOTm9(&-h|Iujm)8vR-ndwd;rs9SFPWcNEf6Q zWLzAZxads>f7w;2I);>))r8HLx$NmI<77(j2blg+?{ByH$w~=Vy}o>Cg=K?0z;7_~ z`oJHQ3jT|4XD0fWUQ4*VL^{=s4uzBcuNP#C2+l>mYBN?2QE?Uivb(Fc-u6syc3owW zdnUx@bcH}tIg=i~m9H+)=Sp`v?->#f)m-Ui!VL`5)V90O8?vFbHvXd4812sDb0dv1 z`Kqlw+J6+50%uqUmT;aRZ#TKXTDs=}cdTVMq5(>WH?uTbfv+`$t_u>^ndF-0!^=!7rX@JSV(BjRAK4_($mN-ys%Z9EZTwX;mwzsXPg(6A$^6BPV3W?=%hCyjEO|6?)Fc)#jj$ms+B z06|Wm0Z(&o;^%P*?7ZO6@0-7@q0L#83E_Sx+lV-^Lr`)M!!@J@GQvYkn&K4=ylpFy z$*~%;P|Y+p>VY6;LE?GMcbijbdmGP(ar#m+5P3AMh77IHvEqIHoNl-{X{<=wdoxk? z$e#>?FAT@`+HXJbX|)3`>a)l9U!xTZ%=Jsc-Q(&Mh!u!m%33$9)&AY(eB%!sd(gCZ z>Nj*t=t0m85Yd{_`QNQKK!&&Hy7D zS@OS)*?fj1XbgsYuvqGHh09a{0q3*@&v03b6C;kET&Z_Qjlq;Va$S^Gepe93*F_@S zyu4zfSilJ@gd_Ur&U}Qus@DSNHe9PZ2?I*d`wDLvUk3?ZhM&e-m0>XrJ)mpT8dd&K zcYIuc`zm$Zs>a_NDTO!824Cj^x%?=D9q^mM@swowzY>DHInN%fe{LgZk}GBD*~4^q}A%0>2fAtZ~(E)NJ^e2vnVdf?^~1jZrFD1#Uz+zgmn}{>8Z!Z0{QIb zP}jyA8_@rZ(pOSF2H|zz*g3=mDR@3h#;PRM@DCRsn?oZ~W6;$g<&Orjw+A2x;G!}g z&*=UnVfEwWdmOM{jq>j5`QXWpMtn_^u}|mxYJMXF%leZ2a8Pc}{KHWflJWWkSjRsr^m$Q?{tx@z3`|bhAHwf&W7w9#=AqeH&ZWNq&}|zL|;Rt_!)H>nl1}VUXgGY>$6;SQ0UpLdMy`H7uus1P3a!< z&OpHvXlI%uL(!icZT=nzR$(9)$8+kFGm<#=_jhrP`pOwPdmWr=6ntV8 zL+1B(9a&@NSmJCMZOG3Oh{$y%koyV(13wQCxKvlSL^UOfmLzZ~8_mYQjA4dj*FqhX zmkUQ!Tafd&e(IJI9tiQQF=)^?z*<3Ib?9Sdoy@k8J(Ar1DK0>f!x*D|yn_0ZB&2Ay ziShK1w=(H&x^HeKvg)sm57B5tdF~4qpz2Ow@NmX5)aO`0vIk_3`*DuyaN-wVx!)6% zq32y|D6>7$SGH3<+|xA&HY{r0$lM&505NUZzdD>kOfae9mv|5DB{To7^y8-An}%W) zL5KgG(U&nYh*c#TmL88BnL=}I^H=K2cTH@Kt>gS^GQfHa{7ox2aT;3r)7Aq36v%wn zPRpthKL1|O((1#}zs>xjjrpg=O7pTI)`ZJosJ0+YXrx-^`wO{^}%#jw}{W* zz9x*U(Lfdai{$oXK^jwqZB;6a@*1-y3z(7gZy5>R zPA&UZJCQ%;yI=g8+13G;6ZONoa>s2^<1CVUNJrg`S1r?O!3GzYsu!Xo-0qAyKq&LU--FwbooSSkd_m1<7v zYH`iZeLRKh`Ti`u!C-1UY&h)!MoO3(pe|snfyMBn6(6Gw<4IJbO8Y<*e{Gzvs(VN= zBb?abkjsmqjewUWV!6wWm?2p-r&%iN;bJmD?zKmw%*rzjZG~ zU$rEnomIVUqVatAk0X8dz06tH0tho zyw={d?T*7EZBQ(4Gi1h{g$NY*#$GIj+?Yc!Mv>7;R~pxL52JeTcMVe1j;B>gUOPPq zhU;9+@R-_DCd_E79`*i16quDB?`z`Nz6dm+KK^@oXumfZt0kt8N|H$KBx+nRvS-L8 zoGPtvzB}HN4pB`!&%0(Mi@TH1Q@=&>s?4f>wzk@cDHHaS6wBXEaAkhkm|Sp0G&Mx; z&*^??I^U~&G?-LI;Ie3W+u7g7XNDDR<`Hr0jw3PQ*K|tl6M=e^tt8F#qFE^eY0;G8 zGozK@#?*s)dYzrzj7H0g*kU}2uE0p^(^4B^hPXm-3{V5y7T>N^b0mjC`L*^}0)!FB z_JoE_OyGDyH?2!FcsdVW?Zup3Z3Ygr2D1GfO-f7UHjIB;LQmc@n{bSeMAs_b)28a+ z$7eCHD^E=1!=5|)2eSIwOY%1qfaAn9!@;>gPvbT_Bz(60zZC9pkRly?@^%BB5i0Bo z5%QPKNRB)_xR+TUj)8$HKu%TYn_GozCZGc{sVmS26Xqu#f8fvPu+R!mN$(^3T{rLz zvMDZ`{q>l7fesvtkl-kXJrK|jOBEytpkO{AEHu5=Yse-zs6-YWMMiM$p7!F2?c))Y)trXXQjEH1tB@e;?4Lp(>ar~K=U&Fx@YwxV=tc($ zpTISb)7zP2%H|2$f^`oJ$n~Eh@ROG&K%|)RGd;NTy2?R{0Mt;!cXwMN#gN#p!$bd~ z>j;N9eK#koiB*N8dsFphR++{ozk1#a#DvX*%;_Wul!xRKMrpB20G%2|+|!`vne_c{ zZoG-fmMYf?zCel{vn}i_@tfYFw+=vZMpQPWH?e zTwS!zNr{+4yF&}yF%)&G0#^+XBmHQK%^UW0EIpPqwmv}A+VENvmP7I4@wlIHY0i4n zncJ6-{~ho^0bnK)jXFj+X97sxeV&H{qpafM%4j1scWEVYk?6(ctTOTCOuWOa2*c=35P?VD z4$w|$B1VFbZ|#nQKDP43T@>j3BO9b-q?(q4dmr0R@WsIU0N))OLeQ76U+TR@Hb_3y zBS)Md*R);Uj6ZI{jPmFHO&6@4%#6X13X9{D%??rn1GWDu-_m)Ce1N&9umloGh1tA# z#07~ZRzY!Z1Wac22_#~85QW#~$?vT$C{Ec*^lm@x{Cyi_;}M>aBAx(GIaU#GL$G(; zm;q`ml8_6xbe>lbjJldw3m*1DtJXi^YQoYI*IJs-C^;FwYSJ=sB?4d^z*5Jv*Z_Ig zIOz0%JaK(bw7p+L@t%HQ&X`ey&v<1yUlSc~+o-Yy6V$Up{?$+(P+-xKIcX_pKrV-_!xjQ3tgO(J?UZO=~rR>8mC}Hc5i{si$NAFEg(*x*~o0RhIwy z#9#U=o0_xslX16yb<$a%Yh2LI$fz55?^$R7ruR;4DPov;hQ z@TcYF6_Tog>t(63rPqW3A{u2*PdAGnyTur<+Q?;pr!^Mlg#KNy8F+ao9g2K1ofKw?hQ1Hb+k~b{`)SSnM89Lv$fQ3dTJ|RXSEI9>;7V<` zD73CL4i@z4(Dc{Z+!>VFdn%RHP7<4g>Cg&8v2*`-j#ygpDVR+HxK3a8$|B92gmnLC zC(c6nP8fFDbTMhJ_2Ue=V<1TaAXIIlXkLu3j?ja9%vUj=irL%TonPdZD|0UvM2QmQ zYUQ0jY6A+uoBH&^cG&=2J2}c?ZiP9JaM%i-1)N>?)kO+|+8)W=CwdLA=;@l7~ z5ZL0*z~l}=XAc2>#f-s9C!eK;40gR=ld4y6fQ#Sz8dqH?d0`yhDhqYVvi{m|2ES*B zv{d>!Xc>E|#?f~e(Kzq&ddhX+rmLgdgN}6(G@3{TQGxtC^JCaDN)vQI5G1O-p$0%L zP}irO4N47oOe2ZvaqK9F0`|!&PDVj;%2LYk|;#AYFbCsU;0oSf%N9Oohj~YrV zO)M9Oe^Yzslw0;Jf9#I`H6$=ffF_-5fQ#q{$|V?5bkL)3R^m0xzgs=*3Lx|zVebk; z%4OhhINinJPP-o*G#6W3ciJn%OJnxFHoT4j_}X`9IHncaG5N&SFWFevS%{0Fjk* z0t|ebtD8o;HQdo8(0dHT2w(@cpz2~`Ph?Rc!I_UY5U;+x1Z_YPo8^IyN*_?jbVf{` zEv@Hq@SY1b6{X32Ibpn_T+M3@+u^|KgO)$LA=)n-@XR8QWSSWP19Ug`K4>aC>wl%p zBre2M+{uJq_h|<)zc)h)-}*78)x^@a?^k`Y6%ahq%u_&OA731XaUZP7DnU^8$WUic zw!4M|9sH3loM`NL&(9GIi|{kL9l@W$1(hgYsjnBh7u`47>7g!%w-5*J!a~D&fKxGU z9IfYW-U+K_Wi=0J2M_H}A;vR>J7Ys)%Usd8g?H7yN$T}#)_&tWq-`85x|Q^8Wm?1_x5ZW>Jp=AhmO%YgaR8b~`G z_34ezSP|MVKZRDg;vB_M4<2zno4c((@5?qKGaQt~nXP1;K3(Cu4#Z zyjp3TAM+u=ZK@lzU6l~s5CkoswvSVRLZ@-wD*%DP;#e&B%w;5=MP#tdfTb6LkfLq^ zqp++Zf8TMGxbu(tTb$q3NMa)Cjy=f6+AvTl7_~_IA{jqlH7+QkF+W%AZkt(%sq^xU zQ=-sw(51i|0IwGYh$ezPC z`?_I65O*hiY9sqKnv=aMksbH4_NwJ+jZb`;=TKtMMM}JEwetbHu31W+6HOB!R3X0sy}FRIk6oG|O-1C{3I6+%GdxYod=kxRwS9FOh>1?B z4O~{T)F+o2qxShvn3^j{aLSppj+}Mj=#_toNOk7Iw_tRe@PX+nAJM|Yf;yR`QHp7 za{RXOg`W`f2lRU!Fq9CqxKj@QBo*4~M&HFNRuOviylBZ=?hK84?0tv@>K!r<5x4L~ zyMrq%vi#HW4-4J*c%*w(#Zxy5Dy{IH-cyU?-9Z#%NE2K4|&3Kml^wWE&%TtYiD~! zG5pdadURS8bI)wc{<;PZ562)o*RmbTS=G-ZV*~8x+0@@F&M=A%)-vAhB9`bcOPMCGp&CrfWIB^I@v(_de|H78#{bmG!Ab+%L~GVV?dndiW2&T5MYq!c(#ApF4cU2%KpD z!gE5p#lf#b<3I^|#X2#UIp`S=i7{F_!%CzwYD_5H2+s%(9~axsL(=627n7Q>Y4DjB z*hw-j($|3Z($a5Uesk)%rU6Owg4z!aF=J2XpXGlu$dDO3tJ!M_>mY0AXq1xHVIJ~t zvb8LHR?#;3>2nz+l<$q2PX13)C^c zWVI)OyJtF~?*LQqT73ZYJw6NBO=~c|shG^7tt~HR%K7zbVxvhiu!d+cU7=Iu7%wSM z+^MZ|kqF|LN4n%TK;%9NLxGMY*D2$=WmWDcdNe_0=@3d7wE<$FfZu>E3eF;y8csSM3}3 zal~ej9Vm|9$ov#>83&x>*UU$?3(XdvAH#s^?G8SYJxWvK^o8?&(cHDF)kut%*OGDZ zE6AyNUE~biDk&aTiUeWQ@6q`|W2YwX%@g&3`7q(~-Dbq2rvntrVk$c|ia&nm3&%bh zgqi8(wfBYDKkb00O4C*yd z`$IY&2T*i5 zj%mbrG^(d!l{)N1^66BeWIccgi<=Z34!_^Si&}b@WvqwcVvC{+>fF()_YC1ulYCvF z%d1XpkH*+sp*iESUGW-Z0k#Rlhr2~oa5h01-tZjcPF9?uY(o&VT7yb;D4f1hNqnKH z$fG5$D`!fWWDP#LpBjP06@)njt06gYM!0Y#Om8p^@&=cdfC+oCQU*b{>09vPM)|d^ zS64xqbgdm~$c-AmyYs5(;#DWaLQ7dTto<*_Q%yq(wmWiC%bzYWX*wI@f!cyje&zS@G@90UA!+sB}X z{4=9Ak{@tNHYS)zT%apege>)?q^#N4{S{d=Ahw4-H&l}_h@viE7%*^yfjgIshy6m> z52-OZQ%^c;=K=Qu~ga$`qg0$x^m>Q^kaA9`5 z*8l*A>J=oJ$PicY>{|aBs!Lk(t?-LYtH0?ux_DE)t*UubJ@ldb1pgQ!;JbpxEByIzc*!lLjJ@h=o(lN%sxLn(^vwKLtJqlR!Y=4qJ# zVM!?qk;X;3hnhvr?`i~I|51~+St_#m5#8G41e=IPtsZW-h2~3jfH^3wzJ1>oF81k| z4k(?KPLeb_%KBbdAkH_!2c`JiY0)tAv zfi7nRjEsOK=F4fGtNRr51UwQV+P-QjbkbTYzwpxIC!2lVZj}38Am@orE?e|H`6_g$ zWttRS2R~H)I$`6$=zCkw@8#P%!CTmbU;iZ6NVi=~dJVw)~y|0o>y=kY{un z(Jgm7igPF^oJz6OJP_WKzi?&0rgYBv9xW;N!k5*jIBEAsAFk-Nb^`YBdLMyqEY}C@GP| zk8z>KJ*Md>13z2{ELEp-pY58ySQO)NSz$+qu2^?)Ky)ALHQUATrH&%C7)#nJY~TqP@|iR;sh9F zvSvc{w|!n`x+paV3;+T?wye(_43UY9?-(VPEGQ`7_nn?t(d;PeyDl{eLiOov^sEFW zS}*GPTi;%ZzjUI!giX&gbjjvt4gxTFky3cb`JcLw9??A^_%At5BmNuCcc@=zifJFD z$VT>3{$b&-`hT3v`CmIUCgHHwC^0jb0Pa@UX{@~virL7`fa*{A&Gy^zN68+#&5G4c zG_Olc<52(FtmklMRNuxtJw~=dWu>7H=}7zKo&a_=EgVTlsl>}eq{I; z-&6EKG65+3eg1Z_gfj$oD^qZD;W^p(bJ~ESkK}vso2N0s_CYLbL)Kse)J<$?bdWPGOCh9qC6i)rMBgr`lL}fb{ zm#X%wXIOEj$bmI5TsXygLD#5`$VsrDA#d!C?w{|fHg7n$iZ4@suR+it3TSRPJLnhD zM56Df(x`^Vw|hm{@TVxg1?^USztnqER8FihM|9Fcc+#WW9!yY0k;|&Rd_SA62B4$^ ztS2moOchhkRe*j15MMIv8ioCjr4}&#jc(|lW6oVyHapV7DU|8*CNRd;#f{^uA%7T zOCCNJ-%<4oU`hrIMjD}PWbf3J^CkEQsH;NywmUocdVexG(K;5v$~iCQkGltDZcYo} z{a|Rtx&VJCxa##qtMR@u42_np)szQpvw-v0*&R6i9_5GWXE4r%_Zt06i^iGUmX=Oh zG+3OQKLBcgkcY?lj+IK>@I`*UeAeoE#EBy$?^f=r7&jI;93uzUiSFYWd>_u1%)+O= z1l*PIiA0Kz_`*L`y!wgJeXx<65qK3iE|ny8P^|QxGY|!(s5<_+Xn*V<~l=qGnv<83yYTi*-#v5Cc(*=`b< zCXw~vcHjr=m$<`5TQ0K{Zucih%CcT+@y)@z7~F9&QwS_}5yGc7?)&-p+H$oZY`Y zv}*9`3wkxc`g&$cgnP+tTWxZmJI~{3f5s~WkEi9jlDR&ZH-Zi8!D3;JRoJ^}H;0TV zY+)`dkmye!`yZd zQrbwlf;?wP;(LxV zWl2*UBXGD>nRcI*sq*cFdufiJMPS0($M@U$6v!^WuU?IED26;~04n_cTgH(C;D*D# zR5;2}{@f;+C=~U7Pk)wNuL!OgSjFuBdZlMKFn_xu5(t8*gYryFv?WxAq4L%!XuX6| zXx~t4{60b;t0!8OqSLTGf;z5`Ta^j6CdWiX(hJAFa6J8)gX1Q-8H{&S7$ad z)H{tkz*(ZI2^XtpRtnF|m~0>WKqBZad zJrF805;wAf@PU!%7;KeP(9bg(e-ziz(VSbs?ZdCK-_>fqB#IKavA>yd6r|!VW6`CI z=vnojo`^wWHo$Tl&zl|d@U9Je+xx+r9m1>3#B5SA9BoIP9c0Ne{5&e{WL?5bLPU@dKCrl5&VJ2+_qnmZ4yQ zPHldVKnox-9)YDDjX^`ydxt~kN^TRW-TxvIh+C!HxU-a~mh)qZ9Q$TomN3xZS|dMYO^F+nEB zSCdX?(@-h5EAv|IoB`MB5Sdk&`<<5^71Dub*~}j%_p7jQfnqZ);u}KWq-z}!TOw#c zp_rOkJe3nF$V*QiBHgw)$5I({BTlj!JNvw+alB?LC{@*{-48=6_^m}w_b~n5^*+w= z64`AzEW^juO}Fq7jty{Xy={GE{`BnePHr`9-%oVuYcmE(=UXH#VOcqX{^C`W)&`Ad z;$CiZ+~=e`g{I#s^)ZeadFlu|nX07Alxb`g4f`Wsga{<3$y)6|LJ!3Epi?|(4lkFM z2N)mywyqFX+a6@CX@O6-G8YNE!4qeOXRA2-;De? z8g8d5O`{RYsKM8jE~u>9%zEeeX@YUOZT(Jtnb!14W}H@xuh~-IAUioagX>P_BHk%Z z!*MKe4MZjKGI}%|a-_zScqp8H|XC?S{q6cG@LU`AcG4_AiArVFBoR{}0GUk|^*g~ATvwCf1vG2}bb38swX z_~gMVST|PAYnEV9l1H;aoUx6|{w6I}uF9B!pbRPZow=DJ{aCjfIJ0ZB{wo(=ad`-n zxSniNxSL#(-+2c_W!yuxYY@n>)&Y1pD2aBSpPYjd_CsJ$pWxp%;o%0ZQ!`qcx%&rS{+rDoJ$A=)slrh z^8)jt@ur zZA(FLw2D+9k$~-FT&!s-7N$4bJRCYAjSu}$7#;)Zq4VH*a06ntl2x@HPFE%WZ5y?G z&xW;i4yWtFvzg$h4#a?k0Qv^y@|04syC-q^JZFTve+D4)uyPq-UZ{Iw2sN43;8EDO zmgkpYBvV4NGQuVn@7EsZEJ+I$5x&6fX(e8ugD-sI1m=u~6bVb|tG3@2h|^sYl=Ba* zYkGlGb?c1%KP|lfDy5hs?$HO?eu7D6LY)O{KXZED{{>RK3JLx{p*4qn$>1p<)8HZ6 zyx30wCvKIq)<8saJw|Zg>iJ(A`0F5trtucfTFx33zN&N5V;UUPbB^~)8G=Ft(A`!3 zvnl(xkL9*&N&YM*M+BvYQPE$LABM={k!V26$D~@42NK}!AO?7)R;rZfkT1_{Msh`~ z+j9Y@=wKs>qD44P0fS8y#9Q2RuD&D$+|xZdySPg-X~$h`Bo=_+m!7EQZKQOHaaG{U zQ58hu2YST)&91QbWB5Xo4ZzuGxo*QzKuXH5K=*}mCp-*x3wKapL#k#jn0wT z^J-{O2=jL%lg3;AzrFfI^3;z~8Mz&=DQ9-}(y&t{esMxy(V$~ia zo+}}NrrySSbSJ{_hgnSsa9pGo-(aY4?Xw$oTB*r<&U&7)(bMtRN+Ep99ImQ<)m8>W zK4uc}-$rDc%Eb9vLteyU5s+T>O{Q@kCy|zwNEMiHFIFIjchM9W*v#Dat>neOM+nwE z(gRf(Avo9Xf3sCLSVBrC!cueXe(6=GSKu^nvHSY1CA01 z?tH^37br`d`o!Sf5@uI2Fvg7J$C>ulk;nRF%H8-(a(6V__+{$MKY|D#VZA50n2^Inw zME4vn=8imFAoSmCf^d2NVTt~K?HT1`>XukxO(MxN z_6X2^e_|30I~T___ViUx&!qI~q5*ZwDjB~1<#w1|T^DR@;&Dw|$^PHJhtw~pz%Ub< zKmhU*XiTtP;U=a`{#1(sW~eR%*(l=9?jRb9XcH8bDkXVI?;`E_?m_PdHF_y5tE2B) z4C=YWMK2TcR~_zq;Q)9dHEJ8~-FUEv*-wb~X&}3nG|-KInUc1H({@{zm|+`UaT?(o z6!DKSDU5Sv-hXp=N1Cl&L7HLYv-JO@qbdSN4cS|;B_b$Lk<$eJ#$&*r?7|%Kw}YTU z(*>=DVXSr~omFrNP~wOz{A9#Hcm+h(1zF^_ueiv~lx+eTF42s0_&;hcDooms5+`$u zE7L1n9I%uSiI*d%=4S=T!-&l(D(GqAXY%ffx#`x2y$2f~TqnGa?SKAeZL0Ol_G%k@ zIg~~~qL;#xK^*dAgO3Eqf4e7V<(GlT>Ls{toZ4yubaa|BsCe)RZr%inlzUbxTgYWF z;?$^MU}g|69s0xfjL31-0P||#uDX(;&zykUpAZl4iGAb{(nteXxU)J%XsUoKH zZ%yILPDO3ntkRWghsusTYe!vY*5UAzwRo6D;e%Uew)7$wW8+${j3c>yG*Vpb4}e>~ z=(f=0Dj(In>rMh?nP6+L$8komSuJV4Z+{5$YqLcx!$%?$oux5(aGe42G??bTXiz zD2?QN#W+ySP8U_vxRi!G#S4QaPFH=F49gGX7DR-UY11LlbVrCbAVYym#--m_!RZEj z<(LAZG6L?1GR4-`e_EeC2*bTSQ*!BhK1#6qgx@|d*>Cdq`0sQEg0!oF5zm_$u#S^& zJXY|+p4i4F8Hk&>6MzJz%-#C=p1iF#$^G(3v&MUE2G`gsRK`z62Kclo>_yXzB$XXN z5sn2t(a(xnw7f$AgYV{$0J|Svxk7ly+>2%oc270R-YeUZDz?}w+Ic*ZY>-@_MZ=cn zqFQQF$jjz3nZ~W?*5wM*FN3UC5!&MyGpyj&+`Rt4oPsqWEmY_1K&fAT%NoXM3)XAE z(?B-uUI^LH{kqBgs>NC4v|hTjfE=uuEFNi^8}Kg$u|FRn77=A# zUb(9^W13Nhs1B4UnG91XG`8V6(i7Ssd?KiZgTOFR7ApCb`RTjcu%h1kuz52{SZq5; z+8f3CN-x59(+rZaVLjFhB+VpPP8Ic!u9RCMME;xqcACqYv4mkK08+~gKxgeb64-;n z^oBjs$8aLIUk6^s{LE>Izl51_!Q2nFZ5C|O<2cCYRH%I7*!P^8fScVg~ZwAIEp19AIr$pb60Ru*MgxcN?Arg z?0?b$8gjBF?OezJs??r@u6*jVT}m`#He&O6EHmC~?p%WArnIJ=xnrxtM{Hb;82fpb zzWTB&YVv2lVeF?IFn2i6f%E2xuKh#M^O^=u%;dyxb9`$A89x-t_#0AgacW6rwsa$w zBY&kzfuOa;G!nJ8i$7&=v5S6Nim|IjL}={u$3@>oRHsS09nFeZ!}2M>=d>?`47yj1 z#by>te0F!z4RluYKd*2{LY^BDU9DA`u`M|{ZmP!n1WiabXK}ROeKuESt?mG}STc{P5BH-c1(*?6PMbwP(A)h=;4jsfu(#oMO#{xh zL-mN6cGaFck>3&yk@XTMf@1Rv(nU9p*O9OzzU%RrlJZF8Ec8lSrYM_ge8>bAaB0Ni zmbNjwXrxilD+Mn?dDVKAU`<)t&ChJ$vX{}pcd+2HJ^w&ItL3?|n;{r35}mPgG%vh~&c&9D4eOy9m3-g{O&Zy~_Q+&Lo)wzJ{gyf4By$Z0QAZ%pV5bDO}f38X5& z*f#l3z{XSv0~e8ER9D~L*tVFd7B_KdPz|fI4jwEtf_JOjtIPhHUb!*oUbrSY1I}g6 zo>46rn~jqIdAvOz^X!J=Kt$bOUqycl;(z2yxJgA*+RX_)*yR$iZzo6#lL!cU0V0%U z`P{m44J{1Is(Vpi`&otDZM7zcp{6bguVZ!uz*PHm>|M7a-4JYGgJCu23#_3 zA7Sm_UFYY&2$0P58}jBWXR^pIbkfd8lmSqM;&hlND@(<~yn{)hB%DIqV29SoVA$^VlPC%G;G!wNd4~zK zkylA*EBQ2rVWK-xM_CHKsa1DSq4<>BpvsnDV?1fE zr!6P!B+^Q+J>~1xLl`INA0Mkw98^f^?%O5t`wxx+8F0A5yg3wfuExK&Bj*ldq;WLX z8%sM!(l=>Ohvmh2P2kl`b#(WR+#5zNY-RuDMy-~gpj@A@M`0Wf_o9S!fuZamnSm0JxzpU{_O z3xpC??2+6cqFA@@;_&^s)cWhZT6j|-!Ui;?ioL-TlM%$fXsj=&edKA9Gzy8J58T}xWcs4Bw!N#muT9?08xP|flv*!Ch_c&Fg~6lG@(b>G=h@0ShGZF?5CbjsJ&ck7 zWieIl2U&TR9!c+K=CWq6d~gCVUdi2l*#P)%g6%d*j|^f zhzFSxg}A*qA6W<8P4lcT(!Gf#kBjuNSY>@{dK3q}Jc#h#5vLpDCgv8Xo-KloTRFxXs(oFl|=?D(|L6@n4%sTa(V4cVp{?K6~$kGJPNk;uqAeZP9TudT51W{!irqYO>|I}zGCT3;My_KQ3mhF}3%8uz;zDwbD z@9rcp(VrC2^tjS|DbKK;{y`!@;#{M(j27rss*gwbT)E(sJUv%rzt*$}7n)KL9{U@5 zC^hB^W$n4L>d0j7u1|4euJoP&M6jNPx~zDqi5;v%9XniR5r;TEfZHZ9d6UNG?EHa;RiLFMZ_(wCAl13cde3JkW-Uwc^n9tSj=y7!lx$A%#I5iID z9+W!v5zPuhh2FMRss1XZ5U}@^SPx|t1=bq~c-eBYi$;DT!C#A^T#EKF**i#Rp)N<) zk~X>Ph*nT%d@og`3#6i*6Uk%$R2qx?1*9x(tYbf%(hVy?w~FDl+GD4{lieJL9eCd4tPh|DyzUbLe@Bk4_N{p6>t%aF@s0PC>ZIU0X}0 zYq#9sFBr)Ib9%O3W!vQCXopxsc2V`^5le38+ipd*4Y%ZOA07(QviJHrg_+DtUBXHl zs=giUm(XE&POtPiYfL4lujJwB&n+XLrZdVu^QJ($nwX&H$s(llGB&@aPqX?S43vhK zilBphxKZl+0qN)&J+~;(CE+6{YQo5i-(I^QD9xHcRe)GjXlu7q{^KgBe0w-o7Uz4# z;|J{0QPBa^QfrosR4&F$1Dm&yBV~}alR@zK(WWApkyXOR%q_>wvvAPRcc_7c`*Ht& z904MDS>wEq@$N?br+LnZh8F#e567F+8UXvXGXcSqQM5{*ljQgs%adDTxtg zJhYDxyqtHr_NF6;jy_TPRuXE>sIhRLojW_h!hmXwDEHdjN(3t{?N84?_rNb{OEK*w z%)SYX{3I>G&Tj|YwyfQq+7F|}m!|1ee+twP;u2bEAasE2otNT!@rxU$pr4;_`*C{o zX0jCZ=t5^wrZ18#lCi9mB$8pDJ zM2sA03ss3y^ze^j4)ut@@C^5%{T`&3&kSdQ$I|I_2O4C^3}3<5sWhtv|O*-r0nS@RIg zZ+<9WbCj1*qXA)uq13#0P zb<)$SfxW5mhx732T%jKL2W1DcHgTVIQUmG-hrf~-9qUH(-BA>CU&Ab$eDhA{{?VB? zfv9iR4;T2kFYo*o-w3?naa*ha72mc0>C9|>)NmU&fzK3j`#SOgXyw)R2+G0S$+q)u zp6rCPrU8z+pnv3y`F<{zpZUQ;Z+-0Xu~e%c%$&XWEym5?xx&F*E!g-!uaJE@e-ZJ` zC;(gn&&;W}1x&1QD|ouUQs;xL!q*hwcAB^c;NJx-!kvRD#fZ%q+Hk|buT zQcNn8$8johnNT=;o|v11@w~-y_|m;XLGTJ~Sx0gRGk+^l&l%RuqP;M^wT$A&ax8=N z6lxZCodby&8(_PAMTlq3($$Ig*%bIa z8!l+d#h%4C;Q3(J*OUCvoqLqU*yIstAm)NFoUq@k<5sM#75#Kbi-Z@-m*I-lO$by3>l?Cpe6ZffFzk}dPw1a_k51m$Vd+7@97 zST&(llS5X;DYW9UqN$ZLf3ai3WMqV000+0{ZM5` z%r=LJee7`Zetk?E4z`1uqqRs>AY*}!HCfsu*u*%ti5Z@g=n+mmLP^3{VmM)q9}gAu$EBmgjy?N7Zr(Wj0zL zKyU1iNDfAf)OA`V8W!b!)5M%xwf<@r2cVf0SPS zMbZczr?+vwDpgH!n2`W?uS6f5(R$l+0Topa*_7Jdu!SHhgLu(|J{xW$_1469?NdWk z4aR(Z^jJNvzCQ(iYrY8lge98W3YNFyptu@al9JMH1^AkMKrCcaRW6ArvC8ryQ;(n6 z`cY5_!c;ZbMh>p+s$Wkp5LQqTf5aOs*vD^D-OL?VX%YahG0K6J7WN*C5*l?BeL?Vz zTpcc){l=)Gw>#FU&0wv1>VNMNOjPF#nPB*(+sz#H{>9n2k?5y_oS2>FlN?~&J*A6x z#!-}+c=!3Zkbmg%;_j)E9E|_msO=s(V~QUO&q?Ej#TODM`F7hq6LD(j0v`k7XSJ3o zRvH{jLZ!Kgc1YY|0s{GinY&y|%TKjl%rJW7N!`wFTpu7}f#<6d zMI!4w$w1Ead5~+i^CRbE)w}lSAIIF>)5k6g(nJRB(L_H>SzAFYCeat2BcBaLqC!g z1-Q(vVWWQk6wGn)smJN@t##RFEtDIJWJ8Ef(LdLT!Bp0Hb*7gMkx&M1;ZW@@(vYK8 zp$KFjpSgjoEbPp_2unjMGV3k%jWnc&3!T;mq;JTmZ-o8gCz)wyy3n1V$vf?`ob z%bDrml!WTaI%o3`vgz2+*|@M?l_%vUTT8R;xtyXdK%L?xwoNhTuI*aznv zJs4G>%~im$@=nu<0n1De=M4U;+79&>+D~a3(}(3JIr)0P0MB_M<3JdfJbwoZ_MjkZ z7Y5DDd;?}6JKnsMh0ZQFl#6)r_zhgbaJ6WQXy)yB2o5*yN;P(AhK{_kCb_Rt#~WV>>NCv}#B;^)>&)HCUBf&it&As*d-WKA9(S9mn@FLQ3R^&(%Okk|Tf?tL%(H!9p!!ok9O-C5x#~rum|J5wJ%zIp?gdm$ zXPnv39F9h3@jm(dMbkjE7(HT8VVh>|*nIB?=i#;s~M6~1kui>@`rO^PH*gi@-l zyEw|HvK{`Z#>1`cC#a0+V__J9+kMJ5$K^)@t+Z*D`luOZk0)2wX+8&~3qq60n5_Z^ zHQ*}ci}HTrgHB`~ZKL}tUJGE)Uc*DB4fBfne=>{eS#qrR3?LW95h;MSk_Fcc@A!80 z5ru;sV257INB5Gq^DorDKb((2;CR^Asq3jn7(jgbTra-n2u;21DT&!QJ}cak{();P z3SH=R0)XMtnwdT(FB4hCzc!F0s=Nhfv9NJ5GrG(T2N{9;2U1N1@7H~8=5s5r4#-zV z+5$8O8^&`aJsSj?scWHm_jl(#z~!^FpQJ+Ucimpr@PZjI*O^U&up`0D>iTMPv^;k8=?tOf zGzrf=@6sZis>^Bjl{r3#hu1dyrk=`~=tWy0TF%LN3Y;X@eUTR4(&3GRH8Y^c!^5N4 z59LB_@yeB>BQL8^Z@#n?AxkhW#{P?0a_8KBKv}y-wVKrMK*owldyw;g|Aen-;8?F> zd!`e}tC-RWeMN6lhAAkD34#i87Bkp!UNTj9#_T}Xr4TDS$;&V>=xl^i=rd&N#}1N{ zo_*fEdT;18C65rn#OvfSc9m$a3`WO2n@mntZ8|>wd>JDdh<8=Hu99DboGz_8frUXf z<>JwN?@msK2N76(8uSm}U<&W)!;oj=7y0zsTWeIY6ohScTcW4&nz3y;^wJ+JHvrBS|So&>NM z>$bwO-p@lMc*@0fPL6P0l8vviidni7ADnP^34Erlt?xg(`B-EUccLzErr*xsF;I^1 zhTdWzNkPI~H75gPRq)X4tE@HyJ{`S6ZDlrirzs25&LdPJ;;kO2=30>(B==+&zTIr# z4xU9>koLGqbejNa#nDp@XfAMziP0+LQ1(u(_j4_Xp%2os#yRn}^351+@2yiw`^q*!WSp9mPm(BDO@jmpu_VgUypEO%1qESVcj zL29B`zGD3fi;0lrXRy`_HgwxUd!q;d^AKCDcZ{8Mmkw7#a0VOg0oc2NUg0cZkwu&$ z!!J+d1#s1iObUu|(-2y1G zUw`%PWbikx^nRcVtil*w$DySEG|?gq2^XDQWTKDHVFE@lC9t@qxjB_9j}4Cyi|3U( zIgh_*3zA_vqbA#$>FU~`ht3(IK1;0dTK!&wRI05SvdT|tOve{q#&%mxtF3}%<+u>wd_2Y7T}RY-3_?JQFr1m3MR^Ui&Da3;{zvHV}>oRbsR_JAk;5@H=^3)GBb^{ zj+n!i8-76UZ3n^4_7u+J3r+LnZfB{}X9P5j{pwSH?E@3`vO0?QGO26yPCre)_M9Xs zI{w7yvn91fj0B4G8C10{$g%#PAyqMjwE7IH)NsEoZt-Nqch;*;=Fbf{gvK8vRCb zJrY?PG7~EP0+ybHNx+m(Ni>ZjbIlDceb`OlUz&yooVs+M8wwB6)%cM5O(fWI1GmMgSs_R6)_4?d1!+f0>rWiJCw?4Xd0pTO%=8cVDrxs4w~N9W#vRq$gUvUudz z|HUUrrPxJQ5x2uv4wA-Y#*sZz?0eK)kLz9Ubi(FGq-`TCuxzcDahrIY@l&*uAr)oi}t{J^pA9=4c-8fU$+) zOC?L&*q>Bk8ecRf5uk&%9+O8SvIZV!THy38d;G5(SzT$=C)cQG($)c4dpT5!*WC}rzGqmf z{7fN^>IAC|n0S)o2Z+#ix?pT>+B8^jJDfbtLhaKxUDy04s=^HRPqT8Mn3jHauC`8g&zd_>%>t^`sJKJ;| zxJ9~bTJ~oWPx<|Q`z9aT26CsmZ3TMu3adM?6+>7>fJC*sY)a+M2LmHx`rsG_37{lh zQcmR%14H6Kmlo6*$ln&zLs$EtjTrUd z1qT{34*68F%mgMtM$a$ZW%g7DClcc?e9#YhK%QGueb!hwunMx1QfTwD2F73wa>;-^ z7ew}J&N{hlqpz+IPjw`+L%Tfvx!+Nl!qa?CGcnL5tgnH~Xr0*goeCP*>Ml%i)gNV> zF6)g?IHoDkKG`{c(t{YAhiL=A9xZ&TN9rK!uo{2t0+;b63r9htsT*^)93Lb{=eF0w zl_`9P{;?}`~G`a7dvegC3KpGjaOc8~V^Gim17(#8XF2dZNt;>foS z6|x!z;YzEvff=?84S5CNQ`@y&#fBtTE??BG`APW&AxI>5w}E#V8QLthUsW0grl*bZ zt8qx#PPhh6^Ak_*HTB5&t*~DBNfL_$%EW)@FY#~y-lNeOF$d+kzY9*t!$XOetj)0( zu8N^JZAu? z)bgcCcS8-R=MYST2iW1q<8xbN^hBE3SAWJu0$eM+2Db~zH}Or$N3h^7F{uBjd-QJW zX+~;IdYASy2cu7D3>0T7E-gT!g=EYcayvhia)m=rAHxco7FBcqtg3s3;b&XYIpd51 zk?||6YjBE81}FQ^Di04zkW)O)9_&pOr3X8fZlnpXVuObj6(rbv7IVx{qurw(#W`Cs zi{;&}hxZr2Yl? z1?Rt@zRfoZjS`@a1q4;cKUV`0w3sSRQ;e`E?!(Au2&YqRC& zg!mWEVd@1iqtBrcBU*WUYA3F;I#o`7{CeFz)1a&+W*D;~imcJW*kJGQyO)CHTFH0Eh2;`dQY5ko7FphwZ%B}o8%#e_0n#QnI-6Cto zyi^F>`ozhQzmBuj%fL+5rV&^Ey_o=CV3 zor`BG++)BN*p(i_#{5Y6soDZ~Qry*|;oT&C5&9CnkpK$SWeUd9LD#`!TFJ zk3=Ur{8-T;Ac1D+lfyDb)+lq44gNB zaBjO?>7O%c=14Pzw6)Q#C2mWVplHZGH&hAnfk(U_K0fiIVGrJMXFYa#Mu;Zm2Adax zjxRs{?a*IFbK@gD?!i?W;(fy>s44u4IbXmB8)wFN^%tm8WmMT3nf$D~E6Lu(MeR2W zkfbnD27NQAP1;)cCI+i)$Rc~_<@!@>v6K%XjUZ9u-`*u*sFBJ}yzd(4_2m=*U zC-(_ef1T7%ef6l8V6S89yHZm;cfW9WS?wZ1H1OmceN?fZcUprvN^D=EIb;_m>C_pV zvZQA+Kh84*^P4-9+>r)`3a~oc?vuPX(Yt59&B-lV?`Wdy45A^){vJE;hxt_N<+D|t zp2#yX)iZG9JM+?nK0Q~YJkA;?J+oG&|1I^LWHqorm69g5Q6b|%ZV^k|-(CucOPO_? ziZqP6p6Jx-jg-a_=U32uCy!*<76|eJ1>3Cz&4ft3^mxjYH6wP&_6C3wh}MAy@&b+p zXD6F_-#0?E*0??`Osfn2+4MaQ8`jIkIt&RF%eQe~Z7QuRXZ3Oi1PYXz z^@E_NQP;jisSA^!g8&p~xTv3HxDQV(=}Sc7z}h#mRa^6@f{`J@n`=)svP|LTF>ref z!uVzg8R967I<3n7E)a9r5$JMN^n-)<-Dz8+g1t42bc}*QHTNND*z}`~dUlT7o!AL$ zuzLH(wKfVRWp`R|44LmRZZWJFnq?|6g#=n9)!P`>KB-yyGE4 zkQQTL^iUjJ-hl0#qN$LNo4(^LicrNw40f`bD*XOunJde4dPnr2@NvEmU!}5t8 z{uM}JtC^D$wcbuAz3S}$9G_8+TUxpyEj~duaO^$9$gb?({L!#d8A*6rj6I)?ov7cn zos6b@97PnZ^1cWoZp39L)_1Ii%SWCm!-bET<(k_D!2{JWkkPL_&U)v>BS_IH45{X6 zH=fcr$uYM?c*Mf>j1&J$<~|A_jIzPK09}e>MqxlzKk+TsZ-XGKnOsS=33-=bf^m=% zXa_5ta?}BVJchByyg+_JJ4HRV#^j(V&6N4#ZhK4O#P(haHyVxT_WjycdX*~!rfcPV zH(M;dd%3Km>Gdo70v6_z8CE;?F$^D-spaPg2A#sU@Qk_J#eoz%Jb|%t^w?4uX(9X+#xf{jTlf@-x^0wZ{Wd_uaPPTwD{fQ_>2#t}w@Z-e5{OKt>*_2LaD#^wY1 z$l0@PAD-_!>kaeI1f?Q!5Vva+Z)S+l(BsnzLA-&8WowG532)g&C9oa%6o4}CHMS`# z(HPozncVD}tzf{vw!Qcrdy$uBe>?oj@cdI*qCuq!P`wV{OKPB|X))5Iym;|C7H+B* zp_cW@l`ZbqOy(BKz=xB_RZO&W^dOLDw`#qsyl0J8f-TleuXp)m#Nv;vTq~N7PUqeL zC%KnFlZ@_B zUJl%_%jUs6j12{gLQU%+VQn|!Q+&bJVGMM1kdKW_?#OI(Zkuw~P6n_LC;{t)O8JbA z;@TTWTPbaJVp6nc2A?^!M5RS-=`$kg>kQr)fiUG1jbJEVFYm>jFM{#q5v9cQ##L`z z@?;6s+`C{>Q9Zp)m7NK7dIAN_kgxIB{bo(x?-9vDAih8heKGjU_1?Pnh)^rP@vNON zmFks`NW-<{g@;|;7HND8Ssx;(?`r0W3;=y-wjm=;m%(GyG0WnMt?AMCDQ`9hT!YZOe<)q5O0Q` z3+tUY2_y_k<``H|pqF4vWky;i#B&_=D|)xmAthGZi%;3sRD&TS8e;gwU{^dQI*?~xsX-xf140ab=4f&Ba$`oXHx4Y8~6x2iAp-;rw zkV~&4YK4?ub^8p+FiZA$6q%m-6^!&T+36 zHZ&FXO3Q;H5gm8@(_&WiSFELoHKj{w>Cc|-ui#&06OUjj|u^S zv+!0{M&!^>d@`BiHQ48mo=7qTiiiEmJ5IuPhd1ZMC}m-+$FyF#_;-Uqm~S(_qwLX+AwCDJ(&2B&Ad(eEh(w^hfWjUa_Q!I~*;DOv9!J;99DH z20o;=nTOcthrOZ>LHWot5`edIOI7C#$q!ED)be7>FYQCq1o%o06V!9_5w?Wb8pzJ| z0n|u}2p+%6QO#_>(FdsA+xbtQJS7a3JCAJ%p0B+8(7n1{T@Q2LmdqD|IpUm70V>lV zsX3=k;5k6GG;%!XD9HCk-9nC0l2fQF5LNq?mjC=5@9LX{X?%%s57DgIju&k)CW%Yq z$x-5=7CDsRCAmn}5gE{F0T3({!@GnYRrYnP;~7Jgv?Dn>?HPI6B%K+IiIX$Cr&Vj% z2~uNJe_&qg%POe@OWLS0E2WzL8nxO7&Qzz8Pgrll!vprHbIzprbh_uK}UwtGFV8_Ch~_-ICwr5)SSw%cpB+6e$j%q0lVELHq>ssCRJS+nfCOfcFIG8Ot;dpVrUoAUm z4R)U(EL&a2FgDt%dML(Q=1n%Cswq;n{Y!=xEZMRIR>h>Cb2lh%h36A%zrx!ivSCq6 zkI_P7#h-sVf_q_4t8(QpM~}=xrO&0tPW6Y;5jmLcKXEx$-F}o3}1H#g6agYIQ8Ef9U?%q<(V{w0|kG))J3IYmFiM z2gwN)QaP3RbzEk>8J7Har*x0ga*#`#67Iyc>Z`>KYboveCQF>ZSeyA9OU_}9wW~QS zvA-w}8=-jjEe#~j6sA!5tLmh#NJ~QSEpc_l&bmN=<-RFnR(SGyw4x?ivJpG@Vmecg-VzD{fJrjDlD_f^_ z^rZa7r{KOlg9hq!Tif-FHgF@&JLp~0@hmt9@9uFPg(|La>^<$MrL3Oh~;-b7%S(=t<^pqbadcp{fOQ>|#q3~AcY8|w;au1 z`9GjPyT%M1@*DymqVPmYw&#V69+zjnTAnN;k+N5J2M;KQNaW9$QhFAl!4P~YLjnjp z<|uSBrFnwdpw~laYuamkXiAwcxghX^&`@7#L-49KvQsXII6{kG1@Hf@HM!5j5>Jr1 z%QwtVhA@|*{eP@T$vHF6Q7C7QLw>)N@<-kNhuk8?JJ%)ras#`EFf{6i1aws3Tf0_} zGE-QhhSQe9&Z}5Og+V-I5ydz!W>yLN-m0nvl~#t>@2c+CxE7l5MM1yh1e>G zsKzVJAmZ&%z8`PxkMHQF+q+8&r+E{g?A6G`-Y_9P^jNYcJtqe82Ks25^l$Qr#-!EH zD@2(ZKo7(ira(vdNP*xrDy#BI_qcwy5tHWw@4fnSfImp`lvhVMuhxRX7WYCUI<)N} zn!;vS&JvX3Q;9pAy)RA0T1D!r&VBCVrCSQLo}7)gn?@hW(+bG<&vPoT-Re6AmviQi z6l78!a9-#Ep%6y$eJ&nKLB4sZP@Wa^f<1&HtL{S_pM1RzTF=hZ%?nEba~)rYVc zx%Ew7c63C3I({lRbSVa%dp-{{i0?<~V~yTtx3?kiuXOdbus58j+$x|LfRr3Je*J?h zq%i_4{z`g_@lO0cPs8R7<8x-^#JVlSV*BZJL(`ofSq>ZP|JZ2U7hla!0+A40lgVjO zW3qHCH5gn|eh%wNIq0?y6Eu`Gi*9@|jga#hxflT6vcZW+=u3(>(Sm0U)UlUPbnl=C zudbY}EdELXErH>0;ES21z`i^iUnVm06*YdQN4a#BrqJzk*hsVy7w*oyfOn4Dfyac@ z1|%01aSXocq+#9VQaa<0Nt0)pHC>q)x2|SR?MpkXl(hCI zdlX}{?OK8^J@{S+S#{&iT}-ZRz_If8>FN>b>w~qNyw}toJxX!gyu%X$>+#dS=Ixk| z@dog)!f>&lEV<2H^-C5US`Z#v6aYc}Xhn*>0T)9B?n1FcvWO!1!}GOVbC@&|zoEqc59lX8qcXA~ga{&-h z*(Fnv1ihV|?kS?N#b|rS%r|Gv(*S*K-0vP|#>D0!a37*l(JV;cez+BQf#@kK0fj&> z?&H%36oDv2lH3=`&*gL5CjT*&;hAq(j$y))RP(y?c8-W_lk>QGyjfqUn3(tOAOd1{ zL;#MyU15>wdO6@8Eqyo@)xm@dx(<8qicp)UxEd9m0kDn1nAcqc*8Q7CkM-geP{Dv7 z-u`p!nn{AINF>?a4i~D6{jI&O-|9jh8Un0*mQFgmVX7Cto8Lm5unG=D?78sa>bWwR zEyqwxf4Avae87>ao!W?@Als=WQkM3e8rwFfa#B;BIl;=emTj4)%jj3&4nbeFn0Or2 zbX4Lbd4-RSbTHNs5Jr_aV~@y-sG3yZsc!g>vHH8e?wzFmYJfrLg06rh5U$2o*LG8$1({jo!n^Hl{2iVevsa8^|dW9D>i6=(U;t{no`L8_Xu2XyDvyX_m(@TjO>nH zz0uUhe;ROEuT!V&xF31@&yC+)p3TzPE3IEuhk>FVxl!WWkXeju@HIDa*$;R05X9Fw zRk1q0Wh*r0#4ITPfkZQp(7t-gw+Sap7kMr31DVt%ZEH~>kyCxGDqOl_HmbKVG@D*8 zNUg0N$ruw$n(hTKBafd!IGeqBuTp9mvc0Zb z@n9BtIjgtT+_i`$Y69p$3_O6F>AFL3)NH9ymtErZ=MWiwBbl)`;m`)h(t1T%-NsGe zbcy;a6|##4OfqT$RS=l3M+L}Oi|p?lu2=hD=QwL*tPX{|XhC0xo2$Niy)Cj+-b(Va z3GP?iZ?BZU*#isjm-=AA_lvsL7&sRvQ*ef9x%dUq53uYJ*L3_!E{?GU_4ecB%zRnH zb`3aOQcApH;~i&-hIDw-lKs8ImZ`>x?;2St!u)HomLs@8^Oe=@XsK#{7Cw{B*wdi> zKH1FgN-AwL7Sec}lp<=bq*H!o3tpHI**qL{{xCwizg?oaO!|XKpya}VxmBkoSND-^OZUf;6LVWDXzBL0{a&{6l3qDz_Gt3 z&DKd=@GDLI#0vkkwx-$=UO4YlyvD~+bm1<(h3R6fa8NC?hgvrB4#gVU&$X=6bTek& z&)ws~udeg*c7~B#6b5c<^$~hEber?0d37yTk6OOPQ>1P#A|Dex zrB!Z?hcO$RdHm`$ex;Fei;JfUM|KyOn*= zt_v8lAFQ*q4*|&V9%c|1=Iyqr8;x95;oQ8B&}X-} zTFYbPni;~r6=|19XU_dVKzk@u9Y~*;$)=T*Ut+}H`d3J%pC#mEv;-J7luyP-#yuDF zrp?UZcjydSo68I-9`T;%7*-^goTiz?3mAO^_hh#MM&^abV<`5lRLjL_{}EG!>Fu;~9#iMjD-vN(s?YC#5&=<*xlKQyl}F@Rl4qR~H`c$p{P{6Wn) zfET!>9V2J<`3A3~2?kWQ*`nOCR@gGF*V9sun#&==$63IiKM#5LLJuC{)_#T=2~}}6 zli`TcY}7Q`LjtJcRsUEV9$}~IQ=IHnR^T+nBzOUJ8)+L~FJpx< zR@D+N%yqQ2e7_&HQJ*W3S5~`yb?l}dsX5Hf`#U4vjjSwWgv(gR>~MIN6AwutSHeVr z&+u{6V~)r}1*=9&qpE+$Z{mpQg+V7mGk(_6=dkbRGR4C*^g==JZ2KYZ74N7t@-SKC zSFxaka6%PhjA``P=W3Y;|CZblUJgQKPI~fVV?s(@kc|jPApyZ_^Xs&kJm@U~qbww4f1KxA%qEKa4jA z!zcCH)&Ajvl*JkaRSIMzA3%q`*5^E>L2@}~d57>gN818PC|Ei|Q=M^&((HKuG)*?yW+1TmM10aE+wL~i7o9fT0{z+SZP#p+ zl@0k#vZ_tP@8$rk#=dchi-GxsbAOsusZ`eFcYW@a+xaC^Jh{ z>5oZh&s6tRqmfZ>F=_b4>A1APnzFIrCaCTv;(EImEHQ4j8t+5HN0uEiskXCP;Hni? zh!JG78W=gN*IMWPP)a|N&|z)4bDyBMhE z>R6kp`rwba;z9SF#vT}eb@M?kC_AjS!Dah0)(OCCCJy6BYQB z9z=oN=K()i{3|QxqZuN1RjX7n`=A^!#Aym?F`k}apFe4od58p?}y{%C_i%HYFjEyZ<9j&0bVl8kkeDTWC;b+7ww|5Ptvco19Nrd`~=$ zcTt~Zc{Wu;<|7mYB>5UV6~%MrBFJ`p(KC0 z#RTi^m^g<^V`T!y3!jCZ6r1l9v;iKxEAo6)56PAyKH6L7xoDprh>c^X>p9E?;i~86 z14Dv+Tk-M9P1;;q+Ve{Az=lD~Wn2qKg4l<-S{A*mbsTjoW_4tnM>nf(mke3Ubt;W$ z+qf258=-M_2C%e3q+}Bk+w*0F$Gk}71ZwdOVY#@GP6Y5>l?htD$vjEW$Ug(68KF8Y z?B9X5)OY`C&0@d)So{Q1!SgPmoE&z%pR*q=tJ2% zHr@M;01=||@uv2i*w~M%)S?O?9cIA~aRlqG2?VRC@z{Hg<&!t3dZ&bFI(lnIklRjY zGRZ1M;{b`|WVX9bwoR{hmDU?N#jKj9P4!;M7>4Mi6aQB&|B-S|h9b!SVs8A=h<&^1 zIHg@n@F6Py29R?w5JQ4PwQ)SRWf#BwA^FGf1bb8J*RsfOxDla{n!Mt= zcxtHDZ`;j;D(5@4OB_IAlL7CZ1DGq=CLwsLQJ};m%J$1EQD5~>RFvt5m>vY|$qJUKa`I6h*pE~Y7$Lyrs{X;nN$xx#X9(2^lYreU}=a5mXziS zw)glTS60C`bGd{ldG|f)Q5W4EJi*6u1sgkY`#?3*agE@lTGsGS*8X%Ol@A7dK{O+{ z`JI5LZ0hV20V`R(RL{F`4RRL{;jsRJj*0}R&9WeOG&tRJpI#aRCEXsYw6p0$NN179bh_Y-5bO9$2jPd^pQfd&{Et@2*rmZ7(gR z`go0Q)zjQi%h)DR5-p8W{WOe)ZSX#LcwN5;Kp{Oyup@}ee1s3cDw0*GRTWIsS%?{p zLT11yy{2aIO2X8Jl+Fr0NWN|z2!pB`n$XD~y`domW6e8KT#RBdO`5+i1|FC>lf0YncUJ{lmZPINsQ$#v00+{& zOY6t*;lt()2GT7HLz6*-3)&o>Tz0vMeL4Sgr9^aY-af0+nBzlmtJRgK!QoK~QR7np zXwd)0jilK=tPlDregQ|VV*-qh{cKX|P0|h7cvSmHl#KI$WI(P!Nn}er=RIeX~Pa^F2tV#JjQaxR+Z`nT#P>n=TIr9V&WZmSEAh zN2k#c^YQ>7#y46q3p&g={J{je)!Q0=%2VV#q>|g{V>$mhr%ILObdVf&T<|bBaH+$V z#4;V?)9TuegUZ@psN0PJ)pti)_6dz$Dh`EpDY${0ms~Iz2B8ztO_%L_Ku6FQfZU+G z{x?^`=aLsvl_c#fZZj+*`DkFmASmPCqmwGtr{ja-%c z9S1!yTJ1oAm+P=WCH8^S-+1(@2KWH*1F34VQ?ovVT&N8(QQSS>SDh*L+9{P7$O5wg zdy60y{R`grpmy9?#Ka1V#KJeXWstX3_>ROdpdRd%*ba@=bYd51Oq&!F^SVX*LF`B1 zVy0hTgBS5$$TQp|(r_t|D_15rDv*HdtRv{#IFUjWfIQ@bT9r%#(WQ22kLwSI0!U;O zG-5mKL1qvstAl(l;kj0USi`S(OcC^CvNwRRZiMY$xALYIU@jPKd-p1=)&J{ivLK>% z20nNQgpgpzhJSL%TZ;TLa+9NeujuBrhbw$CnvbLkubuaz<3c^UH&W0R2eNC8K_uHQ zZHW#2s3VIWlYPnkzs`W&P<6nIwKlbjiodvnN`_x>GoC$iXU&X(M7bsen9zL2weFK> zqmZv>2NP;%cUUWoOR(wYl>2QFzI*ucibuE>WWG}OJ&SwyV%MdQN6brQk*|VJgMwKavch3i2X$V^s9vpj(1EkxqoZ zT44In*|r_~CLcTN**5(tq^ybrVOz$u4cSj^7E&H^r1Wq+O6uL|I<$7~Bi9L6edlG> z<}h*pkWk2O<`XmqwXqGr_B}SxYEr_Qn27oO(xum@#q5GZo<(meXs~IZZ~UW&b6a^z zw`~@Lgf7Gu9_d$k3Fg49*qH0Gi(*rf2x+6ffjmjRXJ28O%Z9w)Ms$cW*Fpqc`yDA{ zf|8Gr(FIC96(R(IOesRkIZF{cWE@u(2Y*+q4~W^eYoz|%kYJP(nueT<#T{675pZIid!2;V5`b-<{a0v%;1#cMxpq2t=e$p8hg;wxMKvaR)9OE32ofZ5?t)RY z%giQYPYbJB$5!gF5VzTPXj+a9ln#*VGIlI(Rg)E$0I>ypvxtvSR!6R!li5BuA_|oG z*pY)Af|wLEWbQ5o^jo;QbJ9s1Wz_EPRFQcB%)>i$8ig!b6*^}0{1$t|GKO+~z098a zTAG*gMYd^q7&KMl*wNu55$vwtq*RliQV7MP?~Uka}#E`OYKT}v@)qz$)6P-D?K-H6$JE%L}HduOQf8&VY{ zIlE{alewSdfUV|7pMDk}~D$r6q)_m;ZOU1A0e)xzr$c!_9`0C6!*e{svPjpIamX1yT#?0+!?WRc% z;TL_BuAaE<&Wd|q>-J=?D=<8@Zh=QLciGH*+yeBW05Kujh>0Z8y+Z{CiQ-$;=JJ(% z!S7|oMs7Ej-cqE)v+qrx1HsndbIhAo9{X}ktQ48MT*GGjKDz|u?fdMzu246bT+7qm z&SO_;rGVkd`Kqfjs618kQ3`>qT}7*_OYyaDV&m%S;7Ov<>MDSqZu>}={}S+PD1Ats zOD^0R6J_3`>0V~0BR1`@S)jT_X_n=lPZtz2vrP{PJK9W<6HS(7@y*ZituC?MBC+Xe zZoJc+gowEml18n9>e7>-$|k^@o+2Z0GyIB%2SJ`9!Pvk9fJC0#Q>g}VNqI+)ksn2? zAk&sbh{QAZG~Z57B2hdH3b$T)D`)omRqUF8veLX^I|i2^$<^-vF`alh{skBkqFKZIate-tysj z=dBMZm--J_i)yr%DcfgGxFD){h6#S=41ZM3HPG{xTL6<)?_vMkJXq_y04hc>;82?| zoO2&7iukR*_+`42{al!lGx(II;LiWnNN@)8t30*RSc~~8j%b0W5E+a6W|+oYD4#P2 z(*yjZt93C+C;R(=JsnGyD)?2$)#Fe)-)36U)8mGD6}fO_2dNxg4^*%G@{vL#I)KDZ z{7mLmN8S%GGo}es?HEJ|+kKv)(kX-%(IFP>TlsS9E}0p}0@sP&a*V*O&3p3;*;>3l zvX5iU@W4BwMI5^Pg`%OkQ)u2jR608SA%CTu;)*??y5glX1T&br6Q+Lhx4kB$iOCc| zIAj4c;aKOs11Yg&hq>d;i_~1g! zy?F)hoi1j%KgI>_c-B-OV%>uw0s2xXTwSthgfHYM0FZisscRXa`kF@>$Ri%ufCE#c zR5HD-fbmhmNJ#t?LAS0HfbbJ*D~9YFR&V5F6ixZUqEN-g&@26cQUDX&rb&$1tSb%` z)}*t`>`^7e{BTC?Mt7x*1C=DATzRTK1H$JTC~E|j#v@z>4x1cgw%X0rtRwWAqw=e# z!!OxYaGoZ9PqMK_Q3%#imMPbx%z#RT8HZpDt1na0g!LLv!UD$C5LtzN5)0yj=2)(o zwrmn=Y#OG~uUpP5^KAztqpZ+NH5_!u3;#%T$bU+^3fd8({{Y-$2M!9D>GtMU>~3=x zZG_yRtdvpVwvR1#jh2(hV1k^bUKoGjJzcoBy2TLkt}zP*vAMR?OwD7Z!dKv43sOZ& zhRxGnl(E(Q$j68WG~E1)z^n~lCv-4W`Eimt-X6HC*g2rEWX<9(<%J2dwlGO=g@O%c z+(+isRi_N0TfjwsU)A*#MHvw`b#cGV`m*BQK3u^(xo{ z!Ka!L)S0DEg#;($zd%MkeU!1;7}!05<1=ZXyEL9BQ{KC>*}!qnxY+Kk>oP<#LDo9c z=It@2%Z>I>tL`pIxL+(QUv8Nachsi%eXZ(|N9Am4(+L^TW_ePdZ>tU1RDq8yECjj~ zY9otzY46_8faeW3ao|7;tn*Pg{7b`-$8Cp8&u%Mj18h|voWqIb; zGtcOqnipu|y!b4^xxsL@3L#*M>$4PB$4kmgZGXtf1$9e))Y|@Oh{|F@RPLv+NJ_yO;)I#CF@8yFDSsMr zG`Jy>=qqsKS&r@|mgTMa?F(;4SssKL?gEWSLG>CQVYM!qZxTl=$kMfPS#2>^4JV;2 zP;POQWiKBWVZ0Dy91eHTRcaF4+0uHO+2K&_nYBl#x*HCK3QfU#z$iWUW{h&9I(o%i z(53P)0R!;d^of%9RT#`Cm9P{U#%0~W?XSzS%pAXKXKp=1NnLWn?qubT4@mBngA}h? zF5hM~=^3&J)4Z^UuZ`=YzeWKhwyGv<_j((f;IdpDe%3oaUhqz+1@#y-@5}?%=}ruI(iAv|8m8jmrKEDu63jAw_6;NlvQF&Or53Z`M1w zPK1o>(uorzX15iEutIz;aRzrS#rnFkT1U>Cg#X-rUf&y08x!vaf5#)^%8h`maI^^X()!gMq&Uq5#FfS6xrZ}wK zKX$QMGVWtnDj_lT+X@@?r7-MRESae~8_)%fLK@!kkCaZ4q&dB>0%Q zB|>vx`O;&KGFgQj5^zTQYP)vNH<6NdO%@`;?U!NeDehLrL4AG{q=VC6!H4hs@boNg>$8lQ0taEtGOa<>+ zQb9Q+5z{45#Nle`H}v-Rf7EW)QYO^$V&$K1!alGNtu_;E4j!pEW@qfhc)Jj+iTWg} zzT_Ts6zrt(jEk}Jv}6miu_gYMEGG=zM_Rm+}*z@>Q2*WJ6b6Zx>FN#6rM5z1!hYMK7XPktB+) z;7N1fqBSYB(Q;FR*gkI~l_;1A%i%wlh|XaLbwl$0BBR`Xx}HKLtjRXm5~W6Qjrw|3 zuqg~uL2<3v=6jn#AJHhd2{IqXr1IUM?9)5~=MpDM?s)DR(y#IP!i~Jixim~%GHL-_ zx^pCh`Pxb1&|Mdav0%Pu+oZ3F{WMAfqty9S6&y5)#>RmqW_H^S!NfS@U&X(d zsPBQlhJlobuH*aM3~)D{C_Jq0hq8Rr;#H z8IZqI%0b(i(poA*Goa1k+3+{4r=a)CabKh`qMS&-&!Aos3tqgZ^Yku%-7k?}X>8S0GzKu>Q*m2p5UV)He6*e%-Pr z=@FO13tz-0VVf#VGx2^&$e5oN7KAy}E-Bn!L;#MFipAXF4QqtBt~PU=jddGbnmZ|H zl*T;a&y)a7U1RBDJsB~gkspAC>2B}5uBC=H6SYY;jdT@vDWgo3QeOEmu-}+2aLwjE zW|I-M%)czOd`V)txy??!J5h=T7%>cLHMV>@gM7G}ARFjxnEM8io^CVMv6-7D4N|LW zBMvyY7ig}%^9mIgWhC<3F9oEsQCNlr_wxmn1n!dW>FbV=ww|jJOk|dKu_{Iw8ehFA zo7x{*)*-l*U!^${-LQoK$&v=ALYP*D2}i{JQ|yvRGysO7hWK3T$~YLRazLL@(blBO zYZ&KOY9P(Z=8z=aZGw_A468(|cZ@GtBbAyyzuH;qc?T-26$3Yh-s|b|wfhDBc6%CE zcdTvGkPf^OzS3`6zy~W+S*!C(7aS;}t(jFH0da8L!(;I$?+c4v7XOLDRT0fYfY#YC z8M_BRx+q76+aDoS+Up7&gN9YZT`8g|1$Oe5AUQW~N>6z*>M|E~3%cSJ&aqgYH-Y!elI|gP&x2$I zJ{qz0fo`s3ktz$0E9SrK3MNU;RO?No@sh)P99tw^RiFm_B61o*eHzz{&s!X|jYmi^ zRCLtOu&RwI)J1(+Xa7alR)LH0keCNQ&lLFDwRONB8>cgHP3z$?PYhrHhkSq49hf=d z40D7TaQ#+84DM3Pm~^X@Gl zFVQ+dK8=9#K<0|{g!zO7Wt5==Ny|^SW+2=Fl*zyHB4{yv<{C9Bm2FW$xjI1ivWHUE zJFRCP<+gyUxWg0GW7-V7VH-;87`>S`_V5ZyL)3KzAtr*0|N zw)(edD(!5wmXH@J{XVm;X1s7U!_9mbqcdopW{h$RTU_?U9VJK>DiZlpwNFb~3Yss} z-Iu?-13}bzX)sb~w8PtJ#P+PN%FTk@tPmM5WB+=Z(M;3TVWCslL<=1HsY(d-&U2^- zzI$}my;?h8n=9g)oubrKJ@%=9SPTlTBef|^qiw|=Yt*}=NWb>QQR;B>N#nAe+(`C&5tZmK zUX<97UTBKFjBL+?Y$?1^3LC`-7>#D|~Oa6_?k+>w`Xf{FM%Q!IRR@k@i9+tmMgt z^}?7!ZRiJ8fy|(UapkTnsDP4b199UFGf%@;J};d|YHu%g&VMxI!mKrCLTiv*D~w6H zifUOQOU9pG>$}#5ajBe*Of)Jz4uZ>+A{GlMDA>+WHJ6NsGm$pyL({c`dqmvf|5oN*9PM%y`gV6f&=USMV@`_J=}`Ue|?iD>06oR>(>Ux3&PBHrxx zKWt)xNB$(|A@^d0(lE;JZFWRDoO-@aiS|A@IC!BSEdKrC?0^WrM}LgqFwG{ArT=%o z`RIs<1jjRHPgjDjXqogF+{;ZKGAV5G5?dri>q8AYW+Gx5VWi6&jJ6tU$L#$r<{+`D z7|O=hP?T5^~V9H`h1hvXl94k)pREc;C~}rHrLsNj$VMx;+&L)aJ2iZCJ*BJ z#7-dXdBGYrhHKo{O?f#2zFVC(EKtGm%U%@z=ssM{}(toz_Q2ieVwv0Ba0!sriby^%6 zA)g}6iJ2iq@i>x*Zw!)m)&*)cuj$clmTuhje4nmnbQ|watm%;7{@;pxR0`e?(BP;I zoDyq-CXQQ~#HtLvLwD-wdZQ|iofyjtEU#wS?~@wjHg#q9CCrH6YpeK)(h6Jq*{wr-exAF1Z?CJfQ0D;J5>zsvLGZ+ z83HsndzD?&{LYEBL10V9>QY?K_Iq@P+0+sqm*ssBE*O5a^fDt6cPnz~nI4{^S}mef zsAz?Ar2XXDC1-fE5@`)+YVDE9U~gE@JtBo`Mu~y&FbUP^GTsd9d6MxS3o;}~l#K@x zEWb1Fs%DSUtO}p7rpdJDkcwuKHNE}6^W|(I5o(JHFqdqSPb~Ej0X}y>ew@Gx(46IU zcPRz~dLqFv^d8-!c>L=2vr;~;xkXx4%SZaO_`aLL4y;sd^yC^oZMS}R1byK#&i)z& zk$raASr0}A@AyqUfW{yspaEI;s>vvRWU2#IbLZ>3!K`+x`{NZ8u;67c%^YKx#U?ngy0d zO~)S^&qdW4wr5zjMab!_Il@+h6bb(4kSw9W%39( zJdly}?pX3=UrltGByLPkp6OvJTs{`2;ShE1$(%Dr#Yx<6I`qW zoAFP%Z=JybwjH2PDlh^7;h zt4B?oKUsb*IRs4i*B7qHI<$&P^+9Z^^Cz0p%>lQiR6h!HALgf#*bMvBex(}u0?$Sm zhw?9^l2EiicKW6;0-GooQ$v^T%u}BOGoP&&(AMGIOR7F3PU%cJL{Z^qS0$dYxlErx z1eYTjc~mhpy9|g-qmSdrPt@}$P#ei@rj6-&3!l{Rs=m_7C~FxWc8W~TF&B>{+}>2y zzdaj&^+M$wa0pZmb4oUsd7`J7L~%UwVoh<*{{tOD7jt}`^%<#JnjrYL@!EYyPK7qJ z$8TpilHv4hJ5P(ilRiV$vN#~*a+T?wxcjyTH_N~d3CbuqZIVO_;`|)pg}rY`O|MB1 zaRCL`ex0dk60x6u)>z~WNys3s)7M))rxV<6{yR&;i8e#^7($wkIDGm6g66_F_tYcH zbxiJZe7ycpGhckZRFf#6I4!)Smp%x>pUvEQ0cYM)3$-l9??&@C#U0HLICXS^jTa70 zNmJM=8&*e_yBd#0&x`UrTW`>dU`Js@I@9HUL$dBhqNZ{j zViXP7T(M2lswe|1E=8JKFu4a3z21NP6vcV;esAYO$6BbsDnBfbQCb1;pqzyKb6R%n zFR%p*q#&o^Ut-8He_2HEg4G5KgQ``QTTnuRC?BV+qk>BR-0X4MI6>db5^fDqG;Kp6-iPboSfLJsF!~O`edD-^8P}GFxzIz_*gNv6;Bv1>UOiC#UPK8I?}!0w1N_nFTYN?v-HQmKJOpa+hnGRZT=^1jFMMd53-D(QkHr-m|0cl*IG zULDKyo@c~>w?dSX#^5h=`V5`bbX4!s@5WRMlH?q|bIe+p%W_lLp3QvKpZKFxRd6PAg_i3Mo8X-qzaF$$ejHKQ*3AO@9HgSa88ci)f zlux~z3z~|Rq1CXd9z9;1kE80x{{#{!Mtv_LCQzmOZws4rlXKWW3m3z3@$8yI=qz7* z-@`cJES6XAUeESMQ?Hg^Z==aK;osSg8ZnBwfu!c^qJfuGUdGfLn1dniq%cn9tPM2c zCAA7yjl#UK1Zecfeu$ryjKt_V3svLDNYP;V`!RGvC6=JBuKZBEOTUP;RBVC)>)AQm z$Op6YAwE3DvtPm4DRIMDbv08mAPqd$BbsufN>zzjb192phF+C;UDd2wna@7&CTO$1 zbF9473l10}3;h^^-%8B5drcs?j!2>QHw>{e{_O?tR>w15Q=o*=4(4FPL8wAIO%3); zPBS~a>Bwvhnew+?Cz6>`hYrnz-IpFjy?1HQCg>xRUW@}`GZ2P2PI3RTzL{8ocdy>H z$w7h=n4e>6&U>&|dV1+voiYx=|&#*XtgG;J8Y^+pwbVHbHacY0nLyZxI>x z*3Fm%cXdq$aau9rb(5e8%Z1QX4JT%sENLpmav6!G{~R`o`W#3dHa=asA%E7hK_P7Q zl*rQXrUcaG+1hqmZHnsJVXqlq)_4mTBG;k7LFN8iAH%B>utauvVWf)$ap?~%!6vS0 zc*uPW%r24uNrgo$54f!XtXZ9PLKs$Yr*$ZB{+M52(;pjqoCmHi=%xh#pv#*T)a639 zX%^Ey?QGxji`~EG-(Mlx;RFPpGvJ0X>=9iCs7ZrxCrLuD{I~~PqWK1+Ebi^uLvPP(>fztd<)u62f;<*2JK6v;->M6* z9C1kSBv^Qqnx`fv4UWa#1BvUm7B0#*z<}1xpYYxl`FA{m=8Zo8_Mh^ws0TgFfj(8% zowi)s&hh34c&f9#sP|wWj@-nTap=OmaY#jl;bN(x3*t4ruS-(#l^a~u{um-_H|Cd5 z&Nhczk)j-$%VGKydT`aDqO5uW-<_hDQCY^}0&U zZV&4WH}kn@^A4i`*%aXk#42+Bppe5GATc*JT00Quw*UPqo#C^G zG_MlPFSoE(!zYz_#0=XmRjIv;TV&g_I3j>_^+hQ=XRu&MFvqW9n z;6{ZhJ#nTYUVJnKrK*|kip@%vwY0i?+j1JRUDefpHQUgK+P1Q1ulgO^Mbm}FyX#ib z*iCx&>)U%9(vTcS`3>y9a<__S5 zPA|g^G3oY%qO;P48+ZzjK>!8Z`w-ZG)OOg`jBu2KaIMbbtnl=XPQw#fkzD1J>|Do| z&(52_figy9o)Z*dLaFHY-m-n7sKg{;jJ1|Jz6?CO+w*?O6%{0UhwTJldy#)^&mfv{3WqXA4P7#Kl1nDZPbm%64ovH3hP-Vw7|l zMb>@yDn*A6*l)ibA{Y?>G*TE4W8VwH#%l*!?caN)D=DiFAk+Q#Ue)3XGzE#7gmlfT9~k=vx(J`eU2yXc zQ{!>G1Zy}Jwar&BZ+#Dt%;{L&H8h!zyC-Y=`$jy#>FoK&6YS4N-QGFjIe-P@VYPcB z-MP-|<+DSTMCsC*Dsl4s!08oN2C+}u-ghQ03dmBS^}S1V-GGPg8UwtBBFN==fnxO~ zKH{5M+FD>BLl`l|VkvgCo1^Jk!cvuFQnFrKeFpcWx(x4ycYk150W>W*TqBc~mj6gP zrhOg+reILeNy#_}DBtMsQrDN~uFM6um9@CewYi=Fq3Nh!zTKoX7)lNPX%1Yj1dm+7ZSXots|it^A~0F_(#ubbOS>2X`^&yD$gG-*ucJ=|%kPjV~KS zl@W|TOMgdz1Fiq?eN~aoB*QW4UBU~5z{%qm{PkO}AQIeoQuob-Gk-3hH=ocx>p1klPQ z-1a_E9qyBV7$+nqV?FXjc}q<5RT^Fww;Ldd|9d_|K2m(Zh_CO@ue7X@{J_rQ79>T%DkoXV9{ z5Hyawsb%bp*q;#C*-x}Ad^5A^|9~W!QGx7==4>ni1K;2)iMcuS(uHe?M?>O(BWfzo zx3OlY$~8FJuHpR4)@ybHeoPs=ct>*wqBr<>Ymn;K{=iBYlBakCvJvi+cW)M7i`oMaj}G%R4`0QLMS#*> z;6_z_?ThQ~23q?1K_X!&z&k~nWeiQ*ev+BV26o_0oO6CtGIc%vBcYjuMv@9eGD@0Q z00S$EC2XjrWtY$eT@F*u7#;OY@cIpe-$%n~?`c7DY8 zl)$uN%$XMfS5eU9E%8al%Q?90evOnYS%zv)c zN-CQ#EHVkFd{atI{gSDuXN0 zZS=>F3jta2?=@!H-6C!f_;Dbl1)rHA>p7a)3c4whU$*CR-2pnRJ$XKk@)3ytbNQkTu%vQ&XgD! zFX#Oiji2nW?fF0*2C%Bhp29MTY~Bo21s;1lZWB5oxO$xV8VANI6z-NV*=`L8X)_tW za6oeERHLJ^Z0%>DhoQ|J%~YJW&sHw8L%=Vn8%mjkh0Rhxri-IQ`%<>GJpnh(M$pJB zo?TMQ=a7HXJtqUgtV3vg&I*px&Z;RAzU;3uZED9nKNS%<^VI;;0pt@@uTX$XRRb1{ z>z+`K9 zo4?!o3KcCeJH=ZW-}8rQbuQ@kQK}`zIboy7b@=SZeU`!6_|jxGP5B_!*|E|G(u9_%PCQOX6~Ykp)))B-aK9Xb zt6*sLuQn3IHB64RO{}m>tkTpL^LI%eohNwme_d-xlXg8@d z)2kYm_Om+c$4`@YH`zHbCjk@rpZN{G)lXX(DeOjT7#^pZPFQ0Te5}&eb~%%6UNDNT!Sj_=p~_DTO^WkT zzH(7?9rMnjxbFQ+kz2D>FT?YyZ$EQ-YzKVz2(uyIZ$c&B{amGEBj*i-uz#y zJR;B9`7c^1I?Nd8dyE46a7(F9HLCJ)(<5DJb$#@S0(edegcG6%o}aQc+l<(Jj&DgcPr0MbYy+tqYsmUzke$YGtCNy1P$4 zCJvL&kR_#2)a_0e={dPk_G>s5G*b#v!PiZ?xrGNr*e_z$egYLf{OW%V^Exc3z<b6Y z&_(w(n-(j35S#e&iP2}ujiRz--)&=S%|`~_5=ORk^6MT@vhfF506jp$zlyYR2*#DC z#@7vlm%RKf#fJx2zR7|RKi9aqCbMJY{7aVS7pbL3{L z-FOa@5YCfu02rigxhnW5TTk8D^tc3nVu=&l23{o$YvPuh?4g*IW4kk`0N^?*7u#7w zR-{@SNE0uPW;Caix|eUFaU?itn?KpAGQ91Lai%Rzamf(` zUvy4XX9HTAkNE@7Eqh7Q-E1e!C$jEM!cE$iRlGvOMLJ`h{xNbDYOPZ+XzqKTSF`mG zboIhPi5Df(H19pf1MNe5Jnu@ddi+e^%ED^h0z?J@*}KnOHa@{S-bZ@!^+pR%F_-qz ztEjbL)p7^c)^aPI0+;kv&_1WLMLF=fr(6sL0C}0E1$P@456=*oFe{a!?FSir3j&kn zdyTn{Aye+Rsa0$N)^>9|(beCdxEI_S(ZiGcTMxPiwNzic_mL<&zxfaV&E@%!ii|MR zmXyu;GI}RronssT~h1HIEBAdkZ3!u^8O12 z9LJX8BH&g`cE6mLeZQU5!|mWP;emU}KpFl(V6}(w5W8O0;PaN>C5Ag~V+Nr{qA(};?N*BKQT(DRte*Of|Y9DM= z`duz>xL?Ixeyj~1^RHe#=j~G%+oG&g;SqFkRs~zh$|fHiUmp^sBN;c zc#4W`CD8D<04!LYf%%0~o4XQln|9zZD+0%W94`T-|C{*BO?zH^mD@Z|nq2`#Po=)M zLkRTOZYQN-Y|+dXHyBBn;=vtjd3Di; z16ZKMw+{!x+6J{w`lG=AljWkF36QJw98xMh8K^X|OCJT$OGcjm3|^8bi@E-0^kkv_ z>r6if#hFws7L>&6lS#=#V@PP`Kg1L|x0fz@V>$gX0Qwr0L!ozco3-8>Ug|xHe0WXzp1tBTyK@&InmckqRM(H_|( znHqYT)aA0GDiUDh4%P9r)VZ>QA|ivQyDEy7H2>>^* zYINt#&V(7#J0JAoIxgnwUY)}M50PJ98exMda(4xtVvF@h!mC*eXzm$KbYl}h@l0Xyr&idD z!GXpyjXaHd*Ns`{LsQub(AX|BOQ%_C#{|DVR|m~(g{$Zn!gAgA-jp5!Ee6LV!D^YC!;OX}6tag<8Ej5PWzXmC}R&r;T#D2JMRl zv80*AuebHJ{Eh6>oySh5I$46mZ?_qb-d0a&gc1~X^Afw5EtU$TkE0Yu74uWY6sEM# zpl-+rq=$}H)Ba@HqefSOb;xdzPzg5)0+_bZm3QSI!&hhUokn0t6xL`*`HO+pckTKW zkt9t=&qXb|g-cuT_J{kC@i2CcuU(ApDLvr#inDwy^7(x+Z$wk+ty~$D&i6t>3kX_1 z$5P@>=)&(8Qs8PfZPbs_LlYSl2keTn!1};28>{bR$y?=AIo#15qnT85Blx5-uk9g^ zWxyvM;?kHwkynBhj;Vikr0*~`lmkSh&UI*z8i~SOxgLENA-1ZMZ#`hd>>NBNOIYVWl>vA{9lKI7Mwm#lkBxLRHHekdB$Xv2R1 zf`Uz;%$v2Qk%9%vQ8uU<3+jY|T4aEmBc-+$Dd zW6$z>ATAQLp@+^wydY|&%IN*H?ZfHeg#k9U`YQ*B?2yWL!2zgN-SLmq><}$nQz?rd zIaKlN-P!QOLI5~8-q=$^+1k@z6(=MA$nxZ@6ysHb4r6gArSHQ};Xf!ssC|c9((6;s z-i4^`0S_FTe$)!|JrN>Or{4HU1ABpZgT1lG|RVYkMGseZ~6p)yKcK_4W zSqOWbE~*$;c+7Jb&~IX&RDKl)EosG5!G@7RSk@HR{fxoBY`}~uf7~4Qz4unKvFUxz zjupZQI%}BoVx6sOmX_@Kekgv=ob;NEfQd#JSalyrEwCCZi>K^7r`|UQRvcBv)dINo z`6%1ZYj0H5j#2v@1_SY~%S>aG*bB%l#(zoYJrFLJ$bP_#yxN9{(KCclx9XAK(Irxf z2#F|j3f6Q?W1cH9yNrg?@1g6<^if{?6(>eHvB&xueHtwDO=zkvkY@kQF&jCGKqzdc z1@rn^C3HTc`_z_*+UquZcbLlv>S1W+c*-Q_JrvDE&rN%N;B!-4PGwLKRUXP8Np{L9 zQ=NFye+T2N&vJ3H9>BU6wR+9I;_(Z`TY+!Ag0vX`a}xW2HWX5ICQjl zJM1C*P3v^Oh3QLGf(;G+i@rz5z<{hy-0E`v=#cs*f&PID4B8zbaPy52G9>MDnMD^? z_(8DhA%i)Y{_Nhypl823C|-R+NvxDwmNPk%OAP-sZdVmE`2lEOm~3tDoVKhT=D6|v{IbV zPzr0{2Ey8@?Kmz)D_hmGSnft$iZ8m;#=2q_&cjuH3cHUDb@{Q2ga*DeqFqR$9@gwu z?D>y{nu(BeiB^-}6zr0Zmh!O(d?HC6Z!pDjYy$I}I6_U=hxS z(YV2$Q&u5pb3}qqLJi%=I8=68)kN@Nf(jqyID*`|{N@@X4jxsMD@{4&N;RtS^|05} zFvri2#$sd}gO_k9#z9O&8_9mpsyPXZxtiH5BW@ZJbBeRiPc%KS+j-!h2iz%<`^kz^ zgeJJ3nA6C_h|_(=nIL@}z(~!0GVsvi0?SMjon9@kr?r^jD%c8@B}4^3{ef+t;FgNV zJjYgv4EqcITXZs6gn1Jyl`oQks25orBg=n+fbj>Pat9N*N{YMu86lrY7RIL(GyvG{ zWMGD1nj{tNS}dqNzTSRiX)j6uxC{jvuVL~~O~yTsm6j(eBQ|mz6e}qDRNJG}__psK zQsgavj*0)QYJ=|2(w>f>A|cL`Vm(GMbXWHx`6fDha3}Jz37;Vbjl7NBa&%P|Nwjs} zW7#MZ1zp_fL^qz%40*!)_S+j6Z99&Vfz!;iFr62v0xh)t(&mObqq^-K^pMNzP5v9kNpU%l)$BbW(+*cJ)XvU$bA?CL^2s z32c>4%+r2p^&39&4u&a!%qeB$q}hT#CQ9IN@An;Pov{$&6o?1-%DB>5$GkSq58}oc=I`QxlRCHOb+`BVwW=|Zc^?aW(6n7A z1gZN_*0fb+R2fq!6PPU}Q-CUjYmOU*G+<8HdFuq07n=2~_Eo@B?@PdZj{I9G32j^H z36{Lqant!kpeI171ws}A$g&SdFQnyK;y7`i31_pQ7i7uN2O*7wW6av1`UTmJTezBI zdXS~74d9n@rxB5~W^&6pi8e>idD9UsEsAaFlAErlRDTjZZAG#07XN~rQ^EK-=)=tb zBl7c9De|Gg6*Iy?+48}i-B)TR^ad2#!Lnt0#t^FJG=~gesk1W|m?r{P!?tX5*g;;sv~L$d)l7c z+}CU3i$()dQB^xzrSvm$*#VAkaKuleg=){o;PPGEnxA_hpbJn?0WkF}3oKg5EI`)( z6|IGhE561wIoIl@0DuaT%>0b;J}L!D>Rx+_e+>s2>+eKs3fpZ}IKYrU2ilAljMdqi zv@Dg~28w-j`b{%|gBugf7YOitL@dM%9wIL?>StxI=3<5_>QqNnE&lAr5fB*ITub>r zAdH%gf@Xp@V)!n>GhNXEWhs2f9@fLx59-npuLxitohtig56@7NG zb^>XAD**UEn8S3no|-woynX^Q^NA$h8h=rSBZw35X#6~D>9JP)lB$ThML5lQbvxP$Z*CVf9GM>P;wZ1uq+t#WNSyb&CDyey3?CAFZDPP(Y`!#j zCMtF6t}Q&!UEEU4!o3xPH9@C8lo&Iq>j+4?f3s5gA7nT>0Vxtepc)xDh*5Pi(?Zw) zw#!9?Ty;e*fpx>fLcgb*z1>);IY;inVjwYc!P4n3?g^uo@~Da{9M;K#a9!F#*$$%N zrq4&R6(6Fq>PSwQTed?6yuJq?lMS86b$x*Rb~tn;ssWtQ*zaow^mTA`qUTeziTijs zrT{vOM5$Olt?bt!r-Ljr$!ji=ypd(m#K!>3(l6ZG&%c|TT33Qq^~Ay)0}{-^GYs0+ z_*rpnFI2`;m+$hy#1b!%yHd^ALN>t1lSiU8fj%=ayR1NyWx?2qumw~g7!S&SAXhPG zlVX`VxRCG6)}nr9@HqhwPuYYIovWcn+Hwd*1F~R6<3#APgqk(4s_c>_dA3!#kex&>!*ohEgf7kM=RxH;pa}4JjUdp884Vat3aStity^u8b zcpwrPY&^zPEgyp#IUYu?Ig4~kc*(<2uL$GTEDg7$aX|(eEzD}MzmiG`(yk-_(=5qHL2r_o4GM_EOE}T2QYUn03mnZ zKlPO{@UiAWFP~cA9dBUV2gRmmG!gQ!c-Zm9ZpT9OXEL0DwJ904{;1=6x4CmCx8sld8+`6`ldAK4R}J`q&+Y;A-M`3< zYm)GHqmm#z`Xb%J;{+QYplEw+8G)y z!>XHc9_t)n6N)n4bWG~M9K<$~QO8HHE@yij{qLt*&)b~(Kl|g$QX9D7j_DRQQtT_5 z?N?KVc!Jk*cP&*oswsxs8B7D;Nbct{5QxNYEfPNC_0T?_koCuJG^=3d-b~0JP@6mkZTnp;w ztJHlSa~*%2a$NL_kg@w27&!a+eCXx1ZRXRBXG}1%*>jniPPb|M{0kP2Tp6g=T!|ja zLPn*BAohEi96D?X60%sxE58EZ3)2i8m)^}6JPyq$HJWk2a7qaj>IXzQBxU4C ze4e1=Xj{LR)_&R8OlxZ;CoWB+0eQ)o$lL0Scgxe?o0Fe|=t+(zGJx~sUzth_|0ET; z@ogqn#|)00P*>CPT}c4vf0#CsZit5!FN_&4&*g!88o4_D;lCEeE$4lmZvCU*_euHc zxok5*AjPoFaoXV$6bv3Uv~POFidn7@Qr!ItqeQNTI1j#apr*0h>| zJH;qaw-b~b1VI-ngM9*(#v8NX`+g#qdHAS0vjyQjW$L+rxaS*4187XdwY@hCQx z7aIUyGRcs9nj`a_r&63PyX67)N@1U?e*&x%80>@S03SU5*h$}`)p%7MMK!&cAY=-< zTmBb_E`>#r(7wypYyoi0IC2NwAE&Cz8SjdD{7rsFK8m7Cdk12DvwN43h~4r!;GiL5(ii z;@~$)#V?7KYXw9jhrRXKS($Cl#oQT%pF8Q!lx5Cx$R0ZIoJHI=Chiaj!b&WIF$!Is z4fJ<8^9QNnm^}31bzihqXuz(kDer-L-%dbZj-*V6kp!CMqI@yqc)PqFYDz#TsiXAY1z_((@3ckYwsqi@$ zugv@Xch6OXtD0E6uL<28P#EpJfM_!l6P1*-AA zL&SHj!NyQO+FQ^BhBR3-X*{XZj<#e9QbT4E4iXoYRo$hNU z8sDcw;+h11RWSjia}ttF=>KV1kXy;`;T!!Yuj89DkDU-stcsi?qJEr{c^@+hB`b9gUk8xiOg`-~A~ z7Y1we{IRi+igkQ^BT^fM+Q-$IAyQJkg{sJ3b+*cI_k8_*yD1a-G8n;X7jDf70C{|5 zA{Z>=3&FTMnA*M;7UYYd$<*>uk?GzUg`s&vMbF z5LXH0u-Wgq(c*M=XT?{Vcean8VGXb5gJF=q@dWUOhF^NFHuyUwA+p5K`}{o^#k9a0 z?CO$sd##cRKR|n`#jwl-5^RsjS_a)Ril}F*!4qh3{FwH`4ju`-Qz862Q;g#zh24JV zFC-VWB0t^8*kq$4nj8}W#j0HbQg=hWne${eaR*er`O1UKH8Lsv5ulP7cs$0lEI<`i zr!;mwc*u;_5BsuE+wDbUw&F9jnt*$>) zZtaouO2rr1(Q_H!mIbxO7qIRBxgX|U+@nC%qo#$^9;HOVnp>N0Yq_r-0QU#JP1-%I z7~`HB>1>gL+|JKfc595|DG$P;@s%{hHtd0Y-O~znD%D1`S#pUQ^djHd1dd1tzKm7{ zKt9~oOOB1#-GBrImg%*9}@CFEXb2czBmf%$(b%NkIbUa9^!zM zt^v%NnZ;8m5x zQ+imFTvJxG{2=2tpO}BU%}Ij`8mNj5zyO=NC)?f`-iH>8RR=HG|%3p}l~?mBJPbCb1^> z;2YLlZj;r=$)(FR$RU`BuAJFln3vX}p9Tl+{bvl)sd55(UKI#C`r*|>SZXx$Dhd2d zWQ=ss-HAlKO$~}6Tj_t!*;g;bAc_>x!PmTQI%ZbA->BBvb zLBAad2GqH}(myZ8Lc=vpuo6iXQ87 zaNz2|Ng}}BK}O04YEo&s$S>2W-K^e?l_dwIwslYRnz zku)Lf^^K)NcBEh-j)d4PAs2!S7@QwRPXA|@CZEaS9?CQ&D1gb#zAeV=1K+WAU!sTA z4!7iC6p4UPQLMK_$ACh>mS@+}m_CdItm>I1oJn_5X@7)&dW^rjS$VLY_;w^9+hSz^ zBAzOHEEFoN(9vtAnf>HE`!{n%I_x&aTn2CABj}alNmRLvM#%!%66{5j^k>N-RGbdi z-$#a^ERPL)xsfQHW2Yzo2UnVm3C!?4_hr&taGd2VAuKC)P5#h98Zqt9;=t?o3SV-s zB@L{xE@ci7sWOOv{%(qRE(zpF)&-*q9};c;7+SHf(O?daUOf>RD-YTX?4$FqJKC`9 zHgei8%Jmv)Tq))AkW~Hh^z1+!6|o~g6_7|9^SvR(aySqx!{LwvKab3?%P_MXwFuizbaOVMk0#j z0;giN&1}6=iLWi0J=Vs;jHzssth3g`8sz-zR@4*I2o{AJnCEOoaO8;;YE9 z^$>l5N{1I{AWy6DV5uY1-~g2{PU$Lt%bu5WZ;XtU^R^lPGD9=8Q;mT5o?lV(@O~F% zCO@Ui0oS|M6JX@>xkDLIG#{JzuNSU!Ry~EVd=J@ORAbor7j!Fc(h-ckaur4b#qqW#|@L1 z01)s+=hF_z2arhA`;?RoXr&$w z*NE5Vi#!xVe*1Oiis|+@tvbtyuCr)E8?#AO$^Tt?U`W$aeY3N161a2;=2vXk;QA^X zXuu@O)W>hf9`J^AXZd9c59pjyA9Qci`A%yKfswiv1H}3}mk`G(pdf%@2IA}%O~NgD zgDcgC127Wi#I)A8E*s+OZw61n<)|}iq4Dg zGGnY~%T8DPJf_e2ORv&8eaZu>Cf7ksc*Y>49bW!ZyN~k>o%B*V*kB@G1VEA>{b+~> zUHtInp#|%omK=BQbd*h7*Q-G&Gk@5ZDIz~XATh^Cma9B<-XgPi7qgFMcGsEmdxQOS zi&>t-6(wUzGs^q&gEWCAadv$XF-77Ka6D6UEH^Z;e+!|FX5_L>lIa+1==O? z#&X{B>6f%uQMdtT_)a{C%KDaa zm1KU)IlDfL3OLB;tv9nG?UE?prNDDIOod|W(2L&Z{78lEvw1WT1pEV3$Gd%T_Q~pc z0Tgu0o%-O=#(-yDnO0dS_dtk_*PVCFN@aZwEUpMA-+L=?IU^pqxyzOz=3{jtXY1SCy0J#K_WdoeX0;BCo@Eg{D+n>`76*#*EC_X z4i-<@F>|iU<$-+`zZ#{>hf{z=7m|TrYtPs1e3WL52H$y!4Qz^jtn)`6P9`W zkPMA1No>AkvY?GOb(7)44*_x(7>Pb7}qjG^{tqbHG@X;V|8n9tI4(C`O zDV(mvtML}V1>(%)fHvNf7kz^Y$~~YxtmzcSGmePsJ~KbF8Rf3a2yumwv3_{N~pyt4(sMT$5io?N63>Ed47G*4pIYQo*PV?)>S ztfmXVwbI7X-GOiOi?~y`Jwlc!;X(vacA#~v00Tdf*6}AL4TdvwQj;6`Pu80S{SC5~ z&6{Wj_V_lDu=D>{MQi0NF^CQhn`D7vxZmW3l3@79@Mk{@nPK_rlXp@HMd7-1oQ)SE zWW19qTorBaXO0_z?>Mbi(>4+TESX z)6wgJpYJN2(u`Xkui55Xx3)GT5Zv40wMIRsvStjOPOZ0u?~|f0UFUb}7jZU%ie-bM zm%uU+iM>BBYQ|bzVLM32rM8H)o$21)+Tqb3!}uP$VJJWO#^&r!R@G}W^zf<1o#hRG z?_Am0b?hQK+F^_qpIB2iYz?I|Qtt^8R3VhX32*{c?8?w-GPUaFtI~r4|A<%VHBBT3 zp0W>xU|#Y-!kT`uS90!5cde(IakVkirp5yq>hbd6@nr9A@*cxlBGz>cz4;1DufCGE z#zspNGpwq94$oV->l5zP@pq}C>$5`a8zBPqW{ZLOHi4IH;-?OJjjlk%6h=1p^y#sC z@!LPhRaY!^+-V-VDu)K_+Csq6gXl;!8mZ8yLq-Z)PE=Lgq&0Z_n7rpNi1=zaZlH<> z;X;kKXIT2%AT-a~ej(R$7)j*{oey(=Y5E#VCdn=SAwyvVwi5*RC3R z6OBFlrhay+EOF56WNbQ)arN8RPbC*z64|vr=q7jSP#eWoQ-S22y z0KFsVsdRSOa_ew--_3sB1;amifME&^alWYk0cqNBfC(MBz8D(>Io<9|V~c#E)TRm& zT_;E-VhS>8TGsKlk?v;w4L5(+i#L{jXXpuK6j#g_OIAZeJ*5dp>w}yr6)q~p9}KxU zpHmVssf|KPKHo++5>&HinTC(kIK{Ky60RZO^J+2%nb@{9pu!!nKSTDb7c_eR_R2OU91HU|7>^0DDXMtTq`zQ!f5i^Icr?=|IS0aX5xa6h#2o2&Sh1z4#|@~R*% z2pVPv+T+OcQAYhEKV+&m4h8xRGaZUT?he}YrE67n<#cOCfO0p|N2HW@>T7Qud%Em8 zY%TDsqguyxjoY%RY7RhTGXB4Qp9EPda?wvLZZyv<8WajovaJmwK?1_`p=56c@_qOd zvP+IeLx_gdEH5?uF!q5u>dnf!Sg1YFYSau+&yvmgA(M?qRf9bqTAlU6wb%H}gT*Sx z$wz8^eXX*nIvy;+OjHfW{Puv=y#}POduNY?w1q;FDR>58zKCZkHiS85lnHygV#0)0 z9fE&ZaD-q_41JC}53=IYAx@JqfCU~Ph}yD1Qt`)I`#Z>)cSt3JjbISHsY~(jT#;d| zgm8=Qei9g&x|ch(VC6Z6YBqPPm#)%;+ni~r{_R@XBCBZDuR|kYWlvj%jI9NSLk|Xy z1P|AxOVw*EH;hwJqHzR%9y}TEHw{c0E{W$x9necyY_##9)~%>in`p5nyM64B^7H^; z=ZgMNNd}>4cJ&pc{YPEa3x{si<{@`1J%8NXj?}3cHC=G%ARGmBRl~$K@ zfNCRH=a9e^GFxqUBH}!uc3-FWtWY1a&U#2J28V-fcDryHAzctxk`U8zG@rhyCCUKX$FoN6pJd^UaZQgP+Lv2iTK|7s%A3^dP;>@8ogCeCOZ z*aT;50(kOwqvZnP{__ya!>|=@*6KAikn8$CoKSw56dD#5n4NI@rhmX4x!y&_fQYI3 zXKrE3de&vs!oq#Ae%pswk`*z{JPD!Qnj#R;_?A@Z;$(c*fNkhq)Pfv}JorM|$|VXD zIT;vJZmt-wX29Mjn562|n$P7|DmSL5yr8E%TC!RLQ|G{{bTJ zCei}b8O*X5ly^MKShM1CUT`@ENVjnQIfmGAXJf`<xjAxApI9CBM^m*8!vi=(I^i2W~k>--xlOv0+6#pTEyY3_-LD&PzaI zbUv|wog-xHkBHU4n2f%~+j^HL#pt-y(a|Kon$r9|{`e78XDvwLHewWF9bXP-7TjG^NK7uCAlyYRahDH3J$=ruVmmOD z;=MR|i@!nVGg(7U5@BBr_kflx4BUi;L1Tp?67+7GQN?JgNz&auCXvNARV4EdZcuP| z&VQnc$(C&Ns_f*FZZH2;XrvRJN7@Vyz^D?J(V_te`u?N~a}0$-xx%5-#MfNK-qVHdvW;()Z@m>@@Fii_*IY!bw;K3HFcMPePFc!g-4H6)%r!IdqF}58TtqiU%xQZ zB|||zG9I#M0D4(4aXbOW7BPgZ86C88+Ngo-ziC^97gTtiECwbZ%;oG_M=0ArH1kp5 zC?nVO$C*zFr;1301s$A`)F~*x!N!#V+;AMm8Ygj!dJisrh*psmmFcG>(j0$gG=TsE zI%GP&LPIw_R>}{a!duD90!9ex3F$67k-ZO=+2~aU3_zgebT7aU2Pbi9O^nq5u?z~D zVWfrxP_9PT;G!7t**HNF_V4UZ3|)4(iMe^IHa1FQcBv3@VyxH_DcQhZgMTAg>#cgaO>zh zbv5ngE`AyHpfDXHHrfBxt_7b(hi)vA`39$~){lc`Y}l{`0F{`Z>+ z@lxcO1dNkVs;sJhghs~?(PD;DOsPBb)Vn=h&acyj+K4tm{!ED-Ll z)%4?(+0jONk`l+-f}_9cojfkG*c7Ubja8sC{4D*zNc&CR+GD+3+Aw)>IcwJRzauGn zyjVU24Ooae=mzg>8g~IUr~GrT^)Cf%AEQs+Jkh*XIeJPn)=gF*4ANFP#j>iy{Uf~% z+0^$ESc_ z&BHMCCw|Rg+Pi3(JHQO~&1akJcP;Lw*!eXA3y9M7D82^5JlgD~otPT_q@Y&OK$*a=0GH%`*-GknA8M0m_O|r0+y__>{Qn z{^9W=r`&sHxoay{GMzx<#cdd(%1m)NJ<8M939%Sb=Hb)_$&Nvc|0tD`&i^eOWpK!B z7SYh*ti9MjsI9K}eiW3SqnmBlPa5OqXbHUT;vH~Cv#9{7e9!-!Ea)<2L1X1|Je)I% z|0@WXDemSBWv};H88v=JV4EhRCP|dhc8#zm0MAMV|JT+TXCPc*DwV2lsaQhc!SNX& zwbjdewQreUqIm52u4_o9;>2(QZn3xk04;Rz0NbH}o(ke0I@T#jtU0n;B%6X6*uj~b zWFpCU>6UXeWS*INJ&om^SkC#5 zB;^ZxC4T?lS?GWxOzfvUw5A_d6Z!Mxb)2^o z{{&JKKsV)u`)EU6cyC_o$*7-ACC(E{58;K&vrP^)J=FbZa(*r$^BA{S@T(j<@MIN9 zm!zlbAubP^>oGTmg#1KU2*kSz)9vQC3gdt0X6!cOMFw>b6c}$IS4aA+HwBf!4rrhW zX>J`TY1w%fWWyS%!Bg^)Q;Cr06oMmQ*Dvp?k3`(|4~vFRwpXs-9E)(-Mv2i;@*p3W zI`!@q9t3zZG23Jqk@_8{hp1G;gSc04ZgXxF zN_)`21~4RnBMCa^zq9-|KqL7pz@)JFVnJrFXyx{+!)+6;{ES<=Rp9Oy^L}qI`2LB>n(SoZiSVc!Vb}79KV`8m^c7Tp0VxB+7Ta}a0G$@|BBMGKaIGHGeWD9* zaYP#U(UCH^8>$PQ9lE?hIi^4l`Iz1lJ2)D=6*(L~neBwC*Yl3sA&k+eVDGS_&0Ztz z;$iS+#OViMk|>d5PXeI(Ps31reafqaw#n9aPyJ>k&p??KX;_YRI@_XfKdw6Mh%u6_ z-EmUooRPPLX-6S{i4fIrYRF`?$1Oz*x#HDt8FFdyTrP=NaoRYnfHYKKw0T^?k6>c!4ewzx%kES&rqq+*ORUE`X)Yrk+uOQ9>)&mn- z>nF*$A{?(J=>XY3$0A9gqKL<)%S+{pGeGUQUUyBS&2gZ7BI9tatp3$?uSjkxc&BlV z44!m};zf)qYs{{qVS9k7B}^jy@@H--b2Fkfy$+53mxQ3_h!=dO+%bbCOw^Zs6I)et zu>ay4Z04|oab+fL&4Ik|1}wvMTkc@&k;3XhpH%K1@uo8nE`&=Rc3uYR`jtYIw(4Ai zzO0f2aPxG{$L9=)A(Er7!P&EPj+!9F?mk%>hE~ZvAzq9amWy?Wi2oovG`imGbwJv& zQk4D>Wl#i&AOTC=iyh-4M32qr`c6!ybmPm*_C!krk$JTb{Z9-jbOt|M@$(S8KzA@p z`jTF#1&R?c)NjC@6Q^hTmG%bKFoyWkFhdyz7P zJ9A>wH-wXfW$ZN$w;+1?H%Kchdr1CsHx_Rr%fY4IU$~R4lq_bjYX?k5Ps|?EAs{wm zHC#|N3xThwI!?A<1~dQVJ9_w;yTV22*RNouYa&bDkwrb1X?rG;7^KQT!ZpeQu-Zu&Qv1n&%;Vw=D zVnCwOMcd@2_gf~9n)Ml2g|A`wN4lb!f;X`k-!7s7AyIYyA?Y#U&Wr-TR%vB*`*((lLyaO! z@H9N^?)DWOGjd6;k;a7F3Pcmo2U%##HfOXh0Q`cSqT660q9|i-iG*~1k8c3`U@mhQ z9%=QIzC}-{ja6q+BNsNM0@dS%yz!E$0$Uf3hY7OTDmm1R7wTmbmVdsVaZ!(*+xSS% zB7dhTnE0O7%hcUepNa{_bP3@AYg>PZlU4?6yv^5XTG;I}E5Pc0xEbrZt8NQ-UjQkN zh5nEKSG;TEU`gHOAV+iwY5om+lJ#1`OO+Zo-t3;+$D%i9V{}MaoL@&f9hiD$I($$i zBJ{s;Ui|)xx*uX<%FLMFn_*132TT&vsC06#IQ^2FT&9~Jt!aVnRY%jVI*N==#ghZE zH60_6gns2alQg+%a>PjwktUG5Jd-W)u}PIsS?1MklTV3eum~r%KM| zw%sw>=cyd*&Byga2Fa3edkk~T8JPUSZ{o*0)59()!Tlqc*`PS9|`&IH3>+A(6A znHn!y86%lbV3*LYKYsn4<)$0~CCR7b0a_6~CPAN1u_o71=y`ykldzFIs zAwA8Q2(bdci%MW@UsX@dheivzl`!ghhfxH&wb!IYr;*Dtrx9eB9t$)@WMMu_O!=4e z37P>k%o?p3qNI7m2OX?oBZ#GWJnpX!Lb&l9jC1u|&5}Be zuNz$OifAEx2+X$8f(lT%vhT@8=t1CAGJRL{Rgkh^n-aOHb~x6h)hecF6-cE$Q&oj& zx@?krI*BArqsH+dc$(=RYC}=4=rW5_JKHcqmKiQRXYRd{e?nVxpB#76 zehhJ=b8V%NP|`W36L_erGp)fyT!I0QDDnD zvZ(i{amUYvz6Q*vePx9feVKBjq(m>qFZYf%hBGvYnSB9Nuc`!~Ba;}p5YOpBM-66e z-Tscx)+G0Y%>%TmlS1B+zX~JW_q7C?>V~R3A_^_`y&hSasbE;h^(%96zx7LLZ~zCSeEGWK_h0N$?74K?uXhJVr4& zbNGVhG+;00Vy>UhB*+n0Ly<^vWG_WElh2WtlopVNBFp~rB~hdf8>qFIP;J2i>j&am z(M$k+OD-KWvtG^jESp&*nmWk-hrSeiEw7R2pv%$LVemho{Xl-;y^zdzuE`V3y_mhu zhq}1n-UFc1oln-{wZPj!?cRU-ZF{K{EDE@~-59T?d%o1&OG#CoJ_cI*;7E4@&zY0y z*-rr*9-oCyKd_>%W&`y_SKx*JFb-1o7a()eYvVrJ9MNYflTRt+v&M+)rB)D`IAEbP z*o11rH=!lkGkEhQYUEJf26O8wa!tO07goSz*Z|5OazjUAs#MPgunI5SU)7MHf;p2lIiQBk&~;8_^*u=cs4O6n zz&rcjj#3qH?o?5_3H*~eJxWEnp#opquD{M@_8FTh;O0_QK~PrIj|x(^5~@s+Q_tgg z*sSOg9QB;dc|+=hkkiH_lOVESjI+nddnap_#X#%^A<`0Is;oL{BAr;Y6-?Mx0rRZI zU#t7Z{T`$ygER`UX^Y+C@ut-5jnf$Dy=RCbR9X2LpKW z&J(U+Qw&ksP~NFdYeGr#pl(r2ECq|ahrU|Kln4IY{-CM_F;y~UFGz*H z%FUnPW92wE`hxRZ&@SFWQaU$}_0?RVQ`RNQ;w~5Aw47{lX!&$4!w%5HCGB`XR2jd- zeHA+(MYo8nm|cbpbecOe;H;XTMbac=0OqQTdHFy{_Bpm#4*lM^_3RWG57#jpDdhKb z7_5iSg}jPxa}!{pKMoc{$|W>6F3DsnO}lG=@i({LjQAHHCRxl8@A9ikV+a8>*O>$P z)xZi6>vq-l=;vF}LNw(z{kDv2>dK-DeAjW1%J6Pw_j`tgTm>5OyDNGgP@IC63W0ONIH#1v!(4ETbv<*Q&qf57GgC zNjhbz*Jik8+$nPDWqAV1Ub)&I?2m}nACeJa0J?^r{#<#{icVRiopcO{3nEo7FX%_N zneEJG7zncBft+Uagx)vV7*Hcz@>Xus;GiUyZ0OpeucLm+kzUrj%k8zj7)Aog@V0%5 z9CObly(psG(Y!##Jlx7L4E>8t!I#k1M@@4 zgh0YZ$>-oAb|}(tQAckt$4#;x1&KsR&hghdLY$%=-kVDq83fKNu9gKRygh`^#WTtw zq}pT$FL89PPkVDE(o9p>zJ%>J2vE$V@MRt3jzVlR_>j%*?Tgu0&DZu>=GIZ8;o2HX zc#fAs`~$T5cAn#K&d^5gK&5^FX7NK2MJqn8pHv{^H;)d8?F(P$(DI&bD_(n z;LsOX`4>$kEymBCVmqJxt3vxMf+}b%Yib&Lq~ct=8W ziMf4fc~V|c1`B}p99$AE-9p7Q0L}VhgcQH9NrYbQH{N*m2hq^Aa0sQEif#up`+N2M z+MG+)yEg_ol>US9BNiDBY81D0o;e~9WSL?vAQ_{Jtr_q}2gh&e{gG#;vp_OsV&oos7dxg?F5uL zllABiz`NhsE(gimJN!P!{Q9XE+DfrhB_&4JKSTK$3psx_wc2CzZS1~Ho#-i=boRGh zPo0D?UyN6X){5=LrDXhn5HI#Cxox1bR4kW=698AH8v8UXN%*l;q7$i>d)5Pv~qeT&6u}duAw%mifBxL(}W== z*798Auh$>;xlC5O=r;L3gT@TJ{fr_JbJJ&~Gre#_hJ9(z3@$MJBn5&sRlz^s2Tl`x zj$ksu73TMbWIXpC+0v|Mn27opi4MbrB+te&%3;Wm0$xXQlgU>ltgYRf3r>A+>&>ba1F zfEGeso#MN1P#|jHK%|F9hWlPssZC+~d zCgZ08JW=x(eu#3nqWs+>DA=3J9@qq6Opf_eLGqTkiZkh9NO**xsOak z)UC(Ak zO#5dwaIUtrDCKn}sVnIPX3@e9lG#Ec(u~L;>Lz?fRx@g8$8%1;ZV6iS#mL5^SZi#E zuYS(*adK`8w=L*KBi!yfbazX5{aqV_+Uz97I2fdX%W%$ zu`6-9X9%;csHrT&7rK;9-REWlIrcA%8N!OU zDNVT-IUG!7XpJ;}K}FVI(W!!xNz#^y7@oiLQ`^X>Os)W~!$AlXH~MhH1#?l8&{bZB z8c-$|IB8+}^lO*YJ7u?a_|l+V1*|NsS)h;WK!eslWIV_*Rd1vbwgVB9o;}N`cjga64gqDWLf!KuV$R zhG7N#VTIALHBwEIn5*d9!}hgKMY!(a5V*WaE_LZ$JTnExEu%`big|Y?++&ZP)HUal z=g@RXL|>*NZo036c8srK6dy`g2Z2!?rTfF0w*C!^3vvzQGGiczQalA{(AysYntkE; z6*P8qpVNeX{t+^*Y8+1IoPHji3wzviE=r$T57vvzq&x8b(Qu!;@M^mEop6TwkM_re zZ==HrTWnN&e?Aw8cEW9Ik@yNcDdhLg?|4UOBKhA~L}xTW8xct){jtqT7lr>qibhsV zck>b{NpVh8F_<qX$D%?>@KMM0*UMHOKME)lKwk^_6&nO%~FZySwJul+s>jg_} zpLkV|ZhAe`32-eAHgZJH&1fF z?ME5d%eH}FPKsF>5P;CY%hTimys)|FjC7*LZk@BUEk6EcG20yT&LANN7;~fc-Dzju z-rGF(U>zt0UGj@bouHG?gTYKkn+xUObEwGvXm8(vPw`+Xq5n6cDxD{_o%~fW|AT_F z)JkgkZ%6h#FPJi(I8CyAh9A!Hrn5%4401Eb%#0wR!C*;#v{o@#nzKE|u^4!}O!Rrt zhBz}MtF@jVVyf-++7ihQJD2=&ynP{^+VKVvIkKKP(cSh{=6{-8w{b6_{@>|I0H1fse86JhsfG z+&KjOksVE$#Bs33aBX+@MN^s|?g1UJF8U0y6a~DA# zjFg2C=Ym{gGOpQxhNhC+CU;8m|*k6$e$#S!N>0nJ?+{bB<{_-~*~*i6#NheuM6f^V^93 zO_GajLCc!Ucz(Az3Wrv^;Qjy7B5*$A9UFT{39$_cI6?PLl>MH0wF3+>v=IM_=rUd!OB|#6r6rJQcRC-9&K3wSb- zdshQ4kJY&Xc9UWS*FO^AEib*l2`6A3fT5$QI&MSe>15LVOF5YU_uBLgP{;P9Bu|iA zut5m;;mR0+Ew8zO?hgU^B_YN}8o0Q#B=b=BfkcSXLW4kmSppW>+*6g)Frl-kHg-CQ zj0#n`w_p}@Wo*iKO;l2BT#4k@M2?My6S>=>F=m;cfOT<={o4*SXjqdr^d;pZ6ZSZb&a^pq$hi@FQc>LHEh5_n0n!ZXf9f1Y*=ilJc`5$Z`^i9U` z&19$6Ei^6%(-nD>tv*4UWwCv4f08|K9wpmsq&qkv_?jKq8)Ry$(+}wrna`n%g+%&7 za0?N3s6n8G6t>UOiDQISpf+(IF4v57u2@wvQ>B_6WrNLmVUk_Huo|#^Glr7ETb*kA z8ZuD~Ae{Ye-nQA6h~JIb6ouJD;pI6{8&lKE2Os8N*O*;L8*@9^fnx3E_W9#n$?u1m zBZ9;#(Zm3wWw_w<^7Rsx?RcXpSu*(;jSgIx)(Y=Th2s&q^u&T;a|yjk6^v?&Zs$K3 zUGN!D9q+MDhhog^sBX&~>>)SC_|A$l&pZqe^c+1ZbA-o7VRqeL2{CEdh?$U_65aYE zjU1^|#PTM_GC(rtuh#MpW&08jH9#WmxemFl&uSrGOixSq;_9#nIJ8pNrX>G^vkY0` zGjJMN;xpz_1xsp6nJLZdy%+q4q~CRQ((@}+zOF`!+h}5VDeL|0BdB<+zWZ=aW@s@) zSE;reOwsAj7p%FgCElu#7+Ui@PvTvBL`dr;j6SXZM$teT)NQ++)xw|&`CXRMXp>Q~ z$ODipId$W#PaesmT)8JvxE{6Oix!ONBIz|HH3Bvy5oC*^u`_<{Rjy-pR%Pd_O^F17 z?HCEd<|*;=H8bDC)kVWhka-V04lA86o2to%jkhHKhhWX(V~9~eStyTcB`)2w#Vs--9Vn5D$+!`%8x0QO%fwIbOY$T-dQGv9F}}|;AD$c z`^i=$4wWvuB4d1_Px^%*PhYg5TVUhAQ`1U0D(H>rQ&9}-8HXU0j1|)q)t1oBU9s(B zhc^VbCX>t^q!RT|hBQfB`vNf?dTMNQr$%d_s{sh+FRr*OwN zY7Eeuyri@#{LoUiW1*za+jlYhM|aUyOf>?87^WN|kU)?OA$>FnB2bK01ui@Vf?D+6XxCuVA!W?uTi(ZrD?jUv@EskkS+sF`n_(m~N;*ii|3} z8bJv>u=75*aA0xp8kiC<6%TeJ4)3uT?H%G_c-#XKHqrfpiFfC(UsHMlWRgqb4w@O^ zY_V)Tpu-^7-`8s4BKNe8`m;H#Ft6(^Q?R3T-F4&waAQlP9*G9a86dU zuOo(GC{~GmFwtH_Ib3wNgd+5Z`zfl5w#$GHsWXX!ck(`wPc6li!Wl9YtcxFNN7H9( z8cd!Mvv}2p|9_qPFfO)a0-jtX-BA#YCOmeoQNgnAm&~`9md@Ab-tD2s*xzJCK~K~U zVK3dPV%|##4TdrM5SUf810}SpB`4X+93P)p0zZwFGvN;W6F6uFmTKX|4FRT%R^jzX zGAjk9zU%qK*$EwiB`fo~!<1>ge&@T0$I$wVht=wQkevp}Rd7~4XCc*@(va3BdBHrs zG<>Frg>j&Q6Ie3(3>V@;hP%U(tr+z==l@e=vnNW>xInIm@@g9!U`h>1Hbx9M9>cLw z#y$qcee|Pn-lD?BbYnFZB%E}#CRjCM0%J8zmzxVD6P3hR!I-*2p1Zqq2>qwT%=K<-9blr48^RZe8AueW*DA_!LqX(-`0y{iGy%ezs#~~i+IFa=Y zTVJVzi%-J-NvvRu)kyZMTqJQOoqiIdqU;iuYp6(6d5w}G6aG$9GGI0fQ-;hP(<}CH zf#6;3MwN&G27-KB_WuXQ#k;Vu)R!IL_+{=u{Qj}nbXaDlQuf5+)&pq*pdE!;)t>}# z!qt)2&XZJ4t7a@zazMOD`hS=dRoVFWo?L>zvM6Zy&a~h|N>{?p;7|G4* zFjC4_cu~mo~AnCo|6wUoh1IE?e?2I$kGIdn6%5LKgpR zxizg)E9*1x%0NLH6|G0Qh1Sq+Tx zmUh}8aaWKgdvj5ca32yalsmQqx?90Q6G1tR504%Bi>x-x<;=|Kfj&UF#>CEDGdE^7 z7UnK@UG?GKQUMh0AL5#cU=#|fE1jxLNk}qgMGKtl%_AUIqrwMjmt$qoF~$DsUWUXE zM<}t!kKwP(Q$Ig>0cD-1mcWv}@zCq??~ovk`FO1oEyCbo4B|Ho;79nRd$SZ)pC`9MzYXbv_~kco4M16geLx8?hT zd?sMwd^};k6`#12daJB<*nWf=2>x=aHie;S>mYBJGP&>Otv$NfRWeb3)rJ9p5ris* z$ddE~$=kubM(bF=L1>^N5D)A<-)W*0QrmfvfqXwf3`i@{LCk(4@uMl9&N{lY z8|ZMZT!HN{?hdX?nEuBr$k<->a(Ep-*kpdz_e7qn(fZw|Rei}!p5oXsX%a9m-r@G2 zwX$&7Y!X}M;a7^gsGoLIn2ZeMy?>OLW*cBLzqyp94_<@&pKiE*_c{2~V9;8Qj(L8p zRK7a0fC%;(Dhp6Vw}#tUQ_~uY1-E1_$u*`-f3{eKPjNXF19z6Iri?g-rbXZ**wArv z+BNSPMmj-L1yF59t=S3OZ_u;aV1{U1G1+}446L|*W>tRM;oat{#h#G7RHVT<pVI{jjHt=VyA@VaI&AC+t$C~A?= zH1YF}g04wF1s^p9wXWjTvRS=mwyQ{26=}T0$0e1^FBB>f@<&m3a-qlgvlOdE#b%h< ze+kQ&>S@NDQJ!l7O^lE0Wu57_I*-U8%ph0)iad8m`P>5;0oM04_6w3ibcyt?ITqPN zXDNsEX}|)5!R!-$+VgMLn7;LWK{rcffN8B@ss7c^W@}>jTNo+LM%+2TOmAAJtf0~l zMMN6+-j4iq*WC1W$A?8`8|=t5kyjKTTv6M`{MVQXvfgb>L~krolBt{!1vW3TQ_x}V z(XgU}Q32uB35rM?nVGC7WRUL;ZO2h{>)F_A;7)vWnbvWoe^;Y)Zai)PqCkq ze*SR6`hHkX34ow<`;ot9jj*;>)axG7TIV__v1)XYc{NIGIXxfYk*b*|Or z^ftf!*py|@0yRMzS1m+;Z)S?0WZFHp_6+Oc614D=Vw(U6mXxAGDg`%8$K`+Hw~^Wz zTqLecaA?g-8- zn?0?dcDa)1V6`E^3EI#~^>N5@wM&_c#tTv|IP5hvOM$3jO`Y4>*Eq~E0?zW&%PSr? zOjA_XSA){H-O|$))deNVu3`~&J+ocIT0IKwq2k4BA&O3Td5d_{D+Ru3hv#ob1PRjn zb9@?olI3CFba&x;4x>0Mb=*^uP$5Xd?(+bP_qk5El@ez_zu==gJWZ=IaOIt-aMMlE z5v=TR=s+h{R3~O~L#&DeU{LT=ixxeg^x#yH8llOv&gqlQfze{J>=TR%;Yc`*3%DLz z^sI^AZy=Qk@mB|_DrybnzqQyMGdZO?cHfI3nx{dVL6rQ3)32(2=L#a}Vt)xY-gCtM zdS{I|56vTOXH6u~uuc8|F8ZnTv))4eD%*|i{K}!yRR9lBqnGp2G&)L2=eTTl778WX zTX`>2di8iTn2X4q_+CH%eTnwx+A@j)Mv6#d7i_T||9pfyVek(6Z$mT{D*Az?SgYDa zzAX$C_+0K9x#HHNV*+5DwL4$tMULCz26vW*Gm8`gEbrs^VxZcl197Kvf)6 zd-X0ux2ynf5(6^vK!0K#ASR`Ri~jNQlqNFi10;!m8r!bNy}ec^R{~97u1}gi^Uv#C zqDIrJv1M*P_-!g?pe#N44n=y2w9_?FksHXN7N3wqzl4EcNmTudb>2WO6$eLy9Ld8l^5Tjrlj?al-D#y zUKV6tv&{R0ANlhXSEy!K5YL=u1IX*y(mFmI~%HG>LVG;M+?I9}96;vMJMiWaTA8;?Z9?niom#D#gGLYYfdo&;@K z#_OIom`vWS#>2UjSNfb?_gq3N*Kz);LeG#CqT_NIIZHufV~EWH!UU#+jv98i_$Nz5 zYaZ1gcf@LvRiPMZ{Si}r>!}HU&vDYV1fIOEesOYIP}nP}1(yLlV9x8FwJ`1o3&c$t z6?xOg`;LP@9x2-^oFC5sr9enRQhHa?3Jvhc#wlcPeI}|zREnb=Sq>_E$QN@%`eP9$ z70fIg#(6g#f^$GE{b-wC3M%qm6rDxt&sC3`q7?}lW`%XXkas6$X7P*)coMWS4DR5J z-dIvP2-1L#^pCyzMLnXoDA-3zP2wzzm$k{#En^Qe{!)EPxx`=>;2220DAj(gNl{Ug zmx>cA$r?cBe@3(2N4YhPeSLN+LG?`Qi!o@Uv0|xac#=!f-P=2qW5+E-BbrW-t(;_p z7!-~tX-BU+uTfpCaC*$@X4SlVKO1hA?`_q*w$rz!)eqi8Z4`gwAG}di9v7!Kzi69G z6hSutMg8P{EhX2)x50~rQE{N9;13bbEmfPfypZt8^or)j-)qIMfV?7<9g)Ga|6Z9t z(-%_$ zQbf7utBUoGqu9YP)olrXt|&P8&`AlSF4&G{-Uqx;kKYBmJv@PkSnspRfysOiBf z< z(sgs=%~i;jB?3QE00fMTJ|XUyWKPetXR)2<>sPI!yOT>}vRu5>xLUwi3uuB&N%ws- zfsPG!5keyv`SH{-q~8vlwN-sA9DZczL)((`(i`-+2;q)+KXEb{Uj$gmhwSL09f36B zS=-fm)6rlJjmR(0gr<*tfEUQ`T%R~R_S_GZT!?Q=v`L@8{Mzsh)KIkQF}lLM1RQPE z21`f-fF%~F05aw{eD_4-MAKt8&BaG-Aa|(NV!u-mNwIx4nV79A$BCb_Yl~<>T0rQ^ zyuLT<+U4!RU2JKbm@Z%)TE2!VqqOh5W;Z_VwQ{jgn@*a|ZflJugr`@fi&komL5_=s zQ(x9YHJ8K_yseZ07zmWcHHjSL8lSctAeEm=Y~W;(K+6gM)p~~}=MrUQnS|riEDN2D z#0JQj%Z?ZNpGyT3k*C2Uf2lK7h8|Bk(c7II4V?!BDVl;g0jt^Agd>feIXgC7UpsS( zB($bL2m^tK4IW+xY2x2Mv-RUm?Hj%IT^i_hwoCCj`Tej7&%~0t^BKG^#}W62ra2?7 zD{byfF1#a-l_$SxrS1i2n3VSgM~)3%o@8m?13aab(UzpH0JJo+UzZ;!w`qi0H{V5- zY*3LXHzTtZ03|3;%AUaGBmoS^?%ZWByCUqkUZ=LC`8C0!8le3D4DEU4=%C}e=a_@B zPJv}e7Edou6PDQtm%|Q0%^3bwwOROyRuPyX_(S}5M^mdy_q7|0vB=*fqL_vsqX#*pl-cHI%A*WCC7PNHQ3zNyb9JLf_y%wi_B%q(J2OnCy9y-;#o? z>_!{**5VcI;?5cehj9xk*E^@+Z4tTI=U)Nn9KWpy#J}VW7SB-ZLYfl)P5aD^>rDb! z;9Y*c{^$#z%Xt%e7XsT}+70=scuD$mf10ZGU3?7%ZH*(qM5B+)90$q%{rd8OspbX$DM> z%Pn{#is-vsBx(MIUh2o4OM8QkY$grhd6zHk=5~pqs!5A#p2T{7B@&7+tJ-y8^NC`i z&}{vi^*TLfOkq`B^n#OX|-HHx7+ zhXtgjTtMzM42XhH&mtPkp~GOz@%lic62mCh2-=ZuI5GuQaV1TqA)O6}KS`sSTLUq& zb@GIaLGXRK$b$*a5~OpWeo%acA06~C!iHIjt@RVC*LdwaRzN1LUrvx5RI0rl>?8pW z;uY>@x||>^!99jEDs0UjeOuq?cK1%VyHA@JzGj%(ZplPKlIeJ*$4g?L8ioD1T>p)O zKYMV*2bgRM>wtL=ZHupH)@<~}&D$!^CWW6|Nu|25-2dZqbqe^gGBmNfREfu(>t|=_ z3~6$}RsaYu9$hywZUZSn-=MTRIbDipO3ngZ&3t-?6a=C63-;1gp}7%c(#WL=xi@Q@ zHozg$qHnJkB>GOTzbjA!$RQ@(jx2I+lSaOpldqI{$|V0dl90&)UV74>WO*B%-j{#C zwe%C0`S{(0w{v7KW}=NyrDaCt!4!~ejX~V+Zzg;AL*O_aVA1s>1Y^R+BD0(`#J5yQ zAl;GQGMirdA`J4x|B4;g*?l{~?$DCWU(_LIJ$E4fix5>p4O)lc_9!|M^Ow%8vP}1a zts-`D26@t^4pR=WLnzNX6kUTXXVs>6uTmB%+FjHI6hg2De<^>BHD23>$pfE8VOFy| zgYrPf>}HqOCfY(Cs^(s^^QTITJ)@>F&;pJvgD*Xld?g&Ja7r)y-|*~&-L^mT zG)$=IhO>CcoRSA{@dQT5`M8mZYnHvp5rjc^9>L%%mnR)!P=FrcvJ9DC^E&Kq7STbM z1X2;j(xKl8CSJ`*a_u3ThNLo#>QDg+dNnC^82KkBRi&MxaU%6uH`6i&D}0i#cug}* z7!k-kbGQ~XwCfD#Xt+$j^RZ!NN!y$gfZkKZsN$S$CtSxxJXanBb#!niJ#o?B4H$ro z=G_wvu%YCvhozT=($E9MGC#^-J^!k0q4f+wZ=hv7*imXGz4Om=%Gj;i?!D;nqVCj71Y2kf;=Q{_666YY^JW z%Kb`Y{3H?GzsgTdjN6e3i9FzK^6%-Ed=-GBgsSBVE>CD??`e&dr&`9|&mOTg_lWJ=(YvM{FcSA^DTxqZnsEKJyMk2I z|CWcJoK9BwqMQ}!KC8ATSl79Pz*d!DZwE0@9K};gd z7%_nU5akT|f4wnhb~~~cKvp!kSP4^lB$SejfbH29h%=$@Wm&Lk@HVO=C7XZt9s9O& z;a)~7s!}d@K*qA)Be}6yeJ-tD3u_TrZ&L~FqjPL>xK&NF5s?HrY%$H|?O=)n1=`-R2}=e6s1D&{S8rIFY0>DKRN8Bsk_{`HmQ_9N@0u=P zh3`j>CI>GLW2RQU=C`(5`H&qJcejzbNe9bls`CJ0s#Qg-ZSj~6U%Sr|Gk`PD(9LB$I@I`w-7R(he7+L985FSEJG`hDX1RX5+|bP)z<=0C?U1 z6!&{7eeD8G*mzWc&i!u11>If?4x|7bG8{|gcc62YE~oIv^yi=yd=oTu`fgQif=eGDbWpq^ zjR>2}qvNhE#u>RYaC7hxS8IQ_9Ku~R` z9nxWJCB2*ppqBh-g_5n6G(J8_U*`ue8ZnXlmprmfHocyno#t4A1k_DjdQXafr>q-9 zDe1m(bql=AYM2iQ!VZpKE6{aPBw$T^QtXYo>26_{*9sr198IbVB@FojsNr{}Qpmvz zIDu&~`NiLHnORVys5Ti+M2hM?%)nXQmm-0c5RE1^VjY~Hn#v?yi0w#a=9uNiuXydG z>;l_)zM2OD>Tc*ok|0{J;MF3^{Mf8icbY0Xq(ItxiSgj|Zkic%8^z#hAZ$lc9?WLl zNk5|FKf5_L7se3aa6^&`K($>C>@T64M|R*(G2$7wIl|$BnT9>Bd5WoWE)mt|o zt+R=jbtTv1Hgp?**37zS6eoR(?fiIE@k?^wKRw41v1if36WVbThZ!^Z`h2JT7;d{h z#j0!U6&yNSYLo9Wf(LDApNI8=&)uGCf6@GoL8P>kvUrzKKrNi;8*LkH`L(K?1 zZze6Z1;vKrH|!oj&AGm?8apCKafRE5QqggBEy<1lfM~pJfHVXB$rg{=jj8nrjG_P- zN??V$4!%mXWuHoAp{h%rO|DiMi1Sy))@Sob3d9M#HXuiF8`Q+Ii}TN;uQ+3HsWa<| z#oVvwrLFrG>qK`z&aaaef_~HA&m8SPA^Wx#SE)$wc$;Ac?`JguJ?@nhT}cW1N+slX z-6?jOx?})nB+?5=THgPnG5(bmi6D{;#qu2 zM^Sct2;Gk{t2j;Jl{Qa({!aC^mNm(S0oa`N*$5ft+>ddXD^*gRyUxWmfJeFM3>VV9cX%9{4v~TKy!_9Nh?th+myI7 z9aq7>NPjN%y3#At7)?$Gl=d*blkiqN{H6Q~Zx^)*&<5K^uT3}!RR+Om(4jY_fa~j# z7po}2wQ9`hGcblsdw2ZR&hg7-#cAy=TpFzd{7MdM51<7d7>6;te2GwRrt=KBP# zT%^mqDOy&eBP6v40yI1ud(4A6fMlJM#jFUN>31nZ2ENjmWVDTs0knCT`^+|1RD6Cl zt0h(OMv+Qe4h`CLR)iOmtex7};=r>B55CBAm=Q3qt+(durBLG4Xgxl56uYbUZ8Qf( zh8y&33nT^;Ls`L{@Q6P$&fZiDo7Tl1DkvC_%tjn8wU$s$L}NdoM--)NgZJf;U@uw@ zH}q2iJ%SFn4tq|Xm+3}ZE4Jx)2I&=k`XXyk1dDB+d@Te4a^l;)pw_*zk|MQlDIk;a zV@OU{z;q3_WVJLFYo&Bh`_OF7J*}ca?2W1pm^#(h`6WCz`Y3foljf+Pd$@#+PQjvm z2F+}jbk+x|&2aSxme(4XVbd4;Z1==3p^NhbAkErtfox-=PW#q>MoJAa_hxg*f);+j zTI*Ml8}m+AR2ms|RTOX!2{=V+o`)FJxuTkwRb||`I+JJ*+q0?r8sqdNdumoARIDj5 zsATFEWUD&Ya^DEWkY5MOx~A@KqA%ZhYER|L&JTpSnex)`3@XNC>M~H)&!~kr>#$o2 zOWzDrfbTAIg_f@;kMFNSL`K$ek6i#XbDu4HS zN=b*`j<9WMNV#xNeY(wKA_XYes9C}QAHcCNNFGpnnKm_=O}?e$~r?z=r0oPNe|?gZr1E`u64du09Q_=E95Z$Y!!hCQsxp=227UX5 z1(=n$E7hbImi@stq|Vi_2^I2MmM=|ft83VelE&875+Nre;Y_1?K^QdZ(E#k+%TjcM7Zl2K^% zSG6Efa`;!1e6R|1G{Q^td6U*SXM(7AtjM@Rx1cN9kVCZut_fzC4Rpl=-4J1-WL+6) zn~>-_OW^}MgahQ>qBu$|jzC(dux>PQjx-P0R2u%=D}7~#EB=zN$v)Dg<8oHBpyT>> z*Pt+YE~dK)pDAy)=8K}sjFOsV#2JW}wP^~6ZqL+G?G&vIjqY28^p@7W`m;ztE`*Shhw9}x| zosKdVh{cT_&g{jeR{c|o;_W-%jS(9u04m*{?IbL!4ym+*nf0+$z-S=_U;}OuhUXtQ z(%w9+L&X_)^_6(}SLHp%qH>ny+B5JUz?IxE+Xs>XD&R zkY21S918zhe_W0eNv2wPZ|uRwteFi}Zb_}A07L89&e#tt%G&AV)ipPR?FMI^o(3YM zoG3H!h}0Vh=bD0x_33Itt`IM;yPeb>zluPq#a}z}iEZ%(j}}!o`r5O#DB@?Exf**> zt{jZpCb-#ErK%y>TxWSyT8-eUN@j!XztZIJD>eDt<}~2$#v7{SI_aT(C|>w}tJO(1 zU%ifZJ}=262ox+Qk*EMz)f>td3G3TXC>4O8vqdMT6%5Dc!v_|a;N|V_U!hiOI;X4C z3QSB6#QVvf`UQ^C+We30Lhl6%&Iu!g(Na8Wc9o&yI(?vSyw_!&S?>&y*PoyxF^h*s zl1gNI*whu&5lS|HdlGul6h9C#dIH%&rL1EpAdViyY+`@*<^Ir=EdV{?1BNw1P^Xir*g6Eq{l=vtQDa`~nKmTaT zn_~eSETmyN`h{LnOOoTp;0Rk2q}=UiiPJD7|H{?vre3Nb9pl<5B9yhw-zA&A7^T>% z2-wwS*nE4+AbOBc;S_qH9=q5jS4VnfN2=Z+K}^i%QO?Zo{n`nH64;$__u8NRs3`M6s;cds^y1;`un6IcRK z?21JZ-$lak6pUHTK22FWtW+Z#42FTH9au=I<&n)NWL61vvUT|gU26q41X^CyW^L?B z57_O35g+;^%S&S zR&g0PhIRr7&GIsKVYv?CB}|mP9TeJT6DwWbQKgaWsMFbbQ{L&zP0%`; zxEx1OGzRpi;10c}jVn4JJ7cm?+jI<&&gfy;rJbeE-DpY(VUk zm!_9Qf_xg&MBn(3U=?lsOezwU+Kyq$aXdTA>UVj6?x576;Zbmk`4QjD+NSQ!WphKd zNdC*!AWHA>GCan>KuQ^GEwkp8M~P+fFR)`8w&u&YczJ0v5Cw7m-}9zLDAF>Rikff8#CE%1qS8S4HoOLXi23|wcWacR7H_}{FW z04%K&<&#FC8+5?JYs-4KfE%R4P<$(9X-w3_^eH=$7TJf5 zL13`y$%<&-Et#YLdVV)~p%Wnc4`dZH8KUgL3e|}Ds2db9^`)!mTB~oNWq&-G4KU-f zEK}R_SNEH&Z>jpL0j9>8^i#I{bAn=Hs5da#kefe=hVt9}G8@X1izBP5Q}w`!g&O)O zAa;&dkAxp_7O*wqXyR*i8LgO{tkQy+^F9}^^re9mbD!d^Fg_?Eyaq8JOzDjN*0ye7g<9NppdOk(cG##XwQZ9MY8xPCDmSx>nCcl2+O+B zG)2l0M~E*wKA?xdWGifla%1#efcfirNAH_NAO-^Q}K6 z4ogd5pMkTqlWZX*vP=dF{F3V0luyl7<6W1X_&?%wBIK~Mm;--7dK!FoxA>;ltme_` zQbU~wGG_Ajy0W!opaBI&iW(Z*!iPbcE{_soOUsy^0l!tOQ-=Sv8&fcXE{A$t;xef_ zwdsW9dF35J5+KbP+E2RxtX+YK0{qA1RrS6>JxIm(#~j<8B91gbO2Ni`wF1aF?v>$VdQhBrOZ@5v{?YBf30F38e%N+7c8W>w}qXSNl@N^Mo3Ab$FZt8 zMXu}xb9a58nkEk?3LeCE<9` zej&3=XpvBgFrR)4R{*{00kK2`hHKi5MZs;rwVrK%L1_YO?i} zHLv5|(a5&It3#Gc!mSYRI|+ull*ZEtw1$0HAGw9hY}PiIj&M>T0G8MeXKa&VABpn~ z3|$56g#+Z-{h@WV8MC;PV8j5|kNd#ortX1EXL>A#N`xj~z(^pAI7OOoB*`H3LePlU zs*oHD79h!;SNl@S1dW-a)E(7$TJW>b1AXr!7@b?4X}-~VI4$qGH^M3C-Gl5rO;OFQ zM6+RY+EwchXK(!-je|jP7neeb7^*&jn>apZeJ!RCsABo|iX>M%vk@g^dr4S*H2l_4 zTj`+?!Xx?wbQC+^?ho>;*0M*SE_ztv&!T^{=sY6=n~#`ltQ)7!syWz|Wqi$vBaiIK zq>f;#AF^|6u-ui%vP;uyW!9o|pj^GYGc)S@=F!EGr2USW*N9fL;$uun1@X24QG3BH z5LzA#aP*JPIWbhUPnS7^Q#`lnpwprYP>nXa*Wla4qmZ+fIoiec$RPtFkxk)O_6GK1 z!$3;n!A{BpS6tK|*rNm_ToGoAj5NdfWxxXWN}bgFx%(Q)X!(j6W&p=(=AGnakS3Ey zf+J@hOQLa->p!xyxm~WITHjArZ?(Hbc$a8=sT9h0h@CX`?M*z?wEmV+n@jV7K_|Pgwy4LP{m(6sqV_X%$@u{7}Qs4p*qR1sGiMz(eU$-0lVP6cqh46gzH<7?|c~8 z0j6#b*sZ**7CEuTMEBBr&RuyNE+{=JuM%b(F3y@OH11w4G~N77 zB1PAyS~6T5^D0gc9VI)sL`^gzRp<%r9gRP?B7BAM1_?<6M_#ehWGHg-2nQcA@$w5) zZaC1tl<}s`$bNw0ZDAdcopwnXaj)>!6|M`m;pp8wWuNa=AP%;=VQ3+A#Dms1p)cF{SE6f627QFj{y3ss=?R|^`9pailVZyvnOQe^MV zKGLz4B0N2CU_a_i6zku}fA?0Fnzvq&CX(4@jb$!OI)YG%m?T`35_Z@m{nMki7i^r% z>-e*UK9Cc2$0!FG!3f0_1g3=kN0reOn#k>|(b;-@W>+rAY=oEYBe*cmR_5D+)#anM z64C*})m1nUE%3^8)Mvl%k<_4pCzmBscZq^rAu_&>p4lCe$B-TQU8*gQgwX^))da05 zBkG$vJurBV`RI8VM2HuRBB94*(?Zt`BMx6ac-IFd1YbddZwfdKa6nd%(6hoo7A$>+ zrPClt^S(uRNH!&w-j0|l;EkSr-#dk*NJ87!I%>+im|1Utw0DDkrxyN60)1oETXM2> z$3V{T8V&|}>DJVxla(smRx}jO1t`wTn4_gB=?`R4s*zwS*PHv$%L9`B=9rYCC*dCt zG-pA;@eYGU?-E3SSCo~Se4;AA1YgB&hL`e#{;Njii5F{yY^|2@wkZcm7NUY$;Z%}t0G~-4<>k*{bu|)= zFc2mJ3{IrGs2=UrhoIcVcA^+j@?Na_T<4Kmf23K2wIWx+ib{{5>yhl1HB|6R?12`5 zxnO=Hm=i@Q_vo;v+uI{b)|Yf7h|3sr*x!W$%-5~eoa%CT0^(J`tB4p_JC>?Lt4qybASyd8&edoE2Undu1UrV7)d$pL zvI>`XL`jaec9B-sJn%gMF!sEt{k7BMwu`k*>Hz9KGggz|w7H9IHmsXx2GXWRM3+X% z2@sZeC~GP2$YnFFBK}L+j|VE3i%drQW?s8iO9aZ)eC)w+YV=bDy*lznVsIJUOoCcI zTwR{Zmntop4R%euq%C@Io0S7ezz#7N@4Jv-N0+I`C=h&ixLo)i@t4p3pML_n8t8!6 zkQo={uu}%N8CCEH+_S3}h#Jx-W3O66aHAiACdQUs52Ns$=s0UHY*z1-!D>_(u{k5< zu^P1tm&MQ2rZ>pyw6v)ecAI>mOOe=2*C+y|xjK7Zg5EcB$4&>YCVIbP(&d{e*=WB|vYC z&gXyAKH%=3&*H5C=k2x?91{AfKsE~IV&TPxeCV=qnz#e;&TvgnvW$3on-nQRL!oH$`#^`La3`F_M^qZD78rpMNEbp&0zcjg?}tb9Qz7K zbG5{`vM&`DM)Ipdqy54`C{(Xg4)u~qrg5#6Ts638_G9ihVH4A?QqfCIO)Wc>NJ4fj zo*ZWkOBi)VC}ECAu|S7)y8rFh=}L_FV_4%XBn$d9fT99a5V=yF`I@lq0%p6W2gKso zWe|3GNfE{@r4MUZo?{H0YQo%XLkL~`oVSql73xXPZ=8{S)yyJtK6czdhl(J!&C{XG z6KRRI-7+0M>UvalHN6BzKa!e)`J6l-{n;}e!pSN*f?77Wp@*;A#E=l>fPUV9E{ooS zXGWAcep|&9gK^eaIEqmCRR`Z2gL&*=+wj3!M?;j=k|0TN&hGzB>@Snd|U zWiSpPB9WfmRCS_$E^G_Yv@TU{K)C4t zyE((A{FSzCKi*aKtX4j9+3{iqpD{P(v(#XJEpt1MJ zYBxAcVtE$el3dAX)@JRft}{X2O;%B(!eO%A@F}B$a9bai3)6ulMb)6C!2G&nH z(o#8>f(WNOnMqD4u^hYHiL&134mGBvNvTAYT$vu9Jh2LkT;tC$KZ3?Y2>86^?$?Uu z<#)s!;@b-tA;o0>yT-Dr+k-N;zJmTSICo9)=yhi2k2xwl|WmInPp=<-lCtva! z2byC#QNjW3-T-(Mof&axnl=qBe#QKnN2kBPG4m4on|ibN#RB(?2U~6=`#!=MYTBz= zKRi0pRcQi)d!$10pZjh~wEB)AEr|{zAYqCaktIS$;rorrj#)@~Y^vbZw0A%n(|KY; zPQ-zY0N$QQ6noXGP@ZVzx$cJbUQ7jxb6F)$EOfdRV|5rcuKg3T*^AwVqqxBr@CIP; z+RtVR=6TK7zW_&C^D1O{CGJ+=WITR3hqgvZ12tK@Bf`TN2l@Cz7zYh8vXx=Jw3x)K zhTQ;eB_UXLt`#RBsCXcEr+LldD_v{5VuJFbUow!% zQR<)vD_L`7iEXoCt~Ksa9V~af{p@uT1)~SgDm_=5Tt4){x7|L(ZZo^8H}y4zf@FkKAM0&5swqle8-5 zDd?+!{;&hQkkMctb$-ZS(z11YWD11&P?5hI3_YJ^9n+oS6&-!2mawcb_`^(*@<@O| z#b!P(m!oY{VMVJF&WeuUwL2lMQRIRXuC6I+8G>z^GfCC{m3UIZU<4{0It3m`MQy0V zE*}X)UrxQYl|z{|sdUl-2f;I(N!r2>i(>)gy=7Qp86RGx6^bWA+}&IBXc7Vn)xjy> z_2p*Ntls zs-t?WWoLe6ClqzSq_%&;_grV1SdYS-jBdl-mb3cr6W1Mc&T|CFxhZf=UxX}nU0r_t zdNk}Fl>~^7m1$+_b~&ot&Q(%CaZBtc)tW9ZmYmGo-n%Wimy(w;v(}bi;xwZrn6e6h ztoAv%%V0sN|+CRMa|?C#gSnDf64qAsMI` zk{1$e)rJGkL-g|1+*5E%dF{frg$cGjyww>8c8jgLONnmk6w7KYRWyTZhiSX)a8tB3 z<5K-z7&NXr3SaG6P&mtjd{f9&(rxTv_ueTZ@7gPK9X4DEs6QM|1Os`0?`SNAbQRbG z*R@yFEvcwX&R2+=>_lCez3J(`KIjy`(E@vsBFNSv9antGtae@>QMdd_kXz=5aD{CF&YOc*V;A$9Mu(JR{ow9>np^J-;$e^g6MT| zf9ujS(?L(B<#Wc7@H|r91TPErI8EtDS0FI9l+V9(5}OzcCZ;_}I7^qB06TR45ONnVAzd6|t? zElt}Da!DuJ32lS9eg`iF2}r|)i|l@>o$qZC+S+Z#y60pYl1Djrux%k4)b%}!Z9d0i zZ~0;1kM>Ap8#i}~Ju60SFkVwijr+mz_kS#Mq{Qh)aS^q(l?XdIS5bXsAet(Lon961 zFtKPrm4zZ5GQMYi494mMi?LRLY)!`X7Q0yN&S$D5>Jq+A2@UeZBhy5>?g2YvN5(a( zpnX%$IMr_7kQ%rdBwWleIEvGvzb^dGI6oIBMg@fG$6)wRq&02259NK9su$r(`m>J8 zAi(y+wFtJO*Lty2ex2Nz7}}(iNrO?3*^2DWqyJYElN!Lm2X3Nxqaf_r-8fo5w`ncz zsnLOGeGepcAGOe56W){>BBPivBX@YvFH5LCIvO{xoumywq`9wXhy_6mrPASXEY|2} zyb_2>zC>kn8FS5;pQdI~$OUs*>u$4q<1~>j*B%>2X}I#ojLfCHg_3Q$xWl?A-LiYt znzik25VDyFeLYf+R#V4MM~!58VAF?FtIsyxXqwhy^RVmV?&D<()IqDUf1&pf2=#TI zzyCn;tK+wm*RCvr8F)$ZAkmD*xm1-)&wRNt0>^`+9{c;oV^-{7t@GN4cF za+9M2RTo(cNhLouHtz>8mnVd{^BFfX!aj6$h)#<|W8-KvXyUQG?H+M70I;-fZcO}< z&?ax`m_urh9&+_C5qtWz_{$}uT8WI4GO?|)d&S$tj9$diFXECL5~#8_8uv!y>mCI$ z-W!JM<1_q<8ILEIx}$}mI&v)>)G@;8ehtt$u)x)z#7n?Y1!qrvTjMQ#$B9C+OuAsW zDeQUOKVtvOTJbpYl^mjBi-Y^CrM=+X{7edpdUu71SQMynHXE0BHm5a;21k21&g9|e zP53}QVF7GC$P1QEAk&D886Vj2`8SiPYNprV<*Dn#j0N-6DE}#N?fB_igzv+BHyI^nEZMhN0lh+H7@?x3Xgyg698;w)!N6!)}@5RzR zlq(%ds!0GDWcua4#U`T9bi3_4u7mwQ$x3mmshJW+e9OA^Ot=fw#@@#ALA0w|&daDN zLRcXmA0})FSzI0eJBV+ffpE7LV}q8n4M;AIbN%Mi3LuCjA}o_eyu^&&8$h^@%ptsk z>kh65#uAivzx;($0Mo-h2xqttzNLpuA$g;vgMdZ1!n9n@xX;<5(pw$8LuC$iLB25* z??BCmNC{p`?l}tU?Ra@v)%5_Cu~S{jO2t4nF0`naboiX`Y1bw!z5K=kutEdzW|*sT zRaL)=Ix8)all*WkzYbT!fEfqzrm~GClQQ7^0*%gg9x!l(4lmnaUP2vKsl`RXL~tIx z5$TU#{}XL$!Q1=TNP0wC)Cy%4mKB0iLe=$F9MIq$Ti>>KTITnPUt!inu;TQg`}2u+ z$EAkVl@i#-X|dNw3oTnNJr_Nop{l;YhOtlqC2D#I7sd?4HZq; z1%d_uIW;EtY(4ipL8Y9G!{9XOnMTHKso-@R8+cxTG>V>tpp=M=E6v@a)ae!$3hySc zz8$B$lbJ!HGy2TJCpO*t@z?IDk}XZa;HFh=EZVY{QxFq9emrEiinmL6my<83a=m|k z+8$JSmzB+dE{B6?%H8Eim7#jnw|MVz2uxuNK6w+cJARKr8>dg_y2wr(>cmF-rM#nQ zVrADZhJd7mP;gfnJ?Bj%cGfexTEOrqMbc2p_dTA9=KhloIqdVZ|IlB$au9x6v!WpaAD;yH2}b6i0aC7$LGMKYMQOs+Ly$U3b_q8dOdbG1@Lt@1sJFkc%=h(X zoWGfB0#apW`h3W?zOFCMebDn!ZjNxFn6~F_XCix0Frx@lvj{%R3G4}fLP8Mc5Bs{KMA15RF|SxCoOTm>%z%e{3+HCN^=h=?EqFjBHZ{D%v1dBz*xQ;SwoSduulK zV0@{bW+N1|+?8-yo!KY5ab&!bdI0Ec=gyj4NpV#Hu;7&rH>XiAA1r?Ys)@02BRW`a zl!IW+1mqJc-ptIo{phJHy+8Y7jahlL?;D<-A64mIO3Dl50T$*Z?=qk)sXj{m*9QwU zHwFmfQaY|;*mMrZ;$I&n7NGgwpLJZR@&SXQi+`yHuuN@p)gqM9CnZDdA$T06W^E;< z1VEPkNbJIv3|9QI79PP=LvL-pEo#iqo>9HWo1NYjU5}=jyySyNXgH}}@Rk<}pg~7M zsU7v35oHvxnguvYh-4Ie;p9GrN4nAb)t7O}Re69+a~$BS0xoL=7vFu)FccdRkf}A- zEkF=MdTrbQp{~yvkv0h+M@U7u_ArlXW?ZQ`@jV3+%Mb#`X;#RkkNTQBKa&uTY8nPx z0|rV607G^(mUN_h(F56h=61k9vg}ye7^1Fj+YbWZP<>#&TWA;}LymFcA=NLW=~bvi zzk~Z`la!oX)xCSnty>S{pJhhm*)fdSUz!U;4?vCQk^FhgtC*S3zz*3)Yef9>FKvnH zW#3TwW*D}hL?PP?KTak~!N~%ZSd)jjfXK5JQD_?6oxAf)4q{t=whQ+xiYw>GoL`fg zGs}lKps|yvNr)X~ph~@`Ml*0T5GfJGb&q`3on`5licDmzVJI>Q*LBv@(|bBw zqFsiv+qp4Y(WS}sZenKqa5-M>8IRlLjAxyTpoLRUfEB7~Q{)u9HvP9c`GN?0)SLjJ zG}biC<3K>^63L2fzi{)wHJN%T{$=OS^07zFe(OI}PEj;|=DQ4gi^Ju8`o{$!9OwPy`WvIoo(? zF*(@^(t#pcfF^ybv*Bw{6r`brq?FX^pz#KFDu+Bgf*T-Z3%zo*6-6JDsJGpxL)nl& zyj=2okzec*Dci%-D-K+B6XrMBcN%n;dh5;vrMn$%V&O0=ng?DkML89xrA;=li zubUUiGc){z@49*){slMTX7L%zuy#O66w^(AdVkWY4WP0BW>VnLw?g5dmz z0v(M3v)U!x)m>P%p1P(LqA3n;z{R|g|LfZF zasTk}W&kk?k*^@~?}B7P%3&ll4)!sQ&(7AvP8&)OYA8$|u=}=N$d+F3XTueA{_BYS z^@*j#NyqgyLuyFl^#!#jbiR%s8O>gh(qUQRj+$unLxVul`FrrgDaijkWSartq>rEH zyt!gROv$re=OeV51`bPHJL98Ggnk;Im&+dP#4dn}uE=W>0+urrPDCFlN4wtAwSSx|0F7Zo7ZxOp{+j-t3n2Xo}v(UL`ftUr%a-|(_vB%{(VXNI0> zKM*AY>QHXq=`5)7E?pnXeEr`%Oi=UOl8YrS7=2_HkjA)(v+yi|GD+V~@qfIpqSAd{ zyfGD~$s#Xk!A0&Ahrw9&wnj?^?{d_)0L3b~PngP<6C%_2JH+2d-~a9HsRmah3u33W zbrD$;TmA51)MtOdWe)=DI0{CSOC5)IPMF=NOcYCw#xYYxzM_PmI{VSYOj! zRjz$>8}tZ#gT-H)oX(kK2t|xW*7y?Qm4NFz1eWJV5)#~eI*);aVp^S&7BS~Xx`I`o zat1z`Z~Us=1w!4m=|_l&fNa`2C5Zd0-zRCwuhuLs8a}bfu*ZpEWb%S~X5IEwaF2<^ zy4$!92#TLGf61*bv9$zb^b(n!Gh^e6`Zw~dgk}U+fN}%wxcWPAL%M&zK)G>R{n|$F zr|ZTNfV{ITC}%yh zjK1gsF64d=*Bb!2(%&x2A1Q|IjF+=SiC#l|g%g`Z4*i6gJ9jWdre&nvbPF9)p+QEx*|kb%ki!JR%QkBUhpepDy+Rg3&-!6&ApVM6 zLQh1zq^2Y=KP%|U^AyC*mmDLzsyZNr&)P6BU`kCV%Z5(S0K!DoVdFJ9lbvk;6zkr= z!z@((GuUvIu#rfd^DxF()4<_*ctUifdI^hBtq=%Ii+M&Y)}+tVwX z1=l0#C>rem8EX}?&#V}I!66^_@z0l32`Ae38?d3>rQYU{2_V=$j7+(~FCnTegNAD@ zS@-W#8J>L%hEj;%hIA(TloxPsGsGBIh7JDN?{~3Qu(4baRdv4=#LS5_b1GhK7VPd< z4l%&aV`l+nCV0JxGBBJ|6Ud(K=e%Syq>@@7?>7uiD&LAgsRLtt2u2&~pV8VSl1HP{wpb!WNShF_I3(htQ+fXl;@+B8S?mCHr#6CM?^XYVR<{G4zc$HdJeC>F`UYe#P62v3X0j!|ISzB?_bFp|brv{zZdv%O6&?v*nL zcnQfG*`Qug%J7vLjU?B4t*0*S50EB2)eduqKRX}p&igU3|~psPQIX5 z_N60q^(JD#R7%4ZBTb<6XT^}u5zY!1)v9S$6p37cr|ukXrsmeBF#B6kIpLyBYac7V zTw=D1wqZZzN#m31ME>wn($MR5(+<_g z3C5BUl4$@9&0Vquulj6J2{?`cW&8O97p5&#)n6Kv!BBukel_9N4{A0yJDEwa$thJe z>b>Pq?p2e8DT?36D31OX=_|jGpj5wIz_a+S(grZa2oAF5*^oX(5Srs}69E*nM4Uj> zgArwN+eHOq0yG5V4GQ0=mjrVye7_k}_)H)K!^oPU+n(K1%n1#(oh_}i9Sr+8hEG5> zZo!gjMt0I5gWT3NQ_g82{G^jhzKE4Y+635tCA)kSlvnz9s3?yfqUNvE0=V>N8KfU4 zg@a)mp0d+xj>Axq#mO%YLSZ+2F!9g!{nHuWEL7=>Sf-_{3k4&Xyb4<44|A3+G!{XHLlDibq;v zKQ-@~Nt?h$QUhP~zJFBj7RYFqs1<3jnAaVANNTcLBR!f2R~54+Q=HZ)POe}} zYdY!u17EdA;EO?tY{xDo&_o5~ca7)td@D54utWHJR>r6w!WC)3p#E9LhR)X=u^K0x1OrB5fH9K!g-u-$O9~TaV zI*?NPG7;N;smb+VFSGdxJWC1*MPa#`>Fqr{6_}T+io}9HE5>JbrYz%pt)CE+Hz)i^ zG##KzkWQYSYXa+FT^o_zzgP$F%Aw>T;U(BdmCj>9Sx=`ZQY*Q)_}^Z~^Q5n3;ez(a zZ94jJ5f*n28?`feW4hO0M}+!Z`N%k~GgQ`1oai0v^&!)P7)&Mtgx92fB5uvY6dcCK zVOt!QqEO|StxKS4EGd71ccCQZhAihzNG>S%1cu7rA(p)z&=lE z`oW6ZktT?$vHFE3BG-mfbzjWgy2`t>$g=rFpCd0DCsi{G2;1RLK9s!G+qlNp81QF3 zuaC|o7f%*P*|{}-2Z-F*M;KY662e&npz6CPhLr8=0uEzOP*+J%W@Vr8n^>xT3IwK3 z5h*Jv?rbkK8RhZ9gLVP&qt?B|R4r(b&1}K*IKcl><=;v%;;jSVcK~;$vy1V6Cr-?_iS&fLiTk#~c&p9PyBCUd@AY$jz&d~vF zb#2H3lF%OsZ;Q->`1o&;#tZplqMW}~vF{I5j8Xzg6M?jBVa+t(q7kVbH7}2l$gI_C z|GER5Ira_$>yxuq1`6gaf4J6;kL91nO|RB-#peUJl#mG;paroL>hb3-r^E$q<_&7|@><08#hQGAH^E%ogejW; zuSzmPH%rwsO^-CsxLThEkkv4$OSaHS>JUIXi^Dz+Ro zw)DCRzONryz3ozA)c!NhI-!_tj_T=<=F#+vNv}%i5CGBt#EaDSkjk zNrt7;Zz^$%ZSn9j`U}mCsWXi}TF1o|<8|EMm>wUk+#t z`Il2Z4Z7SwS3?;ds1S2J@Pl7F3vOaD6Iueg*eLGoSQqO^Fz=S&q^ z^#5PmUm~QM^~z#}v&K0_X6KUw0N*5p%{!d8RK{?#EA6ZX}2W6s_jE z&R&CHdDF-NmUT4?#f`1f^i@sq%?GVqk%ZNq=_`Ov4eBx`guja#lG0H_uk*HF%m}bP zp&y!^FM+k!pu4*<x1?~(paBxYvhzpv&+!9BPSvRT;B)QQI}5u@ zfTFJ8Dpvq;>d4e zl4AZ29LudpQ|*U_fe2?6s7ZQPZNnydThYTNvpVnA85!pc0-k8K&XiOPM#M~ypk%@x z0P$We4`ULJZ~2sQZ#to!g1fnTH-!DNl&tB1vy6@o4mJrCVj;{^dXif`o4Jb3*dp0~V~km@P~@*#8F(?4VzB=C;V8V0UfZ`!fjW zp6k`*XtDk^3mFE+QQx2tng#lPgvQYM~YWRx9Ov(N;z2ZH6HtuNmew?nn zU6eM!vG=sFgkY%fvx8XPYtpijEe=8vUe###0lH4N3?s~hN39^h8hl*Z$RGa^BGy}? zxSrzEAT1~j{2ViU;Qt`)@-ev}Z*ioOaOHI|yaMe^%`UpkUtwWAUv@RN_golV4a?UT z@n1oWP1@p8t@P9=MgZKO{eon%=fwVo=cG5o(!NzcS(7Y?qDD3ou$S4W7RHkMHs6M& zlxPJZUE{wE3|Yz?dWWN{rol!g&HmsEXoa#iSmgS;a?BEucyE(3Udoj&^rU5U@}5K; zW$pSX&^w!}GAx@I)F*q&N&@?G8K946b#XE$iw^G$1PV34ZPR7HzGOQkCeX$Bl4rw6%&K|ar_FCBM1G~dFJoU>kBpU5QM0^>`M#3bD3;%bM|<6J2S zcT-Z{b_p(H;fE7?rSJdW+atJQb>~%R_QWq>K#@ATok|C&_M%e<6F>)ak<{N3Q2yiH zFs#wlWyILC&fFEMm>OQem?R7QOOLY4i_y8IUVIV0%KTAwKbv zmbX^324TUezsQ$eN|HiHN-Nhwpq5?T!(9JwA=hvNTe&R(kn90@5U2D&vT-V*q4tou zt1(lP%XOKaMZ$?mh+Jq8)|us9;JrfHa+%Io>@x!^IRRl6vBJB-4v~awovR`+`r)8R z&dZ*4tTl`DM}Z{!oi+EegZ!QxOE_LBtf2lR0y3Y!AK8J}edB*?Vk z&;&^VE?*tCsKN4m_hX8gh4$|G;dPY$x628lI@kSQ59}Jw#D3h9z0LIHty(@3TK_Gw z3+4eRQNjglHMDB9k8A3wd3)cjjOV3QTorXfO2U6y$gs&ViS8H=mdBP7RO2_;0aWnP za-JR4@o;hRy$;G%7Vg}fnKx^%O>QrOa@BdQEBu;r(FaT*2)vio5jnzTqr*N>5fzgB z-miItS=~TW8*|)oQ;cAzF~9%e$8k2|m7yAu6Av42F|JMyCXE`trB?OvNd$JPnu}5N zl^FjSTBLH?Z$Q(uXt)WD3Kj0HXboNxK5Aq7xG|0RWZCwcm#i+9YJdd}Cq6Sq$iLe^QX8 zjf?9ZAvE&p*glykQ+al?RPO$xFKQ5M^h2&?rZ$e2335XM7n6_tx{>v4Fc2cYZ+1vP z(|1(%sqXTQuSU%7m1ke4ov{k8EF?i({-A?MN+06a_8U4|6TuR2k50xrwS(uyHaX@4 znIDoy8tP#`v$Wv!o%xVh?9Nvco<8lgNqM9H)(%|g6LT3Pw18xMm{RJ%MKmZjC?cQh zaQI6J#b7KPOaaIfN<;HtOd+YKNiqwoWiJT%Ebv6)1q^B5*)X0qbd~_;{hNQ|axbPL z#r&D<-?ai$=E{521;t-I3Fj}WzEI^R$g-}7a;W(4KH`-nD=9Hye18Tv zA7MkYy6W=j61ch`tVdz9=ko>(w0E_^qn2{|{Igcz%j_sQS0I{jaaV9M`YmW#ol{@yTTl{A(VO;?rd@q*9 zcPS_C7-DnmMnV7r(~2l@*}qof+isBB>^oMg$K}5V7LWXV-`3$oV#Jqi2Qcd&Ji>sI zi@xgn$Jf>(BDjIbT6y(_M>2x8(a5h3On*SAH7(4j+|s(`V5?+sUNaotr!TS3I`bvs zShj6TAz$Q?+T1HjJsWLrA12|K+Z#=^2b496sa~t$x>Eu7K@p~8J>t#D3p9XNc1u~} z2K{Of=7y>6N^Sh{H2Q9Vd6<05;~#%{YlpOh28+pjHSYwK_}39=0jmSIdh!GU+wo z)gq;DlB&x`%`ZNhtfKUiUfZC=-U*!;2F7kXXMn@sn(-ui0qQ5$UX${pc_=9xJ~0b! z_NYS5JM6#NX9X;}m^B=(Y#o`YeteEH>gj^4WLd<7k-L&uf^SxO?fw@pXYXy1dmCqv zG39{gbQ(lV$6~Zqw@=KK60&jWKyOxcQeHA{$Ql|Ea>lNtFfw`({y-9=WNCtmVJ_kb z88+j0z9JNaGMrrxQua?Z)OQ4(zhwmevw+RG5=*nT>QZ(-j+=c>??fIsy%A*f!re3z zkq+}gX5Lwn^~l5&!Sn_7g~C^_GLU<2#WFe+g?B8&=HTmJq1pif)M5ZINMhyqfCb+1 zV*kgd_85*mlCVNyuzrcRzxscHg$nmUQPgU~?6YHBgFW`K2$Qw~{mxf4!)8+qg=EU% z;-bOrf?zC`^jpp!fWDZq6<-e6&IoEe@BR;p+1ISFyZnNKuBcXjUu&}ElG z^je4kLYZRALNafQ8jScyeU&t%^dfjE7GRCITid;hRy&~h2tXsrH4%#UG|l%j!rfvC zM=CaHBI-b_8$QQrsc84BgAr8Km`OXrJ(=lL?m^>V6k@*{SfkNaj<~8H-lMV0VOn*v zx|**}!>dR9RLu0aD>XVBQ(1mvj$AG1n;8v&dA16Tm2e3ZK7Icd#%@p~9JReg!M?R- z0w-gVYJE7r5s&ZhRo(wJgDbkW=Nc|RvOqPhV3`vaegwP;sTz=u6Po_0id3?o&VTy0Pq%yA`j1p5|>rXS>`pLK<_wc)K#d6~_@k3++jp0+i zV;ni%DF@H@sa;6-pf+oY?-rLKAvLM*wC-?isNxrD*50%$A7Wi8#p=g8n%V9S!V0m@ zkdJxO-xA_g+gIjWbRP0mWgRe^Vxq>QaZj0b$J2=QlT{=Y6`$iPp#NKSff@};EO{`$ zL-Qnj_wQIQF@$set-M1?*D zoD(err7s^e!3HMq`SJgU*+}HN#pfZ66>}cx6XSnds=Ny@Z`D~$@ zYuuN(51lrWML5CtYIae$AQ1lYm8S;Xs%g{qmL&+eRZl)Ib+tLae&vZtmVwn}6ZIW7 zOPHBX)Uku*?JY;JWI*+ApYd;j8Y%=9^_umh!#%$oqA)~pS=o%mbGU2fFDm71OAoCY9QbC zo%k+>fLGTG9g0UuL)o&-)+km=K4mzO1wym~__KF&mDHtGsS%3xKnWTIrlH~KHq0#dgN#&w->Uv%#hmfr**E}+)92|d; zNW;!R8@}rPPwDht@%^)-z-Y$ z=}n!sm8gRS6+z1F3d6_jt#=#;dfx(A<{k_z&?VLYJ3z$0`)-={@KM8B9_rC`9)iDq z4&|&wj9~lNJknE95)y4c0y>ysp1gs5_%J#;cE~@O-YVzws>$)Y?ZY7rzyuW>^YNaD$f=!k4HDWbHJUn6-k_7TDd8H&7{;$IJ*p%<1xkUk)v`K{v z!Fwnooo$vEsygwS7-inrK|pNtJJ~>X*ruiVK88W=bmh$(bsw-|zkR6kKkv}p@!g^3Tb6lm{fP>7zq|4&^~%Y04~|;R+G(gP+7IhZAVFu5o$Xk5Wp7A z6EtQ78d#j#9#a)LdR|qaqx3qbXDkzw0HI_pohvKMx2#Dx!1R&j-rwg>tZdGvnuguN z8R+7lyM;7b&7B&5yRYyQ=GM645{M_fKJZlxH^A9=Ese z+lCKK>zGZHf&a`jTn-P-;)S%=1nL8)_}pNnlliCN%ZG=}?uWD3N?dLF75%Frtt{OQ7y2eT=Es;`(67!*7xfTmsh% zEVQ+aD7ztejSL?3&Epq_^E}#G(T))}qBRte=Xg4_m4U{i@#$;2kI}md`f^Y~TMk{F znvSVNKoe{sQ&&SudUf=Sxs7y^h#EW!FpJ(z)Lesg9>3E)AFMyQaF5b`ITu2qmGrvZ zQgf)$2(^BFc3LGxC9C+XhTJzV9g?-!SAHvfK#ozCywD7zOT1v+*8_#^6~NiQQ^IdE zQviH)CjULg`UXRhi2`w`j>3#V*<=Xe#mb{OVLY(6n};fonWE9;wF5i(NVQP6&`~tx zY<0p9bb%CXTxB8eN|)f0a0kmY7iAY?~rb8D=DlXt)AC7q_xRUiE;omyQ|~0 zDlzO_D6B*TggtqIEmz1Q5k~93nTg_c3NNriCE8RzD>@A_e~nNH^Tj`&FNo25p1wcr zB$8f43hAZ0%5*GXG>_&9Qqj#6|L(sQ8@}rN*h4@Gm2L;d3$Cp0aewLmi^^QGhD!eCJF@S83n9-lWQ-=XKzP ztqSk)z32UYw&Bd9MTX~356wvn!lyalPil=d*J`4c}uJET&{bloq6g@`Ay!xx)^EYHTKl+sLqSX6TWq~%a9 zXiaPD7B_O}zu@2E7rD7FB1u`I9m3df8*Zwqm4Y5aHVzTX<#k1n#Gh7k7*&tS>)=d& zsgQI1KoPliaadNph<_E&m(Se!LQTpKn76|#qfC7mV4v8 zET3T&V176{0xAGo6|Um3I?GH!>ZohDx8guW{DN9ZindrA^$TYfS6s`c!H%)ZtDwc~ z4gl4i>z0}Rc!N0bma6zM4!j{*`gFIXVBpuGZ9Evf0{t#TkRo4T5wjfKKc%6A&vZN7 z9Rpelw!GK!vfwLe*AA5MOXZ5vRfOW*8Bq2brQ<#jn2mcPj;;6Rf3XX+-ZE6$VLF(^ zOczbhOAGSFm|y2H_B~BUNf!4%G(Z+}Wj~D}e)xXoc;U<6KWJ4@?9&8uJa?2OcmM*3 zsWLj8P;aezl+UlP!uZW64`?T)9`^8zDpQ2EBTePRi*ICCS1I2dSjDq*dq1TbTu#8s zHbu_?McWx%-v@TG`gdOjt4Hn*H)h{>iFbpF>q{HZ=tc)wpWD80Ng*!hJ0YEdCli&t zH!^SK)R3yk%v}>%O@*C&DBag4MjK~+AH__3&rq_aIM0bn>-TpwXrFkb!i@Q+$!!h$ ztTF-0h|&Agg94X0q=jHzOqXZc4iMjo00jA(qJNsq7=8oeApLCHKOt_TD$%s%riP}XUmuh^JRJ>@*9Nm8MSMCxOCR@}) z)3gw0cfJ6+s|`;`?DJUFvn7-X0ZDpDx{t0PX9k@gUw;Q^a)hGp`2ornVCbgQq62a zoJ~4D=JDfA7p*uHbV@I~7Pnhh8UcI)_3oPy2Uu0pW&w~>6tv!bDB!_LvVDi}-DwV& zz{FbGc9HBF$st&t*AMaXP94B#HKSl&JvevbbYe&OY0l*!ErZxo(B5m|4}5>dtB?0}9Dnu{KS)0Db-!M>T`;oY z$z^Couc&2gjo#@pj)!t%)GdtSXz!k3=bkj+%k2g+yg6j~Tn!5`;j_L-109DdC;NO6`N&)MA;ihK;X)VX-fd%2F$RTnV8V^@n=*=0qN; z3hXmt-_QQps2~|bMi?0OIGgagM82+6}$)tj}J@z%h&?I*L@Acza5tM8AYWL84ZYT2=5KQ z!u!S%YGe{@Y5V|^V-3tyVj{#LKcTndTc{XNZDobOsZwfZF#4=k?ID!3_dDL?E4Ty} z>dUwhKImp6d}=Nyic{n3RJo@@CeIM@afIM6AA>sNb z-^Kc5&OO`tZ(zbhNb4iXCDM?nQC29FhMkG&2xP%K+uk$aFtIu8nyPPw^v7~0rgdUwZFN6j{J)7hN1Cou3W~V0SbjUj_Sh$Pdx0W|gIZYtTu<|vD)caG zrMzjrkF3cwRfv2(CRs&B`_J-Y@ReX-KbW{yX^2)3)v_h0&2Z{`-is{&Df*c1P*Lwe zMzwl###!(WiICrXfoWjyl687~Rxe+!?A_%%OxJD)5c`msX}iwj?xKAGvkJRv6|i_f z;fi}C;#sB5mB-=U!BhZli*N~xSr)W`8~&L5LLB3(1FT3Uj|it^ZY36_{J3irzSF%7 z4^~_l?oj7uUaD-1TU%dj2VkUW(~?-WmrkROzHo_$+h3mmlj_VZVP=wOgM3T%yEt5) zD>=j=fh97grlV;nkRq}3YAQ;VcieSWGy=x5MAp{(`od0}pi&>6D+9d4JQYu^jvKHGW%_MooQFJN2 z@?LE@1u~Nl?|0~|h+Uqi1)qfau&H2ANe+6Yw^XF6#YC&DZQ5w*e2%|N8+e($u)MFv zlt8OIe>$zeOp)n?m+;5-KJMdXdvg@^wG?y}y@Je7${L1tLo1z-$v%qET`zt-pLP#l zG_~6(3X-#jP`!naSdNSDH06}awv-hN!H#qEgOqKt3O)a-J#zjoa0B5DUQsu}g+L#$ z?Zs_>Cfmzf`n0ljYjOl~3HQl&$eePn3G9&>ItOw88OXEz&e6Q_(cr_Y`>rD~?I}8L zlQm~8;UddTc(n`nMtLQT>U57hCcvhcGGFs_IJ}5%-0Ar?(i{*cBoA*I=v(PcqeZ*42hWV$ zX8w+g=bC;bCY%=14E(m{s_D45j^1iaa#L7tf&^uyVPwGEIao`LAqSrf1RSjsrriqwv9xQHF`}ekEw7!AB$ilxm_}x|ji<0HX zeW|H_Pvb;83DMq#|5rYgU}lx{lk%1#Zn{i~+6)BW>98tgo92`~pwX5|>x3 zy3iYEKY_WnZHLDv3iQ-U1L%FE22ah4QN|(QaT%?ZTPAFQQU4y!Lm_q6^>yV?^2aYKm`g)G`gLzyH8AUPp?~1@+)n6f=nhN zNU5Heb&=$%VyDh_VF9hW*qn~01r;a`doi<#F@1pFEi9`))y>* zD6~+L@0?g#)Qat4Nd{3rnXlcUMGBnE!BP~uk=4uKml`wv+8K}_k%f(Z_{|;gY^KBN zh9LW0YgUcc=BlnLcplKkuNc12U-=A=kf{M&O(@9eEaPH7djD#V)EnsXzmk8HKs*cX z#k+T4H8-47h*f>1PrZwHT&)b?R6GLA3h+w|eHT7*>YRm=-_QNVvs|pp z!p8fdJf_!&)Ya>>DXjrzQ+9#Ef+={3^Exi9{U;4D9dSUK;MNxZdIoD8BlLov7_-l} zPrxV)d~w=Wh9;H*nvTyIz7nb$hYYi7b}XuJ@GflrYHE~PMITT?}tIP<|=(3zytErp&yOs*4T&Zu+D5IQ01jorV_LxdIo zC1z7z)>e8$DqS?2((I(cni6wh|pOk!iLFoSt6)0^nf>-R9=@;Z=y0Xqv;PV`PG8|% zhwISE+~XK3h|RzWaGzJ=y7|8a5XuWv*QMeT2$#nv?;qC_PV}hb$M__+re%9E)^T^i zhX`A7f8lW_Uz%56|1p%6pI-Uro(mqA$QtO`E`l=*TTISVYta_P%Yg?-<<9+&EZ*_M zi+NeCpcYR5-}eWViTgMJ7iE?%JsiuBv65?B0jMW13I5VGuoZ}0gV;ep3S%OzagFZM z20P95m}|=IvStQe>N|wdS>+wE*3%NXA_7ona-EuS@}Yw^(dp`!iG{gR<%iv1zIQ7~ zvqQ(`_76PlS+h=w>bHJx_U58rd%h@#Y0Qp^vs7%jfk1i$gXLS541likNf!YM2;qjP zm4Ylw^YV^?vv-}zYXjt4tfY|B-DF=0uSO%;=LxgcK%5K=&P?Q8uH8MSkNBfIUrx(e zk^^-=1Q>Wo>Pu?u0K6kJaNu7Hl+gPsnKju@=lG7gelRzrRRwhvB?LT9z8rA=ReTJp zv?hu`TnA2`r0&yx0?2I+%jMb5s;)GPlN?K!1q_9)JtV!?-eGt$Ch;}oDA$t7_rfQ- zGP>wblXQ-NV&~g5gExQ$K#DG1LI+lREA*x#_!EH5W6{m84EeAU8%?8ZHKZ%ppGDPS zL@8ZNQ7}2eX52K}C!j(A_m|dN)ftF!`HvQpTEy`24tW}b!R=)wU&NJ>Cw1Nk=0?}#dYLLDY;}ik`+2GFT+T-o%+!n zF5YH{R2CZ8=PI^@cC${Q&~Z}N`vbUBuXhS8SRHjGIp91}NZbFvOzK6>f=uDpwu90# zmWb8wbKXQXrBohkt3)C;MuV5}xP<**)d(U|1M19)leBhoHj1s&-J(SyC=ljNBYz3e*NDp!sH@*1&OUCix^|X#JKgbteKiJXFg{P2)F4cmabpQ2H{e`+4 zID9qfY*`0#2&K<#rpOH{r3dcFU=}uhKmf6*SLmK940>}vPc#g2+()uXgW}mGOa*85m*#4gEKWL>ng-2WlKjhK0UYq>e5ow0g6{A}Ld+doT9ocbmm^ zMnxO-M*lN{IOn=j+|E}d9Y+%-j$#AICa4J4h|WrABM$~F5_}A+^MpiMDdPBHO0cFZiMg|sIkOhmn853 zALSamK3*N>-lw;pA>d}$NZmM`Y@rYgkc@ya2pz%^`=ccoH|h_{oo!9)4)aM7LF;%A zL70c+SdK9t{D>M2x69Z#JP{eZb1qKV{_^eHH`3~bQE0G;z*xi!hIVH;nc4Pns-uCG z-o^aYty#u+sl^-z=iB9c%4xGWm`5FUP9W!b@h~Y z8wb<+KFID*E04;Hmc(w?XXoz78Z)GT>Jz0{(hbz4P<7E zZ~CGumiw*=kI2gvW=GC{XVPJn8g$Z28_;kF=bYnJ9&j@wC^X=PP#bu(NnxOy9fW12 zH0Pa5gmmh~r#j3j^Q&}elyz2#zZI+Qac|BeRnRF}(IBr5NF!AAO~YAIf@DQiL8ONZ z^URbr3KGo=yUHjTPoEV8K)F7~!jbrJlY$-vL|%K|Kk^G`1S=n?F$M+Dv$1xZc{^5AuO0q zF;lG8FiNe_fsSH~mqRjvJ>A3NQs4vJh{Bk0tLpi5F-*H)Xs}7HNRFcd2N$OV?Zb#y zBfkg}O2a*>#`d7Xm8D>KBbW8+dC=)^Xn>OPk|nkI$;m{pbta+xAR94c|7kpMYM!t? zk0!Wn4mWAYycXAqF=H`^kTe7DV}9Uf%JhxS+Sc@Qepwh_3!)hNW=D*yLh(rgpds0Q zt7ZiimmTD;(FovV>P^2ZfwOR7c;9otZlXo;7_!{Kr?2_YR&2AGxPnF?zl<%Zh-R~L zx)w(>(sCPY8<{A_R29x^`r+t>bxlWk=IEWP;}Iy9czJJ`WS?pEk}@DFmWfpt5g{2N zj_FIq`+9|g0%>@llY}=Sr(j1U$``Htq3_RBl{W-J$qsI#*=(mzzFXkxX!g4t(|7@~ zXFoc3qexC|MbI3pSv0>NSg2Y&025w<(i&A6_Q1rBaQ;VfMhyD|HDLW+hUkAhYa+MC zA-aKla_oSAj#WFz3=h$bXf3B4A^canz;{YKV2ntigrX2iS_n^kcN`9rSHC6@+laSq z2ciIQ%eDF$38ZYP-c~?;x&-$<30gHoWFcX{4MIyG2~~(M5|>rIl&nJ3Aik>KaO%#< zNXCsle|WOkA8|QgxubS9uh9G130$BHkXiVdE=mO&8CPxC$bO6#CJD@J0TrFq0-mSM zwd$caXvm`j{OSosg-!ZdKDq!!FdH8aHGrbK#ezyL>x;i=1H@nxrs3SI`Y@l(%3sVq z@{O@M11XIDhQF2f z3l3&G2ts2I`K&xQmDO7QaXm6KW(+Ib(+G$Sg|MOXlAq6>tli?rl4~wFw*ImC1iQtB zDTjYGC>w5*f?l^M3CYJ;1ZJQwc$g+79XL=`Z=Dwx0ImiWk=-3QM0g#Jo+{C8!}?Ja zBfypjO5d@JF7;JzHOPle{5*2X-R~g`;Nyh60NBjxnxQ55MYr6YA}VX?2ZyEEP$p;W zKfFpcO;Us|{_p|_aKdcQ!Qy3&AQt=@5L2;P>%-ri)?k^LtKA3a;*R1pF3~V$)0_dR zh2W$fzz)(n(%Zmj^~8;4@n3P*798fMmO zo&1;fJ^Gf;CL2!#A?7d2x+^vPgIsO$P-I&M@a=s-Yn>+N*bP^=PK!On7xqoz+Z?gt zdL<#@+z(YLNCJOB+vWf0?FhS(3X_$m#1tVq8ZZ0x4=91Rk^%$D=W8U%AEuzh@O3ml z&77-_;>}j@WNiw^z8@e*p6uI7H_T15V4Lpe(b71+)xC2xW3>NGLr|B_I0F;PL9Rz4 z$yYh6ci$yFZu!X)CtgZqrpeJ(rWcOwANtlXa{+eqeliCfoK|Ext%w9_=Zw;cvhLDT z81$H3?yi$B3AtlrE^TSd zHhHQY=LY33+}@Ha7E~X4${VG8p;yDOk$<{jauUeqinwl%l11p4y`V$KVi2&v(saDN z4DqEj+f{~hGRr0dT)|s=VUvliW!}T=R60a+(ZV4{<>*2Kn_Qk2Adh?MA8I2;iq4NN>wR;LEZwc|z!v;Zh}EH&$w ziUE~7S4z}+nFyFtQS(RIWy(d8SXj^e9jhk?d!?7pmuJ@g0uZ3KWuWJrsbftT%P=CKw7zMtweLs) zx*Tc>IYkoel0s0GyPPm_tFW^eY=6Z>h~Co8(kx95#B;_k&8rK97!E3tIGV4Avsdy# zYCKBp86G`N%xV6?l50$z`C9$y@?sw{tw-}IK^vjSPwp(oU4DHcDDCSGo@Cqa_&%ga zo_Tu_0;||2!!^K716}RM&+JC6Dy<>gicjhm{^Xnr;HcL#xJGdMsMBmCM$X?lD=wDr z0}$x_(8Q=lnE&5dyg$Oe-xHFfPVE#4rX6X6P8sd5TxtZv8L9;%wh(zZp=>}r!s;aum=SNOYNng&xC2C3X+~r+&k+K z25jpaBx}WZxWb8lTWmewr?pijK`cOs=r;>aiOJ2Zbs<2{14k@rKOIrn;70LS`B{fN z(5)X>k6=zt{IlR44WdB6glY>7fc7kYQKCnh8db)(B}N+Ueo+oc<801#-@gVu`#VH_ z(3UE$qfQvA1((?S6e>Pli1adurhvMO5nf9l)*Ct3l{w5J1EsiID< zGe9avo*k95)!NumRj_?QiyssYnw3`W`LhYJ$tkxesVVf=eOMRjfGAHTuzwKAE^>9p%Qw=veS@x54-!729>Fi3Onz$l}2Vi-($xTNpQr;-PT~=r#3zh#t#LlU` zbNTySK67}|&@A{@SEo>j;(vgicuC#+&HX$PzW;p!{@}@YLC3vXl%(MO`zi8#nM$Di zfa?%0kFPmwSF5}A+ZeXcs+T*Y-(7L+SsG^EEw06`&5{?ZEa1HLd6jK9C80jHQ@QI^ zrLLpw87oS+d4J+teunO%f_5qWdiFH^XSfd)=)_OfB960ymx;m=c@T>wBG7lIzqmCY zH806rtpUN)IAPNkd>l@J@!(dG0sEc2Mfpr^YcfJtQD{gLZTf)zoI1}}TM0^${iZqc zG{5Jzzy?#t(FZ$Y4^WH?m&$y%Ge6B7|G+_0a0r z*+e@MGPZ4E0DWIwu!-&^U6w{HA9eNA`u~T$47>8U3r8vp@GJ(L6?dZPt@*69v}h3{ zu34F$IQ||cSmJU>2~}L2KNMPnanqGuk}+a6%TL$FW5bZ?KR$1(y>z<9`6<6|5iw#P zauHdivU{ji&gC%Z!q1Y^XPD!ffWl^hBKG~B!;4KH_AO7RUTZL3d0<~)d5u*-%Fk{v zzD%toy%ohB5H)1(Z{%rjdk6;UMF?L}HKq|lFbk#sq zVY9vI#I|^V;^<_Z+34XUTZffLSP!UY*v?9)1JP$)h(ZrA&=kgsPR}aivaOMd?4{AH zKJ>w1AK%DAb68G!SiR3UXP_{n^4jTShfG>kZ^t=7>u@0L9W8p4=o*6sG$40} z`N;wXT6?GZ_i-MdY1W8PrZa3UDU`z$ZNLBfugeoP;-54yIJ~#$qChsme1+*A9VPlP zkL`>n6wOyp2W}e))Z#+VKgGLw9>h^T`D%J;#pIiNV2}HHKzj6x6ls$}>Q0M^C9#5CQO0o|CcdH|HE7^@{5WumxwiHk?*7-6~^ok4t27Zq+EB= zFJz(3wdscd+W@ML77vs;`c`+EV7kA0xAJ_7)Lhn(Lpv84;IlOUY{I@WQ>Vn8UmSZT zm-S>_d#CpLX2`4Ec1v{$tOIUkTSkQq>>SEe_P}6)smL@51STFrZJ_q*`!e{Ms#Cm2 zqYfY%7t6mr^zK9wH+y~xUqY31Lq{gTc+6r+BYyWtD{5$aEe|U4nG;S?SAR9ZjZ{`V zg5(j?o_;J|#VN=OOoyR8q|=8|>15};2;2T*2FMtjxI*29o2*&>&KT_;?1ki86?OvDjga4QtH$h%CPb2f_JSSlTbjR2 z7{)nT{(OgNQo{ZW({DQQWjNuUBNus}n*|lK z<6DhJeq9W&xYZ5{iPw`GZ}K zM+_i&u6DS77K1oQ_N0jH_)vQsY}>B9;&t^5@?NVK54SJ6w2QxAa{Z=LsF@=WumtAH zwpsf=9NGd783!iGgg`2=tMn!jl?M<4N5V+pL&4qMyJX~)PYwIi;9vvR23eHE(G8F` z;Cx+HVOMs)ykwdpfu!DUjB3uzYvr(q@;0^Lcu)xhTmqSK1zqC^jfa%b-6YA|hlB|K zMj%wK3Tu`HQ^RR#zVS^2AqC$rJna`jMq(xcqL)urGscn97q7iUpDZGKp-QQ~UD$C~ z*vZl4Cuk&W@|ghvX(hp;&TFF6eiBQ>nBeMK&291kp@6aAmr;O+&u|vncc;oie`RAt zRQ)wfr{z=|lXLMBAWZWJV~~#GQfU+lalaXcz$*KmWf6Y}b2KVpSqA8@C?Y zXOtld`|7A*7SI%JU5XSmfu&ut9Cx>%5K9?;W#`V9tEimc*0Nd$=h`(5@ zz&EgQOC0BrX3A!fCrgtGaFG-Ih=O)yGyQb38 zq>6TMhGwW|8XuZx|W1mG4GR zbP^3nL#C2rAji8Is4y1n2zA_skqIIr!#l+aN{wExr7*0b>wD&ZB z7n)E?hh~tRHU6NRp?8>GT#N&IYqHYC9e|V>f(^}8cv&`Wd1)VYX9J^f`3f^|Kldu? zTC0jWBpq1oNe(1pUW-jl54g-v%WMtVz_#jAew^k^!L z8mUVKp9i;qreyp(V4D2WM6rrYid6@{dgYavm>JJ^C$PrxeYcu6Ahw9MLmu5qr}D7( zAP6DYu}waGw*p@+h3%%#YWy3bS*E`quvHNb(4)DH8j5U}*8|#T- zJ~8We$Po{q&)Qggc-+W-^xmy_0EY*0^=gxwB3&~_)kW~((y&4qku#hU1>Q64&)_Gr z?@D&mj>MsWHu81DAtYjpXC?qLtu8a-F~d)XtuU5${M*>?_JCLo*11=&sVzJ5GahTB zk=*u9J&4SL9&eD^3!0!nC9n`|@!OeG7ums`osf+S(f^}Fe`x1Kk^}s>fO0}p9KIx8 zVsVxvQQ@fT0@7EpmTfqk?;Z-Lr5SSwc2$J9==7}z-S@?S3<$l9%xyzLCOhjjW@!KV z1cQ7r6?B&=L5aEg3vG0=8y89WVUJ>a64(E2t zv%PQe9{0NpFrSO!@gBA!epHsMZv08yLIF~|H-OatP{SLsr^s4jB93h7$$7rQgFvc(WB_Cf$6e#1F>=#1JWEhWwJzT85 zpYy|xn8mXwm7l_yCxr@x8|r6Duf&P2z4?9sh&e=Frue|ZDT_v`Kc&`L$CahGWJlb( z3>C%8jon-bQ7X&6cFAU|rO|-3{;GFoMQID$ZT#MPJx>G?~#Q#osa`a%c_#Z}(F zAMt2CKZYewCRXHQ{KPtfyi5|A3VgYQs2&h3~@0kj^mPAJU;-D9P zZK~wRru9}Q`I%c|D=8tdJI9HiOGR=Ab@PqY-q+{e`+}HL0xC$u{v^8B?A!wi zY{_(2^~n8(AOyf1i_@nl>o&njN0-^45jj8)7O2RrfyC z(>yDhs(t5C^|Xd z;%vA(BP+vBN49$C1FF|h0=fLjRZ;@4W;VBpZ5L9aFqOQT~fbxH>Qhc+Gi)x6x>j1^uD@a_?iK zrF2@uUneEnprx}J<6)69iK>%oz2iR&8Uno%m z?CMq&)C@taEzrHiO>~7<4|CqYJ7W~m)Z9n={2gO$b~fH&Tq+J`U|!j%w+P|I>)gR$(E)!2K-&EB&x47bQJv&uZ8 zl$s3~q8lH(CG0#Lht;6$IqoE%|N5`?YuQFia^GBw_E_$5h4Hf4v%Q}Y(VXWjoli;S z6JmIx$ghaMdqjnU9FFYE8?IqkO4(9`gsB*WIquJ$#@3&VX!3R!HjHtc1>tQYfN*af zD*y(OoITGQq1y=@x#e;Lh+2vQ^V;qV5x=Wu{%84d_B~jNiw?%Ifo>vh=g8)e@7k)BHcAv$_gTQ4jwf-gX z#AX-wH>whvLT7)i7EteEo~#f)q{U)xkC7%Fn5CX8hDj7PeIgF2v?~GRF^y=U{bMgs zppQn61Xh9x;QTOpVacE@Afr%Yc~K>WeEU&-)J482CTNbNHVtqujz@A%sl-Vl0)t{3 zWX=iVX`v<`0yxV2E6~xV03*fV-@yjEGYpDQ z7v)2ZYg(M#uAjJylfK9Pb=sA_pxM5J_P1iAcY0-^yFQ2@MC*Y zj!mnR&=1(yqr%EVI(mBE?s;`Tl{4P;#3-;@Esv8f0-l*7Q9s$1OevFeG_`0V@ME0<8y9 z>D8jPAa+tZZL66U2(#XD<`10QJ6(EQg+F zK{Rl^h+_t?svt^rC_r;xLe({%yRnN_dci~A&~!WH$8WU6JR>dDyCb&9!7sjCXGHdSyF|MXH7Mo3_Ya7AK@WuOZKuln7TZ8T~>9N!MvfmV?*j}UU8OFKE`+|%{Lx4^WPCBe6%#Bz*w zjJ%Ey$L3j}Y?E4%mSmb%=EgDrxEoO=ky#YfZU}1Ga{s-xRP(NMPPo*Bh7uVo>m~w| z)9rd;Ryj**0riCS+K}38erk!_6uZ6f9NElw)9KAQ^%fIWNb)Raf;KD;59Bl?fsmuv z2{S(cws8}SrM^U|x^E#w^P!!%Zn2be10+h4TL0;Jef3X7^TW`nfy(6&)6gGi11$aP z;jA0e7~@&?tdbG3O86+)_|N>>8hy9cgYv?sDkS4ggu#f?kj5woQKOjee+y!Zb1h7v z|2{}?G5Xi%@yX!Hz!@4)0;A`XZruYE@QA&%(ybtWlwXjFg$UNrmfyI6YCjGy7MID; zZ6@{xSXs>Y>rN?s?dGds2GV)Wh8{cNjLXXnsk-W@Y|ct%BVbvluI})JtWpMRe4^UJ z9Qg`{f(7IJ-}OQ}3loT{Zi7K;T82VPk*;w3xxHWWh4OFN{#G^6 zH)?D8&v&*2JAQ%)9rjnrzOu@Z&SkSJZ%Y31G=<#k=o;k_*fY#ayUv1eAU@a9Qyd{t zAcvrd_G`{=h8Vo!l4Br*qTLW`{0GH9L<@oRWALs#c(eV;wuvD~a3ouPjxQIJQhPWTWEqMpoZ}kvVkyVJBCVpWQ`Zi)%{#FkJ=c^&R5|{>aFUk9mt+Uf# zeUDaoGE|*lw}>dYH&i0!)Y2fvL6A!M|E=V~2Tu~Rt>z9F@usNBYia_KhfntaNkF#0 z;SDUTHjV?Nk*FN(CB(_Q4uR*A`hHERnlm8A=l^m!X5D?HN*6{<)Q~Jn-#>y*KFxx4 zgw9N?_xW8q@Z%}-G&=$lynH5|zMz#wh!a|OQ+NHlV0XY)imB#Ub0`D2zR&Z@d?RG>AgX>kDz>uRlwa+1z&MQf@%Tajpmt}Ch zY{YKDzZCZs6?oADM5MgQE}ikrAauqL%Al8n7;lKH z>L23;*d@hH@`J&-Q&ihG>|l2Y77k5l|JwblGmFM6vuKm#oXGqW?cv3 zJxxfCGsaCYRRFUkrw=+zeYBy{2DW?6#%GjuIi`^#kR}61s`onH7c4V!!|qA(^Vmvk zxMv#a@a<)G>y=7ct9ClsMRF+ol5dA>e+n;G)fevBaiHCC;HE6Q0U>Jg-%OUbO56|1 zQ!Co5!3sM`8f_Skl};b}Do}FnQrv)Gh!TUIL=To8&{+PtkW6bJJ4QHZ#b_XI%N`E$ zjJ^EQ!guU}e}DLhw-^9XpxkHdKgF*Hkm&TGaU4s8*(BKXP7iFDukMl+{;K?VMH+IY z3S~R>Q8$ZYO=z<)Op- zI8%OXpmYjmR6#M+=!N1`;6BL7E_QuG_lw=5rWun6_4KY)%fSio&wCM+qJr2$3yd;d z^xcWJHTqkgbVf5RgqdJ#W6M}l#W}P)Jjfy z={VH@ufZPJb@$2Nl{`qbNZSaB`bSKN-*>i4YI^4r;z6V+VK2mKt>_26KQ7meEw?Lv zr^DA!%Nf6t#5G{)l>o(%vQltRqP2`&&=A4naVB2q{=pTO1D%SKCo@iEt**vT5Um@W z8E{AlWKUXxS27|l?9}NF;<{%|ZGc=I(Vk-&>$!FWtAvkTJRin{E-wd)P?V}=L z?zrI_Fc+-`3hZ8^IWrtvaf7B@vow@7+%ML@LXBd_O2Q-x2~|nTKRF4pndb{r1WVZ| zSDGFbj6#FTX_=ne1WBeS$|~rZMsjfplUg4AI4ep3ozO zHQCeYj9l9C>(>?5ut%SfVO`|Km-z560%m|%k3XHrEhwbD$6nY8o^R-kV)Ipt3MXxg zfzc7a<;q7fbEZ%Idk!t;5j97h%zwnq*SO+So0gSlsj8(H`Y(k&Lt49S8ptm8krVfG z>^;LyIXG%cTFW$?4-qe0;4ePwmJ3B1W?rjg9Z$o-hg6=S8wbiI+j1iS*ha-7%8z(5 z&Wl{Bv5ewV+i8Zl#s^N3-Q7;ZOQAAzMB%hTioIg!{XoOUFy#j-V-W=Q``NgLAi$J8Fq?krjT00L& zO?QbAR)u@H4YFtyQdy+8Ye$Bn)8)URK>2t^A3^-e|4M+<1lCWG-l01vB=i&>_JMx# ze)hHA>zYhO?m#KbYyP?K0e#-y(Q!6u%MO@`k8e+5AUq`{rz2=LE40g|-|gP)Jov30 zZz5s@=T!r<-Tt?^xAI1QLn0^BG*<*t9JIqTUMR%DFOqV}?$tkhy4V~#$ZjK3|rv3vZIKTxY5fj zm~Wl5Y@ZdoAfJHa*;CMZmy`iN```|jOz&ukIx+|%sy-GysU;xAu9#tr^&kIoebM`W zq8HDN3n72T*I-EGi`tG6m4`9aeWRh$^^NWZ31CQBV12ng_@ z%=0Jrvl=y`6rcCoo9J{evw@0W;QP}^%m@Df(Cd9G2Al0^ZBsh5Dzg)Fo{{@9(@ zo3epsRIdc->QF&YGQzQ0t(U|5s1)=Od-^tGVDN$<@yF@DU~K;J{>)bkTH}UZ&xbM{ z{f~yGcL7c%K#Dl0<9M}P47Lgpbn*0lbPiNYR&tuq*2iStCre}Cdy`JY@P0%JA2(bM zA5fxx3lY{JFTOtO*1A+;mZ6Xu`e>v6D~Xh+8~phZ1u_jFP{qh;KB=`s$n*HypY9z4 zTd1yFLmL3}yAfv9tau`d2zDn*+TLM*V37|Mp1hHn2LvTt_W&q_j0#1IvewWRg$(j^ zTEJ4-M69AkRIOI(!O(p#pwDR(CgbfNuF+`hVP< zLIm%G7)!zX4TX}dEwls^W(Q_~9eGHS5kQ*wC!Mf^4z&f3DHDys6z4tb5mDQ++XS58 zPfvD@;s7i1c|OAocz9#Mho`& zM(;hy{IruWn})Eo<3fTH-5rWFNqW$R^tn(k``t+Nf-3wi91?HTWDAzQqQ{KW8#WL( zog`(-oqZN2&c+0V4lMszI@(JG9~x+ZVy)b0HZD8gJHecN`3VHs0K$_yh+>l6rnMMe zzTGc3!DCcj!P7tqO7!Jp3#0{;>|d~9L;C$%Pk{CX6o=!{Iqq31 zJ`t*^%>b`*+h4XUVg-k(f%NTv43P=rZ*nmxdFtUL$R4i_NJ^fAp}LUEqTw;9#30CD z69=6)@{KGIb$?;**wwwXH&-x=kliXv>R#bwLV@av-GuPuS5arqE#r$RJ3^U;PiRye z!hzqNAp6oaafvAd={tV56nI`fQmt8rEbQaDeGV;=_1lJa*>cJ`p}2z@=pV^;zB*gV z936Y^1C|PPM(G{#MT6#MZ?5Jpr}mDY1vkfmTZr}}IFFp;R*Z`LdQW(9&(0(@=7Pvs zM+uNt@hckkEeU-%t~U^rpV+?u$;FwO3o_d6%Qi?Te#p$`s*mq;o`L_&rT--L>2K3) zv4mZTP1_Z?5J%BujHMrUZ87T$tKHm_U==Gz*=9A_vh zxmDc6>em+M5PtjGL)dPRHC$NTJ$&AA@s#LI|9U$W9n_G2f9sRt_ik5fq+qfNg!DTn zk#vP$2r{jg6K?SVPKlfeF7igH{GLc#&wh^pH7+^kan2X{aL z#5=cOSw}tpr&oG=KqV>M9U{O>ZsPIjiGlE^(D2oM)oWChVrCreeCb9LJooQSu2mRa zdBPw`c;)6g_-*lDG=)|+mw#!ahwM;P^Z_k5uF9mL#9}NzP)x4iTIZ??2B1pYlyyXM zeDV|=R2VXb`nYp5u^NA7F4Z4{NCmyR^y)y0Xv54fQu6E+@xh5~fl;OdjIqK+lXxKK z?Ct2|SiK6C1FZomI#$m3!&>UkrjP8do^EZtl*Qqo2(RpzP^XR7_O)6C+5NGroTa6D zHcpQcdn{U#tq+6<>6(+6r`iqhhVxK8kQta?z|wzPXhyr}$DQwOYm<2@5?1#}bB5f{ z{}`Hcj4mnDNv;WW)^S1Ue| zUf*9Xu4Z5o6%plv{elH!P7gyh+wVOh4HkG2h88SIFq0sc(ai@}ZG94vp|YRe@IDK{ z8zcr5DUvoQLVyOMaxoNIku(FK=ty0^`Q2`~9vta0QPvbSMOzq{bzcHQ7AMp?Qw7Si zVnpQ)hJz(*ei_ziqs1N}7oyzdGgSdK0U<{!qrQK53!3VbIbLXnwx^czT?=L|#M*Zt)JIrHZU zQLN)l$2tS{_b7#3s=#NY`zeF&X|f<|1D>5fDWE+5+bQC2Mwdu&$;L%uN0fG{VrLfA z{AXkGbF-Q3X^Bi29j4M}^&SE}arOaN(omCR5Dmk^mDfQw*h^|byu`yJc-ia2BHRPq zO52}kw>P9HzVg}Od6dE!KK4X_YR+C`HhLXCJS#zSO__EF>J)P*M*zY1k7R>_J(8wW0zu<*m@J;3BJ{TVv4EM zsY%;dTlT{xfJ4!W^%!b!ksZ<)tqSumHJf}8zqm;t_`rQHo0wimjRLswGfJ5WY;DJ( z(x?Q0rn-O(OPytTO__;ypWoTK*OCPr;z!v~S3Ljkh6~lr+CRLl^8?p)QSthn_&{-Sp`%r62*Ix zDe~`wY1Qh0-=?dU6q+?p(Y)s_*;X<;o$?&;um-Iy(O%_?lM-+!6i?}2Bk3zE)Tm0C zD*E^`PMx^ext9M%PP^&}kHz6c|92S5Fk44qdq#63j>JS2UPFBG%~XyauvsfYlGji* zyMBXD*)U>_tOQ3L51i+A74a^fBmOZ3<40Vu1*bZN0C(q=E}M`{@rJfOnKkO=Gk>fT zaNxmNza1yjd%b|R*hY41`77hn>A})0t?NKa$9n-!uiA5#Ila~1 zze<*SJvoL)2s}d9z;r}Nx4g!AKNUZVlmPFG@0}?nETivpHQhIZup^B3C0xbyXDu`PvpDNg#`4n_rYzg3Ip#%{a>BU?BuAK#- zA~~d$StgbnVuX#5gg?WE0vlSW39-;^*}aZD{BP}AMujk#eIj(A=DB_Ii#yfc_`B`(iAPs-4mt&= zS(5(z+M4f$q#ZXln96MI2YjOAZPB~*|4GuvMp{4sj!J+#OE5O>gAyGK@nE-a{{Ik@ z>HV3?D4y(mH+)&b6?+`-`kUSBCNee5^Q@Vd$6)!vQf<1G`-srox9H}QPX;M$;CL(p zaJ}urONAcz;%JTL_%x=S&Hr)2y7lc^wPpSWRtQyYqFtG zT#}G{)dcqSJ21Qwq)~-7vBB3b7H+9=bA1%ed7>}X zCHLLo+iGBz4yNGRPT=QY@-0TP4`rGzK`e3{LZv2e;dp>Sb8b7-z89JvBe%c|>WBM% znhvz$KxADVNx;>(IM-LyAZzm9Q&{iL2oqR84&L5`B-5=}?eK}|2P0@37`)!~dNc|IOdp&}No|?8!l5jgC_ebIY#rtMq+fbhnoO%y{VON3R?A=jgBwgB@74@Kg+9$0O1_h`UE zsQt9TS|*v@Q*I`$wNSRuTP{~07A_C%_m-kbq72ns=>FjuCCMUd=#~vU9VY&)m)Pcj z{7xuOTR&F$7}S+zWL zicv%&DKKv+ip~wm&vhE6?qtumPEN-CYH5MdzdOzDa7-tqIf>8z;VN zfM?CAL(`q90ET&nN8&f!Fv3VHwcRz4GK-8V>|PW%Mr zmdC$c&MPCzNfGKc1=}2rHZaSBRf{n>DdKPLgW~^;BBDqy4?WD@0gbK zhBl=j*E@4Ohl-+C7kYjBy+>;kAO3t>7(En2UfMrc+7EziT8|b}@@RXp^pql$=GuEB znJ@9D4>Lf8*lUud>>CEvka!8euE9O!_toy;%tm$d&v{JuwCGEB-}jN<4^>M^Y^>*t&g+9Yz+-dD4j{l z#E6d9rPs1js_QKeR=2ikNHqnlWkgeonbH}O4P$8zX382kqRLXIw>{u?_LvgWuOOd& zw|qcXeYIzs{^*zpDuKY+Yf*m2FM#;&1SrhSpn{p=cnQ0Z>LB4&4eSjrz6wg>I<5d^ zT>6UWU5?;rALSL{1~b*Hd#L!ueBy0is4~PR=y3Re0%rYGyF|Q?1)=ojN(HQ@L=V4_ zJgSyirwoDWyTxgB((-pq&d{=yziua(mU4Rd`B_Oq-)i(O&N~u0*g_uFTe0K6w%*{! zNN*jMyHQ95y^))50T*}AesXB3ig?VsNY2SMBs+*T-#xzjl?3{d9LoyL?AVD2nP?pl8q` zF0ZGu$4Os2<7GGf1X@-vS~NW@emT#*1h?ka5QR|zTY7tXbkklhvZfkTG*Za*jW{A# zV=r5>D_g;bfA>hZNvi*D&A{By5D663=Cf49R6*RpKw6s&+~$DMIZF|zA4FTbbYjuF zJ9573BknX)-H_>Y_gnTdMV*RThM%FKB~uSx8Y|`GdNhf08s3`G0lZ3^NV_K0_MIZN zBk^TXWK|aY^ndQJEWnJO7h7RQpb)Fe#oZO0#iMOxr`U$ z`FS>7(F23+%X*f3tEpie8`|D3?Zv^=Cs0c1VNiY@?&F@Nea4bk-p=<};VU(mAxO*y zetbF`d?GdSQ{ZbY14^@1^(YvejM@9DUud~4t zHB`PR#q|fy(~g)-KRua+zUm=BXJ(ocx-*P@BHb-cY{IA@_Hj(pK7CmG>G#9T!5#NI z=Ak7h@|83!#&)MVfRCJXEG$N{+2jD6emRTtEuN>jR*zt-h$@shA$yf{C5Z z@}QaApF3sV>3f?DWmp*;>pB}jx_`cHW}JC@3U~jHi~{Ui894+<{5Y&~K^!7V8OKgY z;@(Z+I(Q6r>EELgVEx6~PSDG?sTHZ1fmG|55j)%CP1SO3ZLe^T_?KFLc@T^u*{T!k zByF8PVy9{ZCP}q+J=Jxm_$yZDkN>j1|HZ#HaV4&3dKWa2Jj&Z@ydD|)7uqLD6?MGD zF6quLM#@6AuX9wcQtRR89|9F_TFvBxXNY8&Hgr&3POkk~1v9!tsQ%*FWwg!+x{R-ME-~06#oC9L|B7tHno`EeiyHz+FaMk z=g4LqDi2cE5%6wXF1u?E4M1P1;;{hm%s6}N=jXw}k7V@qS`j0(?1}JnPT~cN3@#Qp zGsHXG@bX~a=2~D|l=SFh#zfpOb*>km|BZ=5!uS78@~afOg9(21+c`5P{0$<5lw!C4 z&&AY5*_@ztLHfKka#!3j-*og0)zJ-7WVL)6ZO%xcq0KEHn`m@E*zjPSkw~!vIM(FR0{H zw`%Ib!VB>{Ch7CMgn=C)-TP25(mp>S)$v$sR3M6XR~VusoyCzfKR|H$xgNy`d`!+c zagmC&5gt)*T+w!{f-VB{tpLRMfV7FBb?fAu{`?JsnvZd{K*k)NdcggmSnJQSURsQ| zvCtE~WvIZ{$DSo;<~@iZkF7(d8oGPt@f>;RJ|QMMZV!VK4p9%km!FB^VSaMkpG8_` z=zRY>kP;YeVcy7R@iv@TTp?cFtC_W9!<*W=Kb5|#Bd<{zYdZZxlRL7CSIi11#kg#t zW@E0{x=0#|%@M98>XJ_$)@`PPePMLNGIaqxg32qa{(Z8PA(*_-o$&TPqSGO$H&L_m({xy6 zJS%rWZT;>XJE{0D&o*-#TDjF-f&rex_F4#K*-kr2(FC?-^V$T#!@}~B3$h=au$lUw zBu4uhs<$!(4Gw)R<`80D-wsig@9#pV@V`D8Pa>N2)*Ke8YU~Z8(pGx{X8&EGQ`aJN zwQH|#`U`anc?&|Hc3@wB%n&)MrjjAUwpbYEcvS-z%UWFs-VOhuqe?5cd1%vTo-Oxg z*hg}dD11nYRt*2)=HVPSBb%k7@^tw0k7}d^OKw?d|E@7|&aMz#Fy7*0=-y!IVKm+1 zA+H%(cX6?A3+ayLUR(HL1p}-4a8iu8cOaYFkeWiJ z`@wjM?cmF+&e_<4k#O_|F$g)%S5|fk6rU``=n`X#GO(E^8pK+YhYH%b5fD&Z6RI;gU+gbFANhu@8UC@d6pn}(##*SYk1I8Gh@qX1EPC}o? zdzM*T9Cr)CQ7m{Bb{`rP1!M#Vnm9-YT#Km=?J468v6yOX2{0#Z_*OwZDOT0;i|ZL< z)TKs2swL|O&S#p2fyk9o8p8XnG>Gqi4`L_S6dReh?e2uKW0l{Ho&*GdTdY(JW^4V~ z80)`e3}Lr^-sI6O0x&8gN(suuvNuVE!Kf!zyM8O_(RYyB@U0ouNlX7#w~mRZrm{#K?o#SM0j^b668c3#Kf0k&Eb{hlUye@KyEeXQ%wrj!>Gl1B+sMEoCuw zmTLLXlqgOqyZuZCCJtt{Grmd!aX@pQZECo~gzl z)khXgs;Tmrz5qzUv2DoKl^2ihv#%=%n=ZT zqEk=s;R&EN=SV+GH>$XiqJbauR?L(AzQ8|6I5o2Qh_>=FP3avS09Bus0^ zD2p=+Jaj4h4LR??SCa2@T;&HGThucy?ueyyl#KNb!KA+U+~9Du^~xYymlAtkRQ@2T zq2MGmPI6Jgk2THnKpB;E-u(T_aPyn*ogqmDT zn=)Nn_&6xict6NIYDLkJezza;T>8`snI%G|kd>b4p1&XoSsnDeBHU-=Lmr=JyULs1 zzRm^k*8VF3;f*A?U0<%`7cUz3K1|)sC+(7Zb0z2L6?dl+7@xXnoc50a;D%n~4Lx%s z#ynGj{96tEiUdwJDO&BV%A3 zE5l|bL9(wSDUuQ=gw$G8UeHzGBAn*TYb{f;4#!X61ujx6Vl2TGOU*;Iw5%y1R!$2E zrt-*&l`UxdaUkl@7@jXWTV8Q!uX2J{NmEq#creJV2(wmm;A+cOHUd{5rfoFx_!F5+ z>!7a{`(z$Z-gEouEZ)XMzWsc)B|z&r96PFR2B=9j**^GzjhHSu1uuS3AeT_+QHZo} zC8&mm)*9-Ab*FS7=3s8uxmmVx++e^oNym9b-_2%zCu1({=Cuqj=rf6AiT)fAQvi%I zs36`*LYr-%M+}w$)eG3*5?|}YgvF+EHC&4IS`f`TS?sJL9#8+f7iT_p6yA0jG>hyMgKh@M^8={Gf z+EIqV!@-w%vdh47^qM3&e+u6V_zsAV(m%#YAUQc(R$VRuKYqiw{97y2&Ix?%PJ0bD5_pH z3eM}U4#}#C;TRC`Gmv_G$lcvgUtpJy~T@UQfkxiTcq}*OOke8N|!jw zp5Lu9`DN_@S!BCS@+UxCqoF=l=N>l2&>R*I%oD#*yMbNbK)L-2`jnncLWm=OF}r}e zv9*!smm+O?qJjxVp;{3E4YgXUkARJD^qulH=rL&P7`Yb{MqE_`Hl}V`l1Vm|0}%um zh=zK7+h&dh1!lfP5mm#TIYJL>V_A-Ym%LC)FVTg^Qcjzhlef~ zb$6`hGQ1U6V_0ZWGLNa1)6k?f;zZn&=}+9CE-s(6I0Zz-(|N1Q{PsLR|15y3J=v=# ztXypHV(iQ+al`)4`2adNdgok3>sC1$%s7Puy*dNAQB91kk4eunSyDst_$7Fo;{s-* zS3Nb54jM%(SKi+sP(D0qK-e8(eNz-hXOO;Vidl(+>rt>%>Que-9G43BJT}96lxq1T z5TcY*mHW!af9M<_HoLm@zqbfso3GiPEtZ2EiQ5;O(Pfn3Hlzfuq4D@4IQrU#xlCGo zrdm)A4j91x)9fuzac3@joLzFog?xR8rP!|4X$y^b%ea{%X#FJ~CeoWVbvGRZ%wJMP z&^+_(XKHSgM6rNGmmqDkP)_OTv0w^Okb2qQTE`^ihd15y8Cr&l&Ou~Jhm6svg59QL zb6W3FtR9xH1y)X+s!qpfCqKD*&XZP229Y&Q%BjTzZmsbsFm+i;L7oqhFn)k)pG;Y1 zVggAKK5%a{FAN+_GWlVVJVA5dxfbreUOyPuheZ?NkwZp}e97<0sVl&ra~tc*F|uQQ zz2eVF=*Aq{-I%M`0#_&AZhnb#+&U6fR~0}n(;;aXq+E$G%e=R-v7RSKP=5oAh5b3O z^V8>x*zgW(Z6L(_bHJ$^+KV7wnNb#DB0*^t&5hZE7yXS=q)5z)A8=9E+5AKX^Iw_< zVKf?*pm@s}r_#8ccNcsp%_pDx*T12{tQ?F8pO81| zLt*@BmZ{PeHN);A!-5b}%5Vx#lID=&4s{J@hOU*EIimGDe_awN zyn^XB?zEh2K6GsT3k##6$u;Y8x-`F43%Z`e9XKr_M!Cwy1p!Vlfe|8z3>HxX^Ayhn z9_nI)6uEncOQL(y-!3R@n6fxV@{Li93`C%r^Hu%^fAe@=w>}hT=vUZRCW!R=|C(y?MPy*=BW$Mo5t?E#WRQ;xX$M*QA_ zIQ3TbX(xZG!2ZO2XOz2MeIsIFck7#jrrf}v0Kv69MwVQVL>qH)7{W{`;+9C@oo7M= z2O+u*WxFfR3G@GYeRW^IRPF`xQ2fDgNad!9=|7i|#dE$AAow5|-{zdF2o}1{L`{J6 zZo)iY+%fL0`?pKxJ<8f49G^J3iv2ob!DVs$RrOK|G+9%k?FH7?{oE>(?Gs3j8=1L2 zV#9lh?o+l?&o#tDVeLY?c**aru^G3u=Bfq*GVYYz{?}}py%^+VsP?Q0+MN@@F2w8S zZB++?%9+oTf}^w4acdC&J3vpsmL9 z-gM~88^(c4JCH}EwFWMJDVT6R!Pljd`mLER>tqW?AYBe?PItN3!@hps?iKNL4aKcc z9u1C>!N+XQWWzIDdi++m(;8~zlEQR3Wl~$*qkI&SH1=YS-?+9YD(nkU?IJaR6ikG()l2Qg^XaE*1>`>f z2j_8xllr@ko)nYJ|NLsN$4A)4o{QS->w4(=E1t~P9J5cIhey}DSKN3fNc^Bv6;m0!pICoI** zpb*JiaL5ZLuURB%85*Qm2G2l@&!)M=_B%|%c(B1qs~9IZ+Pn(3S|FaHQ!m?wf2=^$PECr{FX~_M7V-FWanFIkX_K;Z-g6B?#6q2!-_$nxl5cJBI2? zSlH*j&Bg75bX){~Bc6~^#*ocvobP>Tqt;DAKiwzyJo+nkH>;8!iE0j5$+Ap__D2T1A_vylQILSXM2(o`v^OgGtvCFi~8Y0%`{M zP;;chk)ITofqBh@(O_QDA3RTxASq34ENJWeiT0(ayn$vlQTK;JI3aehsHrUkLS17U zeP3e10b&WBen}#5nL0Xa9FY$Vg51zvgBPTSKOs2GcugFQp~?WS9}%m+}Uch>CTVgy@xytswcrvUJ>ZYBWK! zrmJ9^+?wmhfQJC)^bgVCqqMl;%M^nX2VK0bV9|wHCo96_nksLwo2{VnsdqvF7NE0v z-V{fFff3SSkj9*RraH53*IAPDKtf2_4N`j7K&z+?Yzj97px!A>+>SFW_|@jO+8JZx z2>X~*>vU?AkYRiVg7qi(|9D9M;{vp8d1pXUMHlOUeqr**{9-Gm1)Xogn=0t90kl*> zeTeYN8m&nwR{Prm23ttxM*kRAAL{#6%iyP5Q&P0}UOB-t9Y%4u#~vkadx}M5QMZa= zL(DC@kKMhTE99Ll8Fm62uY1LXOM&w9yf%O53cTH$RURRiFAF%dujQz(hxxGwyUn?B zE#DOc)CVj}8ps+Hq}kmoDo<&mPeeQaK;9w^sI#;iQ1f+-ljmSy*4-4mOqR&iSUrkO z0r&CbfXSzKNR2ERD9Jdpg$`s<@z)ji@$s!+JCKrD<6>w-n` z)>o}e`@YsH!w?Un&V?;GupnB%Mh{5V5A&5k@R=|4z7!}DmGQ({cncBl{s(!t?_^kk zqkw9>fc=>J{-SIG!Q4~=4T}a5fC2;v1_;ZqiE^M(a+t14mm&zykTue_@G}ctX%RRTN7;goA=(u3L~K4z-h)wL`?-XFfCX80X|VCiTO&la2GOCtQ=`KdLdz;{3WE$esCltlAB- ztooj$Q;dss=D&_QW@XCar%)r+K$VantY99*a{n2Fz+*Y;bAl@doOe^NG1GjT?!IGz z!))ytnT`5c@xSu=dA|ja#-8-GC-Z1^b#&hyhB>Is29*Jf0HqiPJ#ObGB;mZB6hw{! z^+FqHK5|Eig-ez5T1`Y|4CZw+-Dm`MwY7keQ{&*DS2eK?IJk@Wtf%h^4%3`8m_a17 zB`}QXUjy3MtZXqR?1r%3=C+?VVM#^GEj~_LiAs_TP zuaE$5ZK544uWJsTDPgQA0t(nEC}tE)tdqMKoALat96|u7+~W2JrKi-7zUrFO)p0wJ zbTM=mN6%AD>*jMxK@v36PQxi0-cNs(YI{dpLCe^dMl-6Y@B!2vl~D2&t(RauV;g9p z1lV3Moyz>YPe~M$PhzG+=M1+wbi%+S8$}j|3`Pm)5jg31DBTJEwX?DEV7aDWMSE=1 z?KQx%pRjYPJnu`1ol{{5t~sy-RDaD*p>2 zTHjE@9I;y8a!QxU1%J=h!h6tdHsMC>p2`{5g=soBWl=P82flDrxs8gWm0w5~1k)cl z64Uw0q}Q4|+3EaP`Im9ecpJI!@oY_=2Tr)WBA+;yv7Sk~q@+F}rnikoJW6P3D^V9v za^-?>rXDZS*I;PaLRw`IRR||$UY~4U3v}X^oabQc1-R~T4~HiyC+3)C%$!-zKm5gu z03%TWYPFkUgUZTsG^oiBK@wFl)~{qy&H8?b%wQ|oclk`r@;)>R#@=>lNK)1cck!d; z|M&H1gY#QnDb}c&q-uo(Lw~}v^!>^6PhG7#HZoqc-S$V2<~y}H);J!@sD>T0b63zF z5N)t5O;>%SQ7TP_$2Kz1Dh?$9TuxfkqE^gf2~mg@O))unDT9x(&1R^~mUI12L0-suYb zS;Z2jQDqHwENXm3akp?vJhOrs9jKaM&n-B(UV6G!5KD1Go_0@Z{VnVCIJGrQHgUn; zx$dJR!5IPM$FzBiT)pXdqMupHIuEeq+Vom8j5xN$1OZ^SF5?iuIiBMoCG*Pw;a z@JDH?ueTR21w-^fLs@V-h8${U*}K3cjz%B!D09bPxJ$Rpwq(YIFcTBQed=I*f!6!Pu0sUyg$ZAqM?gFVMdif`H~HLW*B$lBqj21OrpPodD z&qZGEka+3YQag^|qM`i~+MD5e{g2#RG}xLR7af(~w$8kn?C$2!>`Gy-lNu6tZlj-Jsizl7H!1rFIYJ zpB-+|8C?!|h_aifY;Yc_E^MaaufU1{0)8t}Ng+@K_K7EK&@5BcU_RseWZqM;PRgR`C!JP~tD+mL+L4?^3UQRtdl z0Cb96zighX;U8CY#WnQCLW^p^K4!FyCxao^~KU@L%zv z{O%t8E!oh<;W=m9q*oO>X40e~@BX8Zv!*Ozk0ep^O2$bjHSFs-FM)XM0pMEvsK9E+ zdMZpImNtObrCtA2GoBppY2PHDWedE35LjX+-2{zR0m1!^D|WxykN!}FR)Y_egF{gl zmi*g@T#I!Vc}+DchyL>%W)wb1rL7HfWgqt3X$}%+X`s&9r?;d#N_Zo@tEsm&H2u+y z3l))A#n4WSqlQRs0mP4|XAl)D)*r6AsG_}WB`>qpA`ugehvR6Tu#UGbQA}HOZ(9xZZqKxQ z4)2#Dg!#svoMn4cLGqkU!{;K@FZ$FV=lIfVIGX5);nvBlOd*odog!7Fj9(@h@D37y zP!RG~k%WwZZmoHjPy6vkN`D6%D)Kx9DZ(E?N_z>*%Oih^3chbc63&1vIntJW!;%Efjqj5YD^ikcfJ#IAE{{z{GF? zaAa|mM-(AToYDKKVwj0vBv+&Z7_CHU1y~>tYZt^6>El9@#z6@I-VXd~-@dIUNKxx_ zeWmQI1d1Ops1?|etcyNi3{R(AeaUd{Iy&I*RwCIO96N?WV^wNdRKi)bo8C1C(A_l8 z)>IzKt`=I$){$z22D+o2#rXBpw>HBI}kpA-{6Q_l^$ZziqRCMsSgL)pe`hw$wyznHp{O zK=+UETi$!d{PF=5pkH~vYUsh+!0^_rY^ou4FOAck;`xL$0Km>m-v9vGTSDhA*IPP=U#!^( zO)8d%-QRo2(sMffvXx^<4)V@DLnjMjfjGP9cI$fn{?T_AayQtWs_e2t1mYw^KCb^N zJMo`-a{*yqC|yRvje;++Qa@u~PBmODY4iiLSmuYaJvdJcglOm^S7L|imM15MH08#E zWSD>1LsOU)X1=jZiAT`FF90VnVdH;|#QtVQt31OW=L*+($@-g?$QqA=`o!v-cBF|e z+;7Fy&EffpW!M_zo^Q8mbtK`e{!%mrw=H2%{1%ds7lHV_?W^UbV!e0_JhIgcj2(cs zMc((BKI&3NIO1+ZS@A+MZ@2D4VJ;pW@-p}YlG-_VpJWsP_v;t2QlS{$30a!X{pbP4 zG;qz30VT&Br#4#o`2l-aD6iTelabMyHh)`Y#53|#BX?CKG!Iw0CG$eZ*c1UoD0qOd ziB16u22^tjArGtmya~9e5_zjCG{yvjN6gA4DorQBb**|{*+3992n>(0$C%nPqkTwG zmL`1@*7Bw^4PHofMT5G;y$`}!MJm?gXT(YX$f|&{O0GM+5!_h)2YpThHoUwyT36=; z%E0MxR0p=`m;JDK@YCCl)4zJJp4tzW3}C-M{RWe0G^m?m1^nk0|MRS+&#n~e%U?PO z@L34^XWrdB>&nm9i}yQ_5WgAsUDh9BiAgtu!^i99B5FLuNY(A zl?>2{k;ngF>TyavdL;*c>_+RY4mgJ-$_Y?2tgA zKo$7P6nj%fyuz~$2tV;~=(NXYbX+sIO zJT^LSiz+CI`CLh2lS&xFepGwFp(3kN-0v+a@cQk5w~riDo2;EiQPQ>4;PV34J02)s zMU<~1j`GPDypIHki5{v_wcFFG>Gq_qK-RdTLYsXtEO`7BetY$8b|tF zF<5#AS`T#paxh8iyZRr#deXs%t?Em5PSehbs&d8Jl{|qSvOD}~LKuQa&zCwuy<$r< z5gIlpsB?9(ZL?IE;KC@2c9yEm2`Qn$JXMzPoU|d*`Vf8O7jkVu(5H0uiM*d^ zT!4p1Lmhxuz5#%Rx*+4zwKBxi)NX?&6`HObBy29rfok=$*2NY*-l$a%x19Ci!<9w( z?5eN_AvJzG)D>eR67UPF%@(8RKEzueaS}|OC*9~!Ua?386D_>Ml$zaZ^I1L0bz03C zIMEmlOt)XN{K`YU6Uc+}YH-F8D5zObGOT@t7c{^Kljky19+iPZy(voPnW-i4c&~vC zQ7e&d2q3csg zH*$d|-DT-q0#hwb3(x4^%YmeD>SwSDdp#mBiq>)znDP(d zF9q`^(K9e_(n-)J!5HWTJVfxk)y_@X?*k-t_Ao)+lQKsO9H3iRA8p~NYE75# z_7xCGRr*F0q5QdY^L=RSB@Clai)7^hY}xjcU~^ZlC+WHt1qF4hJ{|^@pO&DEYA7qR z))o%#?pSd3J?-n-PD85yG9d#a*%b>V1YUR%>nFX(;I zYE|DH6|%W_%aFbwjdEI7Daq{C&+hfketqe+SP&~aFmIl&BW-M}t* zAHE^^YP_{nf#7M!pZ$>$VbPN7K+|}L+FQ7<0qEX>mJ{LNsuWtCK+9sE+z}pD96B!KW0S8S)A4TlrU4A} zVUOW|9xAAQG-lcwtQ&7H#6(O^o8;)Zp?tX(82AG6nt)2ktZh=af-`%y*8o4C4NXnn zS*cx#@me6)xk)XtS{Dv?(#Q0~0xP#!uw=@vK(8y~kY~&FGS)vXMxGCO6pETLbWy+YSQh)P6B3!XZYp4eFS~ zJW0)iZx~K2T*iOc+T4Pg@4+ zJ-)y)CwXt#luEd|#7CC@i)OZt_Ggz7iaYYEVEE2q-GT38UAUN39k8+OyMm#z%u;He ztl3sBKCn4)#IxNPZxr*%aG7pOU+Za6Y1q{gh2UG}k;F%9rzIt3kamgG(iU&~-WFvC zT>TN18aOzh@Q2i7%3Dzkq(BX`@%lr5XYP}>cQWMEf)hW*9 zNlnB{EuC}?t0Ju~f>$iLv_YJ`MpJWfF&0@9#&^Yzt1a6_SnWf-dt8(u50D57=pC3l zJLtiV;O+aRdi7CXDFCQ{*d;09Wan8F$5n7cnq+ShfFTkcMZx848GrXza(t3bD^+eR zfxT5Tlp_R8O84|8Hvg6;m#h3zl2$@=ErDnkCuw$^5f6Rf9|(Hr5#|^T`hv}lpm+f( z?dY|P*0pSv)X-H5OvGV3IghY;es(Qns3se&>7Z+~Xq3l+T9GH60(WgD5R64B6IMP< zZkmB9!FW$Nsc#o7PnWo|^lvR%KkfatQlsoKEH0B0TLjz;wae>%cP1Y?m`I2I&}*U^ zP{>nq;JH@y*-GRi$xDulq)&~NvR2Q$+vXHplUI`q59%^*2JPJ$XFb@KRq6(7dMDF1 zd@~w(0}b)4?<^;;6kFO{m*f3hml5la8?Y&|@B?wa zyR4HiD`0KXI^&bs3c5b>yhcY=%s3Atf)9e5NE}<5>~jq`eDk z`WWkfjW-pemse#70*Tae3e2)a@VPg^Y}Uf_8RauDyzW6 z!)R=UKsU6lw4HFYQ0Cs;8QDw8h&eK<;-IQXvV_I#_@6+=4Y*?CL|hW(iCQy9 zLGf`7CY#%!e2PrM+`qgPovwTY0sDzMNq<6v zsfZk)$)4h`RL50p{^3s1XtR`;)45nr%3XgEifnIB7ooDt-7lbV_vHR&(d?k5hTE;n zKtfAah9FLZuz?x-lQQgIugA987qW*z!HBID{Q@Dn!|rs})yIKk5%67$-U+U2=!QxTe_M4;E>Ip-~5G9@c8X8xR)-J#j7 z(!G|T-?5o@E&48_V!*zbZM%Gg;5f8)1|eTgdfpfT?q$&snWe#{MEj;4Tvbx{^b zG(w*NM5nQ9`>k(YIwb3pY%LODfs{{Z=;KV3Pb1fckyN+3EP)UWK^cvvR_ipe-J}#l z*uDmK8l2gL3~Kidt_O8{nh)n%O|N;6QE#8XE^dmIyzemWDbpc6->0zR={E=xq@MKs zqQ-}3d1ddXJIva0YGEor0*ArefeHVx8XzB%8kGthb~1aHxh(eknRD3oJ~u-aHWH8% zt~v!*V4D)l+(^WdiK47R;+L81d3B98S0%vjfhyXq_%1$-+Ni$=+wvlsNAQyWe`Z6L z@GuUmUOPa@c+?{MXLrLp;FFqcJWfHQtNw57;vmS4dy=~7@ec8X+JUfH^|#B_#k5oM zbPw9K=FVOpZi~ID#F_*oSm0&3BaH(EI1Rquz6)IM(5As za%g&OGHBq~?9R8SOP*}M`D#qA03_o`fgMS;PZo}%-Em+1I$F&dagG$mw`!ypaV8sd zjP_$1&sA9(Kv7cL092#L*1 z3M-?MlPWv2*F(T=_tQ)HwKO3zvP}ax-UA*1cIb=HOxE710xRw@mbke8BEGGQvzYa6 z*gnCfQdY#0PIkm=uNRIUB4MDc5M$eemMVkJS70h&2KoJz4N8dcSHi|BVc>uM0lO@| z-dH!qbvd|oVLTwUl)8f?wY3k_XqWDM^>vMh?CM+Ue}E4+Ref&@8z%TtnGP_<*f~t< zS2J^0zAmF#ZTUwE+&vq}E>}c9e3C0Y(1v{~G{6oQtQu(68E7e~4e_-NX*HQ4mk9Iu zo=Crc7M60FzCHXs^Szl|VFxUwPq2hbAuTOa(C}E!&W>YegpxXRfo)Y95`m8ARIVz7 zOptsM|DBL7RbA~l@~f3^p;Eqy$IL;q!ROgTQ^f=9#eiAa!i_2qDWy4;s>^SPnS)e# zqP#=mS|*tsuw)q1>}sPwd92N;Bl1`&Vo(6xrSe@JcW>Qrhzec2tC)4^Gyqw^64iIV z$Ioxo3?i2+LAr$UdwemWjsK5?EW1)3dImKy>(vL4EJFS$nXsG0`z#YGb6%OkH!!{0 z-b4PgV1&adUEy2-K0DBFb^lr(w>cD#-xfz)ImiAz)8fvmuR%a~ph(fE^@`Jc$C~A@ z$>Q8yV!n5JV&}|7_j$$OV}rM+t+GYhX0BmUbqvxOjwYM+3n23VkC_?TtZa3QZr&9Wtd*{=(X6=KB(BTHSQR?Uju#^8?%k7 z?O`Fz2<}u2GJF@)=~GNDm91e}UkDb%I@607Eb@AR_T_))xfg<~v(e5`kDaRQiCo@Z zNV_1FQ&n*lSH4reURf7PGF=Rp{ub|C+>g#op$oW-6+CpH1VS2>~(R!fRG2CjZOk zBR?UCvzAYBn*%CNGY^HUW>ux%Hh;QeUP`|?mzbPqPaPguQ`*8PrKoi;UIEYA&Z9X! zpVgr){=a8_yiY&i_=D1=39ZS4eF_4M9q3PehM?YolL-$=REthQIU$%R{sAQ6@)zaF zLP^^Y_+GYzisPvUPs6=5lD_c)@NvIhDHubK-_fDuvBT}?vn!`u($pB!zJk8A}lvb+;F>kaPhTz=^fA4U!8=ns{^bY3q*8fN=7Ga+>c7$ zqqGR>lcZbe6~}gFBDCs^toECn9dRLor3h|5y*Qnd<00D!!LJkg8_Y#D!ug+W!1HdE z$z(WKZD5rmeVnj7@kKOI-$oRN(IeKYw2f6kYmKkdSV`@YD^31pYlJu^uY1+b>XacK zBNWs{sDRTiKnhv$UPEU83}`eV<`L&lsCPtjt8J5$ybB3RhqU$tZkvntr(xqXWJ9Dk_OtQgV-@T97tDVY5~E$^{aDi@L;s{xdb{p|Xxus- z3c%B%lYJi{pz=(y_%wumJCIN9M`8N5cdL8@Ew(?U@#dF$+EdB$n%`&=?JBAxgOKFrXEN`lSwcW z94DtsAttXI)TTW;-_E=jH$HhHC1gpgv07Bz({!@;1R~8ldsJ?gXSshWN3Vmm*Pg0v zH#D%IGaE$Ig_a>bpv(QRk)MJ zHG#^cyc@uB0>-}1%4Dp_hPIue^bSJ36X_PD^!L?@DCYMU^Rn4~F|`ODw#5!kZx&{m zVc1)PhJZwUSUi-i6Vort*Q+mNa5sH6BQ)6Rjkn=*SK()wt6N%Jo{osA1z~xFRNarz zRedmLga0}GN_hYtC7x=LIhx#j@@I&KY0(3HR>-4y>{o#Y@fE@VxN3A~s$>FbU{L^% zgJ0*l8m!Oj>P#P3mt5t;?Y*lGTSq?7L;Ji*sJkN-ep2JK^+aiTQHL3*fww4_mt=?S zBBb&rRFXPxvy8KQRF7#UfjRrOf*f`V>@oiop)E@m$Q$Miypm=h^MmF(b6F|D!>4fH z_aBnzWfd%f&69%~$XNnVQPBJ_6CQaeVq;@E&BfbO9mr2V+iBJxHeiV^gzxaE+IkRslXwbKUv1%~cNB zC-i%qtY`qaxj$z5vtmtZo{%q&<^-I(ls8Z;iXX;-(5t7}xxuI;%NaV88k;n4%^`W4 zPsohw5h8k8PRa~xT*Lk8u;?GZf;*m`oxbH8$@GR~PR^HZ$Uo6}1C5rtr49fu?tE?R*SWPJ#uobqk5u^%@8#x};p;HlsCp1z|oj%|pf*0aWn4@LAx zrBy@pd)w!h;_fKG z==F|)v1?l#^fGB6&Vt7A!%XPbD-4}6;w@7a+T=7Qxcu7w1CFHSJ5@bvHbG{Z&hn+v zS4$qiHlh+xd1r^~81Ev;rlV0-9tuS0Kw_4#n$4T6=Fb1pL+wB zNFzGQ(^6s$K{tpB9!Kd&50jPoo(5I_U}dQf49nl#hZhuDb{-o|CCd}qNU2MT!K4Vd zMP66^EkIjdCFoB8*@!zhKhSV@Kd}S%NGukuO1@*<+l;b*L|P$UvEDRA)TZ1?U`Lpbc)|BjUS54WkReNb{r2TMpPU ziA7XMa&C%zgU>2Etc7g{)UxD~rd^U=S3%MJN(-zBo7MkH1LbroCvt=$et;RjJTv`$ zwU#T>A01{4XN~RFVxwD?^BcS!laiz(P9zI&DyE$oP>Jp#C{o&QGntMC^62re>_b-kpF@&oB@8Glh5`|N_kQQZcGS2 zD$ZS8Oye8@&B|i&Yu#O*zuXMtfi|Db&Y5J?C|iL zs$6ZcUWW`V1}joS##mNKAOxV0u!J#yW~LGos`b_ybmyJaej!u4`=Wnu=Wj!0SC$2D zG$OuM1bCfC1V28~orydAW+G)mj@-mvJ>4hvMiV_e}hOGjClkIl3oET!Jif5qtxrZFGk6-0yA z&&?35qPHhbKj`V@LY+1Pd~b&|ed_}xJMOla{Xa~OH(xM&56?FV*_br=PycHYT@E^! zmN6TZjrNq3NY;yIQcOMsq~!Wkfja;b7`G|g(MqpQx}0Z_A;Uji2*a)PP!O|1W|ovOQ##01x0lUUj&)G7)SzdvO-A2GH8gbm zjM1`CE8^@?$9cWCik7W>D=8QbLAKq2B7$$a(!CDK4Xjnub4VIOuU5CLAl4Z2XKXd2 z^XzucK1JP*DrLde_-#D3jyrM@w3m}8k}W8$$y)iPziRj?fZYhC5+v4+2V5z9Z;ql6 z;hr1xXc&v62v2KJHsxz+0E5cA&i{1EKdWl;4QIv30hiO*v6>8kEzR#i5`r^Pyp!4# zFLj%0E4_MF{=ERO&^0^xQ;`!+N3^q!g~$r`RI*qse2yBk)8#C^XQdWrW&{E%6NP~1 z$Z!W5h&|!Fs#xqtoKg^W%u>#YV+&rCtiJ-W1u$QGUh}kF>lPuHx&Egj-1XT9Q%=wD zu0eS060(cKfD($o1vtRfIvR^S@r$AB2L%ukV|CT$(z;O4^f(U^N>;mo(uV8hpJ687 zf*_mjHnzbe1Ip4Ea$0Y-VBwFhp^lwPh;mlUYVj18kvED2zd19No9Qjrbr?^jeiRIOv!&09PS#m%m+R_Z<51f}bzNJaU}njo|69cdUML< z9IU*_T7H-#I$bRsv^mMRnw=E#GbD(u)`3cCwcZLi88o=DR;$lMQu)T@=E(RRr*~$P z_!cueSgk-4YY>Zsq8q)x^YO_3?pShP0o~}8HWxT(xb&HkPcR-56_$)!T(MxSWF;?Oeo4ObZP0#euSe=QWHoR*wd1!OH@D?l?7IO{%)eDhqgSnqUOs8DJ|xi zC%3&j&!-PBtzlZV2oZethfgkLMThay%^E)rCbX!Q&k_iTmN)$2%o7!cCulF3-gv3Z zHOiI5>Ug1tkFd;rFO%a4*>U#-nbzF1BTH5HXd&{}*bH{%Z%ZKH zJHHY=&{pGhDv_=Mf;*V_hV9QwG-3Tr3U;pZ8haka31H6?Ku`h>l!5nj^*wla42n74 zBu=oYgzWj#?UO|I%lM#U1Lhv-S-(hrOzRXVhec9$D_{o$>gK9Opp$0J+y)K;gVSvA zF5P``Rb{hPv0m@jHSov#OsEJ6QnNWE^NS_2D?cH!xIF|vhy>dZj~`a-6Qa}K#j{a^ z_l1=cSDhL}>*5ARVvHp8g78>N7uI-YPc+)Rx1}X`^qAkmak8{PHa;ZOw2Oo4i6p{d z!qzACY4_TP*Xm4R+!|I@cVN9isZa(u znOP;X`+C;~A*OsFn+9zWlVk#62FjV|V07}&?f8jTW^|1j8F*dzjxK@P0LTW6Q-fR5 zcDwZ5boQu3*lgMGOA%KbXc9S`(HWbd-T@+f4$EzWzowpPq{+MHIu8vuP4z!Wmz&g8 zdMKyu$ro{69os=2EAQ?dcA9?d6rV4MKq)9GaCjs%!KX3E-Zzrh(0C z1}E3BXxyEaOF;OfqV~{4$x&S}w{*Tn;-2v%WexM~XqFr?Zhi3Nx#e*hm*4F6Djvt+ zc)>k*AZ}Q)7W8z@y$#1L>;1f{j^Bu^kQ3@24*%J;^w-IU2H$!Sv?MRjzvu(4L-*%( z*yxp$79Ir!D~=tWJ!=NnY;{oeaFC*>P$)9e?RK=WNF zBQ+KD3ACq09xIJ8iAgvPUj4t}Rl08T>j#{xukid2qS?C5JQL_mK?K`1mpSPnKiG2O zO`oS_j~BoAg0jBFBE622cX#dd>?%k7a9Ob%pDU2lW)r1gayGV=tz|&uY73fcFce>i zazsrd@Tsq3Er|8v(o3Y)A`32DAt>)VXSfD$(bccJd9G`H-_f;ifB=qDlyQG7GBn{3K@jSfHl`1!u6iaug~y= zz7*C-ZR29CSV!h-6U48gSS5!PCYYjW855PL!%8NM9|>t;^|>Rn>GlosDX{}ac-(@7 zXOZRD`Ek9w-iuGjCAVrtfFt_q9v7zZM8ok!3(M`=!f*t&CuK_7rWMOb$EfsQ^Ht{# z2&O_MM2%44@8)PAhlMQK4|I&)YkOB2lx&yL=r=!22ERVq^p={Odc}l1TnuCEFA;;K z`uD{gBVq}LAIC!~lTTYF=_1rAk!CwlGhOs~({pRU`XfK9W{$VCg9SypL=cAp$4vq=+X$g{@B<(%7<}iTF?R}+%C``T;yzkz zhlrk+k89y{o@_h}T>U!r6B*$tXvgrpe0OJG9%hcE@A0FN&c6HuHVei*24RrrYX1g( z>;iO%Y?n#Cv159F%#&a-hbm%bmiN3Yo>LqKtSVG~hk}uaNe%^e56Gn0(brrMp?CGu z%#n!baVgyhl)+oB`<})J(*h9`rgoha-&cl9SY$cZNptmD>99NfrugcV>J>8G}+JuegP(`!W1V`nRGvi-B~rn@76 zY2^_e{xs=<&e=Fnjb9@VO=7HCRP-%ocBm1CVMbPLfeVm&pU|o=}Nr9lKvl|BVDW)pM4tS~MA4VJMuC!}e zd|mVQmXV@wJL4o+w4J;>i>tHRijLw@c8(b8=akwLLzV#jC@#Q)T3B1}1$$!U>MBi8 zbP$G)=FS`4HU}zRP<;q9nirNx#Fs2=xrDm8b%@m2kEM$2TIH4V-z7``$|(v|9ABUH zlk-O3-aqJrnwVriDp`KEPtwKNYoLCDxHNv)RygaMqjZ<&TKj&?V&^X(1*q-=lm_BE z&qJoyM3(o8B6BhuvvfyqS9Nc0Q5iNs>8~RY6~BdmC*|DAyzgLWVtMvOA*Wzn>~(v1 zw(8JLNEMsSc*mz;YVcbkjtj*MuD4*6w7$VQh|r$Nd8ROjWq`JN73w~=4VD{#6W`X! zeEJj;C@3cI2@kNd-WNuANq7E#Ve+M{x3M3Z2utAytQj4%eIncoF%WY**aAxSlSW4r zQVL7S2i`zw+AUx7@a|`#pS+kW8oi+RO&;f-G+}>GkrBBK+iUdaN_vJ}0ZTFbdTY+N zh>d;F{&qJDE#w*~+g?o6g12gk;BsKNNVm%DO~OGCYb##^=&pb)&PfjnIaTfSJ3ccW znDB>hhkJ)80l&%D!l}%|ymU&4%wsjdk7?)t`{Z->-AN^%n!EU>GA0{*FLr-e+fisS z`r(M)mreCd=u=!e=zst>=mai3(W ze2?VwYLS~QygOqhwV$U#rR^mKN_Fu2jExA%|&ECwlPf}G_E8g)a1yqs0w?XU3KGre0T8)*H6 z*l0$Nzx04L-CrkJDav@WExx(&1PLUM%y91F03}b5>?pcEu^*7gTvh+duqlO>QF@Tlrk$!hu|$#BeR)Mm%*kQTJ@Fw=`;Iu!vQaSOnK4AZ zR}Z&?1#|;?*dyag?Lt=9V;o&t$@>$*z#NGP>hC^F(FJ}%yB45-eHINf4*B;8#NF}6 zmELd33*s}B!7O-IYWogydaDu2Qsuiq+;^x8&{Wm4%@)tHirmYU{AS@vOtw_|HP>(n z2P55HRMH*q4JgD-$9zg<_|mbg=*x=h7nvz48S60}Wr`J^%>iq&whrJtu9ck4aM zE{@P42iHhrVH!?@<+sTB21(1*J+w(gc+JGm2k3+)R@4VdY;fwAbm;eRzKE*iu@H0O z^mQmSP@rP@4IhX2?F0zk^Eyd}30Sw=Yg$8j7C~Xv)%11d7y9G1S%NKouA|+iRFBwL zd9BFCRe}|OtpHO(?j!fPH?~hEkq9*HwuD~x7YnW_y^McFd2h*D-e9^ySyG3nkCyLa zLcZO>3N@dIwF1t!3!llRW>3Ojot+UxA;~f*#u_66s@WWpYsIP82=7j*{!`sKKza!OMj1 zQ~T*7qS4yndi?68;4b$y_1O#kl2$fz|KY&$qWR8Rc|();>i7MS3-x;Y)QnB(ReA$Q zS%^%_P96%(nqmoaHEvO6c?L>c&f;I zK{yyr>{hRBDN5Pdf=K#UAFtiaIACG>BX0L*%gOY^ofEYa84%S;fz97alpdQYUFDsI zKm?E@haD%DWH9JnSaSj`uGs8&X0aU@{!~ob z3+A;p)?g47no?{j#?7;i8HecLMG}L-TT^yd$BxrkNdWSHUlB+aHzp`6;d3Z)^K;rijtUcK|{H?R6-y>24w| z8L*EoWYs-qBE*u|Zj_56cAA466DrB8GvytpKRjY98nv|o99cAuy`j=U%1yb+8xhTj zUnxdp@eTINWfKWd-7(jEg)o*@%Q*S;-RX3eVDl>#Rhg7fh2PinDC;O}JY(*7O3oO~ zuWIX%wJoYNy`cN)G17BEt3U6r5Bz0a&7Gupl10pZZ!j}u9 zaV&|^949Ci;urDv=}LfoDYLH`u$2&VoCa)5G_F>aH3}>9052$l3WrgI$nW|+IJg;6 z>9F@7e(VGibR|iJg9Q{WxsHpyn!t!oHH1P=E59EVC_+R%2O8wT0i6=8XK$dDHkyxz zz_#|8?o}Jtt+p1(ok(V%YQS|-YL-6mTO_w1S&9Qaver??SLvCS%1*kJ%H`n{Ac}bREHxfyF>ZJYx-2`21C1jx_$@BW5Fg*GjIn z5JR>TjQdZPmBnD@VS2tHB|XY?&E77Zce;;4)~&L?_9}&Z$qpUmrb&u>(IuVl6GVCb zsU&1m8QLGZo+e@yvWFQ(@WH&|wc^P&frgO{$E6#KVj5y|DL}u_{m*-UQcI^sV5$diH8q*6so#o1rq#?&4j0 zDU`r)uNddT%4JfufZ4@FpXE#Kss)6p3L{+=4F?sG0CeuJy8}+MZ@xb;mc2PRc)^w) z4>dqCjv9Y6lTLyhxcyr-yWc!{md?X6%XjaR;q-{oKTh>_1mJ#5RdltH?$V@ss(Bv* zMRlryXSIY?8*0OC@FH2y7U!TBOEV$zywAq_EB=KaO6%t&G@W6?*?N{p5){hTYG%pB zkV!0__@-LN8V-1vB}S22;(-~wflE(NvJiT@^;S@mzo@gV$D*B{UG3epz$ zbJO1mweZG$(~^zBz)7iH^qs$NwXoB7s;YB3QZchdSgOh`%8$;{Yy)xGyOSjsx2y_4 zWi_$r9h+VJzK#R##MDAsp|w(@chMT;Cx5bz9~`xKd(|WCv46KMyJ*PH9Hmi30{4uo;)P5W)@&1QKl)U=SXfv=xlU&(-&LF}|-=qERl9%etFm$1vQ8VWCI` z=n;n{?Iv1Y0_|tF-aBhmyZ*!iuHD@Fz_tMlwj1!x_bEWAd*hi&HDNtV>pm9lC9f@3 z4bg>I9Xl0owC8iFsG;Q#jyLnzi zVl*%;Q|SE$u6=of@Ch}UNvSkw`tb=BhP{_@(lPa6jfx&w(gab9F8E1GV@p6xYdnMP z`a26o382eO;9c#BGB%iteB$pe+$3A+0cLJ&CPa*AbRDsvd9(`|ZFCRQkRGT01koq- zzgkDyBCH8%5(3#BV8-mJAYK%p_3u0yjPCLsy1Ws_EQ*Hy? zPhjnCX}|EKMUC>>X7{`jWW(CPHXKX;j@FmYRlO~%Kcp>gRVa->_}iAfaqYj|?V50I zVKQf+;pu&i%L2qf9V1R)WQT!-{t3!XvQc|}ZGxmE537riR6y_Cpu{fgMBabJh@E6% zh0#0^Tg*%az?C<*; zScbmW7<56ST2^Agw*5&Gqkm8fFsdMjvjGX&iPgzCK0HWE&DPvWVA@S^`t=0Qn;1bC z(1lqy@*Z;Kp4>+$92VCTus?(YuJrjzdfi=@6;m{~7-kovrg%g(Yh-rhQwGk&r%Z?K zFc$ZKijJ#=qI2b9>kbDoV8Ts^(;LL@d;?JBeGfd>oyQ^vMUZP1FURSAC&0MuhC@>j zhYOY(Y9Umj^79ajL4!b~-21}v*zx&1Clgqw0FK3A~I{XO8A;w%iNU*pAZQ3h}?uGziN^iE5`%cpho?{ zW9zvG?+9#hz<8mVBJE0mhI0^M9orL7X=Xl{ zRvBHAE;z8Vj5!j^W;nP$sq7P%U8c=_+!eP_Pr?BcosNGAMr9x_dNl1>#fCnEW5!Rk z1Z7oQyi&Y0IcCp=$rZT%29|~gya^RH9t$gK{$6$}qlqcG9m^mr135OAtpT(1wvo`b z)k1f(xfo_(CtN|jP|cx&KaEJ0OZ3eB!_oqqH6ggpb8Km2*6EcclW&118W!zTnAUa> z;_#&=Fgg&#wZ_DwR8=U*B=$du!(=l`W9Zoj%cfFjWgracXUeQdU+p7LRXogh18iQqG1M7yHh$Y}l zvUa(UU-O$OMtV2sjgaskIEx4O!DwBqA;oNtY zN{A(&RHEYp=RM)xhXxA!o?JV%*bavtn+ToEm4r)z*az;_&JTwa?UVmqrkm@F9vS(| z0RT4JP)a~8rq=`nmE2_x|HbeZ6zzoR>n(-o9`L{k9sgf64%WO|!(EB>?9CXw%-g&b z_=)Q%6h5cmuGn(b144@UGrh`^jhtmtr;}Aj0S~57sr8--y&UHc(467}ut1o(X;u@| z@_k@Qwr*{ZC%85d&>d=@Tt);1@6e+l9>(15z#V+fOruIa!_8XCoe=unG?oI4d3{h@ zh{2Kwc_Vg9q_9IZNzp5GZZ(lJD?-J+eWRyvsvYosqCA;2^B>ca@;rBzII|qyl0m&@ zuWU_8J~BEd{Zv)Rq}%lIK~IB5lNW89Suj8aI)SJi&MOCOr!M)cXq-q!S12U=c5Z;S zWw60A)VWbjs*W}hRJ0H>Hafy=<=l*;yikcmx~>rPXP7@vvRHQi$p}4D%lz;2NBStY zCUuDpbMcST7ow`V?GS(h%Q8a`!@N&whL}t2H>$_FD>UN3HjS5jhPH}|n~+>`5V5z0 z6_u*jf7zA9@-ZrVnD-LsrdYw;*Jn7)kqE}!n^q5OP3r=FkP3fY?XQzL&)CPr20FE{04M zSE<_Ar4FgWPtRXU;%_=7FaXa{Ab|dNcU{VE%x^x(15XsVtWMC482sLG_DtLg#X`1>vb8&J?imTVgH^?&xWep>*`e@*N1 zy$j4xdIG9|U!|B)`u!P0d@I8~-NBCDFf+wZa;C_2SR(QZnp#Giq=8f( zb5HsX)CmV}sXTFJ>D@x`1))>0B3>)4xAG&f;l+~mN`kAP8AoZ3t**u80rpt1>oZKo zGsQ5c*eDgYmZjOCNUPQ(CGXD2_IieXy3H}>+|rT2-uRf%r%_vljU!{oPgf(SuxpgT zWmC8AIoz++>-hLh?Zv?RtWEE5M~V=RzC=QIUhwXxWw>%EkBE3$qfQuH7sp09Y$8Gg z6v{w<$b#Y013DEB%Zg9wkR7dMO%N~!QA_rSoz3e@kCmVhTp*V9oET)yX9?!x$-DyN zLEGM`u|lx@cOqh+jg}7ae(G-}nzMaCA;ye*IsfD9)~xpmgf;?rv&$XvsQfT(&B7sJ zlq26WH_Ac28vL|4og>TL%;2O!6DSXgv3qPuHU=w!f~phkfr!+ zC89J~1lz#zM#Kfr@yrx<(iJSaM+51S`@xusv76Y~@8AT&<^e_%OlJ0MaAfew78)4r zX*mU#3;ZIE=9L)(9tK>k>JlVd=oA@A>ppr;p;?nJ42mf-E^r$19*y^Yru&u3lS$(3 zS2i!YVhfcKA8^C7T!XIRT_X9=9(ihhW*YEX){-rbud6$DhI1}rM z-Gk3LUpE{M-Jy}i*b?U+e3w9a=m9n!W1Z}A|{PkI>W0`1{OBn;RN>%PvfNRxO} zc_0MLHZXIcz}(RP=~D%+5Lpp`1%GCHv_cW#3u zF(KscR!XgC-WMuwmLjJ<<49aw)U)W?NOgbToqD=J>$V@mj{L_n1QA>Aty0mza{m^x z(*@*@VD+RG<)5W6aqJKP5Pr|1QXFNyzyzHRF11z81C3If%YnG#xC#AS+leR4aeDVC z;mgH;=@d!K|C%_UR!?|R1r$zLIeO{+?8H*Q~xOR%`e_lXT9eF zin4#Cg5TTCzdpZ^TP2GpsE9DHnBddd89#Rae1EhATcRu836-M-y(LfV9gEQ*4T9=pM8ln}b;)S#4i9cEmdE`1!3yqQU<} z@ zEkUYDA|zHDztFZO+xw(e&dVl1YCMae%>OSfjtJJ01@ek$Xi}}Ekew0Xqore-OM=lIKz|nu0xJLfIJ>I_BLzm_;GM6s zPol0S;_5lzt>t&6lqntg9I$_2X_&WW-!1BvT}IJr>AQB3d?YMG{p5nVr-z}ZceUvv zgQws6J#OY5s`=j}x*H|lDTSGH7-9Mm(dyu&36}0N;MWCQWOfT(sY0d4bbXbLxh}mD54svncSxZbs+;8x3arbTNMVChujSz7 z3u44SR^L^R5lp>a+iqG+iy3fJ0)9txk=4ie(FOse6oPeq>8n-?)+_10)y>-`#~bk| z+=`pSbT#MsFP3D2YU_JLFEenyylaWQ8;StSI#)hdh5wFt- zBTa&9;MpHa+Bpf&t$oBE(aKM$k7IWaeN(C>l?LWDFsdwcF?_r?r$VW{I%c@WxrTEB z#+|?K#l>3=XYt+Z9wHY-_6N6bRBn6uM5%34goxV5J%EylB&bf9>t}YvQ{<<2h$v2Q zs#|6YngB6OLqe`;>jpVADM7?9D1E%SbgZz`9A+4rl$5G;CM@l$Ex$T>WD3pPl*rW= za}a{rgyoRm7a0N2v!0&RJq3RJtF@?v4OB~&lOe6g9}gP}&HML@8D-ozd#NByG`ywF|M;gb+YM2*L1b$^kU^B0`{3hDRdJ zgHC<|39{0Htyw20XhYpb9*A$bJ=5Tua}tMc{U0EyR#a>BEbw4PZlPvd_~+k21Wxcq z8|Xe-h6^_idIeaYmN1GR4X;Wxl5JjeC>;cg7c#S=%mDQ2;R|ZQTE2d@{L^^n8yYMa zqVkS6XYBW-&MI8Kduk=HbNV`HU`K!SNF-^WaGj!~p%YO^pZhiDGcME7FmOPe0v%3_ za&k6~_>`f;D7*b5ja!!9{|87wV61~_U;5wKps8P#L^l}8f0LwLCtE{B5a7<}4$}vd zLwpf;4f9o>fOnS{J;tO+Y{`(ie(3FU`0x;^V-a&liSss2%}`Z)cATBDp%!l{;!Amb`K+xhw>WL-?xixoKHS~H1YN-}`uvl_-3L2wz){h3sW{1f z4(pyBh*oh=N0YxLjQ967s&juEYDfNs-E^OT5J||D`giFw3Bqj5%VWiFgIZ5#tcKS8 zPi7=Emucdkun_whs2BH@AaK&i=UQvQ^{V&=9;7Qrz?&6p#MVAdr0*32tV-9}*wrdx z0_<9vqE8^L=BJym9l99ULHdbFtjP^n1Hr%pCoRmC_EFKoottaaeJ~;+@5p7Ff}&e> zq6>-M7qosy91xH42x>JUO6v}>00`Pi`b8R2GiN3!6M!IO81s<8j8Ul7-ehgTmah#X z{r4Kz{7nkA8gE~OyJc+&2P>uU8`pMznSw^bSe*nike}y(WVpXNVvY$PQl>&!>$xyg z(qEtsxNLTVETH!YHE;n{sktISBaaUs8ix(?P%(X%Xl_iUb6X@PEPq@5DEUnqtCvF4 z`6x3FysPw5D`(@b=1!fg&Q-{d>he`0bt^mww^+vk^LhHC^l?_H#UcU!2fW33_H~Si zX;}W&ItKyE581RdjD66Bho%lOLXj^fJqt(&5r{`!H?P3?3bz(-CtaDTFW=`KU7opN zMYNFDG-%KfiHAYS;mCu-&977r_l1jerM}ZT{b5I8s34LE8y{tYQJn|xl%AOLfK`cN zG^x)~Pjd_P%@)&IDYYU)kUWh-7{VtQUh-(C8?As z=bi+hy|cs87Zhq^>x#cJ<;`SU9X6=c0*!LQ7PHZWqbg6K%|9ExFDOt)4S#kC2 zq!Q1|$*!uW<@x#ZwUZR~^nM^hnamfBq&8dUwK$n5^?S76EI?q3aqRMEC4)x{KyyAV zn)78Zak}jOVMjR&sEFcFoiw@Y(fJ(*Q2v!^OHIc zmBgpM#|#0%vct7i;zY=H>J^H8Y3<^>^u&X!+Jy&?N2C<26SRCF9`&~f2tt|}hYyfK z;4xr6NBwXFPBls=1VQtMg-Mgv2(@(@Pi*`Gz*v%F4Y4FANLEv85wS`qfxFbzRZ4Bs z;oucJ8RS@XT7lDJ5uMr=QLB`)CRLig#a0USjh z{#7IL)|cnXcG({t+LW{uGN^EY;7d^savo5~txJ=iO2Cs-Wf9PgJA-ty74;=Tesa4+ zDI!@gsY?0#wQQz80f+lYY-!@|>1(B^snrt}xYRZ@m1zQrB*OQQ;SOC-qb!YSu)=i_ zvylv#g#A}Ek|ToVW@F^Lk#NgZFLrB?;n?MH0eTHMe_j`#jM^YVEamoO&sz?NGxMCj z9sTU`-1{z~@k|TTuLiIR4q1OVVl<49Hui3}Ce6wF)T1Q*AaXA^{l+p%sCxLr0$m!x zN7$djkiH60$84z#YvK`C`oa6hNe5i_JsXd(X3-%;`HY=MB3*3Ni^KN_NdN8nenmGN zj`O@uwv`4(tn7>?_tE``Oeq^(%FG@fi&?AP35{&#xE>{%b_apE4CmZQE6EPH z(2Vi!3fJ^sEHDV*b@Gq(=Nc%vejs$wWP?f;^9A93B_iDh0H^g-A}53uU8KO}PKBi| zf?U15ho(&9>t*kq8uimnHQz|$W~1vZcXd>ZV?#)ubxx;Y5r~k)53!cHDCMe+eAihp zeb55xFgh4XEtf4Bjxq^c^9laQn^UEc$;FRw^Ro2sUWD}PDK|Ca^W9$88;TAn8p=lg zPe|Sz$+`ay)0(Tpz|(O26wjn?oePo^!Xz`342!~Ba}@JGbtFIv{5u$?8A6}ePe8Y) zNF&y(O7q!IKAiv=oZ90qN|D!49epPNXoQ3o=)1#nyQqfzk=~e0Wde+cK%zqd5KuhQ z1C%=As64U_fWiQdx@VKa$-}7+Ei^gTI1MD8Ar)ee2u(aYTOI2M`m&cDKcH4@I)rfF zgP5+0Z?soYh$+w_vPhjQA*GL0)toLm)|pl@-KMQtw;uoo8dnvy>6d&X7oX<&zg+rR zzFRl3pXA$aVLvKc8^P0_g0G2D1`!mRIg59c=DG8K0SA-);3maB1%w{ZxrTs_3%-5t zQwSk9#bHwP!}yZUO`0xe>fnN9QE!_UV&`rB-GxR!5bB=`?iK5$HU=PoGc)E7!CFWJ zrSDi1(@|BYjk!gxnR(}3+{%l@_{i5niXUL!?2b&P3G=vpcj1KW@^ULDG10@r9T#GG zS4(1mVVaUk%As~&ynMAJ6<>1KXjq57;tW%9;LoE_ZhC}VW}XV^y6ME>T2LV%P~OxQ zz?{ZE$;M_4=2IERd$LJ7&FjgPY!OTMJ6yJAcDAonm%+HI>_9rVQh(qOkTbS}f~zi4 zOx9C|cy(^$b@#XY_G{~mDepdfKomD6&(;@K;lm?=AW&`$s2T7R`+*dTvPiaUSC@6p ziPUEWCOo&!8Kpo^w}KAbka6^SW{DP}mqtL1PX%HdCEUy4IbR1bceFG?Bgj%`wc}i@-APJpvH!q0GXFR=Qb5cRr@1_# zr|QgKq6!G1?{>@$Ld}qLGAVK&-!*u%H4M-~Rj*04*YzPoJdnbk+2OXI<0`&dg7cH# zT&~s08eNP*GP9R8y#ZX`p*eto0g-m0=Ev=3;R^|bSNNQ(TOVJTI9w7!?0->8y9@&= z@G@{kzu=aLA#*PA13e3V+~6l|RjyMJxMiTEGu2B45lHTOu~dC4rD}m_eZ9E=GDjHj zJUu=u4!3u;r3{JGP=%JAX?nI>n~AiVW&;+yx~Hq~yg8gIzHqP=Cbw2C@+PB=*oposT`6kTmT0F>;%?LJ4eiM;Y1x_bc1@Do{8SsY z$s5>Ux6CLTtb5g4szdUMbExc-kqcprNqm-K*InEWLq#9t_p~AJ)Z7@9 z4%$NekJR#lADtq_f_Ktf^m#;|+{19{rk$3UAxv7TfUO$Z`gJ{utl2P}F0g(dJsLpX z8nZfQddcQcvnXuu^inedTp#i7>c2&iq+!z}T@@8(r?CmRqJBtkcM0X6>`%$Ce4au< z0KG`TEz0E0kEu$Q6*Ae|-3fqD-uCG?7&>+=Q&{56c zSjv@c)jJz^uPyYoi62gLw!7cucqh*B@X?sf91->oluz+>NYoW-r8+O#--!e~LDxG=6sLW-c zZg+Y@(yUaxyBd=Vsh+1iK;sv&kP)a_nwtZGXs-Q$yv=8t{U}-nH?_?e{=xvh>zrjf z5{vG94b8$RY4@EDm=QpM_^byg~2VV+#< zLt|FDlmEyQouZztB6&ZiUVg|)FJT&1W$XGVP$ty@md++d)GO*cq}bguVY2}vc?n8P z_}FHvhEm|&^3C9Ao`ndX-_ud*)z=Aw!wRL-C&~np4OXEdc6755K8b5=scxQ|*PlMA zKgAW^uACB3lmANCL+ndN^@A`li0&cc+_e$nirIQ<#Z=-*&u&d`@lRJ76g1mSij6EY z9&2Jsv^N8v_`b>~%L4t{WTf+WBfB}mwa<6paNs|A>>bq0R^lY)lT~L_bt;w9KJNCW zn`o-c1=0M62c2Oq5o<$x?)ddCdKNL0f%VTSJ@(=1aP;o&{+NB{q?+haHtbF z*}6=Wl`FdiCl&qVuYTj-=qzjJhpa~QPwdGN0%l3*p~Cw8*U2b5GB0;3!H37#-z<8G zBX!|+eua~X(MD5-2^x2>Vd4kmwpQVh8$!o*xgSo4uxKpXTKYVE8RTVN(~YH0d*H`& ziY1ykWGJZZ44c?c%{wOl-&+TJ%4)%bq@lhlA*u{{a^05Sl`nD>v2$4{bcdUq8x~zQ zk{5r~p^4IQk}V3@eV3+(!)L!YI|l@-QKex}DV+xArTfC1%tb?#vLnKuFjZ2cjS2&f zXkALZMj!LZMb2a}N{}lzU(aX?f!20&xJrc7E$I2{LHOKUw<6| zP@TjY-rPD{aasWao<=ehLOASQUKnjCtNQ|Zg6WZl-g0KUwc7!8!Gyy=arGe9cS%Q6 ze?yry0V--#{%N*NWnZO=T_qs65G>jS0~F$4qvuS-hQqW}q-`5_VvsBq{Brh*b!T3G z8uZQwmvhZ8>94HGBa-n~AkZRFC^d9-T(_11J1C^*uAVX5S-gtu9uiKmMp{aEEDOTuwa&iy6KIkm`Dg$K-=~zuiCOxja_X%Y zLpqs-g-;5jd9x$TTpCUr=^|veLT63z0$`@4woj#ij zxw&jboh~!oKtS@8yXb)MiMHfF^fj;=G%Mp9U~v3Gs7!W@FH3xn+(iXByuYRz4@9{- zwVh_{pn+{wPL-m99M-X8FQ8$>f%$6^22H1A?JTey0Za+(#sAl zA;dG0c9UniL%epM1dkuhJ!%K(9s;`gFfpPa@I#XkKsDxxD)4fcFg8)YhDS7&vX2@2 ze2}DZQf8Cl357ZfO$vFYoUW3qhx$ACib{3OWwgUU)l!`;ri4C+M{Qi@o9=PNfzp9x z{6Ocfx;NM{ioKGvO-uHUU(N_%&aDPY*Yh;M43CES z?wk3!QP%N-Jzi&5py+)>ePrE{s#v@>9*WL&K#t z_NGKC-RW`|i-cdp3Aeka%O-@?w3i}k2|~EH0p)?v3ti;?x;kDImt3{us1;$JactK_ zgOCPDGE}$$&neCTd))RSjEd82K~=xC3#ZbhZWhCj(JQR7p~vr=k{HdeUhFMWrZ<99 zr+T7UM3it@+%!anKnwtCzL#BlOm;)a;M}~CINgwcI}3mnfA5PKqmZ5&g>r{y#0Rsj zmezr-!MuwyvA2mf770m!TOfT`H!0}+L2@92j#AJSRt0>ts8>ij?@I*4Jdq^4E3VqzQYmo zRA~IUNdw6%q;47lj1IT$G;Hu-IiElCxdvAUd%_Ibw{_CRh$$bB(bTnpcT}4aC3+o) z3$gBzKj3BSFE}G7zYXcDL422&&iKL*(6yB9G_t_Qw8VO}@{-9TM$l5~F3ODqM;+$e@TTZ5WJP^_?e z!P-s-yU{D0X+ssxCGT2PL14D}NfT9MjkX_zwp(BZK_T^cPL+_c1hpYsHXB+e?4=(1 z=S$znB1ZZWn2_t$6{XreH&p5(fYgDqGq9hE{*Os1g>V`j<$i_P$WmhXpBhGN7koVx z*qo;aDP_!gk0(wL_VBu{p}DE;(HH%8mqjdhxlpg6(;wTk%${)tR9bnb@UiL{>p!4z z;FA&4nLeQ%+tdq~F>2iH6?rYsGSa;oQ`9ig!^!MFR+kU)_@B|1oF|=k_!jqinF%fY z6_qgd;*kwrxCEzEVxEk9J6Ob&)GhlXlkuMbGe|Qfl3-qI3uk5gl|;L93@SoncJANz zWfPs>8PYNnw8A?Yz-Hlt5V#LA_x;Ms2WRmNGITrqiE2hbe!}L473;g;?v7-qoQ(-E z{v1KCA8re?$kzhj!(W zRCkHmx9(e)E}oM=1WDjLc0!txZ(_->kg|f@d`0s4pMk|#%-6pZyePmV11z$;v!niL zZI8K$;L8_n?Da+lXh2WG5(H<15CyU*`~!#JgA>s~i>u@|@XhIiDhEZP=c?#U60r?8 zd`-ov0`KaU5N=aw9fDv*b87-cZ0ak;BT$!1$bz7Nr&)YF002Be@NmTqVPdAiR+O|%alelzIs33v zd*{_}si$86ITlAX}azeiyEOpnf zLhBIm&utN!G1W&LOt3Svq(cvInQy3YHvidcX>X|DUx?u3aFzpD{ua-evEW2R5MrlX$^hGU$2`1B6 zDgg1%zzvEuKgT1IfU>jk?3d7#!PV94ktcg*;ybS$8!DbC9$kT3|LGP(*M;=yK;Oyx zrv#HXYCTf%2x~n<2m7OvBA-7U#ukizhfD~8JjPtC_;@`+v^cvx9I$Qz$>HFTS@^3( zD*PV*35AxwlanE@Z!>lwUq2#>CNN7R4f8O1dibcof*$`N^(sWQQL|J?TZpv+iqZ~~ z>EKw$ZF1fZ4tjaJwOjJZE6?+bQ4HHz$bhv9y(EhzFUbv&H{DwsnDjgvBrUENf#edc z_d%bC%mS-y?~S#SvK1oT1XIx|=TC1yhz5$rQ-N!qf@&2gW?)N;I%gBR>60sm#MJfz z!E&nR3YSF5Dg$fg^9kOAM?Hq5ALF&Q@frah1mP2F5X4_uf;L^J={C=AG#ifq;1aH7 zih`CT&@--82y#amo6{_lZyCs@axpXzY(F3W>0SkbpEuMbVGRh}y-EVy#&7}LA6hXA zeg=hSiE$^kqLv|UJwgtAZi9bYr;D_pD~00a6dyI-YzDuwC~y&sagg(>XhfTvoTw7b z9y>wuXCqNPOATriMpRf{DMDxsJ9ovdxOx8ST&z^=P(0F->*a~8?wPNW_;JiVeAVr? zL@qyL4|{Ou3RS#j(_=&8J9+er#~xe5hPboWrMj>lXiTyqMp*dm>JLV_!Q-4E4pr}> zuw->+6lY?aTb(smn&c-2gKrMS{ptvgXzr~{5ZI2Rw)M!OMFEQt1#j6b!_Q~I^c~i~ zY=~kb_FBHlIqLhx755_`S^Oyclvv}A4|WD<58ma__~hzh?F}SDPW$hOvmufG~OpT7bztahbAX+;HBL za;zfCeg>h+)d6>6fOUitp*u}>4ZLG=k+@#poyt6(X!zaPDi4GpGb5*}TW$I=2|Tc# z+sRB?lf3bQ5hzi1F9pUx=nN-1&4RD&4vy)p#(#;VSDhMB`&25fPZ#=M+}#IxKI;!j zAaMGi4gMAdm3SyM7NLLVGLup2nV1Jl+g<9Ao*}RTrSZZ6GEVV5nbjoR|b;-(_k(nZNjYa*YRDaJRZ^j z*YAqN^^dTsKpKyX^(8^Z`k3|LJgM7{TOw~ee|wR}>*HL^zRKi7pnY_)Vm+fmwh_k3 zekPF`;v^;rc7S9pUG9BCvgFk)R!aG!wK$Q5oEqfTFL@Ai`FD6I{?U+(1agjG2m(7d zL$0-l9H_U3LdTBdNTGQ%_!jT}*Fzbb5LTL;i_xv+RKTk39RlPSxu6$cxwspavZ@E+ zcjAI`8M9fh2LPqR!SVC>k!G)X`z-h0=Btd=0w(gAi$W3}w*x$&TT2UTV~6Wyj_e{9 zfo|dql`uo48iwX?cotNd^WHgILC3f}Pf^y%A1rr36G1g)d9N60B6CWCymOvVMr612 zMVlfDPKoMCF0yLsXO^>yt`c~T8&x~!9(R}hl1Sv-ADdw5De}-J!QZAb12y=Y62LxK z)L7k|g(=t>@WL`yej}Uwf;%2Amf?|`kP5Qoqi<(NhkooC@nYYpz~@X5WZe|Y!~ucE z7!paZ?2W??@Uk7{?l6XptNSZWC2aOc*`+QrunV3uiN(lu5*s2Nd(7x}uDJpsbjDH+ zs5ZsUj$4Mt?IB}nRPWkMJZ4|<-k3_xo3X6Y-4Xrw`$?q;q>UIT?$~d{gG3-DW&tb* zwT5ZIb@nv2t@borQm1<(c3G!-tRzQ3&bf30a_DX%j&pt|3=0}L&xEKg^}LD$L0_a) zglP!74+A;~^1-xO*~#F0HG6)g8T6OndyLROSQzXn6iwhEQ1$tVB@(pbE*y{?BT}oJsL@MGu_=+<+A62l7}5+qMsV*ro8L$68oYu`9<#(t zOKQSVHiQo{8=(XV#qRxGTtQk)W9V39MW;xUB)3;kX5UJ$D%Eu-yXq80m7ZDD_-J)+ z)8F`M`87pwSo>mWH5TeQg5IT>shC9!Pgh|U65*M~$o+$1w2El?()MX4D(PSOI zN*0w{;$l;f2E2rCU(%CgT%YT8qS=$T5L)t*pl20m&iwlVs9 zz#Q?mkp)mPmitI1@muLxg(4Gfhj!e_qvn#Y5|>FA8o0AY~Dwn z+o-4B8`Dl6k%^EP+@cpzJBNR46RG$DZS36i9YU}%99RU&ROUcrwd-w!SW;$s1cQ3% zzZ4>8TFRNAYjr=9x#L=hP{Rp;{45!?1h+UwBId@}qw7vQX0_T9wnL*Bq(`GFkf{Kd z==)x@ST89#>HIjRlz^;YH|y7-=v5*C5oUygRZ^sOL`dRl1*L{@Q3o2`+nAiWas&~h-vn&Ec{%gmAuQs`x62O=2d2pMW%X;$o-cOFms-RA9=byO^*zc*jxknEe(?78C@0F=>nxVmt`u|JB&zI~rdQ z!?XN|h4Z+lyk5vSU2QPeDtls^G&PO_!UO}CeRlB`>${g%yultwkb;cS>YR{ka-Y1C zs1YabxNV&J^Q%Hnay1@7_ZkNgGt0&kypU3f?)j;=!2?*>8fne`3ZM%MMp~`Vp&F)Q z+_+StWvNp*9uB#QENEG*ulzsj_48XyFr=2>9aL>ds&_i)ozfzyrc`@}s_zF9Ug4@i z`*uiCks5|hV^0P9zTuPD-$=`;R9k+)SAY4=`6v<+G4*XT-%xC~qbz1~nCCdJEYjK3h87iS<+%oH;6#+ed` ziHT=Uv$F`vh|9wsP3!l!$-PB#9-RB0WWEsH1^X!nhfqprn}O}5@^K*_W!S0+Y5D$@ z0w-dt<<@7{OnJpJw&iah7~tWOj@Oy^sR6(-_I#xP7IXb|t1S7(UFe$GKYt7#VAjP~ z&*WKkxh=B=vf*5{s7$bWfoSu$t)(fen`__HBm7RP#}<`3?5Xnm)_<$b0$}hhzlYU1 z;|6O-=HC5Pp~XYS%1=DQwkZ$YJ;rqYO1K@1uuJ3+j%!lyXi)BwQk>h)U|_^TJYEw$ zC({q?6-70!#=GnB6+|&bWQ%5)I#jUN zFr_4aTOY*$oFfi#A3FLAtK5hWy)}0xta;9RIRGry7r9bm@9k@e!NBQp-H(bUHa2PJ zg6Xy+lD`%HjmJ*Gg;(TZn zjRIfp_RCs|j*FvmN%aq&$>?;%D)b1gZVFx%wn`MKH4tBTwb-o1%{6Xt3l9(<$;*qR zbtUG(3@bIKH9#D}SJOcj3&8$c6fW2Cc$p(l7JNZGf`L|@1i3aN5gn(Owum24u^wSQ z#SUALtH2U{DOAc$n<-7cy`8!}vxr6%!c_Z|XjrZ*xB$9Ol&68Eeu-N~zX6r|?5l^s z$(}=!4>dM^(x6@Z3$M}vC(cc1om%NOaiWSQr{un>#SEzhBMtTA#C4+}Z^s`6jv#d7 zhQ4ah@M$uzd$jM_7V+h(HKj;FjB(|g#jZ{+YCU*1$*TSz`sRcNcQ20F`_`>~-g1!f@0 zHCAh*djR^qu1-$XXqJebOc0vmmb9K3#8ZvMAf|H=hj zY!3G-IoAsuH0u>@KxFEV5`K&#e>(E2js4TVOmahPjF`g*ZE9H7itvvjLNfP;B@5}w zoocVagRR?`8r!${pmN7Z_u)^E*f}SX7+tEb0D$~@t>O*NLu--akt9*H&s5ky0oBY4 zQ*QJlFslk|(6lgbJE59ZoV&&qxVr0SoFC4OA4N)%JK1W+>>8H8T2@u%!4)dch8KqQ z6+@Ti-HcGZAl$;4O4ravE!@iT&l7B?g^K{oWYwdhpf{I&xlDp5SA$!6@28bvpI2wM zXIJjW0^}YgzgISxvG8m?r2$SxvA;1TKK&Uuf5*x-Z^WJE>EAs+#>UKjR3SR?9c}E zla!B!Ytx)T2XKZQgY`6Bnc$r5Usg&Uu?}LGK~Pj0;{y}a+-gmVj-&PpAY78-EJiE> zxY+@$3n@A!IktEc3tAQT8(AWR<4>tbq#a0d}SokV}0Bi{k-_JNM~Fc6U96+5Z9Kx<^Ztm2#E=Q)YnoEmLpt z1PiK9?J^P-sMc{u*uzfw|0T)hx?$`ixFmMC^*RS!)Uf2g=I?JF?8`4gqr}A)h93r* z>g{;Onu!PsYcV=7Wpv>(1WGAu_?FoE6RdjEK4LPK3VljoPC<8v4{uMqeg?Lbbv!h6r@=oBmkR#i<%hxaa&QiJr!p~*N8S6p z<_DKL#En%Wb&3(DdB5tWKpS_sgKAuPkeaq>5Ha@0fwy~z}w}hJ}2Qh=m9?4d{ z$~*)`EtNy;1f-87^UT`7~)e0qTmhF2|eyYRyS7eJ*H4-*ixD)wzx zVVrgs`@6(VW5c7caTw^KukPK#UY*z*E_;vhIlcpr&Ea7+JPy*2q6~Ou%iA@Q`}Ppy zS%KlO{Z;y83zGI zetZPZ44QcJQJR@3!%-txB;Nf)trH(6*fRcLP06$T{_csavDaI6 z_Mq}NlKW<itAz|QXRhMN**&BQd;a@yVR=N*Wrf36*zt_L z0h)m8(@X>1}E<2Ti+Uk!K=x{{5YwSz%p^C!{@|Tqr6PO-$t@+Lb7D}%NHB)2f zo@#BnK9~J=iVEMSUo(YT@e99CQB%>K#l5UvS3XS<6_EwFX9Da99Y3t~oDv`g@xCq%uuX)-fU# zPW)I*gzvb|C3!udX+PKe&gZb%7(UdBtTAe!wG<`h0BgiYO&xO^habYdI)mVz%r@V8 zpvMO`5#;1v_L&8|vyHe{1+nAA`3$Z+$?`04u&@_C8 zNZ~5~w{;?Uw%J4aw#2KG=_g+q>vsQmC`*z2<)!q(t||79Lg=k$Z1Vce zYPWF$mqX~;3mg+jZ;+RooLE9xAF`XF?m~&hbe+a^1Nfzn`f1byJ)VM5fF#W1_c>Tf z4vt+%%5D==9Y&bTGJ=>KR@|IHyb<*D$|S3;EHX`t!)jAS1{Es01uB%Fl8;(#IMQ1i zF-`d8N7hS`iWxZ*op3cpwM5lo&FyW>#U9$f>JwO|Y3#|#=N2|40v+Pli*bO~byaIb zgHTEioPL^p7Y8xDY z>*#Cr(Ic*NdUA?iH=B+j)G9yyPGkc6T#IS#nD$0W_kWvDKqTNB(kDhUM9Tq=VuS4Y znHNz|U$gxyIxY4L;w~j_#SV3!UJq%9@8)msa*EE3$7?m?ib67&!88P-Mo)yo)ML{n z;Oe|kx{Ba#q-j<|fSpGI{@bRV4=o?N=~t@3K*fj(I+FhEcEnGyu_jNP*qH9*$qR<* zFVJ3+{8wJ_$wr{moQH%n*cM?_O$GPojv?3O0x7`l>YgeXpOuUqxH=SdS4r5Z0DyKN zZHDC1Rdm9X7;%#U`&!mKs5~+CuMK0F2k95*<-p9@UbiDw$-l%ag0i#jK#{HDUA-xH zj|`KSW8#5h&&>&U(&q&CG82VxG?YwnD%^ybm?22RAtu|-xJ|vK;*9|a87s@|EA?_v z$0!#^w#3E>^(o^O8BBD|-4JE%P3KnD*)k&$a>k>vIXm?~|8385`rsrpg>!G|5_Mz6?0j2=W6jT&YAFT1O1e#U zW%IU^CEZn$ym2!XRthG)A7e17Z41>y+vGKcM2h>jLHHK-Z#PT4n&iwNu7!Ft+`G1r zT@w8#>mieJ;$rtFL%}Y|&;(d@iVY-CJW@%EfB2#COfbM{573<~kQir}{0T2%%X>}D zT)7@EOm#oLGrqA3`6!NuHkLdsY|yi^lgIFJe9NC&V&o-rry zO23?ryzJ15`wIJxi!La@L3*6^NOLiThY2Ok7_A&4jjX6&Uz*D3oD)#PY+`iAt*CurG3wgjKJ*fd6S*v7{_M^Cq{n;YOB{oVPT2##C#;%p`wsNs3q-1YDAj< zgbpEePtSjiE~hE`5^Xima@JDHN=6C3PeN^jDXmkxU8(_G=X&uwI_Zxc9Yvu;j|J8W zw)0!AJNyz3O!Y zKo3}hr^R3Q$YeR;Um`mqQ_368cF9#a4!;<2qhNU^H3}*Atu~#sM%EOiSY;CdpGRF$ z7c3#XISo8_HAu_hjA{8v(PK}jlmZAmX1@}D7eiFA-Tsaz$Wec(v(1xIBs2QaL&{-N zif)7wk)ab1PPf==&mPTgm*LP#u&btYFsPhOGz_&ekx#DXuF*bH2IEQ-Zh<+$Ug818 zZrTQn+l*0)7&=%9W$-C>I zw7Xa1{Nf3qmFA)9`GJN4VE5ETAnr>YElBNIdNP+Jb{3m?n8nuo6CLJEio&7_;no?{ z%-cHs{yR)3&Z*5yfEQ)Sz>Edl(v7!I*9C z`c{NQ8BW~*3>`1*=aGKOz~a#2Eun+Cx5!2BQwRIkC@2dkk@I4=25{BU-?)zIru8uD zS{x4ZPev(59k~b5-N}C zf^f3UyQFq1gpH!wVoL{B$e7@3Wmfe)xyz+X2ndJ+W0`;pGUJn{Gt1gMbtUXr35!Pr zL{yWizVZBGXbx9ZL9=)wc=NQFF0p21;i90xM^Ev~Q*K#9AG^=QusJ^fM?kp0c;?un zY7X`9&@J|oR$S(Hp4pOUgamNE1Rd4y^TRvLyuvp#l&CA}vEQLID?)Zzr|kW1a-)o! zKciILBPk)1wWAqi!hdURCwW*eK6=n_R->Jw3V_p8_A?%Hp>k(1)2D?w=Q7|h`iP-$ z3h+y4+Jvgu2Asop6o|-GyVed%%`W!y_abTkJn5^!bMYB6Z0j59k;}wZQ+p#6lW3(+ zwyK4OnK6_$Q#ZL_STWpPRG*`Vm54v(E=-^6xxqBvNSkvD=~*hYovmg$p1l<&1iqq) zoZB;`a#k?LrDJWU^-Kd@M@gElDc$Ao z077-6LWTid*j)&8>Z(nAn6qqN#4SadTEWx^?#M9t)4~rY#mXaY)YT*P%km&mS{B0X z{HrzPkhs53zGOja`}Nh{$ncp3DDe|G3nPCM0nVzf{A?I(%$gq?g~g=vs+J(wvQvVYS$gfSvl=$a zZjR#~2jw(<|8F+K&~&wmIvdhUr%MW zdwr=U&)zeJdKp~+I#=bIq&hn7@^%KxE^L$FShs=QwnTwB;@*i@W_%owI1Y#E}Y(X z?gEjkQlYkYt!yBDac2(Xi2=rrs7-zL)lP7K@)gQp$aKfmoK@xHMZ@#0`89<=x( z^`&GD2Xh890T4i9w*uhIi!W3x2gZ+P0}pd=5q(#qmIA)X?%r*Dh`rx@fNZ7fVN1Nr zz`uYcV3Fr%lytU=s5VUrlYLu7S$ibZ1b5Y+J@Y58;=SUI4bSXdNO=+j7oS+E>U-cL zPgJ2SYh=T-#d=DO1U5*enLR_RnxZ=YSxM^K7zEix=m96C7)CKGT6m5gX?7M%&%;DP zuQNqPBL?2<_d-w;%4i>ULv7|um_oZ2^ikj$X9;Z2bVrS9g<)K=z><+GX;WB7oZxXg zDu?$t{yprxB00`B698@xH0}}0IA30<_YIf(HJfXY+xA+0=KS3y{WOQMH*vy`%H zprk7?LhbduEnP}xvADb)3XNasRE}SPAP*3Yq);C^-Fe?p_{3TRlfP)kS4d3bNXd&7 zb<|froJ;xU4zNbYr0VVJ#a2xn70WQty}yK)NMhw_@jU3!X}=c=$YfQ_StID6@#dqa zo93a5ze!}2}>Ry-1?_udnPmiQ{St#g|C@#u~x`TET}QdZ};JMk;lPnfB>_feWo+~#|fv;i?# zpODa0oo}ELqp(h!9(MBi?Bndj>3E*W^k6Nw)_mLy`TSlJxL;<@Li32A1=r18Z?~}Y zm(*0gd!AbUb?jKZ=hhjb5MAr2CIKldNy54cX$#v#zeRq+f|m3rwz;JViN7%$dz~pP zhK-s$KLiVw-|jh%(Fw(YO~$hVftZBO!?PLQk4qRPbAe4ZiTca@nUBW!)RTI^L$0(HEJ!2BN6uk?ed zXL?USF`dgps|Tl^5H7BUOPw51oY!>>9Sbyg(2Nxzw$2sl%NZr!VpdguCcYor`t3`n zgh93aT^kme(g`NYeyy%Pd(5w$~V@dDD4%GfmB<7 zKH{08-6A&FNsDYfs52TPgXT}iYxE>>DP)yZUjC~GCc@&<8M4i5!Sw&-`N?1r+(Wj1 z^q0?bc#~aL=f+|l_?K&HC^ay4agyu!Z;H4@b4|Y-(oxUc#XN42x1vdWe;Ana2{IX< zU2B*XXxscSxY}yU<4U&+F+dVufDF?X*1wJwnzNV8UFJYrSmr_^5Zr0tAs+YIAPlDa zukUpkG^fD_b{upd#9f}lq6AU+xjjj=!QBJUT2(_o(ju@qf)jV9l0-%r(*&T(hO0db z5Ewy5)I|^i?M|SG9XD!mD@S5pvN8><}ezOI@L1g9VH^xwuF@A?6-Ot z1E)vrFG|myQwHfGJoGQUfN9M&9&}#{5R;xJ683YiQ#ki3xH1z5@oc&*Gk0Bg2)CJN zi0ff@0QFsj4PM}*(mc|6_udTq_lWIDa6_q1|s4(<+##q8xfXd+}G|&!Ceu4cF`t$L$ysZsU^F$%GV6o z^RxaEK zLGnJ}vrT1}Uc%?h2e6n(4){U8W&g$5^-yrB?U@ zZEB+&i|ZvRJaEQ$qI%7o8=Y_7xbGX$x&^!STO4EBAU-Vdqg$7gl`8KQ6~Dvas`BbZ z=v(TqWXalrJCbT-EUr{|ru%8v#l-Ng<}AmQH1xPXIJ#Hi(GrrD^KBWA(%SsWlyA0v zx;->x*YvKb%7OZP0@%>T{ifS9OWFZ9jR;rbZSc)v=Dz0dTJyeIu9`Ic(CL+Vf=Pb( z7}~*xdkaF~*KQGF;?_h3Z_9`|{g=IZsYu+`>U#NIdL2W-80V6oevKIi%KUTEaba}I zjO7-@dMn`MW{?7|?}JWTqP%t3r@P(&r8UAUu@db)HD4oP6sc7YjM>D{VHLGMh7M^2 zL0cu%jl_S{7NfN+(z{5fvXNhA+t;K09(xCU zi{CZZ4isF|R=#Q@>WA?Wkz2>buX~AU8qR;x)YiPaop(De4m!P9k^UtCy%#J%49Eqj zM((qIxuaj#2`2c3zm3I^5T#ohzYFOrk(?J?aEDef*t_&T8lpuhzUIgdOZy@!ELQxV ztQF-lzNo}z5!VUGP@2i%idvE*SW5wkUWMt$L7G(d*1fLikVkko2cr6fzP<%ko6vNk z7m5sgy|^$*$0igenfBL6B*057+tX{itY$?~wig8Oa^KlQI{ZT0Xj?YZ5LhG~b$1RnG@P!Y^lFsn;KKDN>y}V19wZYzth&n+fgxi1;Ew z`w@uu%bXp8Tov0TlSfBQ**2_Q{p;O<>@5PtY5u8r61PFzifmqEt?mxpczaEf^j(#H zV*765ve{1P{TpFR2MUt)SHL*_4^BoR=S1l>t`Hbev<@BIrxLlX#kwivCZUcCs+M$6 z&M{BC3AoV*3UJLWVgAgZ?qAY>?tjrDKv$aXpM6AKwwEoAZrfzq)s$z2!r9CFyw6Yz zTGdI5W7p2_LK1#vF8ckRBdDmNjJ>JlipX~tLGca}?nD;zWDR$jrjeIho41}8SBa$j z^VrR+7YXVwbB%c-P!RoUi+^zLCJ5mEO3_$)3>1PcZ4s9|#D95Z-y8gs zmt$apgmRs$2qmE{do#i7>U7ycX0tyCAc=71)#9Z#k(epau(1Iad3Sl`qW?Jjl zS%g+c&>!suFi2&`^mbb+WryM)3Yt@xSS#ra=Uu@|MW9dz^#&3)g|?2Mdi*A2tl-uM zA8v?SUuR8#C~t=Qo~Fr-jV=(#jxp)Zwe^;CAC-oDvLr5D*=oK}+Xs&qOj~u*THzmX zy7o&%@eS`dsHw(7A$*ZAI|UeC{@Yui06&A&4z=5EIB;F}B2YgFN-#loN7ZE+EAt}LQ`O2VQt=2C|;~9KD^(~c5aOst=4Yrt@ z;J3HeNclMJ`59QNGDUB#B!{@Z@wl*s&bht;JL=}F*gIagcW z&W_x#r}Haij!Rc$#j2!c67sJ46kG@)W-)hN$g?&BcUBp26#0iJ%>K|gN5SaB$y=IB zUt;G1ygIOToHGKBo;b?G3cm;^$u@XR9YO_SUmMG@S2+Z-ac|x92*Au~7j`}V33z;d zGM_@;Ssd+~r#G-zO8|yAPSi6R3}Bg1B%Pd(#AG$tK$H&7zHG=bCBN_hRv3&01fT?Z z^1!=uTRo#PQhU9N2^~!DFKUJY7?IgHIZde#|EiW2 zWa2`E);V47A%qk9NBNqgbYsy|uVN*fSxf$>1Wq=*?aOg-d+I?wbb>Rxd@ar)i)c7B z_q)JalO!~0@n@lxCy&h(!H>NXxIcVkNQLA};DzqibB9U|mp$v}PxDZj(3xeaDlhWw zL?VO&F`v}v$y^{@a%2UeTl6d2u;!aMd#kulHL}jDYZ&S13*0gk7%sGUA5@}A(iN>N z-u-k>`;3e4fJQZcc7iBO+(oqWte|}nKpo%NAA2AgwTyr5wjw&qvb;L<)7drS=p{sq zHCCb)ku9A3!;rqX>8-^N_!t;)!?uCZ9{y3zfvBi3T(`J z_{$?ucv7R7vuiA1a?Jz+gWKAy8Dp~44QO6rF(2Dol03SGgn-xSm>UjiMIl|Rq%+PP zI}Ni^zCy}#9PM>+{T+>F`+N$JvY#i;@!5D9_SD|Ass)?@Y`4arSHmk$fFW%19-h zP1KnhG!J2478P|WpieU6r5!YFr!Y2Er}SvG<37xW)z$PY#C-u0=GR2DPA1IYpY}6u zH6jf}gm8d$hcbg88Lf-SA;Gu{rF8O~C!B?=t61n9(+_yn0o=bdPtH>q@M;H}zcjCIUIAYkhorNI$RN#Q6 zBpC;8u@>Px2wniKpW~>0M0bP6sZ!T^BDpT2ugK!Mu5>Q@aXE4Aw>K}Ju>tzKu5&HD$wI%p ziB9ymTx0ut9thg{1lOpLDXxZ<C^IBkn_Z15U6??9qDLEoXUwCxwX>ET&Qw5h{Sv?OaMG0G+Cb-Ei-ItCM%`hN>SkgQZy@4P92} zz5UzncyEQjaCYI#QEhgk492Sb%EIvXZQ-20q)NDpAh|Dg5R-#xb|9$-oO6$IK!vd^ zd1n~n(D2ksO28Ia^s&X=@!$%+t{ucRaa44iJc=}$QIs@g2x*R7HNa)cv5<&kjIgfm zV2qOt#tnUJ!B!|!(~=OpTaK{nwa-LO$D!&G9`4a_n#PrJrvvI~xmlBgtb9z6Hx;oM zEDK=p)fd=ZGiXAOP>5hmXuK0iRuO*2-%gCwu9Hos1&cR*7J9$j|RD zr?T+m;AoRT#CyEB7aIL-o)0HJ!r1R}b2MSrTJZxgT}p%+fUf_RNW=KFIe31b*>8%K zWP+~pJWOZWR~i2vI?`9?Vv2?#&SM0B2vYill!Gd`-B3m?tg@;3aFxB~2G z{PWW!GuihesYf|4v5PeCq*2{Droc?-^}h>{2~q=UB`H`9B%^K!Fb3Yjmhh8hi(_YC3{U=8uj63g~W5Xw%&`?cIQXeiMYvb<#MVJ(uMRh4ZvxK^jl(tj$BCc*ZY z;G&f$#+7*;+8$Jl0`aB6cUH~kbkD};q1G~Y5gl(l<^??aF}VL3K~dd%8vHS*Xm5IW z^>VQAlw4vH6ti|fP-?uS?7E>>C!I|awatyMMS?2&%8n4*zsOQoBbeRAggj;AD4tte0bw}Syrd3m`qDv1 za$BuCe@wvS=}IanoNsLaDyClTaEHWc-4lh+`$yYU6{<0?6|T*1N*`{Gl`q&5rj=3L zWFDimt|X~Na}1Hq;yltMr|2BW8zI5(%`}%w*)~5;s}7-yx7jAm$rVp=Hwf@^ ze&1K{roAW(EmK#g=eq!}Hr-WJe;jVvNQ?Z)imsmsXV9*lXZpqLWpSD1kj|&3ZhE#$ zlsHlyD|-KRp4y`cz$Tr~2-KIb3dB%0r=R4wVrOJE3qD@a((gmSEw zJHHO^EzR?{N9(!wrvxr++D&J3ZU=uo-025n7imGB{}P>8$j92qX9schxQ8gJy&2XC zN%rkbggAwQwkDV={b2J!$Axd0)MrgncBYmE{=<^xkEcp6GOu)7 zcVGd%)Q+I{Q{x}8bO2aA9`Yd{-ff+dvX3I~ab`l{=jD!;IRKL{f%)Ma0;})XPMoIb0>mKEabGnoc})y(;Q=F`23kdf3$ZDZF3u~2 zP>ZnN@7Uu~IvTMb0JC%nfM*CADry0Kx*D?x>9(UJ%_j2$d{trI_wZt%8C)u=$Ovo){ z^m@lqXj^9xb>;qrYp^B7gH5Fqo*MgPkq*0SoNuXH!FU_;Y1Ct%rgvM@z|*`t`i$3b zo54!%Z{`qT(Q8igE7=XlZshxd;S1<&HR4jP1D0zqS9|l#d z^O#`90;}(=8;l&SSdyyZ_hhJxQ>Rnh5*Vqc+OEi81(e%5f6(-ByT)fKP4Z$nOw!qK zTBLq@*u$I$&Y7%?ELN(jVGPXg)G$}p>Z`@l%;YNxU}-%oWsKFOo)=^`wR9i9#(bJ1}i6y5V;B-Ck60I^R7b7AxqE; z#oxj%Z^$V3&935@2AUnajLgS?>O-XOs-3%73h!cVn`fe@S%^2=Wm|SVFaovu2-gDX zh+s*vyth`re#Y!+Gd3*%73BFX{<=ewbxtYx3A2*reZH3+`zo|ijg-=+-%54)rOD(W z2u1jBS-qj?J{rfk4wUmT=cuk8)^S2w)4M}!@taW4ZXoMLU+iI){iJ znlan<6R4~|E5}hGBeE()45zfDtTH>E_@ny5`h1oDY7xupg&BK>jUdkYIX0f@mOQnb z=MApLpCVnAOc=3u!y5Q9@}=bW?r)kS!oc?6c6$j-^6gSENjSyV0>Jc5AIKjTFTWF^ zj0*Edu9CoOZja{waAjKh>2>|B$Na$!`ObeaScth@+WZGT?70$O8%z^{nJWB7Rk+Z$ znTV+-R3P7f91o#?1jTT5vZD(rAAU~+TTdL^&l&T5;;Yxt#gvqEgGslxvQi|#i86J% zoayyyU82tbpXceU5mC%-%A-Zf*{kXaP9$3(Vd+c+a%9|j^U&1m0B{Hnw6}T-kf0au z8jvGt`T`Jjjix!L|5-LB^?)_bPi{GZ@`qq+d*5nGKzD&wz#vA~?JBWjLBv@VeAqJv zIsGu7v9&jTC0SJp7^D(09}oONt=CH|YAkl>!9AvxS~q1C4J`aBc3nu7_CHm+oBoQG zXzv*&(^Mzg+X-R{jderf=h_ZMD+uAGzay$Zn}K0Fz+rJz0tnBLA+r92@?_HBD*x@8 z7i;qa_^#djDTc9(U!Q;_O5c&v!YAFnL9l#8I&OdaLSQ!vANH(aNZ<>zW*>Jxq+Z;) zODfWF_-^1LkHL`j@a4ou=LH;O4l*8zTf?NJg}l>nh2PsUM@YS^2OSL3Nt_S=xYEuB z_Yow6Lq}(>`n{nu05(&+Uqnz8_^}M^(Mbd|AN!11%iEg=-Ddhkht+{oV{%#d+G-)D z08>u^ycrg;4oJ%LC_>e^de@E5m%fpGs#Yf!iDGkpKB^SxXc!7*IKijIQ{ql`XAq~!V7hilR0BQS!7FQhty z3hVS9ebmg|fknd-Mv$1D7jMk02Aa}K(nd-qDpe+(SyZnXJ=84rZ%6S>O#Ed{R6Z?{ zg!Xg!7oa6^3g%YLx9t+*OVJ|%@zBc9Ru!w(bRL0?fX9PdqVp39Fe+R8X!w6f?VTE2 zfpyrl&3}%etUDB-1(1OO{9jS=yerKaA9Ku<4{uw^D`&nRG&~>;Fr_N@5U0H%fkAG6 zG#l?YiUXyg{a_uRboGvEut}EPP?vVs9QjJ1j-1TKmb^iV{VW8+n&O+7CZKu_d>7;e zZSbM}GA47- zd20Iq(Mjwb-S$sRFYL8LS&0&TK*EspSAd$EYwCCF8$@%?rYYil3V|is(g{g>Q{w9` zsDT=fBCFtwsjh4>F?CVzC}IQ^f-`tT<;c6iB-|Q;I_&OcDfiDI?k>2nW-1M=N7FQO z=5i{M=+MgBmy$|SSe__F5vU8K93|UT=Hl~)xpu%Grc&`|T&@c)S70S+`E!+CD+LHA z^G^(4L?C^qo0SxzI;=QNqq8Bev^PZKe{KTGDz6bUmUIcxMSNGzuA_f zzed!+Rh~8_CD18uao%7@_$rq<7!E8;1+7PyGNNWH^&Q_hDh#=DhkX__D zp2;Wkebgi&Llr7nG5rtdD8cE?TNq@#2WIp@-aT>xR889lmLSM?-#Sg)MMJ|%mNRrY zZrJk)&6kJp0j#;${r36Q^UK|@02KHArj+3-VYBzDmR|syj-r2^fh{ALH!i1-IWbm> z^+-$@&Ru^i=8is_=NvlezoB7Qf2`axxaP1mXu1BC;14!9_J!SA#izqz)Ca*r1=m{F zZ-4F$huwy1#7|9V7Te;`cdhyGCRF}@exNAmvg9 zg1ut-+V6Ar;{uniSO5|pT@Dr}h=DD>Fr4=rDF#>CmRA7Vs0ySg)A59H$7Tp<#*K{Xhe31 z>w;S`iLRt+XTAGttq2z+zVE8uE=L2%DDq$miiSpqa!1*TH7%MrBjno~>|KQTaHmm4 zJpZw!KJ_sO6#9Y>o1%{$dC|$;1J}Xl^5z30emck#23cV%@r%T3`r17#HPw2qe!Ic@lZUM(p# zPgwqo&KWE52r>_g!r+-AX8|bU`2Fo$Im%T>c>YBPr&R9?2chZt2D24q&q_AQfESgBx@8;#!Rbu~^jSyr^jZw*kiAAvog z5yg3Gi<-6Jqmu|4Mb>+{6$&7X_RWVn&AGCww7SyM+bc)-;@$r(%*e}nV9jrOH3Tv% zwPH~i_VKNq64y~CxtJwU%rW7I$JPNmaZsA(^F$g9w;hyxBEPo*`?DMzbx`ODwzjR- z1Ie57-f44eP?V>Av^Cn>n~yoR0$OXusZOKFt-_Mmu<|imBS6}k>&2MDU-JDzU@m{5 z4fFxxXIs~DCr+uesNJ!PguaoijAv^eGT}(!N0(b*G11we&+rK+JG9!F>h-#TiUJl_(9RWjZqJwv^slgxEr>4NIzWDF?gceE0LkMfW+6 zwT?p&Sehi1%u>Iv*)VDmGm{%NWuv`IJVnK!8GfAMy{l;LcTOMuE=Y&n2lWr92WV;? zMU&%14m5HZxP`&4fl7=wlM3vTsLG_*a4I*YAc)OCt~jq5ow?4Wqb*NLC7Z8}w6Uxb zotcxaibzW!B~T9L?Akb8tl#YcxkJ()-g6$H_uFFez!w|WlEie5t_rK0nvJxS(ch#y zw?3;+D?ik5!B|nN1N?H0I9*V8L51%ol@&joaUYWb*0vnj9bTu%hEO5_dF>3))xOU8 z(W_GhOWY_mB)r!^!cR9^goJDx>ZB{?eic7G*Ej$Q3dT-rVLbv>VcjT`=*A>8yMM^Nc2{um)_s+{H{Dn0+^$DhDELCdaj-UabJGKAFz%yl(ouqhjA zaVF6NijiXY!Q-NBOIw|XLnsDc)URYvGLc-0Nid!3iTd$914Zxb``RD#Jv zyom?@#eGH|Z@Wfb$9LE|YQ#II7yO3NjQ^byrljK@km3E*_PCg^1shh$pFbfO-tek# zeXnepoO`OJqpbU_Amo;<>u-Fbxb!;rXT8zOHZ%JLK|e@!&la{j3M61v1AIG4!&XeU zxQ$3UgEp#t8AoU>wl`=C)QgPzv#y8-qtrmb^JeQfJIm374ONZ&U?Gdi5~bEkh22{H zvDX1!;AcVVr|~vx@yxodnTqzWyNfvn2BG{mhkxEiOQP&=XFawVUfe?a!hymZ%7XtLiaK`2Hj23 zx$o#S3zflNd6ym0`WQV5Pl??mq)|!`gjz5eSyCx|no*yhp1;31Oxt`D^Sj#fU#R`F zI({Gk#hqZ{$0YcA5K)?^E=<{&u-?aX589`G*J|;R!W}6}lb`*UEtbzh2k^ zH4q_)b?R$piGBW-LPHGI%5le{N-rQRh(K7k=fL5e$)K_r!gF7MP5I|zdSK3Rt+U&C z%pH2F9L}gJtYOE$qd3rWISA`h_EK)LG+WwSPi5so48GZ=H>rcyvXcWqKcI5G%jM8n zGwP-lzVyOCM_UmXYBLKAk?Q3frb;bXY5ULQ_TO-RW&Cat0ND4QgEI)1-fZDuVEon{ z3IZ@;PTHLDUR2(u=priY++8L;!;6@@fG%`b0*^Z$={U1sO*=Ly^6iz|D3JkCzfPrGG1` zTd~WUmnN@uT`M^KM&Y<>BrYj;d4EEX)ElOqw|kIuBDR9lE}Z6o1y9^-E73%l)|Mkt zY{(W4XEm@35{gu{VD|j2U(MjPY`qIe%{HjYdq)5kXTAxDBwV@2rp-u91PY=!>$vh z0_uzNh%6FFxtAR1vGk|e%%R?f7ZE&lC%+<}>ys`EVd&$Op}j zwa|PKt!a=SD|1bQ0%-= zVOC$q)}H?hdprO`Mc?0Cg{~GybFuZmEohA1UEmqO<%Gxiw{06d*LfUIr^o1rXaGw+ z0EoGX861}U|E9}r{Ccw%`%mOUUyxh@9(J4DRDW&vuOk%4^A8nUQ{cVgv}{0A06?Oa zn0M^*dbUT&id#O~L&UjUm=}~xqsuce5f|#Bw-y@*tLQAMX+10bZK%zo(Z0enly_6L zZWPrbedggI{6OA=3-|z{rRa%@W2jo16#o~P)+76SnCQ7kllX%Wd3T;-vin3?>3$wh zcRfNQ*%1;eCT<`DaxUksVH-4wv8m*)Hh2`>wQJKGtI)Tvu}#^N=-%xkI2&_}N5lHzu9%lIAv z3dKyLIAD_h7INJP{1P5~+5{gc#u8nyJ@nl*dLG(!6iz#PC|L>1Q?JVh&Yfg{Pk=&f zFPG$q10xC&APicoK!z)99IsbImvD$WMhVVEGb1>^GD;V2C}xBln|~oOYi!@FH=)@V zDsGE}P8=H0hzdiIrTxaoc)Xp2&GYsF1$-tKgRnOo4Mj*v12@Zw&QVK>PCz`QM>#JK z0auebMqtQ-3!krjzx6)c-=7ig5G87;E1(Jhp|tV55z?3bCizKMkPu*b4>?r4myC%w zV5Q#?`Db`gr$Dh^6EqOMSM_JX5I|S=9x0pqaMyC}aF^e-V+e$B?xx{95D{L4XWYq) z?EB*#fR;{Rdkt90o@gik#?zBwHK+&ao&#*I!eb`5lO8_^9Anfp#JaIGo!8~*k=tdY zcGsheQj&bXhp11}YF(bTFc@q;Z{*q@(4uaAMOb#wDC0=6C+AD{PpJzDREQ$MyM9E3 zsi%uRm~&3Xf;VH;PkJd8G9Gao1+=c+)ep-V;*UnS{m9w*%gP?S*!@7P%7^(%egNDy zHlS-^f0)d;N$5GbA+Cuk!DpQM`jSkBy`xLi=&S&WyiV{}(Jb5&s2^qj2Y#I}{l|=N z?X2o?63bz&dJ^2tC|B>{mz_gD z&+Pi(>qqyw&O{a_L;-R?E?soFRr6KBqtGV`)^MmDnCvfOe5B@9ErdO`+GB&tKq{o` zF6ix3ZOF*VKX4ZkG8|_lPIMy`Gp7*;=SyQiyF0D4CByt3x(c6bjsr;&I8TKkv!<{@aPQ$&YtW9YAzijBGR>QC;glWh|<6C8g zT$2vK;n;@AmaNhaO%hQ7^h!;%=(9PGQnZal9! z>J~y2*`)tA5-{UBES@3hPah0>p1GHW1i4t?FFHLt9wGQMiTHE!$VL) zl}uADF5+Q|Hef`wXdLo)|EEvsH|M~*A~>BZ9|+a#dg<@BD~ zM_#4UU)G7KS0>G*7z#S+mq2V5k}vb?mEM=Gu{jJbI?eJwKZd_0oqdh$b7GY|9#URY z(el=6F+kGN1z%d}dBK*-eVg60%-CFnvD>32V> zedB-l3}K~hoxthT$2;3Kc`NTPnbZY?p4YaV&RY*v{LuQlR9JYEk14OaL_;UPl;%v$ zmMSJ{wCn^fQGnThA0xBZ!X27ytDLU~-eBZq;{bneyqEab0lCPbbP?{<3b&rI&e6A2 z+f`&u{Ol~J4wrUJdf9QcpLB5<-M1p*HDBCRlOqXmXrm3Q`w#_QuS%hCBlgr(A=q?g z9boeldG0@@4aX~3Xo6Y6CBpy_M9GJgq0T276qy8PF+Y!n(-qYm`TLOI&?y6^7yHf4 zX(2$mT13G-P0i!d=KSPgk%+v#-`YoSg+!h59{%zKVE5S$Ox%1UbfOwbEXP;Tw{;o@ zOPs4;*2Uh!@Tn2d$4_NN9#)mkdLeX+%G|?b-Am|N5cN4$Y9WL0RBd&x?`R9@%O)o| zbY9W@@o9ZWO%tMCI{nXT)XvV3P)r~aS)>wUXNf>YhvSVUlV;?TaeWfV54b{+Kkxc2 z8|P$Zy>XVr*j61PhwbyoS*icpJ8y+3o+M-`WfvgC7SWi7TKlN%h#j!gBU1NbG1g)z z1be~QSfEeVB|hOi{Z@`e*C1b+c7oM%&N7RJ)taXos=vO)qu69l=K-5s+G4pd;m1ar zKh5-lmACsr92>%fHPq2tkS-cc5934g&ENTRyntYT%;T{*b21*PVqlDcTd^Az6I;;vAwfLu*@jr9E6MT%q9?$qzSAT# zH07$h!%3Ogqvp@7`{m8j141qwP~WtGvcQIIB>{rk;@3&M?IzX09XZ%=C#6hAR#1kG-5XzfI!` z8uN4l{1y}jN>Q7(1h@%$71o*LT)O|1HsQFc{{T={|dep%d5Tu zD&0&Gr+#Irq^)l=i~aL#?x@z{W!gws)(2(Ofke9%lS7p}F|t32!4ZfYXp5Dy<_BHe z!r=6dAnc#F_9RT&th?!IH$!P)^7Z|_Lj&n*lF+0J6^Be00ciH7Kzu-R$d}jUY`X`0 z9XZHl&!Wy|tcHI+z`euFW?6cRi4Jt;#+Z^C_%0$+Iz5v6>*pO0eQ>0~2IhvbxgMT;Zzl|eAWH8_Y? zf&(`q#cyflZKfq;N-VD~D7$$r!2Rv}NsglQbk)ryBGm~2gDL3AKS7-ur`Nz7yjl7E z(po)2QLQ*qlVpp!fZ-7Ryz3Cb@6<6N1Iekp?FC{$yRN$Uf(m^Jdi|(C{0dCxDbTgg z;$7$seQ1oM5!iN08ko?#GsWj|O(YY4n#K^E5T;w^0P4@~Y4>fN8aKbN2l8XSAs%cx zWH)dXR~~9F3JA?Z4_xR+l3IRXI#3rBC~!oJx_xjFxFDZQJNsk>3O44p`G?H0Jxo%? z^ulLr)W6ZNhxeLjJ)DYW%p>ol;nh|temr&ZBuYS|ih46u8Gd>fe6ZHD>dIw9Acon< z!Wv<-c4~}kw`~qGm;@);oRU%nn{m!zyOKQ0kG@S_p!(f-B1^K_cSpOJt|l{nKeY0~ z_p{kQBHceQ7x;v6Y`0x>rDaZpD2%XmUif@@czy4!BCV4k7R$@gj98H+;^lIgTkZRk ziEB|6!1>nPG~f#!-E@eM%#rFnZt|w zT9}Mk5+ajjR2`jl2EmR<{Sy;U(F?Hy=IuN&;6`0#BggR~1mU+%`HX%5l<$OTF=`i! zEW*PZQ9J29KZ$PxRLdlvO!Ew-(#Sax2~=ChoT2+`HOcSdZ&Abl5nI197Yv{E#OZRp z!$DcP0CpFlpn02_{%kMedH6->+SRpT*d7PYH!+Q14%RUEB(v6cVTug8Vm8S=M@1u5=GP`@VP%A}C^1LZlF?D#}pdUO7&DT@s3D#ELY$ z4~QuG7Z#2Ick`fE8?87B2jVBoEfxhXS5)HOMYp3~5tnAVZ1N@TB7;e$$_pc4+#_HS zsQaccpE;QbM#s)fRyNFltD$N~o(Ws;dB=7}+G8QsrW^n(3W*|A6PtL%-_kj1-mD<; zsqFnA-7_$|^$WC~^W5lx8SL+;U5BFM!+r`UwkH4xcR)uO^_cdI0rA#sn}>kNbkl7K zgHs1#fLdQDvY%oXM3J*>VUrjB)PE#dlR=&RBw_*I#X>+r`;%*yQ!Y~@WML@|oA?#j z;E-h-mqHA0NuhU!>$m(derH>*H4M8;o=h6bEl{3&8?o|_+FzzI>1#+wRz_{xrE9mMIctge!v`oxpsk* z1z(Rl#-d!#RoO+vGId`G|2Y3ih5b+DYZBeeKFH0N(UkZGTn9UAv)C{pwQO(CWKIU3mYm5p)nXZ2GNr zJc*5Dw>{J*`}88|@KFf=#MZa}&N`xJVPY7j$izy%kL&JVE={pIi&=MHpuLj$_i}HC(R(_1 z7xa~h+1;2@qZ4U<)2-<7o{IWG1#V7T%h1d@fJ4J|eZsrpQm6_xiJ^X z{i{CJ^ya!`9jTp1P2c<-^k>zJGor70eFRFm^tfe?LHaT6>QvxoY{@Uc4Jet0&}_%V z*)L-uAJQH#voUN1yx>>bE~R6CeS|KuBuWG%TpWl@FixG|v!r_n@I*T+z|oaj(cT+X z31whGWdU52O^3yoqybBhH>L~|FEiCGz0B$~NDB2}sQdaWNc3|nm}i;3=*sICE8qh? zTht5f%T6u4+ez=gO`G~^PyFFJ_@~i9;wz7#W*t<%y`3=>>EAGI$JCX-;XM>MW8-Zy zB6I*w{LnmX&IHX*tI4VQCu&xpKPSsDBbduwrF~$ulEJGmTwuZWTj_Ir_v=9_zi7D- zT(I6p5X-9TLnpcrSu!dm#CsC`_Z^C!OneIv)m*zIp{vXURa=>po%i!Y)^Tb0wd}20 zzWyg^GS`imna3T+*jHa%lqP1h+On)ZuyT4v{l^SU&;|-O{JS`4C*`=3Y{1a%gmk2& z+;-cm9~z(e`nIVw|D%MNF^~ZVwUP**a(C@7n}9=DiN+Qa8MotxB1YMdGT9pWK2_-O z&OA`N*eA{ZelMu5kSGigrw+OBnrP-;`&XWB4cv;Pzya(@GkVA^Y#s1XMu1Uf1@U{k z%JOi00x@XB^^n-<{JI)s_?(HU_4KVio3OhUZ~}<9M%_G4#ig?nnu9v8>_mZ@(H_)* zGjm{`+S8NDJf)7XX0J>s?#bQu^11Xv8Z)hf+_9G^)&2>zcjpJ;=mg|0Ma>Nk!3klt z)2z=)oFfbQU=`DMFMM4gP)Q&-gAt%#9#wO1D0OM&d@X0;mfGF;p$aNQ4C8DUFa{X^|PPDQ>X=7jg*FQKSE;G>v|$uWrdrvNW(VZ!8Mi-o8K*&+BqOh7W}`--IZ))09oWq^rYB_^}Qn;arg^( zzXs;WI5{yGAASCtP#OD3VvFX90q&zAcS@_3(b*3JFnS8A;kI6n-y1c#9>Wz_QFb4h z628i?o>y(@N&YH7@PW2nWB%Y#qD7ZnIrn%&uy|mDhrF|~*?>Az;^%SIC2?^fRV%yU zP;FDw_vl#4qeUR*XQ_|etJfCL>a+-_vK4P}1G&edhU;F~6aWrxyk=!GFk{b1Gd7`3PM)bVYdjr%gj*`G~aD=tM=a*y}_t=kVHh|o5R6N+-xGf94re9y)f;SB#)R=oikq0L3DWBC|_i2Ht2*1bhZbUHvLc#G>2^4Lnv$u9t(Se;u7zYoyF z2%#LvaaRZ{6uM4Lrd)l1W0gX(>LPu} zF+>F5l0--VB6y|-eLbA0ZIVDbWD|K0Azn?rNS#8_pdZvDvu@96skYv`jovj^{I8>Z zaLZD85@C6jxpSS~Uj1s^{^SLpfBIvpyY6{J z*0XU(hquh?ev!{uj%U8J4bXyH7Yv0Hiku}}MqQ)=)lTzP5z+Z@%pUVlfdk7F$gGAB zS&$m)P?UoJ6Up{Yr$mf~!*`{={wcs$U1Bo+l)w7alj?&lslG>BZY~DD@#lACL3oJo zUo`SXAx@~`-e^oDr#Crr%;rv%gff2hcGi|~KHO5ctxO~g7FJk@U__v@G7hE%)`=I+fA&|nA+cbq6Rt$ZNQyb=EXS$P-d=$7T}i&=vHL&xmfG1KIpyGc zL^EMzX9i7)X2;j!byeM!M@xN4UNLWx^0>E~@PfeJEp9teA$SH9tk!og4Z&?lV0GI? z-`5=)v)x~bKb~Ns&3+Wp0b9_CAXQyMSBM(TwthZ%j>0>@gfKEoF9sA|xi$jfroqD+ zv1RPXxri7}LEhGGzW|boV?`xnAajb73B1XgOQP!@_A{@&Zrg1)p-ofTG57N#-*I6o zp1?Jmm%?jXo|)X4ZyybLnV8?T;5FFb1o zf=pgmIfc$Tk=n|0oSG{Hoi+pr(S#yR)4@G3Z}6s5Z|gyY3FQ^V?B-8Lf42|Fi3%b_ zP(BGVDXnnYa*YbyI4*h#RcEPz5vX#@Z&?Fok&g}$NSC3Q9ak~dRDucFDLb3nAB&Va zJQMsxi!sF9kJZCRBIo`)B)fx^3TNLIvs-caseH>2aC4Sn7iEr#oKRP7^cAurFm(Lx zj_KvO16sXCI{+Rg0OD82GuV;0NUO}Z^_fpG?a=Z{spRQleJ%aFUwEwqN3x(o;7|M4 z3*%b%eBFGep&&!&LxA7Q537+VsvWpCR1fHL>@EdEWu9gq`I__xJz+q(Pb*}&&o34` zdYQhcwpvg(DJ{c!kOKza?XR*j(V-4+fJ(QHj*SGCX)b?q=c#&8T69}DXau1nOfr#2 z2ArToW1r4bzW9m@E4Jzk!gNY%1=)XJ%Y<}2HryTgp_bY-#1C8B1VRzqzwb0> z)Hw;t;NlHKsVO#%>8i%;UMru`v;^>~GADKa@w1b^r`o0o|2Df3| zCY_3RM~PCKzeXg2pkq2Pl$rFOiE$wO`!je1q2&MmeSrFTv0q9U!hJ~2iyg}l@z*?x zsiGd*u)%2QGAGRK&(t7qA0vuVdZ1P@OOX!9czE*J zGt||U$Pk@OsKQq-EH8iz9@m9;?dbNWqQq70X^G^=0b+k$Uhx~_$~(Ng%o{iqv#C80 zPsjPmj$o@n%d3H=cMo>P1=k({7JDdB%lg>G1n#tHmliCd1UKOzMS3V|r$u87<5}-r zvop%-LB`(f0>Cdr%a$3pb9{YZ0Jv>(oX1Iv*9|1m&cJzWC;nlQ$GIBf;E(1l%D$tP zj@=Q*b9UJ6nRoEeokWueqK-)sA@HU?5XL*Ve90IGI*3RjEof?i0?%HA;<35_);(L2 z$6b&3IvQ?Q^fOJeT1p{|3x7VN=Q<%RroCtp9Nl{QfJJm#C3{gsk2vVfWG7p{hbBtp zD3tikVoSFd1K2AG^H96uN5JBSD<6)?dfoD_13>R`4PvhBmJo{FCL(Lq*JY3@7?)?a zd%Yp2t)nlSxf9c->kB2yLI?gZ0W}4St!SueIo#NMK<{g0&CK1p zFtuv8pe+TmNl9l0k3dZFnC)c=w)~dOKI4U%yuu zo`}RvY;e9a>U-U{I5fAo>sCc>oe zgfUF+Fz^fXA}d&Ef4z);zR5C^HOQ5n!m_CQ0Cn;ys#Msz&9(4N%1v1Yn7)p`^A!kI zB*7-R6?0iX*~d4#a{iCJE%DXjKU0)@*MHCFx$O{FbjAffDxnORMzf(&GxPq?ut#`b z0E(rpAK_m4#t4{xG9V#GB8inc7b5IF(aj&PDOz_*@Fud6TFuMR#4c-Pa{{Sw$9(KW zi!OO<>23~yle27cYBna^D4Cc<9t!FY28*zQPxNXFRV&tQNLMQ4)e>av$${OUmRRQR zUw9ekgINt08AT}CTJxh2Xp#o=pK(0$RV5?i&KIp@%vz1S!pNq@Z?hA%0Bf`a;^q!2 z7qCTebFFvUW#Iy*x2PLcXCsy5{Siq`!Q;T};ke@bn@UpX)E}GNG8f%CZpfyZI>|N+ zBlITW3aMthx5RAM$T`>?ie#vF8F=eImd*tF+_8tX?)a#gMtbaHL_VXLa)pUZ&yxQ> zpl#DT@tO5<=2*nfuG;K!q|{J+l>8t3xd6=m&FBJ%MZmH&DvJ~cMXhcucbdK|S$HBy z;~FMlgH&pvPijXd?sw9-crSN0Ud8QZxVn2EsY1y{{9pyXK~S7}SP)(7?+C7!hp`L0 z_?wkdfVTBNv7H1#gQuybU#rCra}Esi@-Iml!h-|*^IiHATbxy~VXOIDWNngXjTcHP zgpdGhRj=5WZzI&~C)w#G`?w`dta9iDd#~-|3Ifo8gRBUkda^sWoz|me^X6`eTAl4j z{^B&l4|yr@L4v=Bp}aiQ6x9LNHnzQWdK;wtjhlZSsqWomavexzdvOoCq{~S0L@=8EVs3#QFz|l4?0%TYfOw*hqtS|LWG5F z30`Ue(Ff(KQ%=f7p)0x@sGXJs zrr?*&x!{9}VVmmZ=^#Yg5Dz=9&tR_=H#A+zcA$(wV{>8D+FXZE;;> z8wD~@YvJ)Pq~bqDIBODRpu?9&85t_Hnnwp&@!#!ZBMyjugtCBjLIJUPkr?dap{LHL zBBxJD9I<#<7?vbnTGtkV_@ccI>6DUovI%6-zo`C-2ch`i%c%wICmK1Z)0D`(mrqAW zDOn;yq-#~IUj%yErmjxw+i*d+NOj6(w}oI$on!5(Ap?ErTZ2WjUGa?fHIm2#znw>ct<$8oT@qumdHmCXUOdGh`-7|8p7p_YZry{+$Dq81lnI1!W|QL2PvVVkwC)G&;r%Y!m!4I6gCgi3 zX1?grcR}wGF8oO7FSFm~f2zk;VY1Dg(D~-xtdKbN_-%73-JjMIwRllwYCq+s9&hnq zCp-1T4S)pFaQX}WwNRgIF;CK!Cff=0TiOvY|RI|hjzW13}9zK8u z$!rAIeE-yGJZr=Eg*M3{$OZ`Sa$i0CsM#luEw&a~ZyPQeZn5-7A)?Z6anHU!cxUMp zb>Ih6yYzGLGn8zD}@Gz^BQo4lNwqT@=A3Lq1SL z9eA}aQw;MnQsSjtr;_KVRdC}IYg}QHW-h-4dP6Ja4ppP#ProCL+#cxm%%RqcgO%K! zHb!;pm*y-qW#i*(tW_Xq>~ug#_LOLfRO6rv(4F|Vh%xd`N)N%Bg)!50FzYWzQ3wcO z8)Qi<6FII58&r9EJxyc}ijALH(B|SexMYED1j47&R|Ys!6t#M;_mZQvX9d*{;MHl4 z7RJQ(x$G-Fod$MVON89tJ5`S5F8Im4IN-ez*>Ud2%`IMhuU03DL(%oR`Mz zu8m)7>uOZ{FUG&+?N2TYl45UVa0%bhaZhh4WdGN@U$(1^nM)||iw;|+mQ(7f3e4CP zrRquaZ^Ne`-JdOhi#um4BvBS7LK<#Th$;%|E!gN@$)BZ9U!Ly0(sKluNXiyP{y+V- zy_r=9fTO2}L3xh=qVvYPmH(s};PRF)SCB!R;}3($`QJf|z<6Oz+*DIE)6b~xk~W5k<^+d9T86;g0OM zIlY2k%34s%{ROq3)bc*%L759+4`a+cc)AZY$QKo9)Kbf9I(C zsvJHj>W}j))eZ~y(uJy-|BT#VPQInsx`aM6LP*z6PH`d1Z_&Oy$b(iV#(}-BDYibz zGlrI~19XNaWD`0vmPav7;}4J|O!zdo4_KlX@mLB|@cbDQr?Ix6b}D0I{dPuwa`I?S zFzF>wDae`UU)7R0log7wGyyL(^t4h3CBJ-2OD)rEtoTj9QE9~bP1z(6Oum`<3N%{R z&#GUcIKa2?qR@o;&<>wL!A3EC7^E)GJIQkyJijQtq<|y?7;j9%taSc|IRje_B;Rn~ z6Ip|uKVqg$=yQowjEXDbIjuc`&CbMjL5do4+_IYE$e|vx9|mH|ZAiL|hoUuL3qH?8 z_+8^RUKhcNoF6OV_aQmu|peMyeyp*r%8o_Ze>z6lOBHL{H29DkT!uC&w$k)#XLu z63&|z*F_gKCh?qtMeaOTw25xszbLw+dEQGlB{XQ_4}HM!XM=Ky-si;OU8%LL`n8s& zdw3+=Sy`r;9Y1zC^GLxvQpOtQ2e0oHd_C?Vv7G%ifg;5XQ7w<^-!BxvKk5RMLd*vGr`KM0@+jIAK!>RK;${a)>)j z0D?051qYnbZ@fS=I6J%uZa0zx%X>*lyhm2U zjpM#;F?$jQEZ;Ix7a5o(CRg8V$O`+Ice1?~*$WChyLA~&RZO$0;tzxB~h*1Cp{KUpHrPEg>b81pL?Q|W`57`4FYTA-Nl$uKf9w0z?vR$pr zHW?|&a)2oSGXR)Bi9pO5^3=ij-6D}fEk#Wty(5N8Q= zX3|SyFsPUe0uBEkOhCtVn+Q6gdPM=w+k4l1+Zb#*u;Em@JeQ4c%OH@m_7`oKN^&7$ zJ>A#82Gp5-_s8gr@F~VY;&mP&!_Cf+xTlgoVV^A}bN=Zt!1w*XiZHVX^v^OJ@QvnY zo{DRYNr6lu9#-;F$XxtL7$g)G&Qe!kG{HE)xX3L?7P54!)`|P*dYbLjr5ueXgi%NF z?}`!Vu(4yv(*pn4>yLCC3XlF0FUp<< zJ5*+4O<|5ASkT>BL$9)M<~j9cA6668UrDh;OJWjw4thlPnj2z55|vp>&0f^{nkLA@ zZf^OSy9i17KLyr}?OsW+`gwXxp|Swm{XOEKK45RnT8da;6QWl!T%a|ICAn|=Fc1C> zM91MIC9q2fmkD)j~y<-n80Pq6{-TeOY$sl(K4HC09p#7sjt zfU#cZ{_3|mY+xd`V$q%m!s(zoW;9ixOCZvmvEF=wKuWsV+uNHj;3S99l`|N&Yx$y&`O~mXnOyOz2Jh4KPEAk2j&->M}PMj z#O6jO{>-ps6Nb{hs8lT_St#J=WP`9Q(mIps=MZ-`g1_G{q&~E`A{iD^*Laka*)9_< zTS3wj0B^37U5Qtlp11NkOKpT%cWc$ItTrS2RzuNGRRA>pcdZHytQa5H=oQV#z}jot z@A%$fRP3iaKRw1kF1RZ@q9=}$3R>e1l_{F~7Ev0hZxff}5^xSa4ABW=^%3+b+3>Dc zrJF+>X+4-?#XzRzAzf~=j za)ZNTGfCE6a7dUzGF!^+(6lZw_SY{ev2d~hVV7X@l)zWYudwi|#uRJzDl;LNTP^qu7%&)!=UPogrbc!-ZAnP0(zv1FLXwO5|Jm8z9OBavL^v=`*G)X`C9=+b zQKj3z#e^CIF3MQrJV-71itA)KXtSj(B=S&AnmD=Yep&5SSD!IzDZ!OfxYAt#^ue>G za=wBTmn1Q@*RgzG1~YD2RviQpCoBL)Kx7hM*vUf040Mp^9YgCx!nDC zi}t_n6(Ah;ei3Ob0yvWJ(&_q``1P!Ljs=&sl&ABuo5JM5K#d_rfHgI(7Ua!$+SCUJ zpDV78Np;dXOk#p3%3(W^UI2m49#M}f7R=zNPs?Y$yLq+`0D|@k!R#n+w_v1n!+PS< z`~ofCPUdGH$shquRe?JKNbwH8w?NkWOWihwJDJnbiOnre@m=g!$@{$!2Mv5}# zx5<d;Z9@aOeuSG-gi&Bilc#LxqgMunaWTRfTKK>ysQF_kxcZaon_87< zrg)y%+fJ3PM)Mu^UWDdQ2d=3) zdrsE3#`4>4+7!`=6(I$j1^F1)VD{e6NUc=c{7Ql^jx}c)W6(|#9E!b+ zbO%V^hd(UlYdwq!5gQfHEO%(9?d<8Vm!+oA>>-7_flZMcZ~9AHcagyJ0JwAWm_Q9% z1@?kh>Ne1&yVM*Tx3|W9r^Ung9Z|8of8;iW60H5!K&+A1=ClQVyMGq@(jvf~Y~10N zIYTfl0M_*atlI6MHq1ykL*=JH>jWy6j7GJ~UHfy$r`#?|g6slPR?cg!p$bq5noivo z3m<(`?+!zwLemXqD+C6(Qm5<}8y0to+IT@VeUKYsv8~EHPmGJ3`Z>nIcN@)_(vyu2 zV5I$-4J?df&Ec;gMG10NV(NA{n8z-Zpelro2Z-)&k*)Mp={79-yKara(8Zm0c|^tJ zumKy!q+~QrdkWg;8Vt~y&lHDbyEMk38RC`m8P#>_^{g@!_if1bZP}XJzb(8?9Ozgl zQ{OMp8drwpko$ebYyeG6)49g4Y1CQFYqhD@E{-kz?5WwYBY_jG)^?#5r^jd`y0i9} zDXEJ)N>$;mDx7gh$ouuz&U*)X1p$9O_Gq;6bb_0E6%N={2g4h$+L1wHK^1qMJhu+y z4AzFn5JAOtt#K*W?+YxB5+ZTgW;dRsFBG#D^eTdTtUVN#=pc`ea(YZjW^G=S&j6F} z)9{Ew6{mBB()d^vq_Vp!^>_y)y|N|+sg!W}|Ci>YM|ps%z&hu81%YVwIjy?-lbaI5 zQhoQuabCrs-=hYEb^}_Q{X#b;AFr?6tzkmjD({eO78u|%?2f_ne8bQi z$Rl2$Pz1RjFH14_e$|j_lOV=rnVDOXn4B5cpgW@H>N>V5hPl@jfgreSRSx|RFl)I+ zqkRLfeRL7Pd760m7752#eyt&p@&gJ=c-dd#Xej+-a~N)8oa>;;U0AOMc6-p06lq^nI7S zZn)HS-}&Fi>h!N;fDsOqe^~w(Uw44V%y;dPQch1_F2$}V2tkY3Pb^j^e+%{ZPVWbr zEvVo;0S>^O>g~&rkxp)x#9s!-tuDE+Rp#qRKV2R?k(Q?{|5ew-==n%vCWUdcCiT*t zO8aw|4-6`p|3VXvG1{uoa#b5M?0XWt+}Xsu}7O_oVdN0(_5b zX&)I;UyV;hD~}5)|5UM}rMr6i%ahD^{bOo*J>cQu*Ju_EQ++=4W+4x-ahnQ6NLw52 zmLHAYA`c0oI+3EEDLI=rL$t?5~lFX%8d1O6JDHS7`4#Ne(3 zo=Ui|%?xEuotL?i=_gk=fi*MU#}++J0cm{-S7iW3*WFC0oVH}Yg!;pGsr=%V^zyTtl5 z;=yijM<@WHNXGX1&rOo3VgBXxzI%b&!=&Urd}U`Ex!>Z!e>Fm9+nDeB=cpy7dfD5lROhvK5eeu^>TA;r9qga|uK8!P{$tC#w;c z{uF4^EH9|Id@GBWegq;bdxqD`V}sGgz-8b-iIBF>g)NZU-Bx(*M4IX|c#H!H=1BYM zlz07f$%TL7%lp@Rj84p)+b0u(fm^W>-9BYE86=rhfyxpwxYxwg+M0@I4^1|x7Ns_6 zxz(n&OZnOpj6)+cwmECoPIistG*QJrRCzV=f{@sZB8&X?5?tS2!kgO?&f~NSrB-hI zARvVDE3gI30#B5x-G~50{EHtt{b(>$|zWukPbID|mP+EPX$?!evkL_ZH>SzwJHa zRv%CK<(Vzs)Mc?xp_YoMM9$DC5YKNIX{`FCaZ(!wvSq|Lb6K_^btaaX3iT|WlLHM* zEPAl)+n6rDN95?Ou9uLN&Q7XH69_U)hR8*lyJAR;5cZ;BzyPo(;XT87EoA2=08U)I zD4+StAJL&mZb8J9e%c@kY{Ww&0xJH~0<3CzE<)IdTg@ZRO8?Gz(gxt{2}IfKBMLVf zA3$i<0P~VX9w`I#`)d4hO_;RnvQ(PGxEVmWMt? zX61Hnn2#~@Pp{oS9ke*7Be1Sw`FbXen`(uiXep1>3kve!{7bEXbZS^1AF?k{soS%y zpa7dbK0Pu-iZ+DlC#kKV?ztC@`Z*fD9S)}0tJ^yhhKy^ZD=SvlCZ(2H>U{-d)+S+K z=;Cfg#Q{%Iu1@c_{`ou5@WP>0KP#9vxzL(JLbH%%7i_|dL(qHOn&xHaYfGWr1WfX& zCL6WQk1jF}j#L|nd2g;yln7{7%hsLy3}gRuQLdf;v8#qiV<#t23j1bUi@$0Xa_vBW zQmgobteGg1P5D-6VmOWEUUPLbDE!sPsOUgqO%n_CjR>wI1M>pud-h9t_%$D`Ekd1< z)3X9oX<>yUSAKCyKV@VX(3;95W3MUXLLvEThARd+JNHB@w%)X_pY#|eI-eg`ZPi5y zWhpL74GvyBwgB0PPb8AtgGty*yvKm&bF&+i)}(WJN6ii@ryI@SROFtU`rF541awI3 z6g}#iXKh03_sjVcs>q_0X&~&JZA2MKI*pqQ}uKcgj3AP^1q!B_QH4yTyQSEnO2TE9g?w zsZ%0e)2N+ebHdl-Hr_m_-8)#J$Hef2UGw>bZ_Sv)`)^r>Y9ZOp(JW$+c}VC!2_0-2 zQxvu&#dLqEFKpOl5wUS5&@}!>T!}y)>+s6NRtRS^-)umeOC}07>J0yq^glscEx<#bV z=O##;X&dcqC=l9^J5s~3Rt^(prVtY*!PJrLj*|ND9=}Ox94Rb;1AO0XXd=cVd>a$3 z#b2^-cl^3bKkw<#gQv}Z_)++pX;;N10?ZyrWE|KVRfwy2ZQc6MJOqyFwV1o+X(^kj zh2I+)$W}pYP!6)J)*U)_=3PF1u(}`G*c{u}49_W#LDGXz&U?hp<>j++c8Cq{(GYus z+Me7S6{FxriaZ}nPMe^`nF+)6@++(u4YGl3@PX&m$s-7Z9T0|rc*(u{;-EOsSk0wpJKuv{9Mv7p z8xbOtR~VHW4IU2=z-T}NhvG+^7tQh^O00DvQ9A>5=x$ltWM^6$6>D#eA7DU^AVXqV zTSGbURQTMCVol>$M}$dc#GVo=z^Ct9`4*0h59b7m@yuCQAuZ_5ujZK4~mHuYr#L^E1MDm-xqnx)b3Cez~`R zm4xW5NHB|2G}iO*x&p(-$T=ug2B>+bwb5+88($3e!4v8Rb|(_Boy%@7OH zr4*uDvu&C-5TJOb)hAaKQ1)&NLc?pXG8{fxy6k&>J`YU=V2Wg(GIeuD8W#B%BT8vn zKTbsRVKfM9!S#HA4&N2TBmAk~a|C;nZt;m23HuahKAQoX&u8WLl$I=Ysqci9C4(p4 zIUON+X1>_ft4RhGVDj3$N9DD8or^u6d(e1Bno3?yZ-K`sun1E4PFfE?zAm)3+;~C$ z-w!?|L*2u-zLuGXto?Ad0d?L>8dnY z{Eg6NzwTDn?^&U-@^rG_qJ0^Vy z5=~Z`{eBa%PbPCvHLu&-N4kigz?q*UVLj)Y9??L0VQ6S`@Hy6=jaabvYzwwbQ5wm) zFO=(uG6fUHgY{(SQ8{USVvc#N@88amWowbjQ)Js_xwWXB5TU91jlT zJa--9D)aGAdf)yQSCSu)J3zl?yy`*;llashC&DzgSVP$Qn=Zf-emtkXNfT{|hh-rn zWCIcf9NaA0D(|=?7#@aQ3K`MmHf)Id?Mm(!fu9ckj3VZz=yipg5faQl(CIeuPZgQf zRQzO8e9|boO#QYoRA)e`<&_C;et4Ka{{?A^Z>)c9Gu~7dCBw?~87Ji^i}-%&DuAze zY3?(mr}}#$$=He`jEFx$wGNba@AJWz7xSEaSVT#%hq&ERhP8ht#su#{Wf zrrkixEw>Dh!1wZd8^ez&-A*o#zd~-m%s7zr$cUSzfL!2`s#ar8(ZU#(i@Gz!uprm2 zH0Nb?Vx9PHrt{&*UN$rEdRmQiW`GuakGV_&o1 z-i^0Z^Tgf5kJ_l}Zm||Yp}|I)<-qUO3>hn3DtKexLv&~D{@XB}-cX>rJ~CgL7-sQa zOAJ!<&^;BzM5`{#JrMk2L1MxH5h=EG|8Fe|0g&D8Lj0!y`{p5hmEOj+#sC z3ebVtYTqn3hi9)=AmeaSIE4)B(vo5Ht-feRxJiAqj?Z=g`!T65rnkR-g9?sqDF=OW z6iag6tqMn2q%qmf8lBn1*k8C{Qr>d!PTJmU89VDpP_&6KN{Zvq-M_ehmPGEQ2)z!M zp9`bShhT|(>3vVX87Fqof95OZkMyvv_4M?di5Y8@i8*pXNCrnCn)FByau{GabzwZC zvXGg_XGVa6LyC*klq>9Q7{rHTJywP1b<^HJ!`TD`nQc2lRH5CO@HONQ)5J4DS%M4{ z?BV7@*Q@%@Ms}qw)gqziJr8+lG)KXEN0)sv@mUQD8&S`45dd_%gWwya>@Si&E#;NU zWs|67LTT)E5J8Tp2H5hqhCU~50-`O{>m%>aqF^~NW51xG5+%4EpDChdKa?Jqi04ur%Na2ymIb6oBV)DkdG zQrV1*XX7xwsdSpVzxqdbUM(A?zZj2~0;(Tg(XeT$`qLpQ0v_Lks`U>{RH3Y)402$g zWPbRP^ocGCRF)v?O14({Mhw7^cB0vx;Y7m?$LX2O{;Dgkz$ADwt)4a)VSy4ronra( zY}&!)VWaO=nGc@21}UJwOGS{9xtVs9ym)8YJ$BtI77K1nXAlPEfbxkE>#%K@lNT$pl z^K1f?pB6(~5X&ZrS;gi06#jiahzQ8CdslBeWhuK z1m4*+ca{EqvfAlKm@burE?tRFkoIEEGg$|+gPe(MrxeNM$>e-9Quz{C?y4|DH=?^N zAjdaUR*Cmv)w@!gu^WALElva`&*xl;Q??0bTq=?pXUps1N11XKdjs%kH0$6|&+}`i z-BX9&>;_yWK8>C?O0O`}driCiJXL1Cpntp;z)dsdoi%zRQvdR)?*GdsGElU=U_lDw zR_5=HaGz6?KVwn!K5!tL^lKFH2#9d@hO5d+*^!kxa$^S*iD#}^sQv^S@GB4#`!K#p41oKzoPAtu2iVLmy4c-ts21b2P@Yep{eh;Z;q4!yQR0xlmn|!#BiVkig7zgMq+f0!%7?pY1TBb z#pd5wYwgo8P$}r~u%^7?efeA3^Y);uRCNulr|=!rIwRL4;7kb-7UO{WHKpWzwc60( zk~j4jv{X-$@IaeC$~TOBybzoe;s=wuGqJm!`faH39zETu;V%Z0OX(o@!%ycYWZJ0`Z{B|_@?3XVz@g2+VwYcYoZe~9 z-HIXm>bAqheE+-gPj!`v9UizOgVHu>w<$d>_}J{$RGkP_demj2{@K^%Fq0_RBH(?q z03I?;yyI9?2b%T|FiN3VC)V1aZhzB(K(RDV@kp9n1R3;P7pw^4&9?Fba6+Idhe`}D z;z=Dy)>t4^Q|E|*xj!<6&$U)h4}BE4-8G|D2A40}tVhrohDb#J zH!*g7X+ErUj8!Z!vvvbL>~HKC^AzASLC3gBrdVZ@b({;X zB8UPRo^77k>7p%ha0jxwTMY`n)~(hn(o<1G(cJ9!rBMDq>{Af4s37keHKyRopQA|(Xx^B}Xd{~VRz9^dSx}H!tWfH{sAFeggMSi`H8F2J zDo{3nqLn$*|BhnOFavU7pB_0T|A?3Evd4?4_&R}Fpb`>0?kp;pVB0nP~e zx=H`pz2G*L{pb5^72QcX)TiPw*2L(DhEjOzEISEtu)uhOwVARVc_23uDU2wd!qyoA z6B5s1*D9RSP1$L$hLT2Ju462pS^VjZR@}|o5@Y+`IpLgES(-t`vl<9`*{0W_3-`V0 zl{pha>?DE&@dXpQP{hLFdZn3<%Sx~s$fosuuNe+nm$|oR#pcpTV9)Jd2|1>O;RzTZ zVbQpO<=FNhBSiwP`K1Y#R>;>s32U|&Nws0AtUJ9_yCTauCgZD>JA+hsDsss&tAM%Z&F^ z`er*|8>u2t%kQNFPGtQ;kqQ|e>#!}Z=jh`aJhUHEi^>1=ElUiBqV2o^Z!-JYQDw>4 z-zAS5e;*B&rySK#b{VN|8|AY!Tu6RBNAw|HG5c3xA+`t#-qcWDW)XZTtQzY9>|XQ!(4R#$u-Bkx2)SVFifC)RjY2t zFFEN0ttI!CW{D){t)5s6e!$&w5%1LG)I`sEqb8)YB*~H#PO{a?QU@zAqn{$#D{sIn#CJ&$CbEm`~S;94!Ci)R93G{%TQCbe-rZllfPHnoSk< zR+dux*C^fJFT#zp2KABX`&ZVr@BI`YWRF3!vn?2@%;Y7$$lM_V34b*{xeQ1Ih3GHT)B9(+ND);5GJPjP>>;8XArqxg; zj&%VsY020(VGccX@`;gttmfZe2udy)KEvb(SbLf0QKent6oxIDA|%TpIj!Np${h~* zpbuo?+4inSGX(D4NE;+9vmB3L>H!>A0@5xbwGtG9UY9K*UNLKZ_jU_=#eTuKjZowZ z-W48v@)|n*ES+o)k`3cMCZXf09w{}c-;(u%y+DHZ!2=dB3)PHQi|9yp-P-m7Ax>#h zLbh3N9(So1;yqtPQ)g*C5RE84^;-o_tdo@bF;5>&yDs^8?i%<1i1(w1t*?G2)K7Uh zEZAM^S+Z2ePnc`{dN(~Ff?C#}1@C`|fZn*4g0uCLOGYN_q`1NBUu;|nn`H#wBFgBd z)!o^@Axja9arhOAdo&~`zb$N&Fg$6rb6SdcLii$g&m#agK*+z)y46F1(O0 zJ(bEI(D8}~IV%rupZwJaDUQ60Rdw0(02pSIp#@xSe1k*H`I*2Cgkfno9rSp5v$EIr zD_-sBaHXtTA}+J)xR^XB^xToz#bczpg6~r;Kux6}QK>&?_$~mxO-Dus&OeWC(}a%OBDo-a!WPFkwnBYn>kLfnP*} z!K3>Dm$>=C{)8`zbGb!r$-WOES)U)JybWL1$2aNS4s)TwHxyq^(T@8RQ}h2{C_iy! zqL)a87ZSLY`JRBooxM964YZvqH@m7A!b1DKo1&Ogt(-Ih;u~!6m~$g0Y2-Z)f)mXm z(e5!H!u7(aYyE#sVM{RHM^@dcIw7srXNR7Ghz%}%Y>HC-tPQsVdm1+O2e|7|fryNd z&GOJsXi*Wi5>ZvVx|Lnb>O!dijFQw~0EU6KF-sNgzyfDT zl}YCS8*vi5GmQ!w^7&E?%VC}a z@j}}<%CD082EnziPXV)Up0U6c^*4VGlP#?n_l9PXoTL>wCrJ0)) z&{4_M4HaS3*zZqj7Dqv! zP>WkH|envr# zpp<#mC=74VToAw{uHV@&0u#jRodagz)LHi8%uT#Y;ArfBzIVZ}i1Tf1Z%Fuer zRQsUX6Q)P`+9v8r&>sSPU11ULVpLz3@NOTKLicTZqBbHTnsY6Ek}j?z&-t=3gSGF> z!r%eZZsijIYxSnv4L^PcL}DED-G;JXPe5vaU5I>>>LRJAhIRRz!{%y=&#_#;calKZ zF;I+`wijkFj#vW{O-;ENOYdX~&-@p%gk$3RnMHBQ)?3J;dDaoi0dP z#T)i&=Wt!C|JQl!6UJNt>=6HC&lLme!>gv`9G`BZo*Y_DR1z()K z<-GPL;J+ruIlw_^{z6(*CdOhd(+(UTee3$(y!BIr>l>nd=qjs3GxOaiVl=$6@(}Zh zt-oJ~#9?8&^}q!{|3Qa*b~zFF$nl`kYMK%ELThQDO#mo0A7rE{&CSuZV@&iFh5e$h zx$7EiT+$Um%VeEfOd0y!{28`sGO5$vFYH&-oBl-_x~N7PQnZ8f5z?C++Rcamsyg8-hq^ zS78VK?T|d=jy4)Y?ct3Vw>mw|h&xW0`g*z~1HpZ$4q;hOSY&ze*0EmqQ& zxqa^s-xQu?s6i0^y8uKMrAVFSdkc{{Z`T)j$4ZnlJYoyNjM9fOu-n_D~&GZ}F~E11ux1$DXD500jDx8-OpeXW!ldMHl zmj>%vXo^~gSuiJ7arBf;&eZ2_Yq{_6)-i~l_LdSh=2u!X3=EG7cNX;_eoDy|qY$?* z$z2!7N3Wr)%!8X$X~{Vdrx2iC!53?+CQ;Q%J*I2)2?v2-1^Xf^q(ZoU|9{tHKG70~ z$lD>te7b1xVdE95ZoVqfe=pi&Ec|mij2<8;)O~oabpw|e2q;D>?)i^vY}8brqL!2J zQ4HP>#-D_%VbMS38(l0mb7yVD)3$@FbIuWE#NZ)t#6hZ{9-H0D+`OB)9M=no7j?*I z{0pl@u(ULxFuMbF+7Rlxr>}v3q862O0IXp+QGW_+({cDA)q#e5+9f3C56u~B*(N;4 z|4vgYqI7AJmf$RXVsa})ko9=~es+EwbRouhK*@LfPmT189pxa6VqtZTBdI|)@l`II z*3{I9c^xaTW1svul`{rr#Yrfc`5gG%?d53>y%9AnHzXFXmys8v7g=o`FlbKBy#&YZ z1AR}dgIx}2?nW)t7xjfHCGz!FFxO6yO58ZaTx5|#*sZk%2ov47bh@u`)71t1)E&X8 z0zfHGh&J-&jBQuEju2dh$C(hOt&@v;T7Rvp$3x-6&0yUeg?>l~yvZ(D#Z8I>wT`|F z5zk{eU7x_wyqpF^755)yx8Pu;KG{5w@MDG&gRkBZv_x|Gt6*ys6^-sB6WJDg1RND5 z2WG{0{2GU_mLvZJHE{>$Ja%Zk?xy}uk6iGK$ApergEuBZUNta6n8D)N6#N}`^z|dM zKZJ8*ZpEWj*G~a*f`pythsfG42#Fn!PXgJG-ph{G6I^@0Ysveu!=oTCrVlh1q<`nOU)Rx+ zLjh7r-AN}p@MATf8Cn;Z#5pH@g=*Q$$^sY#^NTH(6K5#sePAt_WKv`{gZ!sKZi=1$ zMd74Nnuu1sniH7pga+&ZUG$#3ZLxNW<9$KCdUsqA>ZV&W<6pKfgR8V*X_i2z7mNi2 zCzf<9>q8_gM|cZoYVBz7A~9e@G5x+rT91AOI>ZD+n-`z1PQ(e=OB7s@6OYUN9_!GP zA^#UjxpS>P_~_MT_wrc#`+7@W{f4Kh@#tw{%lX6wa^0scLtIl%qYUGq8rL2%s)X^E zDA%NDP;6gfhd_xT{a7lEhNd;Er~H+$((LPH_(%zzA=l>o66)~mSWGBgOhjBve1 zgiVbrcY7Z@&(SI=uB=%w3Jw~m;;>Wn6xs)ELF8yl9m0;5vNm(4SO{Q_mggS(3hcWh=LCXTC**K1Spz>AZS<}&QVs-rS5IAfG~#yWgcz&KdnOMlQ@ zan-C#m@|lIL(Ql!eAaOy9aEa%=imph1h{WcDEM}E!XAH5eROQhlD*dOgX?d^s!N!B zoJeNS)vw>TE&cDReTjoDE4!c*=y@iu%lbVMvFX|#NUI$K=n8vz8z3+sPm{4Z6NPUW z&1R8qh-?(?*kDV#VY8H+Xq+XzqSz9yYak%fMzOE?7y7cB)BKMge=3din-ZU$7~Y^& zz2Dt@n%;&Fx2sHf@U;lMQ%O0^rtk>bikO|$mg=xHDq~!TcfeP0&T{^ZnXGJPqv&pR z8vxOWJLtuj5dpl1sj)QxZ;OprsJu;mtr8a+xTILUCQshXpQFcBL|i&=Iz zSsSCy+;w~Hwddh~ti#1C0b=S%;J)j!Ec6l1;?4JBfNy} z+n)lL;I4m<{P-IOe&!Eh6(5m0fO6NT!4sq$B^voXkeu?p|5E|6v};Vsv3zI^{$Dfa z_33d;zKn1V;9t984DVUA54uUBCQ}f{@#AitBrml6s9oY*TBJoX|ZTZ3wn|-erx#@Vo+2)ph=elm! zpRHcDtnAxu&o9e-mYK(Y1HH=PBhyUtCzgx_4oh&Ao{?z&vz1!jSDBX063l+N`Q`%BSI zd&w|H#+U%SF^euFNM4-3iW^oNQ5@O0)K{wTb5C6?OGw|9l`P;7;Q0OA;4*YJ(F5q6 zIHCknK!74EQuJf2#DP^Vp1@ezpw>28dWKPF9-Z$~R9Z@`4CpOsa=z7zwM&v*BUedJ z+jIyYtauLWoZf|%%HPQ~(Lqw;n^1*x+K}wjSOlie1Dj?rkl1qq5<4k{7z&;Dd9+xb z$;i6bISq4F&OBt3B_&j!-^>(LHzxzL+1mj?kAhBS6sn@*bQoRxFc9~R}mKOq*Pi$F`NN$OA_I->5i=BhfGFH8hb*`U35O9NW1HfLjw`Kll zo<)1Ueh>De*&m5r8gX;^an>OXlao^c^5TD#WDBodb}oWfdXo(RB!sYOhz|i;(s_*^ zir$(KH=L(nqLeE}$z@ZUUf{M8I64iLAXs=sOFG=nNj_yy%-wugTnZI3tpOQG3U-V; z@OHspAwI4f3(OTA9JSMRv8%bwEMHT*Sl?vuVzz1W z7EB+wh)&uR*iy}tOA}Mw;A-u-NPk=q{`jb#@a1fheG+6FL?3i&b*Cl6qZn~iZMTfi zAC>f{p(4=Nf>Ri0^drhg>)I0clHX}(1Vle zv4jq}y-_NH3G0akj{8?Y)I9YOx+dPIr`SXo5|En82J-dQxQII8>@MI$0@Y0km$9|Go&&I9+e6GS82vuFMe#oN}OH)lhw6f_U)OCsDPh?S++P2!_LgYQ- zY_4^$!F~rS+0d)M9rAIhP9>f_Tjl9FjQm8oqUe*va70HfBbVgyRRi%dt9&}jwFOQb z2&q(#2nciAVnK)V?0t^1j(hykw*C`4kc)v%Fg3H6#8=!dH5?G^bE;z8WiF0Gf|-z^PcIrI+A48VdiI^`O&u7TUX-K;Gm~>+_ggs8cwxgSBW$OH0QdM#Z@h zC(u*YZHn0AI1V(^ffL)MBLHHNoNbhF!ux?xE%0{X)@w$aP;%hfsJT`p^a+=qJs6*p z=Q)F16xi?i9tW5Fh(nx)ENW=!D<%Gn0x^#(At|S!S!2&Vt&;VPzeVPL#v_?}Q5^K3aE>wxMqIU`$4{H10_^hf35pn~H3pIvB(d-?nAY6t z6`CsrQ8B>nRwcb1{O*)7`F*y=7((<**O2zMw?JpQGIRL0q!JI8Xs5nHS{ zSZr(o%7rRzE>Af!azIBttfY${Il4!rh)Q{Hkkm0CyHrWwjQa1qudTU@&|3dd24S

DK~xf}uye2sHHMb4vI%L>#BEBs5H;AY%;R8eMNxyNeW9)2@}3mwv?^m3a(@#W zbOV{ncH(~4B)Gmc3YcPNx{I{r{ElI-~fwEdZs*J z15|Av8sGB$WSMc>-l%z49iOVkRr$^%yWwVRi=wm39sim$TV`Sio!oGp6uFY6u@6`9 zvYpY&uNhwsAk(u)orN;yutpcfrQZ)-%?3Ay)a)ibjcFMZ@}#pmcK&w z!PEYpe89*4#`aXa9>wdezri4{mWkfSzWm|JosL=FXsxABXkU0G)rDK2&>A{EF9&U6rbtLGT)?{&-oa1_g*X=?(IvmKd^DQ^0bD+{EBz}7`vNMbaVYtb%W z#$IEc02u~qb%9`rv3amTMn(Su=~`bZs-+VUutILmC^2ButrT@t=VVv81Z+>WeQOI9 z@H0uI-DnBKXeL_YbS@M7fMgkNqU}fz06(YOZ|LFyr2u2p6wb*6vqC5LgKf1CJ2{n? z-@C{2KYWuWDRyRSeVc(!g2VgXh5WcAJ_T4F{wvqgsFtR_rmf-WEI?!Ybah?m0 zY<1P|+HXJYSt$Qu3A-FNBFkr2Im?pWd0azdoj$dejOHuHu(c@eLrIk{jPHP{jlpZ# zpl_S68fxt!3y_oltLyi-tjExoOY#y;WO)=}(K7kOKLmAT9r+8IFoPW_vsALB!%*w83jR*G?8q7KF_ss?4t#t^YQ>F!vjQ|d@Hcy zUUN5qC}s4JioMWl#jH&VO-y&o8th0&zD;?b(@UdrneC(zEu3KOFqZ5qqtslS8yWY- zt>0pyP-}R*+R?7bO5{ND?Gx^!|Np3lNS z+hVhQ+p$mk%p^Um9#XU`k(Yrd{~OMFXbuX+r!%O9paI}WN*p9a!`)swi{hQ- z_3vT3NPZN`8f?G4Yo6>DF?O&$WShxN#yQ?)a~z^)n}U_N3Qta==k1L@uVWRywdZQ7 z5T>mT{)02c2kt37*I(JnuX2zx`;I4ThdiaYjHC@+B8MKbw*LlUMy3r}1;;;RmK?Bg zeuZ(y$~P0O&r_Z^&`A=O@TMP&#a*G7e&gUYT7Uf9f6iJnxxn8(&S0j`53bKVvDrK} zh%{&AN9ixF4;yin5q4bDt@x1xu*tYal_1TK3sT?`hWI#VHNowBnm8 z_H)NUIXJpYIO=j1ziFWjDlcq?0*Avt6~*dH*G|f>)7z(1{#(DMXJs z3G|%gcG>#n>(Lf}PSP5RHUt_H>)1H%63knGg5e!3R4<_H#7*nl4zTTAI?04Nc2)wCbCgd zW38jit ziKaFB<%bW0%w4Tu=53+lWyCt!(&5VTA1iKkyF3b()dhSx?QoAdS1gI+?$)_A9fEh0 zA8pIH)r-*NTG285fr0-JU(zVp>k3m$&lVT$$-By^RY9N9OtAsT+z&9C7`Goc_WFVJ zb19bGL(hZgaem`Oy(Uz2skY>6Nnts755akvo)e{YUHUZ#+OOkAsWtmo1$(HSF3h;*F-1}cB7fKevGN9wM zV0<6o;~k?t9BG|AOzfGDph*OcM+(#~k)%~*%2~M5%LzUTZlZ+G@K7>2%l@--JU{@w z^hM}te1i&cIDUyRSS0lnlDr34r-g>;nxbi;OhwK3xjVT-lZ;ne=yk2x*hiN6V`KFN zL=+H*9usv|sVB;47c&@ow4hMwZ<<*K7&f08?@;4tym$D+(+i!(p~}kcNun2n_t*Fm zZNxNE^VW~nOT2juj{27E5<|XEEy_E9V}_1BADVD*0jq{dmsWA}yE85)kKi&lU>)Q3 z6AnC4cNpIiSBH}SmE_%vo-r<3(;82cAWzzXm^=~gmf9fkb=me^Y@f2Zu`Bz4X|HuS zD{_UenZLlW8jK`lzVk{@!}sj}88lLIV>Mk*L*!b+K`6FrNU591vC$(EXkv-oDACsl z9n>{ZwIn84MBlP36HOL)3D@E>Nq%G}|%0?85 zA7XBTokSU+&_9-f&cBBXCUeo^dfo5wd$>Z3KUNxE&QreGuxxY>N2Kbhf) z=?S)1YQIJ}>D?6pFm@};+kMRpIIB{)>3=R{_ic1GYj+3m68mHrrq?Mf#f0r+ zqE-mn)t9ix*=R*dXC*JnM)|}Bh&2mOAE^avWk<(?PdoqB``unfX<8D4B*`GPSFe*z zYE?zukdqUcyzs-g)_XP7hH1xRYaKW=TFi9CX_7qYs0V7!SMb9LuUsKUZD8~?5JizlH zq1R8#yn=$aje!<Y-+&M55Usg0EfdvBAyKK$(% z$7x3-)aLL5O%bL%=@k(pd^wPC~? zRpy_KI(7+#oduZ0=|3O&S8hG!(vcU6UDmOU%n`*2r*b~5E_RP5be?v8o;a}mmOcwW z%Pcf-4s&IEjJpU`eDGtvmh^0y*Jz3PXSM)0%UFMP4`Zt#NN7U|Vcs|3l4PG^)8`qF zx1bP{i+c2!k@z%1S37r-F}3xPuZg7kb&OufOb7odf845KQw54=E_I(4vjC^bRu>9_ z^pkGqjLU3${08?-1Jb~>WrYSmOtlQT#ghQmExM^(Qrr8@IWbBS=AAM}s zh5yy#3|Eb&CZQDEYe&^g<~%Th>d^MAIP213lx*KR8E$@=DoUI zGyhkYqpy2VOJZXbNbLriF1L}YU7?x}!gSljW&%sf2eTj*&F@xh#%4ibDc*noh*abu z(eE7LDVZjBsoP1_X@RZ7AoZ_!1 zs8L&X5rHv}R)ncg?BQyKynQ&eS4huf2Rt*9KB#-7cGJGl;0kK%NBOu{abt{DKjGYR zT@E1j)F!X}mFQTwHRjY~kyWp9bs!^#yj^+(#;1ov*|EZ(KmOQ}82f$Y7EepUe1WzU z0Z+UR7QAmYUetm^^sJmppR^xX96G^pzUlQ@{-+631Z@Yf}>?)On#_yzoJQj25QgYSwB)k5Jb>d5ctmw$M z*&%Qseh4Mnn~w) z>gc$q{ED7`jQE7f)B@9o87+G*Dw%Lh12HX{D{;Q976)lkV*_+4nW69nh2}|C-14x9 zpd2`swvjAOf@{WZb3*?Bj5_06A~9rrpLx(UKiX>;tIv*D{1Z4w_-3=L+i-ER^+lQO z`4p?eUNP|Ac%8-C&mIr_2qZyDdk}WWbzjERnSR)OH?{O60|TeT5QZA16S^AzcK@0* zUum>6+wqu_{8rSs`0Qs`*T?jR=Y#p=lqVx%)qvK~JAEff;f2WC=lKp)Py+^Qu2sLY z%U=C4rY4HaE5{3Wq|T?qj>Aw={HxiP4FHK{!faCKyPPyxTaK=NnoBidIqLOSL!Q8 z!q_!7cCSs^Jh6c>Dc1Br%9a!ETY3H>_$U!-UuVachZb9_so#xiXS?v<#d1XG^Jc0& z3JB~w=Z|lf1GhixQvF}j9-mr)WJu5@UjC zQToXh2p+yaCHLE{i9UBzwfQx}B*3x*IOUe@Tvbm5pHCo>&zM20CM5-^puq?tI>BoB zJo;KR!eDi~6WX*Z^;~DS$mG$f|E2-VKVNN%%;=n7E&HtGdY2WQaQqFNk( z#-i-q`%eIKmfO@nVv{#mln~@$gVE82xs*<5mn~UA1H^gw!NE0`|s&bOqj~Ee4v{C_8$Wwf(mvxPZ+C}?FAf69n&%V|0{$#_OZ?Y(XBjsx3^Ub#t~e`(UFguF%@ zAvL9xv_6OPNUvF#!fP3R^ZL@stW9qXq;-faC|eC08Ol{9HQFSnqb*V$PTUf{mK|T7 z%8E~d7k$2dzb(KSQl04Nxox=mqN-Q#Y8h8YIrZgTk!EBf1gObvaY(6r1yI-j0M?f1 zG2O?=R7m6jrne$61if62Ef3Dhh|YK5ekD<%$3k8h%qC08+6qZH>bo zZVl9Y&+|oYzB61VT@`EZnVN1Yd{yGwOcV#avB3H12kuWdY#5r+vRw*okA*b0y> z6$~l!9yq&L+)_vcXI6LkTkD0t}37a1|QgWwXl0><%!6MUmKH(z4QBWiEYeR9-6e z*7%lIeG)3w6(y3m#ljcpV#;S!WR}iXl}ac?w1_v?=3?ZI z;{@iFg-z}PgyPS#>>>jGz!;A7{5^OA7AXQegy7k00=1MkJXS2Oi#f7>T?^lg6wDUY z=VdyW@)cQz^kXN&_9Ssh*AMFErq%#JO$bSd&S~any*~~Vn|OT7U@I5G+$JZ7-X#=* zs(z&^i{3qCDv3`2B(bE`&T3g`Q3!B!%9vtIKRwB~O1sFH9m^t3*#qM=FnIw2`}U)#B#gpQdMu)Tr?|BDVu7BWS1nsP zv5_y>5fANBYd+fIUMuGJS~G!BTDN~D2ZifsLczp{nkZUDJN542Is~%7_M!NV{|_dK z#rnBulBX80&?ir~vhl~FG^R1W%_pw-M77wE=sQysA>=NP)xH*ED)$v>dBYL%8mEV> zN{nGis(h`@V;?ub+ZY3E5DOZe?6ht!SLWc`A?*rl6ANK;-Is#U(SiLySMreZ7m)@&+Szpo2R+l;Za(_?MCvs^=2RL(BT+>Waq>npR$*;se zPN21dWN-$b^<*lb;t<^sYGqerVWLS#6gI_ zBk>&E=+*O4h^P7Qo5K22-g7Yd=Phpm}@H!A|XyN-48-&s+2&*PqIR+|1b zNP=7hw{YAqV!|murm6U>{l#aE#Xt6Z18-GwciuCGa4(U&eQ6{A74px#cJpX7NkXI4 zMsz$|Otx5Ye~4Q*`u-jKdORqve(cKRUAd3Z#_)0KpmdJP-ko>C4UO@{6 zE9w1Fy&gA)V_R+sMf(JVyy{dt2hB@J?2JZiUw|wQ!&}PcUCBWt`lM*~4b>X)!j9Gs zjPYC52m^k~;RTMd&yzHm(My2?zK{IBhk?^-HWze*^$(xwBmwTxP>tWj#TO-3_PwIg z*pr;KBAXw3V;=%FmzG3IcpUa;W!@Z(b4fuX^uHf*n)uao^~&<8+xY5`#sfrpS&v_@ zocr-0Tdw)7?9JM{hJ1j{+(M0!YFUKDf1PyeKk{6|HRU{I6G(!nfX+?7c;0kr4&fGn zr!Oq;2Q54tg_lqGG)0O<@4KI?CuwPdCzddY)_hklEsOU5;d9<@d0U7 z{Mu1{V|tIl#GJY}PfIh2#95%$u1!O<0zNV;FyGEGm9)@aBX%Hya@-a=BGg5~<{pBf6WW-iuxOdcv^>!8H=@2>YEd^>0r-6gt0 zYcjHj?&NBOZo@M!pq>AxcrVy!D$+!6=!lBKD5?NBfxxoeZpi9EPb80?2%{sNLiz$t zfsHjUf!-Pz+w0lG;qkD7K%HTG+ec4JLW)tu6iC~&|6Z|vZj8YZkL>SYJ!}ZvmU7^g zOI3B_Nk%#sY*#So9P*uFPLS|1h8yaL=0<9$yK(tjlKn&G^=fEz_5b1gE-OJq?^I(x zGdmHa87zNt!^JvHLK5cq!63vLw@4QM<-{vH?q>*GSG9}sv7Sg0e>qq({Fkm}z49G& z)&exGx+S5p|E{;!HrUvoW%5{ziBdtmU((CwVTYtp7*0xWX}J=V)&Nm%RaNj23i z80}xdNHL1pE!%$~w_uUM(m|k5!T_iXI60L6Yvu*e1zEJbolv)VRTwR{W(;$l(RexQ zqugf=oQywTto5V=8Izvlv)#=T zHv?%XhuRMjObJiXeB@U;n!Aha`=3^VDkK_Z*FMP2#=hNYR`~ONPXzZjny#w=z zsq0E0{jg+fd@4oP{ui!N_UU*24Gh;|$+@X!lcGP&bXl$CL1s9J+dUV_hI@w%G&Y}- zVzx6V8yb8_I(*9Go>BpaOjm-X#Q9$0JvwP#KqJt8GCj8u^$tpW6l6&{RYIa&*4-IR zd`2Bh_X6}PfN32vLn01m9?sj`aDQCdh8 zW^#CILvAj{l8=8IAkAq*HbO&n=+(N3h8!xO`A)>^xb9eK_9?ny>2LZz(b(K_J^F_4d#AnA0hFTUuG8<-e({YWIWth z^#MM$hnePl1|bavQJ=T<`=o37^m!QiI)&<=a75$_aoQ|VAbb$~E4!FfJ9Tg!V^@I3 zse1*=Q|!*~-v0;A=*+}}1cG*#kxnJyweOYEr6R~l10T~XRx4B+m-CTm{#=T@fFsMuZi)BbXKl!nS)(N>^im*%3y8)9w2pFmKY`WLJJ zaV=6MSpNH~VyVYaT2>siC}A1{VI8iOdHF*VWTh47$%_|S+D3MTh}N;&k?qFP$SoF2 zmjq+Tud$71EyrA`nB(j#of{!%;NUO(BD<7CvvRdgVoOq>OF-g2_SW)JhlTZ&4h!L1 z=uiDa(@fgRRts@OFxblkSFCqy>Fs`P^zD5OdsxEq(~5xpx~i(}t&k+~xR4eI@Ajf> z!F!iwtGr12MHTD#|C&wpZ2IJ(;nVb=rrS)41HQo@3}DCDtRh9=GF{E0Y6Bdsm6rH{ zg&y**>vG=^K$lCmmu>X z1f~0c!CC85<@zO~)r^`Zoy{PT5Nxlx!$s~T^(mHHyZM^`xyoajtsakUQ~1##Tsg2n zO7G#1!j|d1(s&#xHUO{!kUcEbJH3Ix(pKXr8S4Hf9XQn~wWIQY^*~^}DI2K8cD&8N zU{ZlYls>Y`Iv&WwDcyO=(MZz(BotAz><9(c#)SLOX8&y?$YvLOb?|0(;7om67nhPf z4HZ`9^|FJvDx*!#)4(>6 zfH*JO(*5??oCL#n8GoEkTa44tSk8(X$uHyZs$bl3X)c>v)e5Ml^g6pkceEU;zP%|B z>Vyn3t=PwWR}h(KYd$|T4y8*5V9Rb3LcX8oJrtVeB|12#*U-CPl0&Tu@q;!ntw4t3 z>Lq@vs2ft}NG##g{@~qmz3B6hZSO zq?&iD&=Oo+L=Qz14Vb#&CC^9VzDt@PQ7lyo9G>d(BUG^3YFT(C129k?WEv{AXAT8a z;U*T&%r$z}#CS!f=$rth>Z)S54iVYyg=B+X?=U@_d@Mz&pxqC5iY!ycBb$MJ1SR|# zs)v0(vfle=x;g%Eg4y05RW936-yAlHWXb-k7Q2o7E4&E6vkHI~guM$9an$FovIhh}*W}%j%nZ{J)1G1Ig zx~sEoL7F!ItuvlfNQp*AwNh08@N z59n%}(x<|}ct+%Ygg_K{78-25?yuzN-P!cCM_}t*8>t;7ypiKRVSXd4hQ(z&42GL! zgSOu+%$a9(zdLwSgXKM6yk_VnH{Fk5b{149!6mc-RvLqtzI@sEdG6dyW{R2zD9IRbS8~OjSULX(C>G<I9EQr>=tQ zuxOz>&WUPWw)05gry~l1M*lEvOn|Odb^uw#OW|XV_^Ip`8|v2s*q|=kQN(eM;V-9# zH_7Fa*8{JT$-ZK1t{J3F={r)8nC3b8nVa)!DHHAf5f7uHfe=|kD~hs@&l9Hp?awP# zC^=EfTYI9_)u|oM#oGUT0h1EEdkLNRvzENsZB6)E!v#Z^SWIOw?TNzs^`y$#gl?D#;;hpvPFlU2fR%jF zDg);X{!iP*l|d_5$*&@8xXtlh3<2urZw^OCP$e2gL_JCx*z#dbJi$#4)n_a?_MQ&F zle{JzYJ;OQsTON{^DNyL;r}H^gRx^axuJZKfjHp&lbV5k=gh5YoJMvE*ce?@0{D# z-3T3VN5sz~Xx^FbN_qD=+gO@dIuHY|W;UQ)?>+Oh4kfiMMeD%WrLHOEQmFaL@&dK_ z{2$k1CL2bSGE`yme}=68iXbRrnK6U`NeiB^3uVrWe(L<~BI!{^`dA?|enBrqB`y*b z)#b}@_?3bs9Z_IY*On>bum6R&m5iYr+)l9)6OJ>yiy$36Q>BH4l#t@Q-cHyXl2Vj-|nB+5uFQmheWEn4kbnt99bcw`4s@?lO(llAaVwOl0kST2)fpyz>=@B zO(_%GTSxVcV~B^)#rpNs>MP+Y@Ez)caEU3t;D};opm=Vq=!IF&z#Aa)2=zfOd$d^Y zEO^D8$+f@MW4#j%_bO@cC8&VB<$X=FemsVF(iSzaGlRd(eAd(Z0yNrU7i6r#MDiu4 zGqj2)u52@GnBNOHO0_#k?9xmU;W(p@K|kppX*M4YL+#14mz0+N0fq0{2ShfGBsUBIA<+#czSR%Hqv;ht;r+EW~>0+@O{A4AA;> z@ZMp?M*_yUIM3HEZ|w*99me6t$KNrg{tOo!qRBmiUR?#S73E=7lju9e;R zkh;eFm)tyVRns1#j;E5rY#+k9C{UDEe$HM&C&5(4El;C%zm~k7$sT{LqwjWd;5bV7 zv)9Z7L6whXz$HCg>wg$)y&BC3MZp{yRoIUy>V`Msj`3naErU4Dq)dPob-I+9x& zjHfL*x1WcqA8pnqMEuS-)ZJMlnt&UUC27Y#BVPW(_C*9$2}C7#*jVH|wLjFcoBDhf z&V3m9L`;D#oQvEv{NDecH%4RWUF_KuNn3u8Bpe~0bM9^mi&|d=2Lp&8JMY9SeaGD) z-ZUNlFm?&YQ;yL&Q{t~$>^2(;DzoGEifZnq!YYw04-awft;~~@36UuVK2y$huxAy? zanbINGRggzZw>6fdH}F&d5Y^7S2m!_Bx87Gk@F}ZKY0jre{7Qc+OBp^{jZJ<7jip1 zO0+`+zdMc$d5S5F1c?}hIXXZ+8k;MU-D;o!e+J#fziaEbn1PzhD8+Iat3ymdS2$f3 zwHRmCNEAKC3c$k%+-rMob)7zf%faMMVg=zC&1Zdq{NdN!g=5+#wmKHatq*IU$695g z13ATJlUQ{vmYjVtoOp*ee!?K>vG*cbRML)H*;W3{dee(X$`>;m&!Dhq$z9}Y>i?Jj zIzj{hI^<={_CAS>>g8M;m}`@pE4yx@CbAxcPt-xfU{7ESpaUl(D>X)rexyseaxi;z z46d5oWWKC``U@t8D|99gjU+3e{27nbdUT5oPZH3I5IXO9Y(7^aLkM&w zlWc!sV`wy%nbvvto37vYzRZL+1{)Nz$Rz} zt>4}ih$^hdMHGuFQAn(taUapd53tWg!+o5}#axtd`q&Z%cmG|)Yt=fwfz>5x8&O;O zDFp>$DODzOeL0Uykc@0X3;uo?)x~9~VB>paY;whV;2u@{%A(b^a-Js=(qs1^){UJ=S(rDCbTWCa)B zdMamqQ#|M?6#n|27VXc%k`VQ3vrLRzt%fzqY<~VGYqKb&yV+`6>m;{Jzx6)!;8QCb z9@_Ae_5t@qCW4}r55{W7gJ-BYwh41a!Ge<9Drm;=v?Qp6APlp=Mv>8*ZJL8b{PIb1 z)RptPy!?Ulf&gBQ0E@R#Kf*_U!9zT}_-kb^B)*%&rJSLhoIP`pw8vApjP3wUK(fCz z=lSVCr?pli-rpa;hv#(Z6-VedvD@W?X!GkjLgbC}qwc$8{Sl0;OZY{g(m9;J87`mX zf*c$~;r7jVQT_O>)Dgmjo60X#08$CUZpOKZtl?7_Htya=Lq!DGE_vcu=zI}Hbj94? zJCm0oeK_M%}-@sy5@ zOQBPy1f-EiqyF`76jH6n6JG|YeqEieRVxxtzMws#@9cL0#7q^O zw!p=Rz%7d6BqL1Mlp;;BU%H=5k#Sq8qm?;qy&=(#18tyZP);-EFdf!2U(RFb_$OW1rJd2PC@(z%RSLPy>wQ2Zgp!iP6kQnRB> z1w)tBfm>VFg)m;fB|1(Teyv&e@@P!RV-CXkRy}4{jCCH*<@FXk%q(WZ!%P46%n{EK z#gK~Hl$OFjfS)W0s{HT|Q2UH^S6SDbZ@j^{9%JzAfu}Ma_+@?^eeC(4)@PBrw96)! zZ8*)n;(rH$y;4Dr7t^O>AxdOr`gllN0T>J-_Yr)#ORj*MfL6mln?E(^{RANaK!8|N zEL>c+|7tkAT{Tkjrk4F9OS#=PTQ$*#?6Z_yR>LDCu^s?hnRf7KEN#7t0TkvE5gG+$}05~N5;%tQZgLb_lqr#-pTwEuWT|~>` za*Yp6WuY?c!%z^8~zuEh>wM}0C6+EITaVoo??S= zL*V0jX3Bgy)Q&%gDO`k&0i~4oD??^MAE~Ij)10h#S_hWv^{+JlJZ(DJ37m|*=b~*1 z@SB}B3|srY!u2;>*hRSU%}={)&yiIz9$hoQ0>R%jTIy%N;gE688{TRd<8_*Q1&3ht z9KDel3h+oT@;wv)fYQMNRL=tJ#aGG}ct(5xFXAUs5B&0~wVD>*_iHu2obr~2hD?xh zCXNAG@)1aZKvAWgjDvXs*dfD&A`9@tCB=%5^+jiaD|YdZNX;=lK{2~Rgs7ZmOlr2b z*?F?IaSJ8Uiu_$Z+2Vlf--7&PEl;YO{PS5&mkM+?wu%^BmGl&g6{9IjzdE=gE*WTC z4I{@B#>%qgAwRP3t*C|q$?qXyi&69tEx&?#=tbPgPJjh{D_2 z60zmb&0qDXR4fE#WZQ5EQ7G$#!h7;(6OpY+LAU@ zLNgVUO_vx85bOw``u;}*D15-65&N<%63D_*%ipy{t0;)SBE;qv=pp(uFS`dEvGZp) z5fahSn2DWh+W__{Z~o{4EipskzeSE~3H1r0{+!muf8hWjpkK)BQ>PxqYdrBiyc76W zp1|(kQ%AKP;m>6rVeR7B1xXtA=aAzZs0km|hdpO-YCbDyOK#PZ{FZ`C+yuA$zSA}Z z1H8d$Ei+Z)y)HJnVhh|U3_YIH>7-HzQ0`rI4n}}j05n33BtmuWf)>?}^@&iPs{a_T z=-B9UjV^MIiU~p&_r=sa$f?tF>eCV=QBSM#@R~x;&X*PFj&5be%>Z2tr~-1ONy4ZM z#3vb6PA^uhNH8tget*9-_I4HxWzIg&QF6~(=fEwWsrY(B_cGsf`SjFas};a0@hQ0q z4_Ot5Rl9j+O_VZp5Y}{%L2xPAa=Psf&;o)rC|}74_8@p23qj0Zh08SgwB7zJ&ZXmC zUX?6o7C9ALLHQF?(nXr$Ea5x*S0LSdFVVRE#~EfPJc9OGgd#^BpdIRzk0JTRk4re-`-*! zUU;gV#MAhMGB)amO{MbswrZdkbE)waPB2=dnP&=g$*t7Py*AMk0>usdpFs(@uNre{ zI^SbZOh6Z{J+*=}hBmQ>oqT|MV~cWvhugaPN_Bjs$&f(k(V9`}JsdBcQCN6In9P`M zK!caBeaT*I8QpJJZ;H(>+^&aK4{RkH*$-pcWbReDEMxut-*zdrm z+b&jg>7krGF}QW;P8b=0; ze+_8c-q~iq*ScaLC&b)aS&0({%*Y+*WUdqeXnZ-c?1UpKAtQ&#tXt9pJ!U#ExC+2W zSM{cafgQIaBrR=v&ZDUpGp!Oq{YCEuyli^h=50u!0N*Q*gA}0LIf+Q4HN%O`98!g8 z?djrM*R15b8)T$}nZNCYa3M-vl~;&SJZNCYRO~gMCz~w9!VRwC8ul>CfG$pu*_Hr( z7M2-fT$2yNG~hVTQk@7BAg&cu1iF`7muc>e_{vCbC7*sJBJkh^q+XoZH@@UitGwaA zde2*1)^`mj6(5&IvILFp{U8@BNNU&w6JDQ759NFqT^cv#0+4#H__r#dB7on6S4mzYGaGuH>R z+^~A-dzTYLT{~0GI9GP2ZRZ7K^YUnA9LOvL7L%=#9`((1%w4u;>?2_-f_7E4~=;ov_N)RBS=j-K(Ma zZ2fC?101Y;S%u1d1tL;B{p8=E#sb|XDH1=nVu2`l*iJFgQ$#QGMGXZVm?(z+$9VB3 zTzkQWH<43`Ah1D83w(k?KOC>v&?{8ew!-#N!WKf25c?QpA^SnF1ebpcuKgUhXo*>T z3U*d;ET}^F?&)T>7V?MKPbG(}^=5QnktmAO98E73mim{kPpVm=3q6fD6XDMCfK zpzjJs)L?!N05Crh^O_t^__)u)dEhV}p2!jUGsAnd6^tClk0$+&cW-<5L0v;M){!yR zIZ4xgpAw{r?32EZZT@sMG=}xWxSCakIdV9f1B$4UCrHQ9FP*UFDe1-VH;iy`nKIl| zTm1G2`lqk8kIrR?&D}kSOUGG`GO<~#r1OO*9ckoBvQ>IIz41qM*of!%iwcdL`-RZ5 zQ97|#dn{T(#5PdILj2T7&~HivwQUVTG%4@=;k1CN6A(z(w8Im(z;9J8rUk7W&L}sT zI^-Xu5tBaEjJBE#ai)sDo@+Cw@B%t-vP{4PW4#i-Kkz*(k%c6dD_t_8O#OjlZqyKC zB_?M71dm{+)xYtbu;^+!DW)xOE>4xnGldRR!LrWnd++3~&|Hr8Ocz6Cuz&%c{Ce&< z2sb=Gs}L;E$?>wl94H~)>+sr7Xx_OVm`aL3wCVKr`i2b*j1FxojS57{TwmEYM~mz- z(I>-Z%4oz&+^}niiZ)S<*M*lwZaLP*Gu9hbg>#OA5olKL!^i>js{Gf^%*XZjc)08} zzZtjT2OUisCyTZ4E5fkkyS$;%GGG|uPbU_j5IMQx&8Tf&+5wNhMmH@#ci*L!>=3#N zxRX4ygUYtUy8fe5Obc76?qHzI{OM`FJH2BSlhYK>ypCrtnlq$u4?UGGE?BH3m|*n^{mcbpg)Tq)bDG=f>-e*e zL&ffi)V4n^5a80%+os2Ta(Dl&`ki!!SNNNM;~0s2CYYtRa$F-*gru=vy7+K45ZT(0 zLlquZ5U^Y3c)KZas5k6ks(TX2Z)>J@<0Q*CWCH~AFN~9B`o>_`@h3(xvm*xwUi{;PygB$ThKnI?s*cmxXm?%%hD%Z?1aRP}fnL zmHrPL+M_OGn4bm?bdNh7D6R<*?v_ayhPElU$=jwh86(L$2+ zt4OMa9w{Wrzw1|lKI=I4q9!wqFJNSv=Cr(>2XKWFGWMg+El^XE2G~?8gNsri>SABY z@MEW^haW&ghys$z@_mz!sg!sO68qM1bqZo0b6&P=uHx{vWrSA0vE0{#A72G1Vg3G( zVr(~zSUDmC-0;p|4pPa*pqxol%_@$mQ3LIkoPZW9kQeejmZtT7TFoyuHPtKXSx8{% z2~`FizE2cEe(xt*5;?k(&nE>SxC}CZl3Hm6ii|5dq#tb}0bdWDaVB?MRb|lY{|H}j zlv)9r+=|ur4p_5Bn9^1jI#L;-xmq%l?zafJTTc&-yO%mHw@MYpWI9 zJ0(1bkl{T!W&I-e3Yum?X>6cpGKlUe|XaOCg@Y8)( zl5`18|G+7J{@l<rZUUeAP{n|U_BBKsr&%= zZGBapV4dVk=+o3~_%7tWzkuQ-oB=ejDCMV+sMQLCvu za3Wo4SPL;d`|GXnyL%WcbqEUzJPvemUKk0OOc7$>>@YKnXN0cnlw$zZmM)u`1Uhhk zE-W%Zm%@mepY__7i>MRMmqYG<;=HcR^-9j)) z7I|0LB^^sSi7&dQGR&(z;Z}e=@&PUJg(s9*r`q5ZO_4plvz-YE$pg^7AR7NRd0#^rHjs|_XC#Au)l=$p2r1)Hgaj)SoEEcau!*p^WU ztAZTnn~BK(oN^80mnHJ1Ng)s)L>py`ICVFmpi%~#Gi~-_a`zCcoYErFqKR)dsFmX5 zY9VeC0z&Sks}h#5fzLL?r0`*p8^C%O$#?fJespJ#KeC{xRF+6FF-J(%N@@@ga1Zq) z+ghu-(VI8_TibNFIUwC8qnc#7yX6B{g8ChN|M?QT46~_5-X*5Y1g~UbitHw zj~g(4a8v!~XP|AT{VbJ7@)g2wvyh;70RmWu;NGF zaQMIfn&tCr+9E5y>2W8193=VTAQ7-|N8*$D*i8FN7iy*%f?+TCF!(%8(PZ(mjF+(% zy?uHJ4M!?%wP9~)-MUpTGsM{j+j^oKf+1?Oq>WJkh7(`{0$<2_X1v5hGeXUDpwCWW z)OJC?4yF5}H1k|uM!XdbUObi`hc;$+*+$9eV%4>I7jdszQO>i{dJH&9!HgU^Z(Ph$ zmYRK*M7*AC>^YbyIjMO5a4VFL;;-1(~~R0 zP_*1d@r@lJfW+Wj`myy*dC{~|OwHp(2a3;Xir}uTQuOh7<*ew0g^Z3SoWM2lHVUi( zRK1ssCGW8us;H?%sU{z}h?5oh*2P}8< z#}7moIQF%f_@`@~F@y`1hEzW_02d61e7NtNI83t8UmIHxKIV@0U_p zATV)TOsWucnS{dy`bJa`e}Y2D%QPT`6R6n4n)79HNNXHIGtsUr{o$UIwf~J%fJp~h zX_!0N>?d~DzGcZV zgSg30?F8Mpbu5el@J6yLDwB~*vklm}OTQr3Q8J)1B+?wIGaWciQaN%At%&h4BfH-K z(uZt27b)mWcDL17lx1B0(O*6Xoe0ysShhqDZ*&elP$XqoLDUm){V5nhRU|1W%k3wm zFR0We$Sp+{O&aRWwtRQp+*sQJJCJ+o3uD~dctOL$J}2nT5=$L59kOb@ZS~|tV%TS5 zKD*>WKwE~iJr0r6AzBRP8)=MAQm=mN4ED}$9+$R?q@RT{R+xR$iTg#N=hGeR2p6o& z>T`{|0wDY0XXw^l)NgF8THdD|OX7U?JHBh@u89zAm7|KNA#>F8|`Yma^$(EjL@=KmfPrTTN8CIcH8}l61ycHSL|`JCiNnQRuYz&#i-J#G8PJO$iRQz4_2 zb;7G#$}ocf)w`=CUF=ad>xT=t_Gjj367&)(cX8Og_Gf1-^WL9Ht&N5b4+d#CeIl!( zhw9BY?-^l&k}@_2gWHL8AQQ>^wVKR5M{$@Q`nf7eY)Ok}fkCOPHMc0Jw$6O%3;Ps> z=9Pyoy4c*o|If#tGOomiNdZ_z@I+}hixx9oFKWh#^ZdEoGfR^Mr8 z>1McizXhSw#o})+)B>;N3rVSQ34Bna{P@6EStq``B`34NpCmnx$pE5BpyJ--n1yXD z9E6oV_!Zug_iQZMl+vzVFyzbR4k)>L{n zM1^uEk>ajels69$Ye2erjiGZN`GFhi;h!DiHVEU+9!s;de8hhAj=YlAq2SkyjHD+O zjf;fwF7gM*>ebU^1nP;W%l3Gca2+_Pv$8|M(sp}3X(H*KwZtbv2b%8L(!M)0cG7a$ zjd6L+w17`D%b~~BYtz1+I4w+dOp>5wSn1rD5ym4T#=Lh4HA!kTzY#XIyG&E|&J2@K zt()bIBG17<+uEMP7kEYmFd>(Xxg%f{$d@_6ON3fMQ5^A?yn;;NKD!JPS#%QLOg|(2 zWeX@~suYW`sBDXdp$NzS5@TxpCHoR2K)h|a7IMibjhq9a8Z<||aaw8+p3BoTO0!HS zeDiH#5(0LDz{6U;L}t%U=J%04ImVG|r|YI@-`CV1xWE1_m6d8`hvz_nEJhX3j^}2! z4yt^v1hXQ3GBVGo`6bKjqHO~Zz3RzVuHE4heqC!s1MMut z2jKg?CJB)_m372oi;nqg{^;wF`?71t!juJoXdWaf%$mPa~31r`&m4sW;N|YsM zSP~3Hh>Lurcc$O)yNQaa2cP0mUQN3v|%r z0MT)RB6fDSBzH;Q(H9MdIT~FkX3-8Fb?&J{PIWhB7Xl)4_ckrNidMMy0a)c7jzX8Z zstGw9q^*t8Tl6S6afngg~+ z{mjG5qLasH4T8n_NEW~;Khn99hI$;CE@|v~8)syd8%?Y-JcoSyD?30z4%@wu7Gk)B zKTKasf5@-sEspV^o4>^}zKSZ7sgrHy^%h>aiw(ft1xKIG?OGj4chEoTt$tX%Q<&T< zunbd~Il;ajJ(=3SRO*P&p|$AlF~3-8+-;bEBSw(2C| zel-J~xg|hX&DR8U7p;W?CUy zzplmx6SC)2_B(Is0I>bXTQs5*wB&#!H@I7A@{9vHbDE_ydDl(yo2$V8AQcqQwwaLw zmknRfgN8MIW}<8zy42b+i;19nO3sX>i~xbNAAYx^%&Ruqn_AYefE|W4@IsC->b-Bm z;{UT3@6DKp&~%f5&y)kba#qk8OrOrVJcr(d=~UbSaP-YqLgay9#$RkB4iE|_`!e;# z3JH{)+Yyt|>Zz1Swg*#YQo_x>mV^~tsAeFXv7FIct&6_DZ91RyQHHRnd3<53>#PN- z^x)oA0;>(X3|1OfT*VXoH(D#5nA3C-Z?ctT&1D@sCbz;gZ!y}8_)_A;iRT6Mh-u@k zgc3DV%Y&6xnR~w|pTiFu`ry^y^9*X2PViKCr@ z=)qf#0n~H9pl}L^hSi4g%0ZfB~bC zWaiCmC`Iq^>zVFPf3J8@wnZW{1p4#4lg%`!Z(cnca(35ekDx$2bMyJ5l@GAW+7h6h2J+PN#h?OuMPJ-V6R+fo*%*SQQe@?KgfQsARWA zP*rB&-CvOpk_)&|1Q>!%{3_7c(@Jj#>O!F#sfvi;x&1_J8Fh79<9bL&@Vw1pA=#d* zMh9Gzf(ylMD7S^zMs`(vlJW{-x7qfXkdtZzfgzy#E^Fp^BE)B9SGxaR5&a4ptk-{< zXy{lyGo+WrSTbMT^PUB)GtQ`lTkYk&^#C&X~W}t341yd!t&s{}vc>$glAnq1N3@jFaBk<5X0>KhWNq#c&4`N;gJp$RtqlGXz^jB$vV z)HR5}Q>`ewxYs{n-vtU5*L9hte4s9LhWc{@+3w;8u;|lXltTu=Pm-9 zS7KT&!b36&V!oa@5I@f}(9zLN#Q2QB(;IYgDzVhJ-@$gHKYfqBnnq@@DEr*`WToxG z=~o@}v_j9;8An9j2}NVf?@@^#07sSC_>eSQVmy6=;Av=KVdAlb{y9C>SntB@UB5RH z{vD8sjx3tgEH=bOJ+7aL-Y1me6v+DHXA%Zb93tCmkZfsikeO1P_%}=^$v}3z%ep4U z;UP@)pFX`)bIdn|X?7y4a7fE0+QI7IoelxyvVHiUg>F)ou6CJS;770PMJi6>%qTwM z8;HD98XO4g3`}+!A1iJ0(gg_-T}wey16O^IL69C7#&%wfeXeL@Tptr~1Mu;n?$-!Z z47drYhw7@UGl{m!|7zU^lZU*Q<1uYK2#Oq}9<895H4fgy0Y}MwwjTS8dcG>qe1~gD ztvKr9Xq8S^tu(Pstro~ZC>w~!h_BIrzgnKPINjCCF;4j!$Ij?`{#HCFkQHrPdhg2u zpuklHbN4^Q*h>rpCzLUqE$rU}0jcni4RjuB4&2jWLO{wDasEPY~{k-8@o_yp$ z3Y%c|Z>{=YT_aBz6(y?x0y6;^A;@OFIn(UPjzdh12b`M~;OI3aTtH-iu#zYrJ9@4a z*5h}$n&x)umN?nvGiP(T0vTm#J&?*4ZG0Y%k5}JW>bC_^QB(0t+?ZMe%Ep$A-FwRv zUei?j3byFBXu)`DZI(xtuuke4k=oow@_65{FWccor`HIs+TQ|7o#{~sdKl~U)^E#- z?fO(@bJQ@W8OVg*2%m#&0I=`r1kaeobP?vl9N^FriOYyZo!skjp^u*41*L#C4zU#; z`FrFh2KPCU0Ar*lHGJ#tsDyKMJ*mK?{~^usw|cuWOqNCp#d397R~$f5zIgmjO<}?{ zU_G>3@#PyKA^q6w01*v)*=K6}=fX;}4GeLc$`T6_GRFTTddnwvOqa zc#4(Oc?Q4d??>)<;g*kF9{?I}`ggu^zj)BP2}S|@l4%t)2rZgiw(}O$__35l>v*#t zv{jgO&@;(t7Ts^9nv-!=b_HQ;*f3njHwx@saaaeL5B|IkgWXKN%^p1e=FQ zq%|;2r&ijH%`rk;m?vopLBe=kFpSYpXN)pM;^-g`QL6-vNo3)b+?rYrYD!>T1RKhR z3e7m(b?dEba>9z>oBGe(I+f4{?6wdhhX9)WWCl@Ay3{VltaT;K-4Zaj|I<2`o0ckY z@~vwWGS53(TL7GYQd`=1K=dE%U72ppnH~;6+V`xFtc=2ev^N?Qt^okI2jkn{iAb18 zP%E57E9A%9N*)<;M4*Uj%@R!_CzLIHe5pu<`S#)TT7%Em`Ec@zBs~ zl%;q_IO;);cG^tG-^j@a2o!cE&o=t2kDh{m^Q)mE$Z2cIkZQ;tXT<7P63(UUZVa5L z9ntr%sOet#S_A?P0kvA_m?9u%yuUu*8KGRkPf2t(KS{H0Ab7~vgM`k<`jdVMHiPvP zf+GmIuC!K!g#=r-bS!&{_7TNIcgg`db7CdbAl}-zbWav@43RU-8p>#MYNar%k0&i58NM(x6-XQe(DtmU8As?;?CgNJ= zOwQ~S6lN$aOT%+T0+c3!qq_RDbB}<hQYxI``9FP=F$kM z9pLsOZbWeNr#?W4C6D={7!bm^%6%$Z<8QDe7x6%GBgu;BxX4tu#(- zw^y(SA*x?3>@IU%k%b_>F6Bo$h9pf>!mETiXI$=^!mjpTY)xPd=z`a*LY;EEhIP#E zH*2@4IXR;LC%e=&65E|*vIhgrn|5A{_F-|XA{;DGpQ2EA&*4lmjxK~?dsbsrOz$>{ zRN3%tjpqn`@A{9ZufTvr5-8S^we*egilCLQjhWJY%tT^Z3wE&Zb*Veg6 z%$vk_Ou9qRq{K$vF>uH+X7AA_^3UO4g|cH@RzIa@Ds0?Ij*684HGoQ{)@B7GqGa`l zK_{cvg4R*`{4}F=O>st1@prBoXp&z{RtMe|+!mJTWiC-oWr(limWZv34wCV=6_D!EHm0 zAajxQX>>7Fx!5wbE-{oM(n4&o;rXadu0Gt_A;afxIwh`FJ0{m@g2o%7Ht+V|-Ei(z z`bRlq)^3USlIhv>MKI0G({h&1 z6z~sjeVZ|!9oxnk1r?_946|7NW;U7QJV@miNkRjfe~b2mdJ3kuW?=<)>~K?yypE{Q z2gkB-B3~e<&-mOLO>MEt^JI2*xqA5FqiOSvii6N_(T=;meIM^&L-tjc!SHC*5FKjE z0azNrKH_pDpdW-u;hSqfR;kOyu}L#?nYI2*u!)LpCKt`?PUA^!N;+{dvbXPRoBzQq z1m5Ggy}$3yx^=tBqdXG~f~ZcYK1wMYS$yE7JVJ~*oa;r5P0cbs(aZH(+_kwK^L@`{?Z9K(SzCR9|WTF5PdL@1F3t z5uo()r^c&@JYYR{$j=PT&HeLEn2b&8o}&h9h(z3?Hj)DQGuXnc9Uw)Sj!1E6?;-0c zE|l}%W|YYIKJeYk-d@DwgJ&UI?_&mgEbL44{A6%cU!R)a5HmxLhVI{?tmLaRb^zed zSEpKkUh~Otq1BhVR;hPQzbCb2MgTflXWO=adcnB++NhVeX<}dmv?MP36&<%P=8DNZ z;Qe`m+OF&pX9@M%wJD8mHD_%|V6!X5?Li|6iIoD%jx^+Br+!cK`Jutp9|9$~U2;4` za+T%WjAazoIV5E8bp)3qt?w0;$r0I8qa}fxj6!XWN6u}EXW@?XRW}E)7A2~#ouF9R z=@M5u}2kBn})C_u)jP#N=o7cL=+vKyK zDqjqP2H^)987r?q^@D*N1oMf%%i{jd(Y`{k_Ib+Ic9ek*;m+9ZMz~1zq}=3QQQ|&6 z*_m8ZtFST%Ax1^9$F5bt3)b_Aglfzm&%TI}Z`ot_+{kD{GA?ug>}BFV_F?bQ_AH=$ zt2&P3=LlJMtFcS|;Nd&#$BskBJi#hXbuK!{L$(cY9Yv)r+&(clA8e zcMbZzl)r0fZjq~4x(46e4A@K5-J(PDx*--2RB=z__THar+whSBj3L{D`MFNkZr#T_ zRgP&X3BC|X%rygvk-sg|SU`r)j@Lt0pol^e%)Y;KayhK&O$;;byrs>;+@{tg-};Q8 zaBEtvH8a5#cU@|fvbo;KpYTVc#GR!(N&-saH(xJ^{J6iHVsji zs0Eq#gRiQ!5riCpKrHpg+@_cMmNa)ajUzT*U}bEye6F3;R}A_2Stz0Jf|srLxhK#k zN^ZaLm2XV)LhWq%b>Oj}ix_D7U*=Lyy9~K5D6^cB19bgwwUD>A@E(T_Ba8QVtDIv4 z!RigEJeB$vV>hsEoRz=5@WX<})%yCeQ>||=_mC%cRGiH(2txL4FEHhqA)VN5&2x@n zx0QV`bbir9Vw@0ocT)8iU)kudi>s_V8ej!)W@(g-aLWr+@UFm6k^+)ISOqelBNlrx%q$Db$x%O?O^+LLu!VDT5jJIaBD=A#aNe%8H$c zvlVkH9;S%0WV`c=6BBQwqNScv4zN>X$)9eI{!SP}7MAWESDv9C1(>jaYSe#usK(!xVbfWtTPd9h z2}mBvayy025AW+~`Lr`rZ!q5R?z>;Qv&1KUJHOb2KvoF2!zFx!>~K~EF1J9Z+l&S0 z#zeAwldBYfbJH<$hmC4K|FZppO!oY_JSmNh2Swkc<1@2teoEzdTuhl$tl9)|^rgr) z`89GzX$791#vb{SW^HkmBjWxMRQ6)IHRh{wCBau7nhL(?`TV69ig90=Kp!PErr`Ht z;Cuo8vo$VqaV={k4bqAesrNdbUjojPL!jw_O*fueAzGTLbj)MO>~@XE33;>Dp;!mC z9QBl?RX8>Cz~a5x4-TM9s+FBDyk(lHb@y#Q=)0EOPD#`(-{2Q2>QY`o&aIxbZRK|& z%6HC3SH5K%5B`riGT5!RO*n>~D}N8zo#dms-H45d8J|9yEBGpw>>AvHWqtBsH8PS? zr!LsGxoD|}f!K$1oNtyJJyD{!*%5PAl6V03^G(P)BA&5S~b|GsOqVO%jx0Lz! z!r5j}`vlF~_pt%UvA5|$VGx_*6|-lLM+_N3T%PXmzZp!zjXEg1Gs?wKsz+FS;B_H? zwqAlp14aJRsh$M60*|Sm0KXJXaaYiV=$vYBSy8tca{XOxh{ z68mAU^#9S>3)(yV&!tDYF}SEys*mX44m3?)ZpbN)?Zfon> z(MSnGmIjvZkx{Wd8~mL`>MJ?v><*(0<(oH8$b zhgS_*pDmGq@)9RgDQY;Gu1rd#PT6V7p+e zU#N9+iNlrckFR>|spQn%`2QzMq|OB{Lf>PW{{e5(HPDkPc`GT2(3LCZsT6ELZ*@au zRukA?7>7AhF7=`(WG2TUe8H?aYq}ZDe8IDEr!{&Fddn~O7FB}Mp$EnL+4TgSu}H!M z?2H)k9H4XlGwU3UjsJ1+d^>WwQ6m3drIQ4w>e;FTsN{O~3tT}kv9rwxB4WXAjTXI! zRmvC~$;7nFKnH-EF9L++2(kBfYt>#f;GUN~Q5OksAEA8V6*N)%$fO_dZYR=wTyLSK|SYsk@8rmVYf+%KvpM4#leQ7z2H1!bnYFXx|71Yg0xV}Tu)5p z4NZX8!jP3+bT=5$aFIQO#!p^^+$#-3j{_%SQ$ zZgc3C^S{FA9T&kqt8{RuRG9=Bk#zj?MGOcXTB>9S#^Dgz0<0f4dtWm(f$@-Tp_#dI zS-~@1_LE9Ft(0Cut`}l2A5nhijTQt|%C7@{=hI~ikOG}z7`4pE`SVC^I;75XA+TBI zL4zs&su*$6lq@2y_+tuYNtM)kG;A6ZQq;+gBlR#%?Lh-rBokY}fo?zcTCwGw{H7|ZAH9MUsxsM6XM-hGX#vJwYT)*ldJ zca;p6pA;bG;N7^;RnZiKecofEfPF_Sw3?dj*f6uL)01n6NsC4ZRly1z-`p;jxX!1PxKN~vPCuLh>E9~*>Vm5u?{Hq7P)q^euoU#SL8kCjK zN!b2N7${z7Otom95NrB11{ZEccc`hXc}}&(A(B`7Dmf7Pa zg_uBOC_~JY;$n#Xue>a48xGzb?dtx+oog)M$LNm$Gy+SnI!5bMXs^KEn>h%zs4q;g z8D@sL;2LjlD;$voZpV5IBy=!amL@BRXry&XJ4Do=VHe`*&S*A-P->!R}!rb>Gn zrtv1)8tj?`qst>9-7HAb#GQl89FnxkUyzA#SOg$JDGtJ)czmh#6^lxL%%fnN=X-;g zGv^Jx+sF1;cCy`Wj>`W7N)>vL=zx5X3f6R0Aob&=3EwIvsIcgC1QlHYE_mohzDrup>m^Am_?Zf(_yu^{E zkvJ1U&sXwNZ+#$IOC0g1n2lnNnd}N8^MR28>TP@BDY4!y&E+eG3GO_->$&8g*&s6` z69$e=32OWjWA?xG5X!`Pzv9Uq1AMSyq}n{UUcc$vp{Y}eL&7>Nhz%~^j5TPY6}6s3 zH2qk{B4B0TkPzgvI@cO_cML**PI`eX<@W@mZ(>|G5`P%JHKshm8}#B8-Uh#Kc_ezG z=IQkE?}hq+;Q`}u8*+ciXG(-qnUZy#@&*ls`4-OC}o zWn}r;FXrhLu4C`l#Y9zz%^I%04hM$zmBD(H=mpdi#jfpRhORjo6Ljx zWQrAfQ1kWs8hu46&6#4V5r7$UD*{I&$L#b@iN(hm3*S)s%^`oP#U`Zxr-qFkGpKP7 zS7B6tiwx^CT?!7eGOdZmQ&?@L{&PU++jtzLOeQmG1l8soRqBZ5U4vz)*AsFx;A&ESA`-o$jl zkc0L4NP5;21}4YFrwcu*k}FK+9X@7yK9v*@T{GAqQvBadT&0QMCfM~KVc4@hHtGZO zXx4?e$>dNMnYJG$I6%vyCbJAd8`2}r5as|3{sVl%XjNi81hBa^&x#}TY(kb>;>AcA z)d?UB728o|X?1s)Iui{k&p;6}&$y}W$C3a&^5X(23e!_>sCkJK%o6245HQB`8zxd4 zhk2#TO`RuA>Xi%X3GbmT2p9JR5exBR$L*2`$Q zsUaUZig6eH_IHtW=rQDrG=&D^*y4(8D)-E5cPmW`P2AnSOAi{n1MT@ukaL=STmmE2 zWR0@ucZ*CN;vx)cLiKQwdOp8A7Zcn_$-*Ps!D*DHKAB@57$11cFm?{V&ClKI|?d>ecr|75R72NgVVqSLb|RqA{Ki7RaBmKKq1iQCo2&e zxqGm8npSdDEkmsCrazHved;10HUP^$FC{WXbLH2iuc9VZCX6gpF;ja!p4`N35$`(3 zXYOy$t*A#Ua#}yiTV}o;oDCs8xae~va__w`WlHYHl^m#oj0S2R8sN+Re@^gHbk=^; z7|}BrV6~)lMYI>yl*)eO$5pIxN7QTwVpp*5q0V)2@wRSaNZ5&)!`et%9C6hkt03Hq zfy1qUJB~^zJQ37)fY2y-CmjXDD`{q0YU#Fh*06H6?$yEP=V1awXW-H$w}`+-+oh

DEFqLD~Y!ybSO`;$KOXPP&W#Rt^!^{J(HM9{`;sBeJlT@ zLF6{89h1CRuH2R+K^T8(^VB5^a*BKYF7h8npU2l*@|*6ubn!NB7+>MrS6c{6%6QVub?ug%z3T9C5eRRe$M*p< zqm48Du}D)^LW-bJv2g6sZ#(izv`b%^t}3=G^v1Ii;HVS|CIRw#RUzV<&h7v+-Fq;8 ziNiu?M0*=Zo3W0h5Of@lB@4ZX&|IO&s)1?R(Y$$SU~plV=9vk5g$IPCTh2w;yoUee zmoj#!XOl>PIW*-mxvxxk9u^b>r;UZ(wjz$(dzc!nVt8*t042Z&EBq_|UP_%} zy`dqY)|ov=bASKlu|0~al?xd)#A@4UkSaz!3y=2D-3}ZXx(Rh3NHH2H=tuDM(j1jW z;ST6COzPLhRiCxh8i&|9bEExW9++8pIJCBHJ=Zk>m zs6@qEl>3KP@K?J{AV?$x{q-WN1NQ&lbd1&E7?3ioW-9cls^~)cI+rd&Bz}n& z_zjvi#DMle-gGr33rf_w*}Zg$|Ku$&=UEdZkHM-n5EE(>jWn50S!NHiakRUf}lrA~p0F_wHgvVn+u&O*?BKI2z9!BVheMmj>s) z8?UpCM+Q<0X9!bIgD+d1!_4e*$}9snBEQrgtU$KAmwxE9B)x;T6es~NsqxLp4eua_ z&I@kgf0GmOBeBE!O4q6`*_(gcxRVQq>2$>umo5??{xgR zDG#w1bkT1DofpktLn0!<^hnuj)m`Ky0ix>+rR53PK`re^|KNpn3>Gn!zQ~rNb{*&K zNC;F4%|OZFw=oJ(_DEPQ?Q18y?R+#;FM1Dea$j7e(r^I047&y#Ac8%1>jiHsW;`lq z!O@*gTT@`esO``7M*PVRd+ub=(twVmV%HGNfUK1x-z=Nwo~Dq_qr|b(L2#@4I8{-W zk?Dt_7E6nlH_@IYGBNq7X(O@0QT#5yyDZtHcOPxbslb^P#`94WM(NQF6DZ-)F*Mkm zYOB0@byaoBT!zFA=3ap~!iAbW9D9EuGZy0R&s-*=JtASlV(susM^D0e7YYA#Ip3?5oU{+qO~UwHB8>pb7;t2q?li zUx>EiFbr(J9sXikPZ`rP8|U#44$yIj8jFQQUJ}D=jt17*W<$s-NY;&NOAq<+W<6r( zTgDtDU-@qxdK6xrTv%`ai&zrwD<}vn`HB%+<~{BMFjDTZAx271R@*Y?%_b-*VtL2-JZa>al4=4CTh z!=<|6Ng)*zxr+~6J(#E6>C))KBAkC^iI@xg)w-Sfgz}XDO~atB-MQaC%cIA?YFd#o z`|I^NFji%_A`V)e3*8MsEQ1eym4h_;rxFvCpr6jC&}CNW=%@J$$7-(@Zh_TYro6tJ z#_U|B@x{d%Ym+5}J1gDShewOT*?(8rOYLf4_#otjJvM&qM1$WB@K@ULK3={e4VZ+3 zsuhy>Ir5z6wpm=0`hVftC&Wrmks8g?nf--Y83xFJ$g>Dkj2pgY}WGd$oUqHFd_>0$BrI}aWFM%2Y;(0`p)82 zh%3H=|5S>;bO62mNC8byAa53rj2R3I)hiM>Q^dqx#;3t84 zFa<}L4ewjrbnh!bx(Te*4dm4I@Az6?rLVA0tFop!)ud_9CN)yxYZIRw&W&uwGz0t$ z9{=sbV4+$nSiIEljAAN}kRN$ai4y${^@7c>mG<)5J=?I~-<8TM@xseQAaxrV9!}gk(I~{Y5~mBEX|6BwA9yq){^#L| z7T5btFOO?CQ&`AwI$}^E?pRF)@ld1Th1ni)BGIV~nM<{1S5gb@0xmeW8T9EqvUz5h zergFTgXbeyyGf7>^*v0!uF2T@RQQiHYXe|~DMo?X^}3!H+}7ZOO5WZKiwEDVFsrA@ zNX`_iQ&tPM4977yc>nvf7!YHcOgm3UZHq1#odxZm-YrXV(_R!<4TQ^I6`kzN!n!4! z^QfNfR&~U}%y-LC$s;z4DAG@66*k5hH9ZG(-^LZ50!>=AnJRhMVD=wEKfJTnx(?7c zQWDF^9sS>RNF)jg!jIF)BI>i2Y^wa!;mmFt=d;hwpA!NQ05qy1nw`B3$ST?;Y>Ec3 z>00N!$PkIr$Ev>P(wx;ypQwFVoWL6@!Jx?8s8GL;%6Tpp^4em1h%H-TJD5T|^a&ZBNqB@G+ z7kkx9-5+MqSJr6G#$^PavVmejWt<_#w=^-U=w>i2=lcQ(H;rW`LR4wFQ5VXgS*JRF zd6E#NZ8Udba!}D3(_mlpz*16bhxgWiSI0Y$m2dX-mJXj(i@%i}YS#B9K>d$Cy8V=? z6&O8i?@ULdepq1^4BqV+V5v_k;`-R-d^M&j(}y6cxECz1nK>=}eSUznr2eu+2n#cj zs+d-B>vhwYkEpiPAJ}~Hm8l|yk8eE?*<>JEH9KB0;$JfgYZ8-qO}!8>$V?@IEyuj6 zulY#JTvZOVf1_8YKu3%H&8z{RjZ=vVOwhj;4hRP0y)}PfhiYkodVrOei;wGBy(T8v zg)u;D6T}=2nrtFz6oH@pol8iwjRSP8H%{mVp;)u0Mu>l6hEFUQdv}IXv_wppDd}%A z88Zmai&A%EvwdJ7CRX9caIGubCLs84FKBLh;qw%rt_Dx|b#l_AgLNL~Ztt3b5-~AB zc5;J*L^ZBie2+~|@W7BMq>=+Ywm7}-7I*U}7% zB$b2DtBPD1?FWQ=Ss3iQIn7c_1~#P>c|5UEsPmN>nHb06v$q@+lJP*Yz8W7d%H@dt ze&>`P1g%uL?}iD56^V(ZC>-qE*f}r(D{h_lr@{b((Y~=$0*#KqCO&Wcu`suQ6?jDE zUr_?+alYkgi~m=hh+56CWfP{0IIip>eD~AbwtG6eowSt8 zUqZj~rwl;b!j3r78Y~yj1Ur6Wu`7_IuyG5>%6&9(M&Fm_78ag($fOs$C9_#*gGC6q zpdFW)#(S7+q*5}TFqB4(U-As#=i2~#IFSVpMEvaNGsn$?=0E111~ z4Tj06CfOpfBFVlmeT_WsQ!kF1+09F+S>=Ink?4JJbG~Z#iyVp(h z$@!cJ6#AuXs+ zILo=Xr!R-%r1Np?{KuRRlT)z*f;=oVw-NUdDP*IH=2)$TrlDNAQAaNrk7g&l8o^Cm zj}&OOgFjF~Ci^a1S^MZS;Cu^OJwTk;f+o6@2|6&_L0OuU+^d+J;Vy$wtnf`a=^`&2 zHuY7Pr8U(DK%tT`*vVL@SH|Mhrpn25zf>X8#fE~)R+4pFH_h&7=tPDWotw@qtr@Wm z)R5zArykgXoeQ^2gj|Q=UX*Bx-S2QlPvib|bm(VqklGe`^~l%-3hj<^Ad}(JMvr^w z)i7)_wr!CrE{YvWn~gqXNKKZqe=`nchyuQ`&{s}69ZV}4VaBL&AVShF)TksW2l%T=X=Gb9kiaG?r{= zGsHx6<2D{8C11Z_aB8Y2EB8o*obdD8)3K%b%ptYJxU3?lI7dvcbEY1)i1S_((mUr} zyejk6RH}sQCk$S!1s&OmBbg%uK*7PXakNt??^7X9tC4x!zM7#aBvOuD9M~OftD{mz zDELI8FNLxle($mmfdcBg6>_0yQ8f&s`F5Mey3nZb2Y4T*dQ!)+8te3P7%<<*+Nnso zIb9294p$NAAjFQ-!ZaZlmllRX7|}$-q(1(FFWL4}EJRQ}EH?&C=w8h6_bwY^jf6OT zT>@TZKav&U)o1{v`ZH7BT+O)XnT%<0`D7HWy?zkBm8h<|<1*l=AGWXVc0nCtnwP|~ z3r37(Ot06}9npQId@)876vi9*5Wyic&E*@NMM^qAG$VvKRM6=C7s!$vOS&AG?hD@a zpPb)Xd@EM{`>IcS2h)YswN9CTSSWZC<%~MliBg5Pp#wMH5M?BDTI`yMq}bCVo?_M@3)9HEezyFmDbz2h}XIsMi77PtMPrayUY zBS_$o#L&R~08}J4+kqRjO?s2PLqiAQ?ilbOt)zqL7)jsu$bLsS6dPcb124313Imyv zU@uW*IogkNp3oz8DPntHon5*=?Se;ETa_MBV35@tbfp@omum=6??yD9zD#!lquOh= zp`y$-<{|HBfiq`uRSD#a5SS^q0n4K-?+DKfGoW!W0ZbgT+PZd1ZP<@41xtM6yAGBnDT6bh!DuLXOg$*8At;7{t*KY--&T`6`yYIErm3~H_B zx_3QFrMVv6UJ>&Ro6TyklDkGjN@oHFHbn#js8g>CX(mzdc}_jZlKl1`fwxe_9+@odC3|_`4E4&F{c4 zS1o8(7T?nm>hg1_2%lrT2DJ%a1$iE-l144$fY;1WJ2CcH3NTpc@LnxGZ+@~K+wGIOB8!w(%fmZ{jKX-LBXwAfViOR@8 zXJRwT3A#BR%-^1JbJ9#ZuzTh-^QZ9r@fGH^j%*<1Oj*3u6Y%_FWOq38k)IRo5NPSU zGpfGTsVrWJ%IPHycEH4yNu4}yt!H!~LO?Wr9Ash-231;ty)?J`H!473mGd(6LirY3zmIB#bq*kJI*mA zj%3st2^$P!-J41P$xvq3>K59ADX6(9IWfSW9!UwxHo7|L(%{^0Y<5DnhTrnr^gmT@2@Z} zr2J?P99tT8;GYir9jG#`@md@{ubsWHSqk|G)U^1+%_l|ksiQE^88*Kb7{^F%kIQGt9cbqoDqu( zXf;CNAJGs9Q;)h{U@c}bH42h03 zdT1eto>V7e(TE5`gpC5Q+UR=z(s_S^TNCKP0f9;thaZDM*Q46-DXy+ z(J%aP`6oQ?^foTQ<5QZ%Q(6QmA}P0H6CH~ehsBk^X_ru1596@_Vb7n?C#Gkhn5QgB z*-05Qn>_|xui6Wbi%!ERIt{$ElO~HGe?y_Y*XC>9%W!bi?R_fh6Y&Bfq0jV*4GdG( zR6n|UU^kGRwtS(E4EM`oFfw5mZ7sCOBx8?tj_ij4VRc>T)$AfV{9|=P@f9>>4h|1l zb^LQA7Xz@Wa@<(i>*|e6B`XYtll1>d5(|=E6|SH?i8Vw_KK1i6ouoju=81PYj9%_2 zoA>+mV^5NuD_DXm@@K5Fk60yzHBrDsKwnLx03vnPo5j!2VctRG{B49>Q9F%%@}7X? zWECxZ%1A`7k(GqOLDk|*z?I7_bXkN;xA-?LG5nlNOMXrudluLTM~obVk#W3AaaJ%k z##_h5H{E?zmSTZ0`%hp7xJpcT!b>GYnJ4ugYH*7CWtp8NgB9QNBN-P7EiBW$!PaOj z*cP7|6~2Abr*WHs`L!${cr=;uka17;5`vS_Ti~mS72S&$_W^7e%Xv;B9CBQR@vh!j zkiozjqw0LUAZ;RJ)**JX9{EgHhAH}F5(%cID{2g;!D*>Ne=ceDgyG;cyI$?Du&bMn zT`M;0Szvx}Ew~`cwY#1+8zU@Z=}Eci5pSaquME`BY<~Vpi19{f7d*2%1hU(Tkpz%V zGZu{Ob1q0r(@`7+fv4MAehcz3urr$n*6+y%UA&9x=3_gS%INRcxgN&j>9n3li#oUpqYamUQpe7 z3v@D+2JtJwO>r5nv-JxG!KDMEZm{|AGJuefK`LLM)u`gk39;9bx^`#X9*wT@p|Z1| zE?GpYde-v?IFiD=Ngss#$qBf@rkQvXy{;;E7&Gb)OhiPNcZ*xtHC?@G>JdKaR1^&E5oG}y=!v#M@R86BCX;It4bP1AK*uf zL@D0#_Q(u@=sGGje375mEDTA~kEg&->OKg%sY!j_2=Uv#NuTU&lFL1H*(?gKXdL7! z8FT;7wy~Zh4{rG{3U1p26~8D8S=QVOqYZ4|2&a1%MI#~5q$5;z(z>EZ3d+2cwqXc* zZwaP}qePY-A=0zJw;ZtnL!IcJsL?4DQ5J2aPClH-p_AzHLBXLzyJjCWv!xG!BL1WA zM|~#;b9{==93I6Jb%hTRiXsFaE_C+T{=k>C`%qxT{WfX`UPcHK<=}WOFe4Sfk&q

lc{Y9%WjS8+lwCy^IYegk$L4m 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⋙rolLlCduF_)ku-5zVOO< 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 Q01Uv7SPB6`0i)~y08PaMasU7T literal 0 HcmV?d00001 diff --git a/vsprojects/classifier/classifier.vcxproj b/vsprojects/classifier/classifier.vcxproj index 130e3ec..933349d 100644 --- a/vsprojects/classifier/classifier.vcxproj +++ b/vsprojects/classifier/classifier.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -42,40 +42,40 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/constituency_labeler/constituency_labeler.vcxproj b/vsprojects/constituency_labeler/constituency_labeler.vcxproj index 3dfd1d5..5bb8adc 100644 --- a/vsprojects/constituency_labeler/constituency_labeler.vcxproj +++ b/vsprojects/constituency_labeler/constituency_labeler.vcxproj @@ -56,20 +56,20 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/coreference_resolver/coreference_resolver.vcxproj b/vsprojects/coreference_resolver/coreference_resolver.vcxproj index 84376b7..e060ed6 100644 --- a/vsprojects/coreference_resolver/coreference_resolver.vcxproj +++ b/vsprojects/coreference_resolver/coreference_resolver.vcxproj @@ -56,20 +56,20 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/dependency_labeler/dependency_labeler.vcxproj b/vsprojects/dependency_labeler/dependency_labeler.vcxproj index 4dacdb3..0a216c9 100644 --- a/vsprojects/dependency_labeler/dependency_labeler.vcxproj +++ b/vsprojects/dependency_labeler/dependency_labeler.vcxproj @@ -56,20 +56,20 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/entity_recognizer/entity_recognizer.vcxproj b/vsprojects/entity_recognizer/entity_recognizer.vcxproj index e60c0df..b6876d3 100644 --- a/vsprojects/entity_recognizer/entity_recognizer.vcxproj +++ b/vsprojects/entity_recognizer/entity_recognizer.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -35,40 +35,40 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index 6e99a18..454637d 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -35,40 +35,40 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/morphological_tagger/morphological_tagger.vcxproj b/vsprojects/morphological_tagger/morphological_tagger.vcxproj index a33c698..db60985 100644 --- a/vsprojects/morphological_tagger/morphological_tagger.vcxproj +++ b/vsprojects/morphological_tagger/morphological_tagger.vcxproj @@ -1,252 +1,252 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release O0 - Win32 - - - Release O0 - x64 - - - Release - Win32 - - - Release - x64 - - - - {ECAF13E4-5AB5-4F92-9EFE-565E79F0CD21} - Win32Proj - morphological_tagger - - - - StaticLibrary - true - v120 - Unicode - - - StaticLibrary - true - v120 - Unicode - - - StaticLibrary - false - v120 - true - Unicode - - - StaticLibrary - false - v120 - true - Unicode - - - StaticLibrary - false - v120 - true - Unicode - - - StaticLibrary - false - v120 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - false - - - false - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) - - - Console - true - ..\..\deps\glog-0.3.2\Debug;..\..\deps\gflags-2.0\Debug;..\..\deps\AD3-2.0.2\vsprojects\Debug - AD3.lib;libgflags-debug.lib;libglog.lib;%(AdditionalDependencies) - - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) - Disabled - - - Console - true - ..\..\deps\glog-0.3.2\Debug;..\..\deps\gflags-2.0\Debug;..\..\deps\AD3-2.0.2\vsprojects\Debug - AD3.lib;libgflags-debug.lib;libglog.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) - AnySuitable - Speed - true - true - - - Windows - true - true - true - - - - - Level3 - - - Disabled - true - false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) - Disabled - - - false - false - false - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release O0 + Win32 + + + Release O0 + x64 + + + Release + Win32 + + + Release + x64 + + + + {ECAF13E4-5AB5-4F92-9EFE-565E79F0CD21} + Win32Proj + morphological_tagger + + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + false + v140 + true + Unicode + + + StaticLibrary + false + v140 + true + Unicode + + + StaticLibrary + false + v140 + true + Unicode + + + StaticLibrary + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + false + + + false + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) + + + Console + true + ..\..\deps\glog-0.3.2\Debug;..\..\deps\gflags-2.0\Debug;..\..\deps\AD3-2.0.2\vsprojects\Debug + AD3.lib;libgflags-debug.lib;libglog.lib;%(AdditionalDependencies) + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + Disabled + + + Console + true + ..\..\deps\glog-0.3.2\Debug;..\..\deps\gflags-2.0\Debug;..\..\deps\AD3-2.0.2\vsprojects\Debug + AD3.lib;libgflags-debug.lib;libglog.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(SolutionDir)..\src\parser;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\util;$(SolutionDir)..\deps\\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + AnySuitable + Speed + true + true + + + Windows + true + true + true + + + + + Level3 + + + Disabled + true + false + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) + Disabled + + + false + false + false + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsprojects/parser/parser.vcxproj b/vsprojects/parser/parser.vcxproj index 08f9961..ac4c05f 100644 --- a/vsprojects/parser/parser.vcxproj +++ b/vsprojects/parser/parser.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -33,35 +33,35 @@ StaticLibrary true - v120 + v140 StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 StaticLibrary false - v120 + v140 StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/semantic_parser/semantic_parser.vcxproj b/vsprojects/semantic_parser/semantic_parser.vcxproj index 00e2e51..b7ef7b0 100644 --- a/vsprojects/semantic_parser/semantic_parser.vcxproj +++ b/vsprojects/semantic_parser/semantic_parser.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -35,40 +35,40 @@ Application true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/sequence/sequence.vcxproj b/vsprojects/sequence/sequence.vcxproj index 786f51e..d2b70db 100644 --- a/vsprojects/sequence/sequence.vcxproj +++ b/vsprojects/sequence/sequence.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -35,40 +35,40 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/tagger/tagger.vcxproj b/vsprojects/tagger/tagger.vcxproj index f836eb7..38ecdc3 100644 --- a/vsprojects/tagger/tagger.vcxproj +++ b/vsprojects/tagger/tagger.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -41,40 +41,40 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode diff --git a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj index fc5c578..99c0e71 100644 --- a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj +++ b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj @@ -56,20 +56,20 @@ Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -141,7 +141,7 @@ Console true - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug @@ -196,7 +196,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -220,7 +220,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj index efec342..87d5f16 100644 --- a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj +++ b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj @@ -56,20 +56,20 @@ Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -141,7 +141,7 @@ Console true - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug @@ -196,7 +196,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -220,7 +220,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj index da6ce9c..c49ec8c 100644 --- a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj +++ b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj @@ -56,20 +56,20 @@ Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -141,7 +141,7 @@ Console true - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug @@ -196,7 +196,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -220,7 +220,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj index be708fe..3f9d63c 100644 --- a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj +++ b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -36,40 +36,40 @@ Application true - v120 + v140 Unicode Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -143,7 +143,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj index b90e3b9..24dd770 100644 --- a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj +++ b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -36,40 +36,40 @@ Application true - v120 + v140 Unicode Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -143,7 +143,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_parser/turbo_parser.vcxproj b/vsprojects/turbo_parser/turbo_parser.vcxproj index fdf7ae4..98e1e56 100644 --- a/vsprojects/turbo_parser/turbo_parser.vcxproj +++ b/vsprojects/turbo_parser/turbo_parser.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -36,40 +36,40 @@ Application true - v120 + v140 Unicode Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -142,7 +142,7 @@ Console true - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj index a09cdfb..340a685 100644 --- a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj +++ b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -59,40 +59,40 @@ Application true - v120 + v140 Unicode Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -166,7 +166,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) @@ -225,7 +225,7 @@ true true true - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release @@ -249,7 +249,7 @@ true true true - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release diff --git a/vsprojects/turbo_tagger/turbo_tagger.vcxproj b/vsprojects/turbo_tagger/turbo_tagger.vcxproj index f8b9f9e..9c39763 100644 --- a/vsprojects/turbo_tagger/turbo_tagger.vcxproj +++ b/vsprojects/turbo_tagger/turbo_tagger.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -36,40 +36,40 @@ Application true - v120 + v140 Unicode Application true - v120 + v140 Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode Application false - v120 + v140 true Unicode @@ -143,7 +143,7 @@ Console true ..\..\deps\glog-0.3.2\x64\Debug;..\..\deps\gflags-2.0\x64\Debug;..\..\deps\AD3-2.0.2\vsprojects\x64\Debug;..\..\deps\googletest\msvc\x64\Debug - AD3_120mddx64.lib;libgflags_120mddx64.lib;libglog_static_120mddx64.lib;gtest-md_120mddx64.lib;%(AdditionalDependencies) + AD3_140mddx64.lib;libgflags_140mddx64.lib;libglog_static_140mddx64.lib;gtest-md_140mddx64.lib;%(AdditionalDependencies) @@ -207,7 +207,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) @@ -233,7 +233,7 @@ true true ..\..\deps\glog-0.3.2\x64\Release;..\..\deps\gflags-2.0\x64\Release;..\..\deps\AD3-2.0.2\vsprojects\x64\Release;..\..\deps\googletest\msvc\x64\Release - AD3_120mdx64.lib;libgflags_120mdx64.lib;libglog_static_120mdx64.lib;gtest-md_120mdx64.lib;%(AdditionalDependencies) + AD3_140mdx64.lib;libgflags_140mdx64.lib;libglog_static_140mdx64.lib;gtest-md_140mdx64.lib;%(AdditionalDependencies) diff --git a/vsprojects/util/util.vcxproj b/vsprojects/util/util.vcxproj index 1e9f992..059ee78 100644 --- a/vsprojects/util/util.vcxproj +++ b/vsprojects/util/util.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -41,40 +41,40 @@ StaticLibrary true - v120 + v140 Unicode StaticLibrary true - v120 + v140 Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode StaticLibrary false - v120 + v140 true Unicode From d79a851e4cc16d478d455d959419b49fec82b1e3 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 29 Mar 2016 11:12:05 +0100 Subject: [PATCH 17/51] FIX Update libturboparser VS projects (was missing coref and morph file references). --- .../libturboparser/libturboparser.vcxproj | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index 454637d..c099569 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -225,6 +225,22 @@ + + + + + + + + + + + + + + + + @@ -235,6 +251,15 @@ + + + + + + + + + @@ -298,6 +323,19 @@ + + + + + + + + + + + + + @@ -306,6 +344,14 @@ + + + + + + + + From 587fe26d94de6c8697ca4acc2e76d9dbdcb33f6a Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 29 Mar 2016 17:12:22 +0100 Subject: [PATCH 18/51] Update MVS files (add static glog macro to lib projects). --- vsprojects/classifier/classifier.vcxproj | 6 +++--- .../constituency_labeler/constituency_labeler.vcxproj | 6 +++--- .../coreference_resolver/coreference_resolver.vcxproj | 6 +++--- vsprojects/dependency_labeler/dependency_labeler.vcxproj | 6 +++--- vsprojects/entity_recognizer/entity_recognizer.vcxproj | 6 +++--- vsprojects/libturboparser/libturboparser.vcxproj | 6 +++--- .../morphological_tagger/morphological_tagger.vcxproj | 6 +++--- vsprojects/parser/parser.vcxproj | 6 +++--- vsprojects/semantic_parser/semantic_parser.vcxproj | 6 +++--- vsprojects/sequence/sequence.vcxproj | 6 +++--- vsprojects/tagger/tagger.vcxproj | 6 +++--- vsprojects/util/util.vcxproj | 6 +++--- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/vsprojects/classifier/classifier.vcxproj b/vsprojects/classifier/classifier.vcxproj index 933349d..2e2c469 100644 --- a/vsprojects/classifier/classifier.vcxproj +++ b/vsprojects/classifier/classifier.vcxproj @@ -129,7 +129,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) Disabled @@ -185,7 +185,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable @@ -208,7 +208,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/constituency_labeler/constituency_labeler.vcxproj b/vsprojects/constituency_labeler/constituency_labeler.vcxproj index 5bb8adc..d11094b 100644 --- a/vsprojects/constituency_labeler/constituency_labeler.vcxproj +++ b/vsprojects/constituency_labeler/constituency_labeler.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -205,7 +205,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/coreference_resolver/coreference_resolver.vcxproj b/vsprojects/coreference_resolver/coreference_resolver.vcxproj index e060ed6..38960ba 100644 --- a/vsprojects/coreference_resolver/coreference_resolver.vcxproj +++ b/vsprojects/coreference_resolver/coreference_resolver.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -185,7 +185,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -203,7 +203,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/dependency_labeler/dependency_labeler.vcxproj b/vsprojects/dependency_labeler/dependency_labeler.vcxproj index 0a216c9..7439ecc 100644 --- a/vsprojects/dependency_labeler/dependency_labeler.vcxproj +++ b/vsprojects/dependency_labeler/dependency_labeler.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -185,7 +185,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) @@ -203,7 +203,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/entity_recognizer/entity_recognizer.vcxproj b/vsprojects/entity_recognizer/entity_recognizer.vcxproj index b6876d3..002e777 100644 --- a/vsprojects/entity_recognizer/entity_recognizer.vcxproj +++ b/vsprojects/entity_recognizer/entity_recognizer.vcxproj @@ -132,7 +132,7 @@ NotUsing Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -209,7 +209,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index c099569..8289d1e 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -115,7 +115,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -168,7 +168,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -190,7 +190,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/morphological_tagger/morphological_tagger.vcxproj b/vsprojects/morphological_tagger/morphological_tagger.vcxproj index db60985..73671eb 100644 --- a/vsprojects/morphological_tagger/morphological_tagger.vcxproj +++ b/vsprojects/morphological_tagger/morphological_tagger.vcxproj @@ -132,7 +132,7 @@ NotUsing Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -209,7 +209,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/parser/parser.vcxproj b/vsprojects/parser/parser.vcxproj index ac4c05f..be731a7 100644 --- a/vsprojects/parser/parser.vcxproj +++ b/vsprojects/parser/parser.vcxproj @@ -100,7 +100,7 @@ $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) Level3 Disabled @@ -137,7 +137,7 @@ true true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) @@ -153,7 +153,7 @@ false false false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) Disabled diff --git a/vsprojects/semantic_parser/semantic_parser.vcxproj b/vsprojects/semantic_parser/semantic_parser.vcxproj index b7ef7b0..38dbccb 100644 --- a/vsprojects/semantic_parser/semantic_parser.vcxproj +++ b/vsprojects/semantic_parser/semantic_parser.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -189,7 +189,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -211,7 +211,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/sequence/sequence.vcxproj b/vsprojects/sequence/sequence.vcxproj index d2b70db..988931c 100644 --- a/vsprojects/sequence/sequence.vcxproj +++ b/vsprojects/sequence/sequence.vcxproj @@ -115,7 +115,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -168,7 +168,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -190,7 +190,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/tagger/tagger.vcxproj b/vsprojects/tagger/tagger.vcxproj index 38ecdc3..17bf818 100644 --- a/vsprojects/tagger/tagger.vcxproj +++ b/vsprojects/tagger/tagger.vcxproj @@ -141,7 +141,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) /wd4018 /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) Disabled @@ -205,7 +205,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable @@ -231,7 +231,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/util/util.vcxproj b/vsprojects/util/util.vcxproj index 059ee78..5b6269a 100644 --- a/vsprojects/util/util.vcxproj +++ b/vsprojects/util/util.vcxproj @@ -121,7 +121,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -174,7 +174,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -196,7 +196,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled From 37e01729cf2966ab04be81dc3e24aea673250cee Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 30 Mar 2016 16:07:16 +0100 Subject: [PATCH 19/51] Change python files for Python 2/3 and Linux/Windows compatibilities. --- python/nlp_pipeline.py | 55 +++++++++++++++++------- python/nlp_pipeline.win.config | 56 ++++++++++++++++++++++++ python/nlp_sentence.py | 29 +++++++------ python/nlp_utils.py | 5 ++- python/setup.py | 78 ++++++++++++++++++++++++++++++---- python/span.py | 3 +- python/test.py | 5 +++ 7 files changed, 191 insertions(+), 40 deletions(-) create mode 100644 python/nlp_pipeline.win.config create mode 100644 python/test.py diff --git a/python/nlp_pipeline.py b/python/nlp_pipeline.py index e9e0699..aea3906 100644 --- a/python/nlp_pipeline.py +++ b/python/nlp_pipeline.py @@ -1,3 +1,4 @@ +from __future__ import print_function import nltk import tokenizers.portuguese.word_tokenizer as tokenizer_PT import lemmatizer @@ -8,6 +9,8 @@ from span import Span import os import pdb +import sys +from builtins import range class NLPPipelineWorker: def __init__(self, pipeline, language): @@ -20,7 +23,7 @@ def __init__(self, pipeline, language): self.coreference_resolver = None if language not in pipeline.models: - print 'Error: no model for language %s.' % language + print('Error: no model for language %s.' % language) raise NotImplementedError if 'splitter' in pipeline.models[language]: @@ -62,8 +65,12 @@ def __init__(self, pipeline, language): class NLPPipeline: def __init__(self): # Load the initialization file. - configuration_filepath = os.path.dirname(os.path.realpath(__file__)) + \ - os.sep + 'nlp_pipeline.config' + if os.name == 'nt': + configuration_filepath = os.path.dirname(os.path.realpath(__file__)) + \ + os.sep + 'nlp_pipeline.win.config' + else: + configuration_filepath = os.path.dirname(os.path.realpath(__file__)) + \ + os.sep + 'nlp_pipeline.config' self.models = {} self.load_configuration_file(configuration_filepath) self.turbo_interface = tp.PTurboParser() @@ -86,7 +93,7 @@ def load_configuration_file(self, filepath): continue if language == '': language = line - print 'Loading information for %s' % language + print('Loading information for %s' % language) self.models[language] = {} else: pair = line.split('=') @@ -181,15 +188,20 @@ def parse_semantic_dependencies(self, tokenized_sentence, tags, lemmas, #sent['heads'] = [h-1 for h in heads] sent['dependency_relations'] = deprels sent.compute_semantic_dependencies(worker) - num_predicates = len(sent['predicate_names']) - predicates = ['_' for token in tokenized_sentence] - argument_lists = [['_' for k in xrange(num_predicates)] \ - for token in tokenized_sentence] - for k in xrange(num_predicates): + num_predicates = len(sent['predicate_names']) + if sys.version_info[0] == 2: + predicates = ['_' for token in tokenized_sentence] + argument_lists = [['_' for k in xrange(num_predicates)] \ + for token in tokenized_sentence] + if sys.version_info[0] == 3: + predicates = [b'_' for token in tokenized_sentence] + argument_lists = [[b'_' for k in range(num_predicates)] \ + for token in tokenized_sentence] + for k in range(num_predicates): name = sent['predicate_names'][k] p = sent['predicate_indices'][k] predicates[p] = name - for l in xrange(len(sent['argument_roles'][k])): + for l in range(len(sent['argument_roles'][k])): role = sent['argument_roles'][k][l] a = sent['argument_indices'][k][l] argument_lists[a][k] = role @@ -220,7 +232,10 @@ def resolve_coreferences(self, all_tokenized_sentences, all_tags, for sent in doc['sentences']: spans = [] for (start, end, name) in sent['coreference_spans']: - span = Span(start, end, name) + if sys.version_info[0] == 2: + span = Span(start, end, name) + if sys.version_info[0] == 3: + span = Span(start, end, name.decode(encoding='UTF-8') ) spans.append(span) coref_info = nlp_utils.construct_coreference_info_from_spans( \ spans, len(sent['words'])) @@ -236,10 +251,18 @@ def parse_conll(self, text, language): tags, lemmas, feats = self.tag(tokenized_sentence, language) heads, deprels = self.parse(tokenized_sentence, tags, lemmas, language) - for i, token in enumerate(tokenized_sentence): - conll_str += str(i+1) + '\t' + token + '\t' + lemmas[i] + \ - '\t' + tags[i] + '\t' + tags[i] + '\t' + \ - feats[i] + '\t' + str(heads[i]+1) + '\t' + \ - deprels[i] + '\n' + if sys.version_info[0] == 2: + for i, token in enumerate(tokenized_sentence): + conll_str += str(i+1) + '\t' + token + '\t' + lemmas[i] + \ + '\t' + tags[i] + '\t' + tags[i] + '\t' + \ + feats[i] + '\t' + str(heads[i]+1) + '\t' + \ + deprels[i] + '\n' + if sys.version_info[0] == 3: + for i, token in enumerate(tokenized_sentence): + conll_str += str(i+1) + '\t' + token + '\t' + lemmas[i] + \ + '\t' + tags[i].decode(encoding='UTF-8') + '\t' + \ + tags[i].decode(encoding='UTF-8') + '\t' + \ + feats[i] + '\t' + str(heads[i]+1) + '\t' + \ + deprels[i].decode(encoding='UTF-8') + '\n' conll_str += '\n' return conll_str diff --git a/python/nlp_pipeline.win.config b/python/nlp_pipeline.win.config new file mode 100644 index 0000000..448f22c --- /dev/null +++ b/python/nlp_pipeline.win.config @@ -0,0 +1,56 @@ +PT +splitter="tokenizers/punkt/portuguese.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\portuguese_floresta_v2.0_nomwe_auto\\portuguese_floresta_v2.0_nomwe_auto_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\portuguese_floresta_v2.0_nomwe_auto\\portuguese_floresta_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" +lemmatizer="C:\\Corpora\\TurboModels\\all_models\\portuguese_floresta_v2.0_nomwe_auto\\portuguese_floresta_v2.0_nomwe_auto_lemmatizer.model" + +ES +splitter="tokenizers/punkt/spanish.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\spanish_conll2009_v2.0_nomwe_auto\\spanish_conll2009_v2.0_nomwe_auto_tagger.model" +entity_recognizer="C:\\Corpora\\TurboModels\\all_models\\ner\\models\\spanish\\spanish_entity_recognizer.model" +parser="C:\\Corpora\\TurboModels\\all_models\\spanish_conll2009_v2.0_nomwe_auto\\spanish_conll2009_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" +semantic_parser="C:\\Corpora\\TurboModels\\all_models\\srl\\models\\spanish_conll2009_v2.0_nomwe_auto\\spanish_conll2009_v2.0_nomwe_auto_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" +coreference_resolver="C:\\Corpora\\TurboModels\\all_models\\coreference_models\\spanish\\spanish_coreference_resolver.model" +lemmatizer="C:\\Corpora\\TurboModels\\all_models\\spanish_conll2009_v2.0_nomwe_auto\\spanish_conll2009_v2.0_nomwe_auto_lemmatizer.model" + +EN +splitter="tokenizers/punkt/english.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\english_proj\\english_proj_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\english_proj\\english_proj_parser_pruned-true_model-standard.model" + +EN-Nonprojective +splitter="tokenizers/punkt/english.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\english_proj\\english_proj_tagger.model" +entity_recognizer="C:\\Corpora\\TurboModels\\all_models\\ner\\models\\english\\english_entity_recognizer.model" +parser="C:\\Corpora\\TurboModels\\all_models\\english\\english_parser_pruned-true_model-standard.model" +semantic_parser="C:\\Corpora\\TurboModels\\all_models\\srl\\models\\english\\english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" +coreference_resolver="C:\\Corpora\\TurboModels\\all_models\\coreference_models\\english_ontonotes_conll2012\\english_ontonotes_conll2012_coreference_resolver.model" +lemmatizer="C:\\Corpora\\TurboModels\\all_models\\english\\english_lemmatizer.model" + +PT-BR-Universal +splitter="tokenizers/punkt/portuguese.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\brazilian_portuguese_universal\\brazilian_portuguese_universal_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\brazilian_portuguese_universal\\brazilian_portuguese_universal_parser_pruned-true_model-standard.model" +morphological_tagger="C:\\Corpora\\TurboModels\\all_models\\morphological_tagger\\models\\UD_Portuguese\\pt-ud_morphological_tagger.model" + +ES-Universal +splitter="tokenizers/punkt/spanish.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\spanish_universal\\spanish_universal_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\spanish_universal\\spanish_universal_parser_pruned-true_model-standard.model" +morphological_tagger="C:\\Corpora\\TurboModels\\all_models\\morphological_tagger\\models\\UD_Spanish\\es-ud_morphological_tagger.model" + +FR-Universal +splitter="tokenizers/punkt/french.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\french_universal\\french_universal_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\french_universal\\french_universal_parser_pruned-true_model-standard.model" + +IT-Universal +splitter="tokenizers/punkt/italian.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\italian_universal\\italian_universal_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\italian_universal\\italian_universal_parser_pruned-true_model-standard.model" +morphological_tagger="C:\\Corpora\\TurboModels\\all_models\\morphological_tagger\\models\\UD_Italian\\it-ud_morphological_tagger.model" + +DE-Universal +splitter="tokenizers/punkt/german.pickle" +tagger="C:\\Corpora\\TurboModels\\all_models\\german_universal\\german_universal_tagger.model" +parser="C:\\Corpora\\TurboModels\\all_models\\german_universal\\german_universal_parser_pruned-true_model-standard.model" diff --git a/python/nlp_sentence.py b/python/nlp_sentence.py index 0acd2d0..0e09bd5 100644 --- a/python/nlp_sentence.py +++ b/python/nlp_sentence.py @@ -1,4 +1,6 @@ import turboparser as tp +from builtins import range +import sys class NLPSentence(dict): def __init__(self): @@ -13,13 +15,16 @@ def compute_morphology(self, worker): sequence_instance = tp.PSequenceInstance() sequence_instance.initialize(words, tags) worker.tagger.tag_sentence(sequence_instance) - tags = [sequence_instance.get_tag(i) for i in xrange(len(words))] + tags = [sequence_instance.get_tag(i) for i in range(len(words))] self['tags'] = tags # Compute lemmas. self['lemmas'] = None if worker.lemmatizer != None: - lemmas = worker.lemmatizer.lemmatize_sentence(words, tags) + if sys.version_info[0] == 2: + lemmas = worker.lemmatizer.lemmatize_sentence(words, tags) + if sys.version_info[0] == 3: + lemmas = worker.lemmatizer.lemmatize_sentence(words, [t.decode(encoding="UTF-8") for t in tags]) self['lemmas'] = lemmas else: lemmas = ['_' for word in words] @@ -32,7 +37,7 @@ def compute_morphology(self, worker): morphological_instance.initialize(words, lemmas, tags, feats) worker.morphological_tagger.tag_sentence(morphological_instance) feats = [morphological_instance.get_tag(i) \ - for i in xrange(len(words))] + for i in range(len(words))] self['morphological_tags'] = [feat.split('|') if feat != '_' \ else [] \ for feat in feats] @@ -46,7 +51,7 @@ def compute_entities(self, worker): entity_instance = tp.PEntityInstance() entity_instance.initialize(words, tags, entity_tags) worker.entity_recognizer.tag_sentence(entity_instance) - entity_tags = [entity_instance.get_tag(i) for i in xrange(len(words))] + entity_tags = [entity_instance.get_tag(i) for i in range(len(words))] self['entity_tags'] = entity_tags def compute_syntactic_dependencies(self, worker): @@ -73,10 +78,10 @@ def compute_syntactic_dependencies(self, worker): # Convert back to 0-based indexing. Words attached to the root will get # head = -1. self['heads'] = [dependency_instance.get_head(i+1)-1 \ - for i in xrange(len(words))] + for i in range(len(words))] self['dependency_relations'] = \ [dependency_instance.get_dependency_relation(i+1) \ - for i in xrange(len(words))] + for i in range(len(words))] def compute_semantic_dependencies(self, worker): words = self['words'] @@ -109,19 +114,19 @@ def compute_semantic_dependencies(self, worker): num_predicates = semantic_instance.get_num_predicates() predicate_names = [semantic_instance.get_predicate_name(k) \ - for k in xrange(num_predicates)] + for k in range(num_predicates)] # Convert back to 0-based indexing. predicate_indices = [semantic_instance.get_predicate_index(k)-1 \ - for k in xrange(num_predicates)] + for k in range(num_predicates)] argument_roles = \ [[semantic_instance.get_argument_role(k, l) \ - for l in xrange(semantic_instance.get_num_arguments_predicate(k))] \ - for k in xrange(num_predicates)] + for l in range(semantic_instance.get_num_arguments_predicate(k))] \ + for k in range(num_predicates)] # Convert to back 0-based indexing. argument_indices = \ [[semantic_instance.get_argument_index(k, l)-1 \ - for l in xrange(semantic_instance.get_num_arguments_predicate(k))] \ - for k in xrange(num_predicates)] + for l in range(semantic_instance.get_num_arguments_predicate(k))] \ + for k in range(num_predicates)] self['predicate_names'] = predicate_names self['predicate_indices'] = predicate_indices diff --git a/python/nlp_utils.py b/python/nlp_utils.py index a9ae98e..7751112 100644 --- a/python/nlp_utils.py +++ b/python/nlp_utils.py @@ -1,4 +1,5 @@ from span import * +from builtins import range def construct_coreference_spans_from_text(span_lines): left_bracket = '(' @@ -9,7 +10,7 @@ def construct_coreference_spans_from_text(span_lines): span_start_stack = [] spans = [] - for i in xrange(len(span_lines)): + for i in range(len(span_lines)): line = span_lines[i] fields = line.split('|') for field in fields: @@ -58,7 +59,7 @@ def construct_coreference_info_from_spans(spans, num_words): desc += '|' coreference_span_descriptions[span.end] = desc + span.name + ')' - for j in xrange(num_words): + for j in range(num_words): if coreference_span_descriptions[j] == '': coreference_span_descriptions[j] = '_' diff --git a/python/setup.py b/python/setup.py index 441a1d4..8bd0cdf 100644 --- a/python/setup.py +++ b/python/setup.py @@ -1,13 +1,73 @@ from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext +from Cython.Build import cythonize +import os -src = "../libturboparser/" - -setup(cmdclass={'build_ext': build_ext}, - ext_modules=[Extension("turboparser", ["turbo_parser.pyx"], - language="c++", - extra_compile_args=["-std=c++0x"], - include_dirs=["../src/morphological_tagger", "../src/coreference_resolver", "../src/semantic_parser", "../src/parser", "../src/entity_recognizer/", "../src/tagger/", "../src/sequence/", "../src/classifier/", "../src/util", "../deps/local/include/"], - library_dirs=[src, "../deps/local/lib/"], - libraries=["turboparser", "gflags", "glog", "ad3"])]) +if os.name == 'nt': + ext_modules=[Extension("turboparser", + ["turboparser.pyx"], + language="c++", + extra_compile_args=["/Zi", "/Od", "/DGOOGLE_GLOG_DLL_DECL="], + extra_link_args=['/DEBUG'], + include_dirs=["..\\src\\util", + "..\\src\\classifier", + "..\\src\\sequence", + "..\\src\\entity_recognizer", + "..\\src\\morphological_tagger", + "..\\src\\parser", + "..\\src\\tagger", + "..\\src\\semantic_parser", + "..\\src\\coreference_resolver", + "..\\deps\\AD3-2.0.2\\ad3", + "..\\deps\\AD3-2.0.2", + "..\\deps\\glog-0.3.2\\src\\windows", + "..\\deps\\gflags-2.0\\src\\windows", + "..\\deps\\eigen-eigen-c58038c56923", + "..\\deps\\googletest\\src"], + library_dirs=["..\\vsprojects\\x64\\Release", + "..\\deps\\glog-0.3.2\\x64\\Release", + "..\\deps\\gflags-2.0\\x64\\Release", + "..\\deps\\AD3-2.0.2\\vsprojects\\x64\\Release", + "..\\deps\\googletest\\msvc\\x64\\Release"], + #library_dirs=["..\\vsprojects\\x64\\Debug", + #"..\\deps\\glog-0.3.2\\x64\\Debug", + #"..\\deps\\gflags-2.0\\x64\\Debug", + #"..\\deps\\AD3-2.0.2\\vsprojects\\x64\\Debug", + #"..\\deps\\googletest\\msvc\\x64\\Debug"], + extra_objects=["libturboparser.lib", + "AD3_140mdx64.lib", + "libgflags_140mdx64.lib", + "libglog_static_140mdx64.lib", + "gtest-md_140mdx64.lib"])] + #extra_objects=["libturboparser.lib", + #"AD3_140mddx64.lib", + #"libgflags_140mddx64.lib", + #"libglog_static_140mddx64.lib", + #"gtest-md_140mddx64.lib"])] + setup(cmdclass={'build_ext': build_ext}, + ext_modules = cythonize(ext_modules, gdb_debug=True) + ) +else: + ext_modules=[Extension("turboparser", + ["turbo_parser.pyx"], + language="c++", + extra_compile_args=["-std=c++0x"], + include_dirs=["../src/morphological_tagger", + "../src/coreference_resolver", + "../src/semantic_parser", + "../src/parser", + "../src/entity_recognizer/", + "../src/tagger/", + "../src/sequence/", + "../src/classifier/", + "../src/util", + "../deps/local/include/"], + library_dirs=["../libturboparser/", + "../deps/local/lib/"], + libraries=["turboparser", + "gflags", + "glog", + "ad3"])] + setup(cmdclass={'build_ext': build_ext}, + ext_modules = ext_modules) diff --git a/python/span.py b/python/span.py index cd721d6..6c3d8a7 100644 --- a/python/span.py +++ b/python/span.py @@ -1,3 +1,4 @@ +from __future__ import print_function import numpy as np class Span: @@ -45,4 +46,4 @@ def overlaps(self, span): return start_interval <= end_interval def print_span(self): - print self.name, self.start, self.end + print (self.name, self.start, self.end) diff --git a/python/test.py b/python/test.py new file mode 100644 index 0000000..612f8b2 --- /dev/null +++ b/python/test.py @@ -0,0 +1,5 @@ +import nlp_pipeline +pipe = nlp_pipeline.NLPPipeline() + +conll_str = pipe.parse_conll('I solved the problem with statistics.', 'EN-Nonprojective') +print(conll_str) \ No newline at end of file From 98b338b6c5078a283c16f609c89c11a6ebd6a00d Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 30 Mar 2016 19:36:06 +0100 Subject: [PATCH 20/51] FIX to have back-compabilitity with entity recognizer models that predate the current set of options. --- src/classifier/Options.h | 260 +- src/classifier/Pipe.cpp | 1 + src/classifier/Pipe.h | 7 + src/coreference_resolver/CoreferencePipe.cpp | 620 ++- .../DependencyLabelerPipe.cpp | 1054 +++-- src/entity_recognizer/EntityOptions.cpp | 195 +- src/parser/DependencyPipe.cpp | 12 +- src/semantic_parser/SemanticPipe.cpp | 3776 ++++++++--------- src/sequence/SequencePipe.cpp | 14 +- src/util/SerializationUtils.cpp | 240 +- 10 files changed, 3104 insertions(+), 3075 deletions(-) diff --git a/src/classifier/Options.h b/src/classifier/Options.h index 2540bfe..1902bee 100644 --- a/src/classifier/Options.h +++ b/src/classifier/Options.h @@ -1,126 +1,134 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef OPTIONS_H_ -#define OPTIONS_H_ - -#include -#include -#include - -using namespace std; - -DECLARE_bool(train); -DECLARE_bool(test); -DECLARE_bool(evaluate); - -DECLARE_string(train_algorithm); -DECLARE_bool(only_supported_features); -DECLARE_bool(use_averaging); -DECLARE_int32(train_epochs); -DECLARE_double(train_regularization_constant); -DECLARE_double(train_initial_learning_rate); -DECLARE_string(train_learning_rate_schedule); - -DECLARE_int32(parameters_max_num_buckets); - -//1 to use new developments regarding performance optimizations -#ifndef USE_N_OPTIMIZATIONS -#define USE_N_OPTIMIZATIONS 0 //1 -#endif - -// General training/test options. -class Options { -public: - Options() {}; - virtual ~Options() {}; - - // Serialization functions. - // Load current option flags to the model file. - // Note: this will override the user-specified flags. - virtual void Save(FILE* fs) {}; - // Save current option flags to the model file. - virtual void Load(FILE* fs) {}; - - // Initialization: set options based on the flags. - virtual void Initialize(); - - // Get option values. - const std::string &GetTrainingFilePath() { return file_train_; }; - const std::string &GetTestFilePath() { return file_test_; }; - const std::string &GetModelFilePath() { return file_model_; }; - const std::string &GetOutputFilePath() { return file_prediction_; }; - int GetNumEpochs() { return train_epochs_; }; - double GetRegularizationConstant() { return train_regularization_constant_; } - const std::string &GetTrainingAlgorithm() { return train_algorithm_; } - double GetInitialLearningRate() { return train_initial_learning_rate_; } - const std::string &GetLearningRateSchedule() { - return train_learning_rate_schedule_; - } - bool use_averaging() { return use_averaging_; } - bool only_supported_features() { return only_supported_features_; } - bool train() { return train_; } - bool test() { return test_; } - bool evaluate() { return evaluate_; } - - // Set option values. - void SetTrainingFilePath(const std::string &file_train) { - file_train_ = file_train; - } - void SetTestFilePath(const std::string &file_test) { - file_test_ = file_test; - } - void SetModelFilePath(const std::string &file_model) { - file_model_ = file_model; - } - void SetOutputFilePath(const std::string &file_prediction) { - file_prediction_ = file_prediction; - } - -protected: - std::string file_train_; - std::string file_test_; - std::string file_model_; - std::string file_prediction_; - bool train_; - bool test_; - bool evaluate_; - int train_epochs_; - - // The regularization constant (C). The training optimization problem is: - // min 1/(2C)*||w||^2 + sum_t(loss(w; x_t,y_t)). - double train_regularization_constant_; - - // The algorithm used to train the model. Alternatives are: - // -- perceptron - // -- mira - // -- svm_mira - // -- crf_mira - // -- svm_sgd - // -- crf_sgd - std::string train_algorithm_; - - // Learning rate and its decay schedule (for SGD only). - double train_initial_learning_rate_; - std::string train_learning_rate_schedule_; - - bool only_supported_features_; // Use only supported features. - bool use_averaging_; // Include a final averaging step during training. -}; - -#endif /*OPTIONS_H_*/ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef OPTIONS_H_ +#define OPTIONS_H_ + +#include +#include +#include + +using namespace std; + +DECLARE_bool(train); +DECLARE_bool(test); +DECLARE_bool(evaluate); + +DECLARE_string(train_algorithm); +DECLARE_bool(only_supported_features); +DECLARE_bool(use_averaging); +DECLARE_int32(train_epochs); +DECLARE_double(train_regularization_constant); +DECLARE_double(train_initial_learning_rate); +DECLARE_string(train_learning_rate_schedule); + +DECLARE_int32(parameters_max_num_buckets); + +//1 to use new developments regarding performance optimizations +#ifndef USE_N_OPTIMIZATIONS +#define USE_N_OPTIMIZATIONS 0 //1 +#endif + +class Pipe; + +// General training/test options. +class Options { +public: + Options() {}; + virtual ~Options() {}; + + // Serialization functions. + // Load current option flags to the model file. + // Note: this will override the user-specified flags. + virtual void Save(FILE* fs) {}; + // Save current option flags to the model file. + virtual void Load(FILE* fs) {}; + + // Initialization: set options based on the flags. + virtual void Initialize(); + + // Get option values. + const std::string &GetTrainingFilePath() { return file_train_; }; + const std::string &GetTestFilePath() { return file_test_; }; + const std::string &GetModelFilePath() { return file_model_; }; + const std::string &GetOutputFilePath() { return file_prediction_; }; + int GetNumEpochs() { return train_epochs_; }; + double GetRegularizationConstant() { return train_regularization_constant_; } + const std::string &GetTrainingAlgorithm() { return train_algorithm_; } + double GetInitialLearningRate() { return train_initial_learning_rate_; } + const std::string &GetLearningRateSchedule() { + return train_learning_rate_schedule_; + } + bool use_averaging() { return use_averaging_; } + bool only_supported_features() { return only_supported_features_; } + bool train() { return train_; } + bool test() { return test_; } + bool evaluate() { return evaluate_; } + + // Set option values. + void SetTrainingFilePath(const std::string &file_train) { + file_train_ = file_train; + } + void SetTestFilePath(const std::string &file_test) { + file_test_ = file_test; + } + void SetModelFilePath(const std::string &file_model) { + file_model_ = file_model; + } + void SetOutputFilePath(const std::string &file_prediction) { + file_prediction_ = file_prediction; + } + + // Set a pointer to the pipe that owns this options handler. + void SetPipe(Pipe *pipe) { + pipe_ = pipe; + } + +protected: + Pipe *pipe_ = nullptr; // The pipe that owns this options handler. + std::string file_train_; + std::string file_test_; + std::string file_model_; + std::string file_prediction_; + bool train_; + bool test_; + bool evaluate_; + int train_epochs_; + + // The regularization constant (C). The training optimization problem is: + // min 1/(2C)*||w||^2 + sum_t(loss(w; x_t,y_t)). + double train_regularization_constant_; + + // The algorithm used to train the model. Alternatives are: + // -- perceptron + // -- mira + // -- svm_mira + // -- crf_mira + // -- svm_sgd + // -- crf_sgd + std::string train_algorithm_; + + // Learning rate and its decay schedule (for SGD only). + double train_initial_learning_rate_; + std::string train_learning_rate_schedule_; + + bool only_supported_features_; // Use only supported features. + bool use_averaging_; // Include a final averaging step during training. +}; + +#endif /*OPTIONS_H_*/ diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index d41cac8..64952a3 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -24,6 +24,7 @@ Pipe::Pipe(Options* options) { options_ = options; + options->SetPipe(this); dictionary_ = NULL; reader_ = NULL; writer_ = NULL; diff --git a/src/classifier/Pipe.h b/src/classifier/Pipe.h index 53a3bb2..ea110ee 100644 --- a/src/classifier/Pipe.h +++ b/src/classifier/Pipe.h @@ -64,6 +64,10 @@ class Pipe { // Run a previously trained classifier on a single instance. void ClassifyInstance(Instance *instance); + // Get model version. + uint64_t GetModelVersion() { + return model_version_; + } protected: // Create basic objects. virtual void CreateDictionary() = 0; @@ -263,6 +267,9 @@ class Pipe { // evaluation purposes). int num_mistakes_; int num_total_parts_; + //Model check + uint64_t model_check_; + uint64_t model_version_; }; #endif /* PIPE_H_ */ diff --git a/src/coreference_resolver/CoreferencePipe.cpp b/src/coreference_resolver/CoreferencePipe.cpp index b966836..cbec9c2 100644 --- a/src/coreference_resolver/CoreferencePipe.cpp +++ b/src/coreference_resolver/CoreferencePipe.cpp @@ -1,311 +1,309 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "CoreferencePipe.h" -#include "logval.h" -#include -#include -#include - -// Define the current model version and the oldest back-compatible version. -// The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". -const uint64_t kCoreferenceModelVersion = 200040000; -const uint64_t kOldestCompatibleCoreferenceModelVersion = 200040000; -const uint64_t kCoreferenceModelCheck = 1234567890; - -void CoreferencePipe::SaveModel(FILE* fs) { - bool success; - success = WriteUINT64(fs, kCoreferenceModelCheck); - CHECK(success); - success = WriteUINT64(fs, kCoreferenceModelVersion); - CHECK(success); - token_dictionary_->Save(fs); - dependency_dictionary_->Save(fs); - semantic_dictionary_->Save(fs); - Pipe::SaveModel(fs); -} - -void CoreferencePipe::LoadModel(FILE* fs) { - bool success; - uint64_t model_check; - uint64_t model_version; - success = ReadUINT64(fs, &model_check); - CHECK(success); - CHECK_EQ(model_check, kCoreferenceModelCheck) - << "The model file is too old and not supported anymore."; - success = ReadUINT64(fs, &model_version); - CHECK(success); - CHECK_GE(model_version, kOldestCompatibleCoreferenceModelVersion) - << "The model file is too old and not supported anymore."; - - delete token_dictionary_; - CreateTokenDictionary(); - token_dictionary_->Load(fs); - - delete dependency_dictionary_; - CreateDependencyDictionary(); - dependency_dictionary_->SetTokenDictionary(token_dictionary_); - dependency_dictionary_->Load(fs); - - delete semantic_dictionary_; - CreateSemanticDictionary(); - semantic_dictionary_->SetTokenDictionary(token_dictionary_); - semantic_dictionary_->SetDependencyDictionary(dependency_dictionary_); - semantic_dictionary_->Load(fs); - - GetCoreferenceDictionary()->SetTokenDictionary(token_dictionary_); - GetCoreferenceDictionary()->SetDependencyDictionary(dependency_dictionary_); - GetCoreferenceDictionary()->SetSemanticDictionary(semantic_dictionary_); - - Pipe::LoadModel(fs); -} - -void CoreferencePipe::PreprocessData() { - delete token_dictionary_; - CreateTokenDictionary(); - static_cast(token_dictionary_)->Initialize(GetCoreferenceSentenceReader()); - - delete dependency_dictionary_; - CreateDependencyDictionary(); - dependency_dictionary_->SetTokenDictionary(token_dictionary_); - dependency_dictionary_->CreateLabelDictionary(GetCoreferenceSentenceReader()); - - delete semantic_dictionary_; - CreateSemanticDictionary(); - semantic_dictionary_->SetTokenDictionary(token_dictionary_); - semantic_dictionary_->SetDependencyDictionary(dependency_dictionary_); - semantic_dictionary_-> - CreatePredicateRoleDictionaries(GetCoreferenceSentenceReader()); - - GetCoreferenceDictionary()->SetTokenDictionary(token_dictionary_); - GetCoreferenceDictionary()->SetDependencyDictionary(dependency_dictionary_); - GetCoreferenceDictionary()->SetSemanticDictionary(semantic_dictionary_); - GetCoreferenceDictionary()-> - CreateEntityDictionary(GetCoreferenceSentenceReader()); - GetCoreferenceDictionary()-> - CreateConstituentDictionary(GetCoreferenceSentenceReader()); - GetCoreferenceDictionary()-> - CreateWordDictionaries(GetCoreferenceSentenceReader()); - GetCoreferenceDictionary()-> - CreateAncestryDictionaries(GetCoreferenceSentenceReader()); - - GetCoreferenceDictionary()->ReadMentionTags(); - GetCoreferenceDictionary()->ReadPronouns(); - GetCoreferenceDictionary()->ReadDeterminers(); - GetCoreferenceDictionary()->ReadGenderNumberStatistics(); -} - -void CoreferencePipe::ComputeScores(Instance *instance, Parts *parts, - Features *features, - std::vector *scores) { - Pipe::ComputeScores(instance, parts, features, scores); -} - -void CoreferencePipe::MakeGradientStep( - Parts *parts, - Features *features, - double eta, - int iteration, - const std::vector &gold_output, - const std::vector &predicted_output) { - Pipe::MakeGradientStep(parts, features, eta, iteration, gold_output, - predicted_output); -} - -void CoreferencePipe::MakeFeatureDifference( - Parts *parts, - Features *features, - const std::vector &gold_output, - const std::vector &predicted_output, - FeatureVector *difference) { - Pipe::MakeFeatureDifference(parts, features, gold_output, predicted_output, - difference); -} - -void CoreferencePipe::TransformGold(Instance *instance, - Parts *parts, - const std::vector &scores, - std::vector *gold_output, - double *loss_inner) { - CoreferenceOptions *options = static_cast(options_); - if (options->train_with_closest_antecedent()) { - *loss_inner = 0.0; - } else { - double log_partition_function_inner; - double entropy_inner; - std::vector copied_scores = scores; - for (int r = 0; r < parts->size(); ++r) { - if ((*gold_output)[r] < 0.5) { - copied_scores[r] = -std::numeric_limits::infinity(); - } else { - CoreferencePartArc *arc = static_cast((*parts)[r]); - //LOG(INFO) << "Part[" << arc->parent_mention() << ", " - // << arc->child_mention() << "] is gold."; - } - } - static_cast(decoder_)-> - DecodeBasicMarginals(instance, parts, copied_scores, gold_output, - &log_partition_function_inner, &entropy_inner); - *loss_inner = entropy_inner; - } -} - -void CoreferencePipe::MakeParts(Instance *instance, - Parts *parts, - std::vector *gold_outputs) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceOptions *options = static_cast(options_); - - CoreferenceParts *coreference_parts = static_cast(parts); - coreference_parts->Initialize(); - bool make_gold = (gold_outputs != NULL); - if (make_gold) gold_outputs->clear(); - - const std::vector &mentions = document->GetMentions(); - //std::set entities; - - // Create arc parts departing from the artifical root (non-anaphoric - // mentions). - for (int j = 0; j < mentions.size(); ++j) { - Part *part = coreference_parts->CreatePartArc(-1, j); - coreference_parts->push_back(part); - if (make_gold) { - if (!document->IsMentionAnaphoric(j)) { - gold_outputs->push_back(1.0); - } else { - gold_outputs->push_back(0.0); - } - } - } - - // Create arc parts involving two mentions. - int mention_distance_threshold = -1; //100; // TODO(atm): put this in the options. - for (int j = 0; j < mentions.size(); ++j) { - bool found_closest = false; - for (int k = j + 1; k < mentions.size(); ++k) { - if (mention_distance_threshold >= 0 && - k - j > mention_distance_threshold && - !(make_gold && (mentions[j]->id() >= 0 && - mentions[j]->id() == mentions[k]->id()))) { - continue; - } - Part *part = coreference_parts->CreatePartArc(j, k); - coreference_parts->push_back(part); - if (make_gold) { - if (mentions[j]->id() >= 0 && mentions[j]->id() == mentions[k]->id()) { - //LOG(INFO) << "Found coreferent mentions: " << j << ", " << k; - if (!options->train_with_closest_antecedent() || !found_closest) { - gold_outputs->push_back(1.0); - found_closest = true; - } else { - gold_outputs->push_back(0.0); - } - } else { - gold_outputs->push_back(0.0); - } - } - } - } - - coreference_parts->BuildIndices(mentions.size()); - // Necessary to store this information here for LabelInstance at test time. - coreference_parts->SetMentions(mentions); -} - -void CoreferencePipe::MakeSelectedFeatures( - Instance *instance, - Parts *parts, - const std::vector &selected_parts, - Features *features) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceFeatures *coreference_features = - static_cast(features); - - CoreferenceParts *coreference_parts = static_cast(parts); - const std::vector &mentions = document->GetMentions(); - - coreference_features->Initialize(instance, parts); - - // Build features for coreference arcs. - for (int r = 0; r < coreference_parts->size(); ++r) { - CoreferencePartArc *arc = - static_cast((*coreference_parts)[r]); - coreference_features->AddArcFeatures(document, r, arc->parent_mention(), - arc->child_mention()); - } -} - -void CoreferencePipe::LabelInstance(Parts *parts, - const std::vector &output, - Instance *instance) { - CoreferenceDocument *document = - static_cast(instance); - CoreferenceParts *coreference_parts = static_cast(parts); - - const std::vector &mentions = coreference_parts->GetMentions(); - std::vector mention_clusters(mentions.size(), -1); - std::vector > entities; - - double threshold = 0.5; - for (int r = 0; r < coreference_parts->size(); ++r) { - if (output[r] < threshold) continue; - CoreferencePartArc *arc = static_cast((*parts)[r]); - CHECK_EQ(mention_clusters[arc->child_mention()], -1); - if (arc->parent_mention() < 0) { - // Non-anaphoric mention; create its own cluster. - mention_clusters[arc->child_mention()] = entities.size(); - entities.push_back(std::vector(1, arc->child_mention())); - } else { - int k = mention_clusters[arc->parent_mention()]; - mention_clusters[arc->child_mention()] = k; - entities[k].push_back(arc->child_mention()); - } - } - - // Clear gold coreference spans, if any. - for (int i = 0; i < document->GetNumSentences(); ++i) { - CoreferenceSentence *sentence = document->GetSentence(i); - sentence->ClearCoreferenceSpans(); - } - - // Add predicted coreference spans. - int num_entities = 0; - for (int k = 0; k < entities.size(); ++k) { - if (entities[k].size() > 1) { - ++num_entities; - } - } - for (int j = 0; j < mentions.size(); ++j) { - int k = mention_clusters[j]; - if (entities[k].size() > 1) { - // Not a singleton cluster; add coreference span. - std::ostringstream ss; - ss << k; - const std::string &name(ss.str()); - NamedSpan span(mentions[j]->start(), mentions[j]->end(), name); - int i = mentions[j]->sentence_index(); - CoreferenceSentence *sentence = document->GetSentence(i); - sentence->AddCoreferenceSpan(span); - } - } - - LOG(INFO) << "Predicted " << num_entities << " entities for " << mentions.size() - << " mentions."; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "CoreferencePipe.h" +#include "logval.h" +#include +#include +#include + +// Define the current model version and the oldest back-compatible version. +// The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". +const uint64_t kCoreferenceModelVersion = 200040000; +const uint64_t kOldestCompatibleCoreferenceModelVersion = 200040000; +const uint64_t kCoreferenceModelCheck = 1234567890; + +void CoreferencePipe::SaveModel(FILE* fs) { + bool success; + success = WriteUINT64(fs, kCoreferenceModelCheck); + CHECK(success); + success = WriteUINT64(fs, kCoreferenceModelVersion); + CHECK(success); + token_dictionary_->Save(fs); + dependency_dictionary_->Save(fs); + semantic_dictionary_->Save(fs); + Pipe::SaveModel(fs); +} + +void CoreferencePipe::LoadModel(FILE* fs) { + bool success; + success = ReadUINT64(fs, &model_check_); + CHECK(success); + CHECK_EQ(model_check_, kCoreferenceModelCheck) + << "The model file is too old and not supported anymore."; + success = ReadUINT64(fs, &model_version_); + CHECK(success); + CHECK_GE(model_version_, kOldestCompatibleCoreferenceModelVersion) + << "The model file is too old and not supported anymore."; + + delete token_dictionary_; + CreateTokenDictionary(); + token_dictionary_->Load(fs); + + delete dependency_dictionary_; + CreateDependencyDictionary(); + dependency_dictionary_->SetTokenDictionary(token_dictionary_); + dependency_dictionary_->Load(fs); + + delete semantic_dictionary_; + CreateSemanticDictionary(); + semantic_dictionary_->SetTokenDictionary(token_dictionary_); + semantic_dictionary_->SetDependencyDictionary(dependency_dictionary_); + semantic_dictionary_->Load(fs); + + GetCoreferenceDictionary()->SetTokenDictionary(token_dictionary_); + GetCoreferenceDictionary()->SetDependencyDictionary(dependency_dictionary_); + GetCoreferenceDictionary()->SetSemanticDictionary(semantic_dictionary_); + + Pipe::LoadModel(fs); +} + +void CoreferencePipe::PreprocessData() { + delete token_dictionary_; + CreateTokenDictionary(); + static_cast(token_dictionary_)->Initialize(GetCoreferenceSentenceReader()); + + delete dependency_dictionary_; + CreateDependencyDictionary(); + dependency_dictionary_->SetTokenDictionary(token_dictionary_); + dependency_dictionary_->CreateLabelDictionary(GetCoreferenceSentenceReader()); + + delete semantic_dictionary_; + CreateSemanticDictionary(); + semantic_dictionary_->SetTokenDictionary(token_dictionary_); + semantic_dictionary_->SetDependencyDictionary(dependency_dictionary_); + semantic_dictionary_-> + CreatePredicateRoleDictionaries(GetCoreferenceSentenceReader()); + + GetCoreferenceDictionary()->SetTokenDictionary(token_dictionary_); + GetCoreferenceDictionary()->SetDependencyDictionary(dependency_dictionary_); + GetCoreferenceDictionary()->SetSemanticDictionary(semantic_dictionary_); + GetCoreferenceDictionary()-> + CreateEntityDictionary(GetCoreferenceSentenceReader()); + GetCoreferenceDictionary()-> + CreateConstituentDictionary(GetCoreferenceSentenceReader()); + GetCoreferenceDictionary()-> + CreateWordDictionaries(GetCoreferenceSentenceReader()); + GetCoreferenceDictionary()-> + CreateAncestryDictionaries(GetCoreferenceSentenceReader()); + + GetCoreferenceDictionary()->ReadMentionTags(); + GetCoreferenceDictionary()->ReadPronouns(); + GetCoreferenceDictionary()->ReadDeterminers(); + GetCoreferenceDictionary()->ReadGenderNumberStatistics(); +} + +void CoreferencePipe::ComputeScores(Instance *instance, Parts *parts, + Features *features, + std::vector *scores) { + Pipe::ComputeScores(instance, parts, features, scores); +} + +void CoreferencePipe::MakeGradientStep( + Parts *parts, + Features *features, + double eta, + int iteration, + const std::vector &gold_output, + const std::vector &predicted_output) { + Pipe::MakeGradientStep(parts, features, eta, iteration, gold_output, + predicted_output); +} + +void CoreferencePipe::MakeFeatureDifference( + Parts *parts, + Features *features, + const std::vector &gold_output, + const std::vector &predicted_output, + FeatureVector *difference) { + Pipe::MakeFeatureDifference(parts, features, gold_output, predicted_output, + difference); +} + +void CoreferencePipe::TransformGold(Instance *instance, + Parts *parts, + const std::vector &scores, + std::vector *gold_output, + double *loss_inner) { + CoreferenceOptions *options = static_cast(options_); + if (options->train_with_closest_antecedent()) { + *loss_inner = 0.0; + } else { + double log_partition_function_inner; + double entropy_inner; + std::vector copied_scores = scores; + for (int r = 0; r < parts->size(); ++r) { + if ((*gold_output)[r] < 0.5) { + copied_scores[r] = -std::numeric_limits::infinity(); + } else { + CoreferencePartArc *arc = static_cast((*parts)[r]); + //LOG(INFO) << "Part[" << arc->parent_mention() << ", " + // << arc->child_mention() << "] is gold."; + } + } + static_cast(decoder_)-> + DecodeBasicMarginals(instance, parts, copied_scores, gold_output, + &log_partition_function_inner, &entropy_inner); + *loss_inner = entropy_inner; + } +} + +void CoreferencePipe::MakeParts(Instance *instance, + Parts *parts, + std::vector *gold_outputs) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceOptions *options = static_cast(options_); + + CoreferenceParts *coreference_parts = static_cast(parts); + coreference_parts->Initialize(); + bool make_gold = (gold_outputs != NULL); + if (make_gold) gold_outputs->clear(); + + const std::vector &mentions = document->GetMentions(); + //std::set entities; + + // Create arc parts departing from the artifical root (non-anaphoric + // mentions). + for (int j = 0; j < mentions.size(); ++j) { + Part *part = coreference_parts->CreatePartArc(-1, j); + coreference_parts->push_back(part); + if (make_gold) { + if (!document->IsMentionAnaphoric(j)) { + gold_outputs->push_back(1.0); + } else { + gold_outputs->push_back(0.0); + } + } + } + + // Create arc parts involving two mentions. + int mention_distance_threshold = -1; //100; // TODO(atm): put this in the options. + for (int j = 0; j < mentions.size(); ++j) { + bool found_closest = false; + for (int k = j + 1; k < mentions.size(); ++k) { + if (mention_distance_threshold >= 0 && + k - j > mention_distance_threshold && + !(make_gold && (mentions[j]->id() >= 0 && + mentions[j]->id() == mentions[k]->id()))) { + continue; + } + Part *part = coreference_parts->CreatePartArc(j, k); + coreference_parts->push_back(part); + if (make_gold) { + if (mentions[j]->id() >= 0 && mentions[j]->id() == mentions[k]->id()) { + //LOG(INFO) << "Found coreferent mentions: " << j << ", " << k; + if (!options->train_with_closest_antecedent() || !found_closest) { + gold_outputs->push_back(1.0); + found_closest = true; + } else { + gold_outputs->push_back(0.0); + } + } else { + gold_outputs->push_back(0.0); + } + } + } + } + + coreference_parts->BuildIndices(mentions.size()); + // Necessary to store this information here for LabelInstance at test time. + coreference_parts->SetMentions(mentions); +} + +void CoreferencePipe::MakeSelectedFeatures( + Instance *instance, + Parts *parts, + const std::vector &selected_parts, + Features *features) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceFeatures *coreference_features = + static_cast(features); + + CoreferenceParts *coreference_parts = static_cast(parts); + const std::vector &mentions = document->GetMentions(); + + coreference_features->Initialize(instance, parts); + + // Build features for coreference arcs. + for (int r = 0; r < coreference_parts->size(); ++r) { + CoreferencePartArc *arc = + static_cast((*coreference_parts)[r]); + coreference_features->AddArcFeatures(document, r, arc->parent_mention(), + arc->child_mention()); + } +} + +void CoreferencePipe::LabelInstance(Parts *parts, + const std::vector &output, + Instance *instance) { + CoreferenceDocument *document = + static_cast(instance); + CoreferenceParts *coreference_parts = static_cast(parts); + + const std::vector &mentions = coreference_parts->GetMentions(); + std::vector mention_clusters(mentions.size(), -1); + std::vector > entities; + + double threshold = 0.5; + for (int r = 0; r < coreference_parts->size(); ++r) { + if (output[r] < threshold) continue; + CoreferencePartArc *arc = static_cast((*parts)[r]); + CHECK_EQ(mention_clusters[arc->child_mention()], -1); + if (arc->parent_mention() < 0) { + // Non-anaphoric mention; create its own cluster. + mention_clusters[arc->child_mention()] = entities.size(); + entities.push_back(std::vector(1, arc->child_mention())); + } else { + int k = mention_clusters[arc->parent_mention()]; + mention_clusters[arc->child_mention()] = k; + entities[k].push_back(arc->child_mention()); + } + } + + // Clear gold coreference spans, if any. + for (int i = 0; i < document->GetNumSentences(); ++i) { + CoreferenceSentence *sentence = document->GetSentence(i); + sentence->ClearCoreferenceSpans(); + } + + // Add predicted coreference spans. + int num_entities = 0; + for (int k = 0; k < entities.size(); ++k) { + if (entities[k].size() > 1) { + ++num_entities; + } + } + for (int j = 0; j < mentions.size(); ++j) { + int k = mention_clusters[j]; + if (entities[k].size() > 1) { + // Not a singleton cluster; add coreference span. + std::ostringstream ss; + ss << k; + const std::string &name(ss.str()); + NamedSpan span(mentions[j]->start(), mentions[j]->end(), name); + int i = mentions[j]->sentence_index(); + CoreferenceSentence *sentence = document->GetSentence(i); + sentence->AddCoreferenceSpan(span); + } + } + + LOG(INFO) << "Predicted " << num_entities << " entities for " << mentions.size() + << " mentions."; +} diff --git a/src/dependency_labeler/DependencyLabelerPipe.cpp b/src/dependency_labeler/DependencyLabelerPipe.cpp index 54af8cd..34d9b93 100644 --- a/src/dependency_labeler/DependencyLabelerPipe.cpp +++ b/src/dependency_labeler/DependencyLabelerPipe.cpp @@ -1,528 +1,526 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "DependencyLabelerPipe.h" -#include -#include -#include -#ifdef _WIN32 -#include -#else -#include -#endif - -// Define the current model version and the oldest back-compatible version. -// The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". -const uint64_t kDependencyLabelerModelVersion = 200030000; -const uint64_t kOldestCompatibleDependencyLabelerModelVersion = 200030000; -const uint64_t kDependencyLabelerModelCheck = 1234567890; - -void DependencyLabelerPipe::SaveModel(FILE* fs) { - bool success; - success = WriteUINT64(fs, kDependencyLabelerModelCheck); - CHECK(success); - success = WriteUINT64(fs, kDependencyLabelerModelVersion); - CHECK(success); - token_dictionary_->Save(fs); - Pipe::SaveModel(fs); - //pruner_parameters_->Save(fs); -} - -void DependencyLabelerPipe::LoadModel(FILE* fs) { - bool success; - uint64_t model_check; - uint64_t model_version; - success = ReadUINT64(fs, &model_check); - CHECK(success); - CHECK_EQ(model_check, kDependencyLabelerModelCheck) - << "The model file is too old and not supported anymore."; - success = ReadUINT64(fs, &model_version); - CHECK(success); - CHECK_GE(model_version, kOldestCompatibleDependencyLabelerModelVersion) - << "The model file is too old and not supported anymore."; - delete token_dictionary_; - CreateTokenDictionary(); - static_cast(dictionary_)-> - SetTokenDictionary(token_dictionary_); - token_dictionary_->Load(fs); - Pipe::LoadModel(fs); - //pruner_parameters_->Load(fs); -} - -void DependencyLabelerPipe::PreprocessData() { - delete token_dictionary_; - CreateTokenDictionary(); - static_cast(dictionary_)->SetTokenDictionary(token_dictionary_); - static_cast(token_dictionary_)->Initialize(GetDependencyReader()); - static_cast(dictionary_)->CreateLabelDictionary(GetDependencyReader()); -} - -void DependencyLabelerPipe::ComputeScores(Instance *instance, Parts *parts, - Features *features, - std::vector *scores) { - //LOG(INFO) << "ComputeScores"; - Parameters *parameters = parameters_; - scores->resize(parts->size()); - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyLabelerFeatures *dependency_features = - static_cast(features); - DependencyInstanceNumeric *sentence = - static_cast(instance); - DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); - const std::vector &heads = sentence->GetHeads(); - const std::vector > &siblings = dependency_parts->siblings(); - - for (int m = 1; m < sentence->size(); ++m) { - // Conjoin arc features with the label. - const BinaryFeatures &arc_features = dependency_features->GetArcFeatures(m); - const std::vector &index_arc_parts = - dependency_parts->FindArcs(m); - std::vector allowed_labels(index_arc_parts.size()); - for (int k = 0; k < index_arc_parts.size(); ++k) { - DependencyLabelerPartArc *arc = - static_cast((*parts)[index_arc_parts[k]]); - allowed_labels[k] = arc->label(); - } - std::vector label_scores; - parameters_->ComputeLabelScores(arc_features, allowed_labels, - &label_scores); - for (int k = 0; k < index_arc_parts.size(); ++k) { - (*scores)[index_arc_parts[k]] = label_scores[k]; - } - } - - if (dependency_options->use_sibling_parts()) { - for (int h = 0; h < sentence->size(); ++h) { - if (siblings[h].size() == 0) continue; - for (int i = 0; i < siblings[h].size() + 1; ++i) { - const BinaryFeatures &sibling_features = - dependency_features->GetSiblingFeatures(h, i); - const std::vector &index_sibling_parts = - dependency_parts->FindSiblings(h, i); - std::vector sibling_labels(index_sibling_parts.size()); - for (int k = 0; k < index_sibling_parts.size(); ++k) { - DependencyLabelerPartSibling *sibling = - static_cast( - (*parts)[index_sibling_parts[k]]); - sibling_labels[k] = GetSiblingLabel(sibling->sibling_label(), - sibling->modifier_label()); - } - std::vector label_scores; - parameters_->ComputeLabelScores(sibling_features, sibling_labels, - &label_scores); - for (int k = 0; k < index_sibling_parts.size(); ++k) { - (*scores)[index_sibling_parts[k]] = label_scores[k]; - } - } - } - } - //LOG(INFO) << "End ComputeScores"; -} - -void DependencyLabelerPipe::MakeGradientStep( - Parts *parts, - Features *features, - double eta, - int iteration, - const std::vector &gold_output, - const std::vector &predicted_output) { - //LOG(INFO) << "MakeGradientStep"; - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyLabelerFeatures *dependency_features = - static_cast(features); - Parameters *parameters = GetTrainingParameters(); - DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); - - for (int r = 0; r < parts->size(); ++r) { - if (predicted_output[r] == gold_output[r]) continue; - - // Labeled arcs will be treated by looking at the unlabeled arcs and - // conjoining with the label. - if ((*parts)[r]->type() == DEPENDENCYLABELERPART_ARC) { - DependencyLabelerPartArc *arc = - static_cast((*parts)[r]); - const BinaryFeatures &arc_features = - dependency_features->GetArcFeatures(arc->modifier()); - - parameters->MakeLabelGradientStep(arc_features, eta, iteration, - arc->label(), - predicted_output[r] - gold_output[r]); - } else if ((*parts)[r]->type() == DEPENDENCYLABELERPART_SIBLING) { - DependencyLabelerPartSibling *sibling = - static_cast((*parts)[r]); - int sibling_index = dependency_parts-> - GetSiblingIndex(sibling->head(), sibling->modifier()); - const BinaryFeatures &sibling_features = - dependency_features->GetSiblingFeatures(sibling->head(), - sibling_index); - int sibling_label = GetSiblingLabel(sibling->sibling_label(), - sibling->modifier_label()); - parameters->MakeLabelGradientStep(sibling_features, eta, iteration, - sibling_label, - predicted_output[r] - gold_output[r]); - } else { - CHECK(false); - } - } - //LOG(INFO) << "End MakeGradientStep"; -} - -void DependencyLabelerPipe::MakeFeatureDifference( - Parts *parts, - Features *features, - const std::vector &gold_output, - const std::vector &predicted_output, - FeatureVector *difference) { - //LOG(INFO) << "MakeFeatureDifference"; - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyLabelerFeatures *dependency_features = - static_cast(features); - DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); - - for (int r = 0; r < parts->size(); ++r) { - if (predicted_output[r] == gold_output[r]) continue; - - // Labeled arcs will be treated by looking at the unlabeled arcs and - // conjoining with the label. - if ((*parts)[r]->type() == DEPENDENCYLABELERPART_ARC) { - DependencyLabelerPartArc *arc = - static_cast((*parts)[r]); - const BinaryFeatures &arc_features = - dependency_features->GetArcFeatures(arc->modifier()); - for (int j = 0; j < arc_features.size(); ++j) { - difference->mutable_labeled_weights()->Add(arc_features[j], - arc->label(), predicted_output[r] - gold_output[r]); - } - } else if ((*parts)[r]->type() == DEPENDENCYLABELERPART_SIBLING) { - DependencyLabelerPartSibling *sibling = - static_cast((*parts)[r]); - int sibling_index = dependency_parts-> - GetSiblingIndex(sibling->head(), sibling->modifier()); - const BinaryFeatures &sibling_features = - dependency_features->GetSiblingFeatures(sibling->head(), - sibling_index); - int sibling_label = GetSiblingLabel(sibling->sibling_label(), - sibling->modifier_label()); - for (int j = 0; j < sibling_features.size(); ++j) { - difference->mutable_labeled_weights()->Add(sibling_features[j], - sibling_label, predicted_output[r] - gold_output[r]); - } - } else { - CHECK(false); - } - } - //LOG(INFO) << "End MakeFeatureDifference"; -} - -void DependencyLabelerPipe::MakeParts(Instance *instance, - Parts *parts, - std::vector *gold_outputs) { - DependencyInstanceNumeric *sentence = - static_cast(instance); - DependencyLabelerParts *dependency_parts = - static_cast(parts); - dependency_parts->Initialize(); - bool make_gold = (gold_outputs != NULL); - if (make_gold) gold_outputs->clear(); - - // Make labeled arc parts and compute indices. - MakeArcParts(instance, parts, gold_outputs); - dependency_parts->BuildArcIndices(sentence->GetHeads()); - dependency_parts->ComputeSiblings(sentence->GetHeads()); - - // Make sibling parts. - if (GetDependencyLabelerOptions()->use_sibling_parts()) { - MakeSiblingParts(instance, parts, gold_outputs); - dependency_parts->BuildSiblingIndices(sentence->GetHeads()); - } - - dependency_parts->BuildOffsets(); -} - -void DependencyLabelerPipe::MakeArcParts(Instance *instance, - Parts *parts, - std::vector *gold_outputs) { - DependencyInstanceNumeric *sentence = - static_cast(instance); - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyDictionary *dependency_dictionary = GetDependencyDictionary(); - DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - bool prune_labels = dependency_options->prune_labels(); - vector allowed_labels; - - if (!prune_labels) { - allowed_labels.resize(dependency_dictionary->GetLabelAlphabet().size()); - for (int i = 0; i < allowed_labels.size(); ++i) { - allowed_labels[i] = i; - } - } - - const vector &heads = sentence->GetHeads(); - int num_parts_initial = dependency_parts->size(); - - // Add parts for the labeled arcs. - num_parts_initial = dependency_parts->size(); - for (int m = 1; m < sentence_length; ++m) { - int h = heads[m]; - if (prune_labels) { - int modifier_pos_id = sentence->GetPosId(m); - int head_pos_id = sentence->GetPosId(h); - allowed_labels.clear(); - allowed_labels = dependency_dictionary-> - GetExistingLabels(modifier_pos_id, head_pos_id); - } - - // If there is no allowed label for this arc, but the unlabeled arc was - // added, consider all the possible labels. - if (allowed_labels.empty()) { - allowed_labels.resize(dependency_dictionary->GetLabelAlphabet().size()); - for (int l = 0; l < allowed_labels.size(); ++l) { - allowed_labels[l] = l; - } - } - for (int k = 0; k < allowed_labels.size(); ++k) { - int l = allowed_labels[k]; - Part *part = dependency_parts->CreatePartArc(h, m, l); - dependency_parts->push_back(part); - if (make_gold) { - if (sentence->GetRelationId(m) == l) { - gold_outputs->push_back(1.0); - } else { - gold_outputs->push_back(0.0); - } - } - } - } - - dependency_parts->SetOffsetArc(num_parts_initial, - dependency_parts->size() - num_parts_initial); -} - -void DependencyLabelerPipe::MakeSiblingParts( - Instance *instance, - Parts *parts, - std::vector *gold_outputs) { - //LOG(INFO) << "MakeSiblingParts"; - DependencyInstanceNumeric *sentence = - static_cast(instance); - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyDictionary *dependency_dictionary = GetDependencyDictionary(); - DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - bool prune_labels = dependency_options->prune_labels(); - vector allowed_labels; - const vector &heads = sentence->GetHeads(); - - int num_parts_initial = dependency_parts->size(); - - const std::vector > &siblings = dependency_parts->siblings(); - - for (int h = 0; h < sentence_length; ++h) { - // Don't create parts for heads without modifiers. - if (siblings[h].size() == 0) continue; - - // Start position. - int m = siblings[h][0]; - const std::vector& initial_parts = dependency_parts->FindArcs(m); - for (int j = 0; j < initial_parts.size(); ++j) { - DependencyLabelerPartArc *initial_part = - static_cast( - (*dependency_parts)[initial_parts[j]]); - // TODO: Don't create a bigram part if this bigram is not allowed. - Part *part = dependency_parts-> - CreatePartSibling(h, m, -1, initial_part->label(), -1); - dependency_parts->push_back(part); - if (make_gold) { - gold_outputs->push_back((*gold_outputs)[initial_parts[j]]); - } - } - - // Intermediate position. - for (int i = 1; i < siblings[h].size(); ++i) { - int m = siblings[h][i]; - int s = siblings[h][i - 1]; - const std::vector& current_parts = - dependency_parts->FindArcs(m); - const std::vector& previous_parts = - dependency_parts->FindArcs(s); - for (int j = 0; j < current_parts.size(); ++j) { - DependencyLabelerPartArc *current_part = - static_cast( - (*dependency_parts)[current_parts[j]]); - for (int k = 0; k < previous_parts.size(); ++k) { - DependencyLabelerPartArc *previous_part = - static_cast( - (*dependency_parts)[previous_parts[k]]); - // TODO: Don't create a bigram part if this bigram is not allowed. - Part *part = dependency_parts-> - CreatePartSibling(h, m, s, current_part->label(), - previous_part->label()); - dependency_parts->push_back(part); - if (make_gold) { - gold_outputs->push_back( - (*gold_outputs)[current_parts[j]] * - (*gold_outputs)[previous_parts[k]]); - } - } - } - } - - // Final position. - m = siblings[h][siblings[h].size() - 1]; - const std::vector& final_parts = - dependency_parts->FindArcs(m); - for (int j = 0; j < final_parts.size(); ++j) { - DependencyLabelerPartArc *final_part = - static_cast( - (*dependency_parts)[final_parts[j]]); - // TODO: Don't create a bigram part if this bigram is not allowed. - Part *part = dependency_parts-> - CreatePartSibling(h, -1, m, -1, final_part->label()); - dependency_parts->push_back(part); - if (make_gold) { - gold_outputs->push_back((*gold_outputs)[final_parts[j]]); - } - } - } - - dependency_parts->SetOffsetSibling( - num_parts_initial, - dependency_parts->size() - num_parts_initial); - //LOG(INFO) << "End MakeSiblingParts"; -} - -void DependencyLabelerPipe::MakeSelectedFeatures( - Instance *instance, - Parts *parts, - const std::vector& selected_parts, - Features *features) { - //LOG(INFO) << "MakeSelectedFeatures"; - DependencyInstanceNumeric *sentence = - static_cast(instance); - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyLabelerFeatures *dependency_features = - static_cast(features); - int sentence_length = sentence->size(); - - // TODO(atm): make this computation of descendents be part of - // DependencyInstanceNumeric or a class that derives from it. - std::vector > descendents; - const std::vector &heads = sentence->GetHeads(); - ComputeDescendents(heads, &descendents); - - const std::vector > &siblings = dependency_parts->siblings(); - dependency_features->Initialize(instance, parts, siblings); - - // Build features for arcs/siblings only. They will later be conjoined with - // the tags. - for (int m = 1; m < sentence_length; ++m) { - dependency_features->AddArcFeatures(sentence, descendents, - siblings, m); - } - - // Make sibling parts. - if (GetDependencyLabelerOptions()->use_sibling_parts()) { - for (int h = 0; h < sentence_length; ++h) { - if (siblings[h].size() == 0) continue; - for (int i = 0; i < siblings[h].size() + 1; ++i) { - dependency_features->AddSiblingFeatures(sentence, descendents, - siblings, h, i); - } - } - } - //LOG(INFO) << "End MakeSelectedFeatures"; -} - -void DependencyLabelerPipe::LabelInstance(Parts *parts, - const std::vector &output, - Instance *instance) { - DependencyLabelerParts *dependency_parts = - static_cast(parts); - DependencyInstance *dependency_instance = - static_cast(instance); - int instance_length = dependency_instance->size(); - for (int m = 0; m < instance_length; ++m) { - dependency_instance->SetHead(m, -1); - dependency_instance->SetDependencyRelation(m, "NULL"); - } - double threshold = 0.5; - - int offset, num_labeled_arcs; - dependency_parts->GetOffsetArc(&offset, &num_labeled_arcs); - for (int r = 0; r < num_labeled_arcs; ++r) { - DependencyLabelerPartArc *arc = - static_cast((*dependency_parts)[offset + r]); - if (output[offset + r] >= threshold) { - dependency_instance->SetHead(arc->modifier(), arc->head()); - dependency_instance->SetDependencyRelation(arc->modifier(), - GetDependencyDictionary()-> - GetLabelName(arc->label())); - } - } - - for (int m = 1; m < instance_length; ++m) { - if (dependency_instance->GetHead(m) < 0) { - VLOG(2) << "Word without head."; - dependency_instance->SetHead(m, 0); - dependency_instance->SetDependencyRelation(m, - GetDependencyDictionary()->GetLabelName(0)); - } - } -} - -void DependencyLabelerPipe::ComputeDescendents( - const std::vector &heads, - std::vector >* descendents) const { - //LOG(INFO) << "Computing descendents"; - descendents->resize(heads.size()); - for (int h = 0; h < descendents->size(); ++h) { - (*descendents)[h].clear(); - } - for (int m = 1; m < heads.size(); ++m) { - (*descendents)[m].push_back(m); - std::vector ancestors; - GetAllAncestors(heads, m, &ancestors); - for (int k = 0; k < ancestors.size(); ++k) { - int h = ancestors[k]; - CHECK_GE(h, 0); - //LOG(INFO) << h << " " << descendents->size(); - (*descendents)[h].push_back(m); - } - } - //LOG(INFO) << "End computing descendents"; -} - -void DependencyLabelerPipe::GetAllAncestors(const std::vector &heads, - int descend, - std::vector* ancestors) const { - ancestors->clear(); - int h = heads[descend]; - while (h >= 0) { - ancestors->push_back(h); - h = heads[h]; - } -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "DependencyLabelerPipe.h" +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +// Define the current model version and the oldest back-compatible version. +// The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". +const uint64_t kDependencyLabelerModelVersion = 200030000; +const uint64_t kOldestCompatibleDependencyLabelerModelVersion = 200030000; +const uint64_t kDependencyLabelerModelCheck = 1234567890; + +void DependencyLabelerPipe::SaveModel(FILE* fs) { + bool success; + success = WriteUINT64(fs, kDependencyLabelerModelCheck); + CHECK(success); + success = WriteUINT64(fs, kDependencyLabelerModelVersion); + CHECK(success); + token_dictionary_->Save(fs); + Pipe::SaveModel(fs); + //pruner_parameters_->Save(fs); +} + +void DependencyLabelerPipe::LoadModel(FILE* fs) { + bool success; + success = ReadUINT64(fs, &model_check_); + CHECK(success); + CHECK_EQ(model_check_, kDependencyLabelerModelCheck) + << "The model file is too old and not supported anymore."; + success = ReadUINT64(fs, &model_version_); + CHECK(success); + CHECK_GE(model_version_, kOldestCompatibleDependencyLabelerModelVersion) + << "The model file is too old and not supported anymore."; + delete token_dictionary_; + CreateTokenDictionary(); + static_cast(dictionary_)-> + SetTokenDictionary(token_dictionary_); + token_dictionary_->Load(fs); + Pipe::LoadModel(fs); + //pruner_parameters_->Load(fs); +} + +void DependencyLabelerPipe::PreprocessData() { + delete token_dictionary_; + CreateTokenDictionary(); + static_cast(dictionary_)->SetTokenDictionary(token_dictionary_); + static_cast(token_dictionary_)->Initialize(GetDependencyReader()); + static_cast(dictionary_)->CreateLabelDictionary(GetDependencyReader()); +} + +void DependencyLabelerPipe::ComputeScores(Instance *instance, Parts *parts, + Features *features, + std::vector *scores) { + //LOG(INFO) << "ComputeScores"; + Parameters *parameters = parameters_; + scores->resize(parts->size()); + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyLabelerFeatures *dependency_features = + static_cast(features); + DependencyInstanceNumeric *sentence = + static_cast(instance); + DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); + const std::vector &heads = sentence->GetHeads(); + const std::vector > &siblings = dependency_parts->siblings(); + + for (int m = 1; m < sentence->size(); ++m) { + // Conjoin arc features with the label. + const BinaryFeatures &arc_features = dependency_features->GetArcFeatures(m); + const std::vector &index_arc_parts = + dependency_parts->FindArcs(m); + std::vector allowed_labels(index_arc_parts.size()); + for (int k = 0; k < index_arc_parts.size(); ++k) { + DependencyLabelerPartArc *arc = + static_cast((*parts)[index_arc_parts[k]]); + allowed_labels[k] = arc->label(); + } + std::vector label_scores; + parameters_->ComputeLabelScores(arc_features, allowed_labels, + &label_scores); + for (int k = 0; k < index_arc_parts.size(); ++k) { + (*scores)[index_arc_parts[k]] = label_scores[k]; + } + } + + if (dependency_options->use_sibling_parts()) { + for (int h = 0; h < sentence->size(); ++h) { + if (siblings[h].size() == 0) continue; + for (int i = 0; i < siblings[h].size() + 1; ++i) { + const BinaryFeatures &sibling_features = + dependency_features->GetSiblingFeatures(h, i); + const std::vector &index_sibling_parts = + dependency_parts->FindSiblings(h, i); + std::vector sibling_labels(index_sibling_parts.size()); + for (int k = 0; k < index_sibling_parts.size(); ++k) { + DependencyLabelerPartSibling *sibling = + static_cast( + (*parts)[index_sibling_parts[k]]); + sibling_labels[k] = GetSiblingLabel(sibling->sibling_label(), + sibling->modifier_label()); + } + std::vector label_scores; + parameters_->ComputeLabelScores(sibling_features, sibling_labels, + &label_scores); + for (int k = 0; k < index_sibling_parts.size(); ++k) { + (*scores)[index_sibling_parts[k]] = label_scores[k]; + } + } + } + } + //LOG(INFO) << "End ComputeScores"; +} + +void DependencyLabelerPipe::MakeGradientStep( + Parts *parts, + Features *features, + double eta, + int iteration, + const std::vector &gold_output, + const std::vector &predicted_output) { + //LOG(INFO) << "MakeGradientStep"; + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyLabelerFeatures *dependency_features = + static_cast(features); + Parameters *parameters = GetTrainingParameters(); + DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); + + for (int r = 0; r < parts->size(); ++r) { + if (predicted_output[r] == gold_output[r]) continue; + + // Labeled arcs will be treated by looking at the unlabeled arcs and + // conjoining with the label. + if ((*parts)[r]->type() == DEPENDENCYLABELERPART_ARC) { + DependencyLabelerPartArc *arc = + static_cast((*parts)[r]); + const BinaryFeatures &arc_features = + dependency_features->GetArcFeatures(arc->modifier()); + + parameters->MakeLabelGradientStep(arc_features, eta, iteration, + arc->label(), + predicted_output[r] - gold_output[r]); + } else if ((*parts)[r]->type() == DEPENDENCYLABELERPART_SIBLING) { + DependencyLabelerPartSibling *sibling = + static_cast((*parts)[r]); + int sibling_index = dependency_parts-> + GetSiblingIndex(sibling->head(), sibling->modifier()); + const BinaryFeatures &sibling_features = + dependency_features->GetSiblingFeatures(sibling->head(), + sibling_index); + int sibling_label = GetSiblingLabel(sibling->sibling_label(), + sibling->modifier_label()); + parameters->MakeLabelGradientStep(sibling_features, eta, iteration, + sibling_label, + predicted_output[r] - gold_output[r]); + } else { + CHECK(false); + } + } + //LOG(INFO) << "End MakeGradientStep"; +} + +void DependencyLabelerPipe::MakeFeatureDifference( + Parts *parts, + Features *features, + const std::vector &gold_output, + const std::vector &predicted_output, + FeatureVector *difference) { + //LOG(INFO) << "MakeFeatureDifference"; + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyLabelerFeatures *dependency_features = + static_cast(features); + DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); + + for (int r = 0; r < parts->size(); ++r) { + if (predicted_output[r] == gold_output[r]) continue; + + // Labeled arcs will be treated by looking at the unlabeled arcs and + // conjoining with the label. + if ((*parts)[r]->type() == DEPENDENCYLABELERPART_ARC) { + DependencyLabelerPartArc *arc = + static_cast((*parts)[r]); + const BinaryFeatures &arc_features = + dependency_features->GetArcFeatures(arc->modifier()); + for (int j = 0; j < arc_features.size(); ++j) { + difference->mutable_labeled_weights()->Add(arc_features[j], + arc->label(), predicted_output[r] - gold_output[r]); + } + } else if ((*parts)[r]->type() == DEPENDENCYLABELERPART_SIBLING) { + DependencyLabelerPartSibling *sibling = + static_cast((*parts)[r]); + int sibling_index = dependency_parts-> + GetSiblingIndex(sibling->head(), sibling->modifier()); + const BinaryFeatures &sibling_features = + dependency_features->GetSiblingFeatures(sibling->head(), + sibling_index); + int sibling_label = GetSiblingLabel(sibling->sibling_label(), + sibling->modifier_label()); + for (int j = 0; j < sibling_features.size(); ++j) { + difference->mutable_labeled_weights()->Add(sibling_features[j], + sibling_label, predicted_output[r] - gold_output[r]); + } + } else { + CHECK(false); + } + } + //LOG(INFO) << "End MakeFeatureDifference"; +} + +void DependencyLabelerPipe::MakeParts(Instance *instance, + Parts *parts, + std::vector *gold_outputs) { + DependencyInstanceNumeric *sentence = + static_cast(instance); + DependencyLabelerParts *dependency_parts = + static_cast(parts); + dependency_parts->Initialize(); + bool make_gold = (gold_outputs != NULL); + if (make_gold) gold_outputs->clear(); + + // Make labeled arc parts and compute indices. + MakeArcParts(instance, parts, gold_outputs); + dependency_parts->BuildArcIndices(sentence->GetHeads()); + dependency_parts->ComputeSiblings(sentence->GetHeads()); + + // Make sibling parts. + if (GetDependencyLabelerOptions()->use_sibling_parts()) { + MakeSiblingParts(instance, parts, gold_outputs); + dependency_parts->BuildSiblingIndices(sentence->GetHeads()); + } + + dependency_parts->BuildOffsets(); +} + +void DependencyLabelerPipe::MakeArcParts(Instance *instance, + Parts *parts, + std::vector *gold_outputs) { + DependencyInstanceNumeric *sentence = + static_cast(instance); + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyDictionary *dependency_dictionary = GetDependencyDictionary(); + DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + bool prune_labels = dependency_options->prune_labels(); + vector allowed_labels; + + if (!prune_labels) { + allowed_labels.resize(dependency_dictionary->GetLabelAlphabet().size()); + for (int i = 0; i < allowed_labels.size(); ++i) { + allowed_labels[i] = i; + } + } + + const vector &heads = sentence->GetHeads(); + int num_parts_initial = dependency_parts->size(); + + // Add parts for the labeled arcs. + num_parts_initial = dependency_parts->size(); + for (int m = 1; m < sentence_length; ++m) { + int h = heads[m]; + if (prune_labels) { + int modifier_pos_id = sentence->GetPosId(m); + int head_pos_id = sentence->GetPosId(h); + allowed_labels.clear(); + allowed_labels = dependency_dictionary-> + GetExistingLabels(modifier_pos_id, head_pos_id); + } + + // If there is no allowed label for this arc, but the unlabeled arc was + // added, consider all the possible labels. + if (allowed_labels.empty()) { + allowed_labels.resize(dependency_dictionary->GetLabelAlphabet().size()); + for (int l = 0; l < allowed_labels.size(); ++l) { + allowed_labels[l] = l; + } + } + for (int k = 0; k < allowed_labels.size(); ++k) { + int l = allowed_labels[k]; + Part *part = dependency_parts->CreatePartArc(h, m, l); + dependency_parts->push_back(part); + if (make_gold) { + if (sentence->GetRelationId(m) == l) { + gold_outputs->push_back(1.0); + } else { + gold_outputs->push_back(0.0); + } + } + } + } + + dependency_parts->SetOffsetArc(num_parts_initial, + dependency_parts->size() - num_parts_initial); +} + +void DependencyLabelerPipe::MakeSiblingParts( + Instance *instance, + Parts *parts, + std::vector *gold_outputs) { + //LOG(INFO) << "MakeSiblingParts"; + DependencyInstanceNumeric *sentence = + static_cast(instance); + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyDictionary *dependency_dictionary = GetDependencyDictionary(); + DependencyLabelerOptions *dependency_options = GetDependencyLabelerOptions(); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + bool prune_labels = dependency_options->prune_labels(); + vector allowed_labels; + const vector &heads = sentence->GetHeads(); + + int num_parts_initial = dependency_parts->size(); + + const std::vector > &siblings = dependency_parts->siblings(); + + for (int h = 0; h < sentence_length; ++h) { + // Don't create parts for heads without modifiers. + if (siblings[h].size() == 0) continue; + + // Start position. + int m = siblings[h][0]; + const std::vector& initial_parts = dependency_parts->FindArcs(m); + for (int j = 0; j < initial_parts.size(); ++j) { + DependencyLabelerPartArc *initial_part = + static_cast( + (*dependency_parts)[initial_parts[j]]); + // TODO: Don't create a bigram part if this bigram is not allowed. + Part *part = dependency_parts-> + CreatePartSibling(h, m, -1, initial_part->label(), -1); + dependency_parts->push_back(part); + if (make_gold) { + gold_outputs->push_back((*gold_outputs)[initial_parts[j]]); + } + } + + // Intermediate position. + for (int i = 1; i < siblings[h].size(); ++i) { + int m = siblings[h][i]; + int s = siblings[h][i - 1]; + const std::vector& current_parts = + dependency_parts->FindArcs(m); + const std::vector& previous_parts = + dependency_parts->FindArcs(s); + for (int j = 0; j < current_parts.size(); ++j) { + DependencyLabelerPartArc *current_part = + static_cast( + (*dependency_parts)[current_parts[j]]); + for (int k = 0; k < previous_parts.size(); ++k) { + DependencyLabelerPartArc *previous_part = + static_cast( + (*dependency_parts)[previous_parts[k]]); + // TODO: Don't create a bigram part if this bigram is not allowed. + Part *part = dependency_parts-> + CreatePartSibling(h, m, s, current_part->label(), + previous_part->label()); + dependency_parts->push_back(part); + if (make_gold) { + gold_outputs->push_back( + (*gold_outputs)[current_parts[j]] * + (*gold_outputs)[previous_parts[k]]); + } + } + } + } + + // Final position. + m = siblings[h][siblings[h].size() - 1]; + const std::vector& final_parts = + dependency_parts->FindArcs(m); + for (int j = 0; j < final_parts.size(); ++j) { + DependencyLabelerPartArc *final_part = + static_cast( + (*dependency_parts)[final_parts[j]]); + // TODO: Don't create a bigram part if this bigram is not allowed. + Part *part = dependency_parts-> + CreatePartSibling(h, -1, m, -1, final_part->label()); + dependency_parts->push_back(part); + if (make_gold) { + gold_outputs->push_back((*gold_outputs)[final_parts[j]]); + } + } + } + + dependency_parts->SetOffsetSibling( + num_parts_initial, + dependency_parts->size() - num_parts_initial); + //LOG(INFO) << "End MakeSiblingParts"; +} + +void DependencyLabelerPipe::MakeSelectedFeatures( + Instance *instance, + Parts *parts, + const std::vector& selected_parts, + Features *features) { + //LOG(INFO) << "MakeSelectedFeatures"; + DependencyInstanceNumeric *sentence = + static_cast(instance); + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyLabelerFeatures *dependency_features = + static_cast(features); + int sentence_length = sentence->size(); + + // TODO(atm): make this computation of descendents be part of + // DependencyInstanceNumeric or a class that derives from it. + std::vector > descendents; + const std::vector &heads = sentence->GetHeads(); + ComputeDescendents(heads, &descendents); + + const std::vector > &siblings = dependency_parts->siblings(); + dependency_features->Initialize(instance, parts, siblings); + + // Build features for arcs/siblings only. They will later be conjoined with + // the tags. + for (int m = 1; m < sentence_length; ++m) { + dependency_features->AddArcFeatures(sentence, descendents, + siblings, m); + } + + // Make sibling parts. + if (GetDependencyLabelerOptions()->use_sibling_parts()) { + for (int h = 0; h < sentence_length; ++h) { + if (siblings[h].size() == 0) continue; + for (int i = 0; i < siblings[h].size() + 1; ++i) { + dependency_features->AddSiblingFeatures(sentence, descendents, + siblings, h, i); + } + } + } + //LOG(INFO) << "End MakeSelectedFeatures"; +} + +void DependencyLabelerPipe::LabelInstance(Parts *parts, + const std::vector &output, + Instance *instance) { + DependencyLabelerParts *dependency_parts = + static_cast(parts); + DependencyInstance *dependency_instance = + static_cast(instance); + int instance_length = dependency_instance->size(); + for (int m = 0; m < instance_length; ++m) { + dependency_instance->SetHead(m, -1); + dependency_instance->SetDependencyRelation(m, "NULL"); + } + double threshold = 0.5; + + int offset, num_labeled_arcs; + dependency_parts->GetOffsetArc(&offset, &num_labeled_arcs); + for (int r = 0; r < num_labeled_arcs; ++r) { + DependencyLabelerPartArc *arc = + static_cast((*dependency_parts)[offset + r]); + if (output[offset + r] >= threshold) { + dependency_instance->SetHead(arc->modifier(), arc->head()); + dependency_instance->SetDependencyRelation(arc->modifier(), + GetDependencyDictionary()-> + GetLabelName(arc->label())); + } + } + + for (int m = 1; m < instance_length; ++m) { + if (dependency_instance->GetHead(m) < 0) { + VLOG(2) << "Word without head."; + dependency_instance->SetHead(m, 0); + dependency_instance->SetDependencyRelation(m, + GetDependencyDictionary()->GetLabelName(0)); + } + } +} + +void DependencyLabelerPipe::ComputeDescendents( + const std::vector &heads, + std::vector >* descendents) const { + //LOG(INFO) << "Computing descendents"; + descendents->resize(heads.size()); + for (int h = 0; h < descendents->size(); ++h) { + (*descendents)[h].clear(); + } + for (int m = 1; m < heads.size(); ++m) { + (*descendents)[m].push_back(m); + std::vector ancestors; + GetAllAncestors(heads, m, &ancestors); + for (int k = 0; k < ancestors.size(); ++k) { + int h = ancestors[k]; + CHECK_GE(h, 0); + //LOG(INFO) << h << " " << descendents->size(); + (*descendents)[h].push_back(m); + } + } + //LOG(INFO) << "End computing descendents"; +} + +void DependencyLabelerPipe::GetAllAncestors(const std::vector &heads, + int descend, + std::vector* ancestors) const { + ancestors->clear(); + int h = heads[descend]; + while (h >= 0) { + ancestors->push_back(h); + h = heads[h]; + } +} diff --git a/src/entity_recognizer/EntityOptions.cpp b/src/entity_recognizer/EntityOptions.cpp index e2d4ec1..c330cb3 100644 --- a/src/entity_recognizer/EntityOptions.cpp +++ b/src/entity_recognizer/EntityOptions.cpp @@ -1,95 +1,100 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "EntityOptions.h" -#include "SerializationUtils.h" -#include - -using namespace std; - -// TODO: Implement the reader for "text". -DEFINE_string(entity_file_format, "conll", - "Format of the input file containing the data. Use ""conll"" for " - "the format used in CONLL-X, and ""text"" for tokenized" - "sentences (one per line, with tokens separated " - "by white-spaces."); -DEFINE_string(entity_tagging_scheme, "bio", - "The encoding scheme to represent entity spans as tags. Either " - """io"", ""bio"", or ""bilou""."); -DEFINE_string(entity_file_gazetteer, "", - "Path to a gazetteer file (one entity per line with the " - "corresponding class, separated by tabs."); -DEFINE_int32(entity_recognizer_large_feature_set, 3, - "The greater the value, the larger feature set used. Taggers are " - "usually more accurate but slower and have a larger memory footprint."); -DEFINE_bool(entity_gazetteer_case_sensitive, true, - "Distinguish upper/lower case of gazetteers words"); - -// Save current option flags to the model file. -void EntityOptions::Save(FILE* fs) { - SequenceOptions::Save(fs); - - bool success; - success = WriteString(fs, tagging_scheme_name_); - CHECK(success); - success = WriteInteger(fs, large_feature_set_); - CHECK(success); - success = WriteBool(fs, gazetteer_case_sensitive_); - CHECK(success); -} - -// Load current option flags to the model file. -// Note: this will override the user-specified flags. -void EntityOptions::Load(FILE* fs) { - SequenceOptions::Load(fs); - - bool success; - success = ReadString(fs, &FLAGS_entity_tagging_scheme); - CHECK(success); - LOG(INFO) << "Setting --entity_tagging_scheme=" - << FLAGS_entity_tagging_scheme; - success = ReadInteger(fs, &FLAGS_entity_recognizer_large_feature_set); - CHECK(success); - LOG(INFO) << "Setting --entity_recognizer_large_feature_set=" - << FLAGS_entity_recognizer_large_feature_set; - success = ReadBool(fs, &FLAGS_entity_gazetteer_case_sensitive); - CHECK(success); - LOG(INFO) << "Setting --entity_gazetteer_case_sensitive=" - << FLAGS_entity_gazetteer_case_sensitive; - - Initialize(); -} - -void EntityOptions::Initialize() { - SequenceOptions::Initialize(); - - file_format_ = FLAGS_entity_file_format; - file_gazetteer_ = FLAGS_entity_file_gazetteer; - tagging_scheme_name_ = FLAGS_entity_tagging_scheme; - if (tagging_scheme_name_ == "io") { - tagging_scheme_ = EntityTaggingSchemes::IO; - } else if (tagging_scheme_name_ == "bio") { - tagging_scheme_ = EntityTaggingSchemes::BIO; - } else if (tagging_scheme_name_ == "bilou") { - tagging_scheme_ = EntityTaggingSchemes::BILOU; - } else { - CHECK(false) << "Unknown entity scheme: " << tagging_scheme_name_; - } - large_feature_set_ = FLAGS_entity_recognizer_large_feature_set; - gazetteer_case_sensitive_ = FLAGS_entity_gazetteer_case_sensitive; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "EntityOptions.h" +#include "Pipe.h" +#include "SerializationUtils.h" +#include + +using namespace std; + +// TODO: Implement the reader for "text". +DEFINE_string(entity_file_format, "conll", + "Format of the input file containing the data. Use ""conll"" for " + "the format used in CONLL-X, and ""text"" for tokenized" + "sentences (one per line, with tokens separated " + "by white-spaces."); +DEFINE_string(entity_tagging_scheme, "bio", + "The encoding scheme to represent entity spans as tags. Either " + """io"", ""bio"", or ""bilou""."); +DEFINE_string(entity_file_gazetteer, "", + "Path to a gazetteer file (one entity per line with the " + "corresponding class, separated by tabs."); +DEFINE_int32(entity_recognizer_large_feature_set, 3, + "The greater the value, the larger feature set used. Taggers are " + "usually more accurate but slower and have a larger memory footprint."); +DEFINE_bool(entity_gazetteer_case_sensitive, true, + "Distinguish upper/lower case of gazetteers words"); + +// Save current option flags to the model file. +void EntityOptions::Save(FILE* fs) { + SequenceOptions::Save(fs); + + bool success; + success = WriteString(fs, tagging_scheme_name_); + CHECK(success); + success = WriteInteger(fs, large_feature_set_); + CHECK(success); + success = WriteBool(fs, gazetteer_case_sensitive_); + CHECK(success); +} + +// Load current option flags to the model file. +// Note: this will override the user-specified flags. +void EntityOptions::Load(FILE* fs) { + SequenceOptions::Load(fs); + + bool success; + + success = ReadString(fs, &FLAGS_entity_tagging_scheme); + CHECK(success); + LOG(INFO) << "Setting --entity_tagging_scheme=" + << FLAGS_entity_tagging_scheme; + + if (pipe_ != nullptr && pipe_->GetModelVersion() >= 200030001) { + success = ReadInteger(fs, &FLAGS_entity_recognizer_large_feature_set); + CHECK(success); + LOG(INFO) << "Setting --entity_recognizer_large_feature_set=" + << FLAGS_entity_recognizer_large_feature_set; + + success = ReadBool(fs, &FLAGS_entity_gazetteer_case_sensitive); + CHECK(success); + LOG(INFO) << "Setting --entity_gazetteer_case_sensitive=" + << FLAGS_entity_gazetteer_case_sensitive; + } + Initialize(); +} + +void EntityOptions::Initialize() { + SequenceOptions::Initialize(); + + file_format_ = FLAGS_entity_file_format; + file_gazetteer_ = FLAGS_entity_file_gazetteer; + tagging_scheme_name_ = FLAGS_entity_tagging_scheme; + if (tagging_scheme_name_ == "io") { + tagging_scheme_ = EntityTaggingSchemes::IO; + } else if (tagging_scheme_name_ == "bio") { + tagging_scheme_ = EntityTaggingSchemes::BIO; + } else if (tagging_scheme_name_ == "bilou") { + tagging_scheme_ = EntityTaggingSchemes::BILOU; + } else { + CHECK(false) << "Unknown entity scheme: " << tagging_scheme_name_; + } + large_feature_set_ = FLAGS_entity_recognizer_large_feature_set; + gazetteer_case_sensitive_ = FLAGS_entity_gazetteer_case_sensitive; +} diff --git a/src/parser/DependencyPipe.cpp b/src/parser/DependencyPipe.cpp index 2cf0cb8..7497092 100644 --- a/src/parser/DependencyPipe.cpp +++ b/src/parser/DependencyPipe.cpp @@ -47,15 +47,13 @@ void DependencyPipe::SaveModel(FILE* fs) { void DependencyPipe::LoadModel(FILE* fs) { bool success; - uint64_t model_check; - uint64_t model_version; - success = ReadUINT64(fs, &model_check); + success = ReadUINT64(fs, &model_check_); CHECK(success); - CHECK_EQ(model_check, kParserModelCheck) + CHECK_EQ(model_check_, kParserModelCheck) << "The model file is too old and not supported anymore."; - success = ReadUINT64(fs, &model_version); + success = ReadUINT64(fs, &model_version_); CHECK(success); - CHECK_GE(model_version, kOldestCompatibleParserModelVersion) + CHECK_GE(model_version_, kOldestCompatibleParserModelVersion) << "The model file is too old and not supported anymore."; delete token_dictionary_; CreateTokenDictionary(); @@ -1497,4 +1495,4 @@ void DependencyPipe::LabelInstance(Parts *parts, const vector &output, } } } -} +} diff --git a/src/semantic_parser/SemanticPipe.cpp b/src/semantic_parser/SemanticPipe.cpp index 286c7d2..af6ca50 100644 --- a/src/semantic_parser/SemanticPipe.cpp +++ b/src/semantic_parser/SemanticPipe.cpp @@ -1,1889 +1,1887 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "SemanticPipe.h" -#include -#include -#include -#include -#ifndef _WIN32 -#include -#else -#include -#endif -using namespace std; - -// Define the current model version and the oldest back-compatible version. -// The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". -const uint64_t kSemanticParserModelVersion = 200030000; -const uint64_t kOldestCompatibleSemanticParserModelVersion = 200030000; -const uint64_t kSemanticParserModelCheck = 1234567890; - -DEFINE_bool(use_only_labeled_arc_features, true, - "True for not using unlabeled arc features in addition to labeled ones."); -DEFINE_bool(use_only_labeled_sibling_features, false, //true, - "True for not using unlabeled sibling features in addition to labeled ones."); -DEFINE_bool(use_labeled_sibling_features, false, //true, - "True for using labels in sibling features."); - -void SemanticPipe::SaveModel(FILE* fs) { - bool success; - success = WriteUINT64(fs, kSemanticParserModelCheck); - CHECK(success); - success = WriteUINT64(fs, kSemanticParserModelVersion); - CHECK(success); - token_dictionary_->Save(fs); - dependency_dictionary_->Save(fs); - Pipe::SaveModel(fs); - pruner_parameters_->Save(fs); -} - -void SemanticPipe::LoadModel(FILE* fs) { - bool success; - uint64_t model_check; - uint64_t model_version; - success = ReadUINT64(fs, &model_check); - CHECK(success); - CHECK_EQ(model_check, kSemanticParserModelCheck) - << "The model file is too old and not supported anymore."; - success = ReadUINT64(fs, &model_version); - CHECK(success); - CHECK_GE(model_version, kOldestCompatibleSemanticParserModelVersion) - << "The model file is too old and not supported anymore."; - delete token_dictionary_; - CreateTokenDictionary(); - static_cast(dictionary_)-> - SetTokenDictionary(token_dictionary_); - token_dictionary_->Load(fs); - CreateDependencyDictionary(); - dependency_dictionary_->SetTokenDictionary(token_dictionary_); - static_cast(dictionary_)-> - SetDependencyDictionary(dependency_dictionary_); - dependency_dictionary_->Load(fs); - Pipe::LoadModel(fs); - pruner_parameters_->Load(fs); -} - -void SemanticPipe::LoadPrunerModel(FILE* fs) { - LOG(INFO) << "Loading pruner model..."; - // This will be ignored but must be passed to the pruner pipe constructor, - // so that when loading the pruner model the actual options are not - // overwritten. - SemanticOptions pruner_options; // = *options_; - SemanticPipe* pipe = new SemanticPipe(&pruner_options); - //SemanticPipe* pipe = new SemanticPipe(options_); - pipe->Initialize(); - pipe->LoadModel(fs); - delete pruner_parameters_; - pruner_parameters_ = pipe->parameters_; - pipe->parameters_ = NULL; - delete pipe; - LOG(INFO) << "Done."; -} - -void SemanticPipe::LoadPrunerModelByName(const string &model_name) { - FILE *fs = fopen(model_name.c_str(), "rb"); - CHECK(fs) << "Could not open pruner model file for reading: " << model_name; - LoadPrunerModel(fs); - fclose(fs); -} - -void SemanticPipe::PreprocessData() { - delete token_dictionary_; - CreateTokenDictionary(); - static_cast(dictionary_)->SetTokenDictionary(token_dictionary_); - static_cast(token_dictionary_)->Initialize(GetSemanticReader()); - delete dependency_dictionary_; - CreateDependencyDictionary(); - dependency_dictionary_->SetTokenDictionary(token_dictionary_); - static_cast(dictionary_)->SetDependencyDictionary(dependency_dictionary_); - dependency_dictionary_->CreateLabelDictionary(GetSemanticReader()); - static_cast(dictionary_)->CreatePredicateRoleDictionaries(GetSemanticReader()); -} - -void SemanticPipe::ComputeScores(Instance *instance, Parts *parts, - Features *features, - bool pruner, - vector *scores) { - Parameters *parameters; - SemanticDictionary *semantic_dictionary = - static_cast(dictionary_); - SemanticFeatures *semantic_features = - static_cast(features); - if (pruner) { - parameters = pruner_parameters_; - } else { - parameters = parameters_; - } - scores->resize(parts->size()); - SemanticParts *semantic_parts = static_cast(parts); - for (int r = 0; r < parts->size(); ++r) { - bool has_unlabeled_features = - (semantic_features->GetNumPartFeatures(r) > 0); - bool has_labeled_features = - (semantic_features->GetNumLabeledPartFeatures(r) > 0); - - if (pruner) CHECK((*parts)[r]->type() == SEMANTICPART_ARC || - (*parts)[r]->type() == SEMANTICPART_PREDICATE); - if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; - if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; - - // Compute scores for the unlabeled features. - if (has_unlabeled_features) { - const BinaryFeatures &part_features = - semantic_features->GetPartFeatures(r); - (*scores)[r] = parameters->ComputeScore(part_features); - } else { - (*scores)[r] = 0.0; - } - - // Compute scores for the labeled features. - if ((*parts)[r]->type() == SEMANTICPART_ARC && !pruner && - GetSemanticOptions()->labeled()) { - // Labeled arcs will be treated by looking at the unlabeled arcs and - // conjoining with the label. - CHECK(has_labeled_features); - SemanticPartArc *arc = static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->FindLabeledArcs(arc->predicate(), - arc->argument(), - arc->sense()); - vector allowed_labels(index_labeled_parts.size()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - CHECK_GE(index_labeled_parts[k], 0); - CHECK_LT(index_labeled_parts[k], parts->size()); - SemanticPartLabeledArc *labeled_arc = - static_cast( - (*parts)[index_labeled_parts[k]]); - CHECK(labeled_arc != NULL); - allowed_labels[k] = labeled_arc->role(); - } - vector label_scores; - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - parameters->ComputeLabelScores(part_features, allowed_labels, - &label_scores); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - (*scores)[index_labeled_parts[k]] = label_scores[k]; - } - } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && - has_labeled_features) { - // Labeled siblings will be treated by looking at the unlabeled ones and - // conjoining with the label. - CHECK(!pruner); - CHECK(GetSemanticOptions()->labeled()); - SemanticPartSibling *sibling = - static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->GetLabeledParts(r); - vector bigram_labels(index_labeled_parts.size()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - CHECK_GE(index_labeled_parts[k], 0); - CHECK_LT(index_labeled_parts[k], parts->size()); - SemanticPartLabeledSibling *labeled_sibling = - static_cast( - (*parts)[index_labeled_parts[k]]); - CHECK(labeled_sibling != NULL); - bigram_labels[k] = semantic_dictionary->GetRoleBigramLabel( - labeled_sibling->first_role(), - labeled_sibling->second_role()); - } - vector label_scores; - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - parameters->ComputeLabelScores(part_features, bigram_labels, - &label_scores); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - (*scores)[index_labeled_parts[k]] = label_scores[k]; - } - } - } -} - -void SemanticPipe::RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - bool pruner, - const vector &selected_parts, - Features *features) { - Parameters *parameters; - SemanticFeatures *semantic_features = - static_cast(features); - if (pruner) { - parameters = pruner_parameters_; - } else { - parameters = parameters_; - } - - for (int r = 0; r < parts->size(); ++r) { - // TODO: Make sure we can do this continue for the labeled parts... - if (!selected_parts[r]) continue; - - bool has_unlabeled_features = - (semantic_features->GetNumPartFeatures(r) > 0); - bool has_labeled_features = - (semantic_features->GetNumLabeledPartFeatures(r) > 0); - - if (pruner) CHECK((*parts)[r]->type() == SEMANTICPART_ARC || - (*parts)[r]->type() == SEMANTICPART_PREDICATE); - - // TODO(atm): I think this is handling the case there can be labeled - // features, but was never tested. - CHECK(!has_labeled_features); - - // Skip labeled arcs, as they use the features from unlabeled arcs. - if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; - if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; - - if (has_unlabeled_features) { - BinaryFeatures *part_features = - semantic_features->GetMutablePartFeatures(r); - int num_supported = 0; - for (int j = 0; j < part_features->size(); ++j) { - if (parameters->Exists((*part_features)[j])) { - (*part_features)[num_supported] = (*part_features)[j]; - ++num_supported; - } - } - part_features->resize(num_supported); - } - - if (has_labeled_features) { - BinaryFeatures *part_features = - semantic_features->GetMutableLabeledPartFeatures(r); - int num_supported = 0; - for (int j = 0; j < part_features->size(); ++j) { - if (parameters->ExistsLabeled((*part_features)[j])) { - (*part_features)[num_supported] = (*part_features)[j]; - ++num_supported; - } - } - part_features->resize(num_supported); - } - } -} - -void SemanticPipe::MakeGradientStep(Parts *parts, - Features *features, - double eta, - int iteration, - const vector &gold_output, - const vector &predicted_output) { - SemanticParts *semantic_parts = static_cast(parts); - SemanticDictionary *semantic_dictionary = - static_cast(dictionary_); - SemanticFeatures *semantic_features = - static_cast(features); - Parameters *parameters = GetTrainingParameters(); - - for (int r = 0; r < parts->size(); ++r) { - bool has_unlabeled_features = - (semantic_features->GetNumPartFeatures(r) > 0); - bool has_labeled_features = - (semantic_features->GetNumLabeledPartFeatures(r) > 0); - - if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; - if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; - - // Make updates for the unlabeled features. - if (has_unlabeled_features) { - if (predicted_output[r] != gold_output[r]) { - const BinaryFeatures &part_features = - semantic_features->GetPartFeatures(r); - parameters->MakeGradientStep(part_features, eta, iteration, - predicted_output[r] - gold_output[r]); - } - } - - // Make updates for the labeled features. - if ((*parts)[r]->type() == SEMANTICPART_ARC && has_labeled_features) { - // Labeled arcs will be treated by looking at the unlabeled arcs and - // conjoining with the label. - CHECK(has_labeled_features); - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - SemanticPartArc *arc = static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->FindLabeledArcs(arc->predicate(), - arc->argument(), - arc->sense()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(index_part, parts->size()); - SemanticPartLabeledArc *labeled_arc = - static_cast((*parts)[index_part]); - CHECK(labeled_arc != NULL); - double value = predicted_output[index_part] - gold_output[index_part]; - if (value != 0.0) { - parameters->MakeLabelGradientStep(part_features, eta, iteration, - labeled_arc->role(), - value); - } - } - } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && - has_labeled_features) { - // Labeled siblings will be treated by looking at the unlabeled ones and - // conjoining with the label. - CHECK(GetSemanticOptions()->labeled()); - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - SemanticPartSibling *sibling = - static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->GetLabeledParts(r); - vector bigram_labels(index_labeled_parts.size()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(index_part, parts->size()); - SemanticPartLabeledSibling *labeled_sibling = - static_cast( - (*parts)[index_part]); - CHECK(labeled_sibling != NULL); - int bigram_label = semantic_dictionary->GetRoleBigramLabel( - labeled_sibling->first_role(), - labeled_sibling->second_role()); - double value = predicted_output[index_part] - gold_output[index_part]; - if (value != 0.0) { - parameters->MakeLabelGradientStep(part_features, eta, iteration, - bigram_label, value); - } - } - } - } -} - -void SemanticPipe::TouchParameters(Parts *parts, Features *features, - const vector &selected_parts) { - SemanticParts *semantic_parts = static_cast(parts); - SemanticDictionary *semantic_dictionary = - static_cast(dictionary_); - SemanticFeatures *semantic_features = - static_cast(features); - Parameters *parameters = GetTrainingParameters(); - - for (int r = 0; r < parts->size(); ++r) { - // TODO: Make sure we can do this continue for the labeled parts... - if (!selected_parts[r]) continue; - - bool has_unlabeled_features = - (semantic_features->GetNumPartFeatures(r) > 0); - bool has_labeled_features = - (semantic_features->GetNumLabeledPartFeatures(r) > 0); - - if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; - if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; - - // Make updates for the unlabeled features. - if (has_unlabeled_features) { - const BinaryFeatures &part_features = - semantic_features->GetPartFeatures(r); - parameters->MakeGradientStep(part_features, 0.0, 0, 0.0); - } - - // Make updates for the labeled features. - if ((*parts)[r]->type() == SEMANTICPART_ARC && has_labeled_features) { - // Labeled arcs will be treated by looking at the unlabeled arcs and - // conjoining with the label. - CHECK(has_labeled_features); - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - SemanticPartArc *arc = static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->FindLabeledArcs(arc->predicate(), - arc->argument(), - arc->sense()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(index_part, parts->size()); - SemanticPartLabeledArc *labeled_arc = - static_cast((*parts)[index_part]); - CHECK(labeled_arc != NULL); - parameters->MakeLabelGradientStep(part_features, 0.0, 0, - labeled_arc->role(), 0.0); - } - } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && - has_labeled_features) { - // Labeled siblings will be treated by looking at the unlabeled ones and - // conjoining with the label. - CHECK(GetSemanticOptions()->labeled()); - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - SemanticPartSibling *sibling = - static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->GetLabeledParts(r); - vector bigram_labels(index_labeled_parts.size()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(index_part, parts->size()); - SemanticPartLabeledSibling *labeled_sibling = - static_cast( - (*parts)[index_part]); - CHECK(labeled_sibling != NULL); - int bigram_label = semantic_dictionary->GetRoleBigramLabel( - labeled_sibling->first_role(), - labeled_sibling->second_role()); - parameters->MakeLabelGradientStep(part_features, 0.0, 0, - bigram_label, 0.0); - } - } - } -} - -void SemanticPipe::MakeFeatureDifference(Parts *parts, - Features *features, - const vector &gold_output, - const vector &predicted_output, - FeatureVector *difference) { - SemanticParts *semantic_parts = static_cast(parts); - SemanticDictionary *semantic_dictionary = - static_cast(dictionary_); - SemanticFeatures *semantic_features = - static_cast(features); - - for (int r = 0; r < parts->size(); ++r) { - bool has_unlabeled_features = - (semantic_features->GetNumPartFeatures(r) > 0); - bool has_labeled_features = - (semantic_features->GetNumLabeledPartFeatures(r) > 0); - - if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; - if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; - - // Compute feature difference for the unlabeled features. - if (has_unlabeled_features) { - if (predicted_output[r] != gold_output[r]) { - const BinaryFeatures &part_features = - semantic_features->GetPartFeatures(r); - for (int j = 0; j < part_features.size(); ++j) { - difference->mutable_weights()->Add(part_features[j], - predicted_output[r] - - gold_output[r]); - } - } - } - - // Make updates for the labeled features. - if ((*parts)[r]->type() == SEMANTICPART_ARC && has_labeled_features) { - // Labeled arcs will be treated by looking at the unlabeled arcs and - // conjoining with the label. - CHECK(has_labeled_features); - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - SemanticPartArc *arc = static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->FindLabeledArcs(arc->predicate(), - arc->argument(), - arc->sense()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(index_part, parts->size()); - SemanticPartLabeledArc *labeled_arc = - static_cast((*parts)[index_part]); - CHECK(labeled_arc != NULL); - double value = predicted_output[index_part] - gold_output[index_part]; - if (value != 0.0) { - for (int j = 0; j < part_features.size(); ++j) { - difference->mutable_labeled_weights()->Add(part_features[j], - labeled_arc->role(), - value); - } - } - } - } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && - has_labeled_features) { - // Labeled siblings will be treated by looking at the unlabeled ones and - // conjoining with the label. - CHECK(GetSemanticOptions()->labeled()); - const BinaryFeatures &part_features = - semantic_features->GetLabeledPartFeatures(r); - SemanticPartSibling *sibling = - static_cast((*parts)[r]); - const vector &index_labeled_parts = - semantic_parts->GetLabeledParts(r); - vector bigram_labels(index_labeled_parts.size()); - for (int k = 0; k < index_labeled_parts.size(); ++k) { - int index_part = index_labeled_parts[k]; - CHECK_GE(index_part, 0); - CHECK_LT(index_part, parts->size()); - SemanticPartLabeledSibling *labeled_sibling = - static_cast( - (*parts)[index_part]); - CHECK(labeled_sibling != NULL); - int bigram_label = semantic_dictionary->GetRoleBigramLabel( - labeled_sibling->first_role(), - labeled_sibling->second_role()); - double value = predicted_output[index_part] - gold_output[index_part]; - if (value != 0.0) { - for (int j = 0; j < part_features.size(); ++j) { - difference->mutable_labeled_weights()->Add(part_features[j], - bigram_label, - value); - } - } - } - } - } -} - -void SemanticPipe::MakeParts(Instance *instance, - Parts *parts, - vector *gold_outputs) { - int sentence_length = - static_cast(instance)->size(); - SemanticParts *semantic_parts = static_cast(parts); - semantic_parts->Initialize(); - bool make_gold = (gold_outputs != NULL); - if (make_gold) gold_outputs->clear(); - - if (train_pruner_) { - // For the pruner, make only unlabeled arc-factored and predicate parts and - // compute indices. - MakePartsBasic(instance, false, parts, gold_outputs); - semantic_parts->BuildOffsets(); - semantic_parts->BuildIndices(sentence_length, false); - } else { - // Make arc-factored and predicate parts and compute indices. - MakePartsBasic(instance, parts, gold_outputs); - semantic_parts->BuildOffsets(); - semantic_parts->BuildIndices(sentence_length, - GetSemanticOptions()->labeled()); - - // Make global parts. - MakePartsGlobal(instance, parts, gold_outputs); - semantic_parts->BuildOffsets(); - } -} - -void SemanticPipe::MakePartsBasic(Instance *instance, - Parts *parts, - vector *gold_outputs) { - int sentence_length = - static_cast(instance)->size(); - SemanticParts *semantic_parts = static_cast(parts); - - MakePartsBasic(instance, false, parts, gold_outputs); - semantic_parts->BuildOffsets(); - semantic_parts->BuildIndices(sentence_length, false); - - // Prune using a basic first-order model. - if (GetSemanticOptions()->prune_basic()) { - if (options_->train()) { - Prune(instance, parts, gold_outputs, true); - } else { - Prune(instance, parts, gold_outputs, false); - } - semantic_parts->BuildOffsets(); - semantic_parts->BuildIndices(sentence_length, false); - } - - if (GetSemanticOptions()->labeled()) { - MakePartsBasic(instance, true, parts, gold_outputs); - } -} - -void SemanticPipe::MakePartsBasic(Instance *instance, - bool add_labeled_parts, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - bool prune_labels = semantic_options->prune_labels(); - bool prune_labels_with_relation_paths = - semantic_options->prune_labels_with_relation_paths(); - bool prune_labels_with_senses = semantic_options->prune_labels_with_senses(); - bool prune_distances = semantic_options->prune_distances(); - bool allow_self_loops = semantic_options->allow_self_loops(); - bool allow_root_predicate = semantic_options->allow_root_predicate(); - bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); - bool use_predicate_senses = semantic_options->use_predicate_senses(); - vector allowed_labels; - - if (add_labeled_parts && !prune_labels) { - allowed_labels.resize(semantic_dictionary->GetRoleAlphabet().size()); - for (int i = 0; i < allowed_labels.size(); ++i) { - allowed_labels[i] = i; - } - } - - // Add predicate parts. - int num_parts_initial = semantic_parts->size(); - if (!add_labeled_parts) { - for (int p = 0; p < sentence_length; ++p) { - if (p == 0 && !allow_root_predicate) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int s = 0; s < predicates->size(); ++s) { - Part *part = semantic_parts->CreatePartPredicate(p, s); - semantic_parts->AddPart(part); - if (make_gold) { - bool is_gold = false; - int k = sentence->FindPredicate(p); - if (k >= 0) { - int predicate_id = sentence->GetPredicateId(k); - if (!use_predicate_senses) { - CHECK_EQ((*predicates)[s]->id(), PREDICATE_UNKNOWN); - } - if (predicate_id < 0 || (*predicates)[s]->id() == predicate_id) { - is_gold = true; - } - } - if (is_gold) { - gold_outputs->push_back(1.0); - } else { - gold_outputs->push_back(0.0); - } - } - } - } - - // Compute offsets for predicate parts. - semantic_parts->SetOffsetPredicate(num_parts_initial, - semantic_parts->size() - num_parts_initial); - } - - // Add unlabeled/labeled arc parts. - num_parts_initial = semantic_parts->size(); - for (int p = 0; p < sentence_length; ++p) { - if (p == 0 && !allow_root_predicate) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int a = 1; a < sentence_length; ++a) { - if (!allow_self_loops && p == a) continue; - for (int s = 0; s < predicates->size(); ++s) { - int arc_index = -1; - if (add_labeled_parts) { - // If no unlabeled arc is there, just skip it. - // This happens if that arc was pruned out. - arc_index = semantic_parts->FindArc(p, a, s); - if (0 > arc_index) { - continue; - } - } else { - if (prune_distances) { - int predicate_pos_id = sentence->GetPosId(p); - int argument_pos_id = sentence->GetPosId(a); - if (p < a) { - // Right attachment. - if (a - p > semantic_dictionary->GetMaximumRightDistance - (predicate_pos_id, argument_pos_id)) continue; - } else { - // Left attachment. - if (p - a > semantic_dictionary->GetMaximumLeftDistance - (predicate_pos_id, argument_pos_id)) continue; - } - } - } - - if (prune_labels_with_relation_paths) { - int relation_path_id = sentence->GetRelationPathId(p, a); - allowed_labels.clear(); - if (relation_path_id >= 0 && - relation_path_id < semantic_dictionary-> - GetRelationPathAlphabet().size()) { - allowed_labels = semantic_dictionary-> - GetExistingRolesWithRelationPath(relation_path_id); - //LOG(INFO) << "Path: " << relation_path_id << " Roles: " << allowed_labels.size(); - } - set label_set; - for (int m = 0; m < allowed_labels.size(); ++m) { - if (!prune_labels_with_senses || - (*predicates)[s]->HasRole(allowed_labels[m])) { - label_set.insert(allowed_labels[m]); - } - } - allowed_labels.clear(); - for (set::iterator it = label_set.begin(); - it != label_set.end(); ++it) { - allowed_labels.push_back(*it); - } - if (!add_labeled_parts && allowed_labels.empty()) { - continue; - } - } else if (prune_labels) { - // TODO: allow both kinds of label pruning simultaneously? - int predicate_pos_id = sentence->GetPosId(p); - int argument_pos_id = sentence->GetPosId(a); - allowed_labels.clear(); - allowed_labels = semantic_dictionary-> - GetExistingRoles(predicate_pos_id, argument_pos_id); - set label_set; - for (int m = 0; m < allowed_labels.size(); ++m) { - if (!prune_labels_with_senses || - (*predicates)[s]->HasRole(allowed_labels[m])) { - label_set.insert(allowed_labels[m]); - } - } - allowed_labels.clear(); - for (set::iterator it = label_set.begin(); - it != label_set.end(); ++it) { - allowed_labels.push_back(*it); - } - if (!add_labeled_parts && allowed_labels.empty()) { - continue; - } - } - - // Add parts for labeled/unlabeled arcs. - if (add_labeled_parts) { - // If there is no allowed label for this arc, but the unlabeled arc was added, - // then it was forced to be present for some reason (e.g. to maintain connectivity of the - // graph). In that case (which should be pretty rare) consider all the - // possible labels. - if (allowed_labels.empty()) { - allowed_labels.resize(semantic_dictionary->GetRoleAlphabet().size()); - for (int role = 0; role < allowed_labels.size(); ++role) { - allowed_labels[role] = role; - } - } - - for (int m = 0; m < allowed_labels.size(); ++m) { - int role = allowed_labels[m]; - if (prune_labels && prune_labels_with_senses) { - CHECK((*predicates)[s]->HasRole(role)); - } - Part *part = semantic_parts->CreatePartLabeledArc(p, a, s, role); - CHECK_GE(arc_index, 0); - semantic_parts->AddLabeledPart(part, arc_index); - if (make_gold) { - int k = sentence->FindPredicate(p); - int l = sentence->FindArc(p, a); - bool is_gold = false; - - if (k >= 0 && l >= 0) { - int predicate_id = sentence->GetPredicateId(k); - int argument_id = sentence->GetArgumentRoleId(k, l); - if (!use_predicate_senses) { - CHECK_EQ((*predicates)[s]->id(), PREDICATE_UNKNOWN); - } - //if (use_predicate_senses) CHECK_LT(predicate_id, 0); - if ((predicate_id < 0 || - (*predicates)[s]->id() == predicate_id) && - role == argument_id) { - is_gold = true; - } - } - if (is_gold) { - gold_outputs->push_back(1.0); - } else { - gold_outputs->push_back(0.0); - } - } - } - } else { - Part *part = semantic_parts->CreatePartArc(p, a, s); - semantic_parts->AddPart(part); - if (make_gold) { - int k = sentence->FindPredicate(p); - int l = sentence->FindArc(p, a); - bool is_gold = false; - if (k >= 0 && l >= 0) { - int predicate_id = sentence->GetPredicateId(k); - if (!use_predicate_senses) { - CHECK_EQ((*predicates)[s]->id(), PREDICATE_UNKNOWN); - } - if (predicate_id < 0 || (*predicates)[s]->id() == predicate_id) { - is_gold = true; - } - } - if (is_gold) { - gold_outputs->push_back(1.0); - } else { - gold_outputs->push_back(0.0); - } - } - } - } - } - } - - // Compute offsets for labeled/unlabeled arcs. - if (!add_labeled_parts) { - semantic_parts->SetOffsetArc(num_parts_initial, - semantic_parts->size() - num_parts_initial); - } else { - semantic_parts->SetOffsetLabeledArc(num_parts_initial, - semantic_parts->size() - num_parts_initial); - } -} - -void SemanticPipe::MakePartsArbitrarySiblings(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - //bool allow_self_loops = semantic_options->allow_self_loops(); - bool allow_root_predicate = semantic_options->allow_root_predicate(); - bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); - bool use_predicate_senses = semantic_options->use_predicate_senses(); - - // Siblings: (p,s,a1) and (p,s,a2). - for (int p = 0; p < sentence_length; ++p) { - if (p == 0 && !allow_root_predicate) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int s = 0; s < predicates->size(); ++s) { - for (int a1 = 1; a1 < sentence_length; ++a1) { - int r1 = semantic_parts->FindArc(p, a1, s); - if (r1 < 0) continue; - for (int a2 = a1 + 1; a2 < sentence_length; ++a2) { - int r2 = semantic_parts->FindArc(p, a2, s); - if (r2 < 0) continue; - Part *part = semantic_parts->CreatePartSibling(p, s, a1, a2); - semantic_parts->AddPart(part); - if (make_gold) { - // Logical AND of the two individual arcs. - gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); - } - } - } - } - } -} - -void SemanticPipe::MakePartsLabeledArbitrarySiblings(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - - int offset, size; - semantic_parts->GetOffsetSibling(&offset, &size); - for (int r = offset; r < offset + size; ++r) { - SemanticPartSibling *sibling = - static_cast((*semantic_parts)[r]); - int p = sibling->predicate(); - int s = sibling->sense(); - int a1 = sibling->first_argument(); - int a2 = sibling->second_argument(); - const vector &labeled_first_arc_indices = - semantic_parts->FindLabeledArcs(p, a1, s); - const vector &labeled_second_arc_indices = - semantic_parts->FindLabeledArcs(p, a2, s); - for (int k = 0; k < labeled_first_arc_indices.size(); ++k) { - int r1 = labeled_first_arc_indices[k]; - SemanticPartLabeledArc *first_labeled_arc = - static_cast((*semantic_parts)[r1]); - int first_role = first_labeled_arc->role(); - for (int l = 0; l < labeled_second_arc_indices.size(); ++l) { - int r2 = labeled_second_arc_indices[l]; - SemanticPartLabeledArc *second_labeled_arc = - static_cast((*semantic_parts)[r2]); - int second_role = second_labeled_arc->role(); - // To keep the number of parts manageable, only create parts for: - // - same role (a1 == a2); - // - frequent role pairs. - if (first_role != second_role && - !semantic_dictionary->IsFrequentRolePair(first_role, second_role)) { - continue; - } - Part *part = semantic_parts->CreatePartLabeledSibling(p, s, a1, a2, - first_role, - second_role); - semantic_parts->AddLabeledPart(part, r); - if (make_gold) { - // Logical AND of the two individual labeled arcs. - gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); - } - } - } - } -} - -void SemanticPipe::MakePartsConsecutiveSiblings(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - //bool allow_self_loops = semantic_options->allow_self_loops(); - bool allow_root_predicate = semantic_options->allow_root_predicate(); - bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); - bool use_predicate_senses = semantic_options->use_predicate_senses(); - - // Find the predicate parts (necessary to identify the gold predicate senses). - // TODO: Replace this by semantic_parts->GetPredicateSenses(p) or something? - int offset_predicate_parts, num_predicate_parts; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - vector > predicate_part_indices(sentence_length); - for (int r = 0; r < num_predicate_parts; ++r) { - SemanticPartPredicate* predicate_part = - static_cast((*parts)[offset_predicate_parts + r]); - predicate_part_indices[predicate_part->predicate()]. - push_back(offset_predicate_parts + r); - } - - // Consecutive siblings: (p,s,a1) and (p,s,a2). - for (int p = 0; p < sentence_length; ++p) { - if (p == 0 && !allow_root_predicate) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - //const vector &senses = semantic_parts->GetSenses(p); - //CHECK_EQ(senses.size(), predicates->size()); - for (int s = 0; s < predicates->size(); ++s) { - bool sense_active; - bool first_arc_active; - bool second_arc_active = false; - bool arc_between; - - // Check if this is the correct sense. - if (make_gold) { - //int r = senses[s]; - int r = -1; - for (int k = 0; k < predicate_part_indices[p].size(); ++k) { - r = predicate_part_indices[p][k]; - SemanticPartPredicate* predicate_part = - static_cast((*parts)[r]); - if (predicate_part->sense() == s) break; - } - CHECK_GE(r, 0); - if (r >= 0 && NEARLY_EQ_TOL((*gold_outputs)[r], 1.0, 1e-9)) { - sense_active = true; - } else { - sense_active = false; - } - } - - // Right side. - // Allow self loops (a1 = p). We use a1 = p-1 to denote the special case - // in which a2 is the first argument. - for (int a1 = p - 1; a1 < sentence_length; ++a1) { - int r1 = -1; - if (a1 >= p) { - r1 = semantic_parts->FindArc(p, a1, s); - if (r1 < 0) continue; - } - - if (make_gold) { - // Check if the first arc is active. - if (a1 < p || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { - first_arc_active = true; - } else { - first_arc_active = false; - } - arc_between = false; - } - - for (int a2 = a1 + 1; a2 <= sentence_length; ++a2) { - int r2 = -1; - if (a2 < sentence_length) { - r2 = semantic_parts->FindArc(p, a2, s); - if (r2 < 0) continue; - } - if (make_gold) { - // Check if the second arc is active. - if (a2 == sentence_length || - NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { - second_arc_active = true; - } else { - second_arc_active = false; - } - } - - Part *part = (a1 >= p) ? - semantic_parts->CreatePartConsecutiveSibling(p, s, a1, a2) : - semantic_parts->CreatePartConsecutiveSibling(p, s, -1, a2); - semantic_parts->AddPart(part); - - if (make_gold) { - double value = 0.0; - if (sense_active && first_arc_active && second_arc_active && - !arc_between) { - value = 1.0; - arc_between = true; - } - gold_outputs->push_back(value); - } - } - } - - // Left side. - // NOTE: Self loops (a1 = p) are disabled on the left side, to prevent - // having repeated parts. We use a1 = p+1 to denote the special case - // in which a2 is the first argument. - for (int a1 = p + 1; a1 >= 0; --a1) { - int r1 = -1; - if (a1 <= p) { - r1 = semantic_parts->FindArc(p, a1, s); - if (r1 < 0) continue; - } - if (a1 == p) continue; // See NOTE above. - - if (make_gold) { - // Check if the first arc is active. - if (a1 > p || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { - first_arc_active = true; - } else { - first_arc_active = false; - } - arc_between = false; - } - - for (int a2 = a1 - 1; a2 >= -1; --a2) { - int r2 = -1; - if (a2 > -1) { - r2 = semantic_parts->FindArc(p, a2, s); - if (r2 < 0) continue; - } - if (a2 == p) continue; // See NOTE above. - - if (make_gold) { - // Check if the second arc is active. - if (a2 == -1 || - NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { - second_arc_active = true; - } else { - second_arc_active = false; - } - } - - Part *part = (a1 <= p) ? - semantic_parts->CreatePartConsecutiveSibling(p, s, a1, a2) : - semantic_parts->CreatePartConsecutiveSibling(p, s, -1, a2); - semantic_parts->AddPart(part); - - if (make_gold) { - double value = 0.0; - if (sense_active && first_arc_active && second_arc_active && - !arc_between) { - value = 1.0; - arc_between = true; - } - gold_outputs->push_back(value); - } - } - } - } - } -} - -void SemanticPipe::MakePartsGrandparents(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - //bool allow_self_loops = semantic_options->allow_self_loops(); - bool allow_root_predicate = semantic_options->allow_root_predicate(); - bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); - bool use_predicate_senses = semantic_options->use_predicate_senses(); - - // Grandparents: (g,t,p) and (p,s,a). - for (int g = 0; g < sentence_length; ++g) { - if (g == 0 && !allow_root_predicate) continue; - int lemma_id_g = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id_g = sentence->GetLemmaId(g); - CHECK_GE(lemma_id_g, 0); - } - const vector *predicates_g = - &semantic_dictionary->GetLemmaPredicates(lemma_id_g); - if (predicates_g->size() == 0 && allow_unseen_predicates) { - predicates_g = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int t = 0; t < predicates_g->size(); ++t) { - for (int p = 1; p < sentence_length; ++p) { - int r1 = semantic_parts->FindArc(g, p, t); - if (r1 < 0) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int s = 0; s < predicates->size(); ++s) { - for (int a = 1; a < sentence_length; ++a) { - int r2 = semantic_parts->FindArc(p, a, s); - if (r2 < 0) continue; - Part *part = semantic_parts->CreatePartGrandparent(g, t, p, s, a); - semantic_parts->AddPart(part); - if (make_gold) { - // Logical AND of the two individual arcs. - gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); - } - } - } - } - } - } -} - -void SemanticPipe::MakePartsCoparents(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - //bool allow_self_loops = semantic_options->allow_self_loops(); - bool allow_root_predicate = semantic_options->allow_root_predicate(); - bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); - bool use_predicate_senses = semantic_options->use_predicate_senses(); - - // Co-parents: (p1,s1,a) and (p2,s2,a). - // First predicate. - for (int p1 = 0; p1 < sentence_length; ++p1) { - if (p1 == 0 && !allow_root_predicate) continue; - int lemma_id_p1 = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id_p1 = sentence->GetLemmaId(p1); - CHECK_GE(lemma_id_p1, 0); - } - const vector *predicates_p1 = - &semantic_dictionary->GetLemmaPredicates(lemma_id_p1); - if (predicates_p1->size() == 0 && allow_unseen_predicates) { - predicates_p1 = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int s1 = 0; s1 < predicates_p1->size(); ++s1) { - // Second predicate. - for (int p2 = p1 + 1; p2 < sentence_length; ++p2) { - int lemma_id_p2 = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id_p2 = sentence->GetLemmaId(p2); - CHECK_GE(lemma_id_p2, 0); - } - const vector *predicates_p2 = - &semantic_dictionary->GetLemmaPredicates(lemma_id_p2); - if (predicates_p2->size() == 0 && allow_unseen_predicates) { - predicates_p2 = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - for (int s2 = 0; s2 < predicates_p2->size(); ++s2) { - // Common argument. - for (int a = 1; a < sentence_length; ++a) { - int r1 = semantic_parts->FindArc(p1, a, s1); - if (r1 < 0) continue; - int r2 = semantic_parts->FindArc(p2, a, s2); - if (r2 < 0) continue; - Part *part = semantic_parts->CreatePartCoparent(p1, s1, p2, s2, a); - semantic_parts->AddPart(part); - if (make_gold) { - // Logical AND of the two individual arcs. - gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); - } - } - } - } - } - } -} - -void SemanticPipe::MakePartsConsecutiveCoparents(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - int sentence_length = sentence->size(); - bool make_gold = (gold_outputs != NULL); - SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); - SemanticOptions *semantic_options = GetSemanticOptions(); - //bool allow_self_loops = semantic_options->allow_self_loops(); - bool allow_root_predicate = semantic_options->allow_root_predicate(); - bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); - bool use_predicate_senses = semantic_options->use_predicate_senses(); - - // Consecutive co-parents: (p1,s1,a) and (p2,s2,a). - for (int a = 1; a < sentence_length; ++a) { - bool first_arc_active; - bool second_arc_active = false; - bool arc_between; - - // Right side. - // Allow self loops (p1 = a). We use p1 = a-1 to denote the special case - // in which p2 is the first predicate. - for (int p1 = a - 1; p1 < sentence_length; ++p1) { - int num_senses1; - if (p1 < a) { - // If p1 = a-1, pretend there is a single sense (s1=0). - num_senses1 = 1; - } else { - //const vector &senses = semantic_parts->GetSenses(p); - //CHECK_EQ(senses.size(), predicates->size()); - if (p1 == 0 && !allow_root_predicate) continue; // Never happens. - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p1); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - num_senses1 = predicates->size(); - } - - for (int s1 = 0; s1 < num_senses1; ++s1) { - int r1 = -1; - if (p1 >= a) { - r1 = semantic_parts->FindArc(p1, a, s1); - if (r1 < 0) continue; - } - - if (make_gold) { - // Check if the first arc is active. - if (p1 < a || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { - first_arc_active = true; - } else { - first_arc_active = false; - } - arc_between = false; - } - - for (int p2 = p1 + 1; p2 <= sentence_length; ++p2) { - int num_senses2; - if (p2 == sentence_length) { - // If p2 = sentence_length, pretend there is a single sense (s2=0). - num_senses2 = 1; - } else { - //const vector &senses = semantic_parts->GetSenses(p); - //CHECK_EQ(senses.size(), predicates->size()); - if (p2 == 0 && !allow_root_predicate) continue; // Never happens. - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p2); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - num_senses2 = predicates->size(); - } - - for (int s2 = 0; s2 < num_senses2; ++s2) { - int r2 = -1; - if (p2 < sentence_length) { - r2 = semantic_parts->FindArc(p2, a, s2); - if (r2 < 0) continue; - } - if (make_gold) { - // Check if the second arc is active. - if (p2 == sentence_length || - NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { - second_arc_active = true; - } else { - second_arc_active = false; - } - } - - Part *part = (p1 >= a) ? - semantic_parts->CreatePartConsecutiveCoparent(p1, s1, p2, s2, a) : - semantic_parts->CreatePartConsecutiveCoparent(-1, 0, p2, s2, a); - semantic_parts->AddPart(part); - - if (make_gold) { - double value = 0.0; - if (first_arc_active && second_arc_active && !arc_between) { - value = 1.0; - arc_between = true; - } - gold_outputs->push_back(value); - } - } - } - } - } - - // Left side. - // NOTE: Self loops (p1 = a) are disabled on the left side, to prevent - // having repeated parts. We use p1 = a+1 to denote the special case - // in which p2 is the first predicate. - for (int p1 = a + 1; p1 >= 0; --p1) { - int num_senses1; - if (p1 > a) { - // If p1 = a+1, pretend there is a single sense (s1=0). - num_senses1 = 1; - } else if (p1 == a) { // See NOTE above. - continue; - } else { - //const vector &senses = semantic_parts->GetSenses(p); - //CHECK_EQ(senses.size(), predicates->size()); - if (p1 == 0 && !allow_root_predicate) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p1); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - num_senses1 = predicates->size(); - } - - for (int s1 = 0; s1 < num_senses1; ++s1) { - int r1 = -1; - if (p1 <= a) { - r1 = semantic_parts->FindArc(p1, a, s1); - if (r1 < 0) continue; - } - if (p1 == a) continue; // See NOTE above. - - if (make_gold) { - // Check if the first arc is active. - if (p1 > a || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { - first_arc_active = true; - } else { - first_arc_active = false; - } - arc_between = false; - } - - for (int p2 = p1 - 1; p2 >= -1; --p2) { - int num_senses2; - if (p2 == -1) { - // If p2 = -1, pretend there is a single sense (s2=0). - num_senses2 = 1; - } else if (p2 == a) { // See NOTE above. - continue; - } else { - //const vector &senses = semantic_parts->GetSenses(p); - //CHECK_EQ(senses.size(), predicates->size()); - if (p2 == 0 && !allow_root_predicate) continue; - int lemma_id = TOKEN_UNKNOWN; - if (use_predicate_senses) { - lemma_id = sentence->GetLemmaId(p2); - CHECK_GE(lemma_id, 0); - } - const vector *predicates = - &semantic_dictionary->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && allow_unseen_predicates) { - predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); - } - num_senses2 = predicates->size(); - } - - for (int s2 = 0; s2 < num_senses2; ++s2) { - int r2 = -1; - if (p2 > -1) { - r2 = semantic_parts->FindArc(p2, a, s2); - if (r2 < 0) continue; - } - if (p2 == a) continue; // See NOTE above. - - if (make_gold) { - // Check if the second arc is active. - if (p2 == -1 || - NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { - second_arc_active = true; - } else { - second_arc_active = false; - } - } - - Part *part = (p1 <= a) ? - semantic_parts->CreatePartConsecutiveCoparent(p1, s1, p2, s2, a) : - semantic_parts->CreatePartConsecutiveCoparent(-1, 0, p2, s2, a); - semantic_parts->AddPart(part); - - if (make_gold) { - double value = 0.0; - if (first_arc_active && second_arc_active && !arc_between) { - value = 1.0; - arc_between = true; - } - gold_outputs->push_back(value); - } - } - } - } - } - } -} - -void SemanticPipe::MakePartsGlobal(Instance *instance, - Parts *parts, - vector *gold_outputs) { - SemanticOptions *semantic_options = GetSemanticOptions(); - SemanticParts *semantic_parts = static_cast(parts); - - int num_parts_initial = semantic_parts->size(); - if (semantic_options->use_arbitrary_siblings()) { - MakePartsArbitrarySiblings(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetSibling(num_parts_initial, - semantic_parts->size() - num_parts_initial); - //LOG(INFO) << "Num siblings: " << semantic_parts->size() - num_parts_initial; - - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_arbitrary_siblings() && - FLAGS_use_labeled_sibling_features) { - MakePartsLabeledArbitrarySiblings(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetLabeledSibling( - num_parts_initial, semantic_parts->size() - num_parts_initial); - //LOG(INFO) << "Num labeled siblings: " << semantic_parts->size() - num_parts_initial; - - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_consecutive_siblings()) { - MakePartsConsecutiveSiblings(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetConsecutiveSibling(num_parts_initial, - semantic_parts->size() - num_parts_initial); - - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_grandparents()) { - MakePartsGrandparents(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetGrandparent(num_parts_initial, - semantic_parts->size() - num_parts_initial); - - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_coparents()) { - MakePartsCoparents(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetCoparent(num_parts_initial, - semantic_parts->size() - num_parts_initial); - - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_consecutive_coparents()) { - MakePartsConsecutiveCoparents(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetConsecutiveCoparent(num_parts_initial, - semantic_parts->size() - num_parts_initial); - -#if 0 - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_grandsiblings()) { - MakePartsGrandSiblings(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetGrandSiblings(num_parts_initial, - semantic_parts->size() - num_parts_initial); - - num_parts_initial = semantic_parts->size(); - if (semantic_options->use_trisiblings()) { - MakePartsTriSiblings(instance, parts, gold_outputs); - } - semantic_parts->SetOffsetTriSiblings(num_parts_initial, - semantic_parts->size() - num_parts_initial); -#endif -} - -void SemanticPipe::MakeSelectedFeatures(Instance *instance, - Parts *parts, - bool pruner, - const vector& selected_parts, - Features *features) { - SemanticInstanceNumeric *sentence = - static_cast(instance); - SemanticParts *semantic_parts = static_cast(parts); - SemanticFeatures *semantic_features = - static_cast(features); - int sentence_length = sentence->size(); - - semantic_features->Initialize(instance, parts); - - // Build features for predicates. - int offset, size; - semantic_parts->GetOffsetPredicate(&offset, &size); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartPredicate *predicate_part = - static_cast((*semantic_parts)[r]); - // Get the predicate id for this part. - // TODO(atm): store this somewhere, so that we don't need to recompute this - // all the time. - int lemma_id = TOKEN_UNKNOWN; - if (GetSemanticOptions()->use_predicate_senses()) { - lemma_id = sentence->GetLemmaId(predicate_part->predicate()); - } - const vector *predicates = - &GetSemanticDictionary()->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && - GetSemanticOptions()->allow_unseen_predicates()) { - predicates = &GetSemanticDictionary()->GetLemmaPredicates(TOKEN_UNKNOWN); - } - int predicate_id = (*predicates)[predicate_part->sense()]->id(); - // Add the predicate features. - semantic_features->AddPredicateFeatures(sentence, r, - predicate_part->predicate(), - predicate_id); - } - - // Even in the case of labeled parsing, build features for unlabeled arcs - // only. They will later be conjoined with the labels. - semantic_parts->GetOffsetArc(&offset, &size); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartArc *arc = - static_cast((*semantic_parts)[r]); - // Get the predicate id for this part. - // TODO(atm): store this somewhere, so that we don't need to recompute this - // all the time. Maybe store this directly in arc->sense()? - int lemma_id = TOKEN_UNKNOWN; - if (GetSemanticOptions()->use_predicate_senses()) { - lemma_id = sentence->GetLemmaId(arc->predicate()); - } - const vector *predicates = - &GetSemanticDictionary()->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && - GetSemanticOptions()->allow_unseen_predicates()) { - predicates = &GetSemanticDictionary()->GetLemmaPredicates(TOKEN_UNKNOWN); - } - int predicate_id = (*predicates)[arc->sense()]->id(); - if (!pruner && GetSemanticOptions()->labeled()) { - semantic_features->AddLabeledArcFeatures(sentence, r, arc->predicate(), - arc->argument(), predicate_id); - if (!FLAGS_use_only_labeled_arc_features) { - semantic_features->AddArcFeatures(sentence, r, arc->predicate(), - arc->argument(), predicate_id); - } - } else { - semantic_features->AddArcFeatures(sentence, r, arc->predicate(), - arc->argument(), predicate_id); - } - } - - // Build features for arbitrary siblings. - semantic_parts->GetOffsetSibling(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartSibling *part = - static_cast((*semantic_parts)[r]); - CHECK_EQ(part->type(), SEMANTICPART_SIBLING); - if (FLAGS_use_labeled_sibling_features) { - semantic_features-> - AddArbitraryLabeledSiblingFeatures(sentence, r, - part->predicate(), - part->sense(), - part->first_argument(), - part->second_argument()); - if (!FLAGS_use_only_labeled_sibling_features) { - semantic_features->AddArbitrarySiblingFeatures(sentence, r, - part->predicate(), - part->sense(), - part->first_argument(), - part->second_argument()); - } - } else { - semantic_features->AddArbitrarySiblingFeatures(sentence, r, - part->predicate(), - part->sense(), - part->first_argument(), - part->second_argument()); - } - } - - // Build features for consecutive siblings. - semantic_parts->GetOffsetConsecutiveSibling(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartConsecutiveSibling *part = - static_cast((*semantic_parts)[r]); - CHECK_EQ(part->type(), SEMANTICPART_CONSECUTIVESIBLING); - semantic_features->AddConsecutiveSiblingFeatures( - sentence, r, - part->predicate(), - part->sense(), - part->first_argument(), - part->second_argument()); - } - - // Build features for grandparents. - semantic_parts->GetOffsetGrandparent(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartGrandparent *part = - static_cast((*semantic_parts)[r]); - CHECK_EQ(part->type(), SEMANTICPART_GRANDPARENT); - semantic_features->AddGrandparentFeatures(sentence, r, - part->grandparent_predicate(), - part->grandparent_sense(), - part->predicate(), - part->sense(), - part->argument()); - } - - // Build features for co-parents. - semantic_parts->GetOffsetCoparent(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartCoparent *part = - static_cast((*semantic_parts)[r]); - CHECK_EQ(part->type(), SEMANTICPART_COPARENT); - semantic_features->AddCoparentFeatures(sentence, r, - part->first_predicate(), - part->first_sense(), - part->second_predicate(), - part->second_sense(), - part->argument()); - } - - // Build features for consecutive co-parents. - semantic_parts->GetOffsetConsecutiveCoparent(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartConsecutiveCoparent *part = - static_cast((*semantic_parts)[r]); - CHECK_EQ(part->type(), SEMANTICPART_CONSECUTIVECOPARENT); - semantic_features->AddConsecutiveCoparentFeatures( - sentence, r, - part->first_predicate(), - part->first_sense(), - part->second_predicate(), - part->second_sense(), - part->argument()); - } - -#if 0 - // Build features for grand-siblings. - dependency_parts->GetOffsetGrandSibl(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartGrandSibl *part = - static_cast((*dependency_parts)[r]); - CHECK_EQ(part->type(), DEPENDENCYPART_GRANDSIBL); - CHECK_LE(part->modifier(), sentence_length); - CHECK_LE(part->sibling(), sentence_length); - dependency_features->AddGrandSiblingFeatures(sentence, r, - part->grandparent(), - part->head(), - part->modifier(), - part->sibling()); - } - - // Build features for tri-siblings. - dependency_parts->GetOffsetTriSibl(&offset, &size); - if (pruner) CHECK_EQ(size, 0); - for (int r = offset; r < offset + size; ++r) { - if (!selected_parts[r]) continue; - SemanticPartTriSibl *part = - static_cast((*dependency_parts)[r]); - CHECK_EQ(part->type(), DEPENDENCYPART_TRISIBL); - dependency_features->AddTriSiblingFeatures(sentence, r, - part->head(), - part->modifier(), - part->sibling(), - part->other_sibling()); - } - -#endif -} - -// Prune basic parts (arcs and labeled arcs) using a first-order model. -// The vectors of basic parts is given as input, and those elements that are -// to be pruned are deleted from the vector. -// If gold_outputs is not NULL that vector will also be pruned. -void SemanticPipe::Prune(Instance *instance, Parts *parts, - vector *gold_outputs, - bool preserve_gold) { - SemanticParts *semantic_parts = static_cast(parts); - Features *features = CreateFeatures(); - vector scores; - vector predicted_outputs; - - // Make sure gold parts are only preserved at training time. - CHECK(!preserve_gold || options_->train()); - - MakeFeatures(instance, parts, true, features); - ComputeScores(instance, parts, features, true, &scores); - GetSemanticDecoder()->DecodePruner(instance, parts, scores, - &predicted_outputs); - - int offset_predicate_parts, num_predicate_parts; - int offset_arcs, num_arcs; - semantic_parts->GetOffsetPredicate(&offset_predicate_parts, - &num_predicate_parts); - semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); - - double threshold = 0.5; - int r0 = offset_arcs; // Preserve all the predicate parts. - semantic_parts->ClearOffsets(); - semantic_parts->SetOffsetPredicate(offset_predicate_parts, - num_predicate_parts); - for (int r = 0; r < num_arcs; ++r) { - // Preserve gold parts (at training time). - if (predicted_outputs[offset_arcs + r] >= threshold || - (preserve_gold && (*gold_outputs)[offset_arcs + r] >= threshold)) { - (*parts)[r0] = (*parts)[offset_arcs + r]; - semantic_parts-> - SetLabeledParts(r0, semantic_parts->GetLabeledParts(offset_arcs + r)); - if (gold_outputs) { - (*gold_outputs)[r0] = (*gold_outputs)[offset_arcs + r]; - } - ++r0; - } else { - delete (*parts)[offset_arcs + r]; - } - } - - if (gold_outputs) gold_outputs->resize(r0); - semantic_parts->Resize(r0); - semantic_parts->DeleteIndices(); - semantic_parts->SetOffsetArc(offset_arcs, - parts->size() - offset_arcs); - - delete features; -} - -void SemanticPipe::LabelInstance(Parts *parts, - const vector &output, - Instance *instance) { - SemanticParts *semantic_parts = static_cast(parts); - SemanticInstance *semantic_instance = - static_cast(instance); - SemanticDictionary *semantic_dictionary = - static_cast(dictionary_); - //bool allow_root_predicate = GetSemanticOptions()->allow_root_predicate(); - int instance_length = semantic_instance->size(); - double threshold = 0.5; - semantic_instance->ClearPredicates(); - for (int p = 0; p < instance_length; ++p) { - //if (p == 0 && !allow_root_predicate) continue; - const vector &senses = semantic_parts->GetSenses(p); - vector argument_indices; - vector argument_roles; - int predicted_sense = -1; - for (int k = 0; k < senses.size(); k++) { - int s = senses[k]; - for (int a = 1; a < instance_length; ++a) { - if (GetSemanticOptions()->labeled()) { - int r = semantic_parts->FindArc(p, a, s); - if (r < 0) continue; - const vector &labeled_arcs = - semantic_parts->FindLabeledArcs(p, a, s); - for (int l = 0; l < labeled_arcs.size(); ++l) { - int r = labeled_arcs[l]; - if (output[r] > threshold) { - if (predicted_sense != s) { - CHECK_LT(predicted_sense, 0); - predicted_sense = s; - } - argument_indices.push_back(a); - SemanticPartLabeledArc *labeled_arc = - static_cast((*parts)[r]); - string role = - semantic_dictionary->GetRoleName(labeled_arc->role()); - argument_roles.push_back(role); - } - } - } else { - int r = semantic_parts->FindArc(p, a, s); - if (r < 0) continue; - if (output[r] > threshold) { - if (predicted_sense != s) { - CHECK_LT(predicted_sense, 0); - predicted_sense = s; - } - argument_indices.push_back(a); - argument_roles.push_back("ARG"); - } - } - } - } - - if (predicted_sense >= 0) { - int s = predicted_sense; - // Get the predicate id for this part. - // TODO(atm): store this somewhere, so that we don't need to recompute this - // all the time. Maybe store this directly in arc->sense()? - int lemma_id = TOKEN_UNKNOWN; - if (GetSemanticOptions()->use_predicate_senses()) { - lemma_id = semantic_dictionary->GetTokenDictionary()-> - GetLemmaId(semantic_instance->GetLemma(p)); - if (lemma_id < 0) lemma_id = TOKEN_UNKNOWN; - } - const vector *predicates = - &GetSemanticDictionary()->GetLemmaPredicates(lemma_id); - if (predicates->size() == 0 && - GetSemanticOptions()->allow_unseen_predicates()) { - predicates = &GetSemanticDictionary()->GetLemmaPredicates(TOKEN_UNKNOWN); - } - int predicate_id = (*predicates)[s]->id(); - string predicate_name = - semantic_dictionary->GetPredicateName(predicate_id); - semantic_instance->AddPredicate(predicate_name, p, argument_roles, - argument_indices); - } - } -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "SemanticPipe.h" +#include +#include +#include +#include +#ifndef _WIN32 +#include +#else +#include +#endif +using namespace std; + +// Define the current model version and the oldest back-compatible version. +// The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". +const uint64_t kSemanticParserModelVersion = 200030000; +const uint64_t kOldestCompatibleSemanticParserModelVersion = 200030000; +const uint64_t kSemanticParserModelCheck = 1234567890; + +DEFINE_bool(use_only_labeled_arc_features, true, + "True for not using unlabeled arc features in addition to labeled ones."); +DEFINE_bool(use_only_labeled_sibling_features, false, //true, + "True for not using unlabeled sibling features in addition to labeled ones."); +DEFINE_bool(use_labeled_sibling_features, false, //true, + "True for using labels in sibling features."); + +void SemanticPipe::SaveModel(FILE* fs) { + bool success; + success = WriteUINT64(fs, kSemanticParserModelCheck); + CHECK(success); + success = WriteUINT64(fs, kSemanticParserModelVersion); + CHECK(success); + token_dictionary_->Save(fs); + dependency_dictionary_->Save(fs); + Pipe::SaveModel(fs); + pruner_parameters_->Save(fs); +} + +void SemanticPipe::LoadModel(FILE* fs) { + bool success; + success = ReadUINT64(fs, &model_check_); + CHECK(success); + CHECK_EQ(model_check_, kSemanticParserModelCheck) + << "The model file is too old and not supported anymore."; + success = ReadUINT64(fs, &model_version_); + CHECK(success); + CHECK_GE(model_version_, kOldestCompatibleSemanticParserModelVersion) + << "The model file is too old and not supported anymore."; + delete token_dictionary_; + CreateTokenDictionary(); + static_cast(dictionary_)-> + SetTokenDictionary(token_dictionary_); + token_dictionary_->Load(fs); + CreateDependencyDictionary(); + dependency_dictionary_->SetTokenDictionary(token_dictionary_); + static_cast(dictionary_)-> + SetDependencyDictionary(dependency_dictionary_); + dependency_dictionary_->Load(fs); + Pipe::LoadModel(fs); + pruner_parameters_->Load(fs); +} + +void SemanticPipe::LoadPrunerModel(FILE* fs) { + LOG(INFO) << "Loading pruner model..."; + // This will be ignored but must be passed to the pruner pipe constructor, + // so that when loading the pruner model the actual options are not + // overwritten. + SemanticOptions pruner_options; // = *options_; + SemanticPipe* pipe = new SemanticPipe(&pruner_options); + //SemanticPipe* pipe = new SemanticPipe(options_); + pipe->Initialize(); + pipe->LoadModel(fs); + delete pruner_parameters_; + pruner_parameters_ = pipe->parameters_; + pipe->parameters_ = NULL; + delete pipe; + LOG(INFO) << "Done."; +} + +void SemanticPipe::LoadPrunerModelByName(const string &model_name) { + FILE *fs = fopen(model_name.c_str(), "rb"); + CHECK(fs) << "Could not open pruner model file for reading: " << model_name; + LoadPrunerModel(fs); + fclose(fs); +} + +void SemanticPipe::PreprocessData() { + delete token_dictionary_; + CreateTokenDictionary(); + static_cast(dictionary_)->SetTokenDictionary(token_dictionary_); + static_cast(token_dictionary_)->Initialize(GetSemanticReader()); + delete dependency_dictionary_; + CreateDependencyDictionary(); + dependency_dictionary_->SetTokenDictionary(token_dictionary_); + static_cast(dictionary_)->SetDependencyDictionary(dependency_dictionary_); + dependency_dictionary_->CreateLabelDictionary(GetSemanticReader()); + static_cast(dictionary_)->CreatePredicateRoleDictionaries(GetSemanticReader()); +} + +void SemanticPipe::ComputeScores(Instance *instance, Parts *parts, + Features *features, + bool pruner, + vector *scores) { + Parameters *parameters; + SemanticDictionary *semantic_dictionary = + static_cast(dictionary_); + SemanticFeatures *semantic_features = + static_cast(features); + if (pruner) { + parameters = pruner_parameters_; + } else { + parameters = parameters_; + } + scores->resize(parts->size()); + SemanticParts *semantic_parts = static_cast(parts); + for (int r = 0; r < parts->size(); ++r) { + bool has_unlabeled_features = + (semantic_features->GetNumPartFeatures(r) > 0); + bool has_labeled_features = + (semantic_features->GetNumLabeledPartFeatures(r) > 0); + + if (pruner) CHECK((*parts)[r]->type() == SEMANTICPART_ARC || + (*parts)[r]->type() == SEMANTICPART_PREDICATE); + if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; + if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; + + // Compute scores for the unlabeled features. + if (has_unlabeled_features) { + const BinaryFeatures &part_features = + semantic_features->GetPartFeatures(r); + (*scores)[r] = parameters->ComputeScore(part_features); + } else { + (*scores)[r] = 0.0; + } + + // Compute scores for the labeled features. + if ((*parts)[r]->type() == SEMANTICPART_ARC && !pruner && + GetSemanticOptions()->labeled()) { + // Labeled arcs will be treated by looking at the unlabeled arcs and + // conjoining with the label. + CHECK(has_labeled_features); + SemanticPartArc *arc = static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->FindLabeledArcs(arc->predicate(), + arc->argument(), + arc->sense()); + vector allowed_labels(index_labeled_parts.size()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + CHECK_GE(index_labeled_parts[k], 0); + CHECK_LT(index_labeled_parts[k], parts->size()); + SemanticPartLabeledArc *labeled_arc = + static_cast( + (*parts)[index_labeled_parts[k]]); + CHECK(labeled_arc != NULL); + allowed_labels[k] = labeled_arc->role(); + } + vector label_scores; + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + parameters->ComputeLabelScores(part_features, allowed_labels, + &label_scores); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + (*scores)[index_labeled_parts[k]] = label_scores[k]; + } + } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && + has_labeled_features) { + // Labeled siblings will be treated by looking at the unlabeled ones and + // conjoining with the label. + CHECK(!pruner); + CHECK(GetSemanticOptions()->labeled()); + SemanticPartSibling *sibling = + static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->GetLabeledParts(r); + vector bigram_labels(index_labeled_parts.size()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + CHECK_GE(index_labeled_parts[k], 0); + CHECK_LT(index_labeled_parts[k], parts->size()); + SemanticPartLabeledSibling *labeled_sibling = + static_cast( + (*parts)[index_labeled_parts[k]]); + CHECK(labeled_sibling != NULL); + bigram_labels[k] = semantic_dictionary->GetRoleBigramLabel( + labeled_sibling->first_role(), + labeled_sibling->second_role()); + } + vector label_scores; + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + parameters->ComputeLabelScores(part_features, bigram_labels, + &label_scores); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + (*scores)[index_labeled_parts[k]] = label_scores[k]; + } + } + } +} + +void SemanticPipe::RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + bool pruner, + const vector &selected_parts, + Features *features) { + Parameters *parameters; + SemanticFeatures *semantic_features = + static_cast(features); + if (pruner) { + parameters = pruner_parameters_; + } else { + parameters = parameters_; + } + + for (int r = 0; r < parts->size(); ++r) { + // TODO: Make sure we can do this continue for the labeled parts... + if (!selected_parts[r]) continue; + + bool has_unlabeled_features = + (semantic_features->GetNumPartFeatures(r) > 0); + bool has_labeled_features = + (semantic_features->GetNumLabeledPartFeatures(r) > 0); + + if (pruner) CHECK((*parts)[r]->type() == SEMANTICPART_ARC || + (*parts)[r]->type() == SEMANTICPART_PREDICATE); + + // TODO(atm): I think this is handling the case there can be labeled + // features, but was never tested. + CHECK(!has_labeled_features); + + // Skip labeled arcs, as they use the features from unlabeled arcs. + if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; + if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; + + if (has_unlabeled_features) { + BinaryFeatures *part_features = + semantic_features->GetMutablePartFeatures(r); + int num_supported = 0; + for (int j = 0; j < part_features->size(); ++j) { + if (parameters->Exists((*part_features)[j])) { + (*part_features)[num_supported] = (*part_features)[j]; + ++num_supported; + } + } + part_features->resize(num_supported); + } + + if (has_labeled_features) { + BinaryFeatures *part_features = + semantic_features->GetMutableLabeledPartFeatures(r); + int num_supported = 0; + for (int j = 0; j < part_features->size(); ++j) { + if (parameters->ExistsLabeled((*part_features)[j])) { + (*part_features)[num_supported] = (*part_features)[j]; + ++num_supported; + } + } + part_features->resize(num_supported); + } + } +} + +void SemanticPipe::MakeGradientStep(Parts *parts, + Features *features, + double eta, + int iteration, + const vector &gold_output, + const vector &predicted_output) { + SemanticParts *semantic_parts = static_cast(parts); + SemanticDictionary *semantic_dictionary = + static_cast(dictionary_); + SemanticFeatures *semantic_features = + static_cast(features); + Parameters *parameters = GetTrainingParameters(); + + for (int r = 0; r < parts->size(); ++r) { + bool has_unlabeled_features = + (semantic_features->GetNumPartFeatures(r) > 0); + bool has_labeled_features = + (semantic_features->GetNumLabeledPartFeatures(r) > 0); + + if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; + if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; + + // Make updates for the unlabeled features. + if (has_unlabeled_features) { + if (predicted_output[r] != gold_output[r]) { + const BinaryFeatures &part_features = + semantic_features->GetPartFeatures(r); + parameters->MakeGradientStep(part_features, eta, iteration, + predicted_output[r] - gold_output[r]); + } + } + + // Make updates for the labeled features. + if ((*parts)[r]->type() == SEMANTICPART_ARC && has_labeled_features) { + // Labeled arcs will be treated by looking at the unlabeled arcs and + // conjoining with the label. + CHECK(has_labeled_features); + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + SemanticPartArc *arc = static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->FindLabeledArcs(arc->predicate(), + arc->argument(), + arc->sense()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(index_part, parts->size()); + SemanticPartLabeledArc *labeled_arc = + static_cast((*parts)[index_part]); + CHECK(labeled_arc != NULL); + double value = predicted_output[index_part] - gold_output[index_part]; + if (value != 0.0) { + parameters->MakeLabelGradientStep(part_features, eta, iteration, + labeled_arc->role(), + value); + } + } + } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && + has_labeled_features) { + // Labeled siblings will be treated by looking at the unlabeled ones and + // conjoining with the label. + CHECK(GetSemanticOptions()->labeled()); + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + SemanticPartSibling *sibling = + static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->GetLabeledParts(r); + vector bigram_labels(index_labeled_parts.size()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(index_part, parts->size()); + SemanticPartLabeledSibling *labeled_sibling = + static_cast( + (*parts)[index_part]); + CHECK(labeled_sibling != NULL); + int bigram_label = semantic_dictionary->GetRoleBigramLabel( + labeled_sibling->first_role(), + labeled_sibling->second_role()); + double value = predicted_output[index_part] - gold_output[index_part]; + if (value != 0.0) { + parameters->MakeLabelGradientStep(part_features, eta, iteration, + bigram_label, value); + } + } + } + } +} + +void SemanticPipe::TouchParameters(Parts *parts, Features *features, + const vector &selected_parts) { + SemanticParts *semantic_parts = static_cast(parts); + SemanticDictionary *semantic_dictionary = + static_cast(dictionary_); + SemanticFeatures *semantic_features = + static_cast(features); + Parameters *parameters = GetTrainingParameters(); + + for (int r = 0; r < parts->size(); ++r) { + // TODO: Make sure we can do this continue for the labeled parts... + if (!selected_parts[r]) continue; + + bool has_unlabeled_features = + (semantic_features->GetNumPartFeatures(r) > 0); + bool has_labeled_features = + (semantic_features->GetNumLabeledPartFeatures(r) > 0); + + if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; + if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; + + // Make updates for the unlabeled features. + if (has_unlabeled_features) { + const BinaryFeatures &part_features = + semantic_features->GetPartFeatures(r); + parameters->MakeGradientStep(part_features, 0.0, 0, 0.0); + } + + // Make updates for the labeled features. + if ((*parts)[r]->type() == SEMANTICPART_ARC && has_labeled_features) { + // Labeled arcs will be treated by looking at the unlabeled arcs and + // conjoining with the label. + CHECK(has_labeled_features); + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + SemanticPartArc *arc = static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->FindLabeledArcs(arc->predicate(), + arc->argument(), + arc->sense()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(index_part, parts->size()); + SemanticPartLabeledArc *labeled_arc = + static_cast((*parts)[index_part]); + CHECK(labeled_arc != NULL); + parameters->MakeLabelGradientStep(part_features, 0.0, 0, + labeled_arc->role(), 0.0); + } + } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && + has_labeled_features) { + // Labeled siblings will be treated by looking at the unlabeled ones and + // conjoining with the label. + CHECK(GetSemanticOptions()->labeled()); + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + SemanticPartSibling *sibling = + static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->GetLabeledParts(r); + vector bigram_labels(index_labeled_parts.size()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(index_part, parts->size()); + SemanticPartLabeledSibling *labeled_sibling = + static_cast( + (*parts)[index_part]); + CHECK(labeled_sibling != NULL); + int bigram_label = semantic_dictionary->GetRoleBigramLabel( + labeled_sibling->first_role(), + labeled_sibling->second_role()); + parameters->MakeLabelGradientStep(part_features, 0.0, 0, + bigram_label, 0.0); + } + } + } +} + +void SemanticPipe::MakeFeatureDifference(Parts *parts, + Features *features, + const vector &gold_output, + const vector &predicted_output, + FeatureVector *difference) { + SemanticParts *semantic_parts = static_cast(parts); + SemanticDictionary *semantic_dictionary = + static_cast(dictionary_); + SemanticFeatures *semantic_features = + static_cast(features); + + for (int r = 0; r < parts->size(); ++r) { + bool has_unlabeled_features = + (semantic_features->GetNumPartFeatures(r) > 0); + bool has_labeled_features = + (semantic_features->GetNumLabeledPartFeatures(r) > 0); + + if ((*parts)[r]->type() == SEMANTICPART_LABELEDARC) continue; + if ((*parts)[r]->type() == SEMANTICPART_LABELEDSIBLING) continue; + + // Compute feature difference for the unlabeled features. + if (has_unlabeled_features) { + if (predicted_output[r] != gold_output[r]) { + const BinaryFeatures &part_features = + semantic_features->GetPartFeatures(r); + for (int j = 0; j < part_features.size(); ++j) { + difference->mutable_weights()->Add(part_features[j], + predicted_output[r] - + gold_output[r]); + } + } + } + + // Make updates for the labeled features. + if ((*parts)[r]->type() == SEMANTICPART_ARC && has_labeled_features) { + // Labeled arcs will be treated by looking at the unlabeled arcs and + // conjoining with the label. + CHECK(has_labeled_features); + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + SemanticPartArc *arc = static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->FindLabeledArcs(arc->predicate(), + arc->argument(), + arc->sense()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(index_part, parts->size()); + SemanticPartLabeledArc *labeled_arc = + static_cast((*parts)[index_part]); + CHECK(labeled_arc != NULL); + double value = predicted_output[index_part] - gold_output[index_part]; + if (value != 0.0) { + for (int j = 0; j < part_features.size(); ++j) { + difference->mutable_labeled_weights()->Add(part_features[j], + labeled_arc->role(), + value); + } + } + } + } else if ((*parts)[r]->type() == SEMANTICPART_SIBLING && + has_labeled_features) { + // Labeled siblings will be treated by looking at the unlabeled ones and + // conjoining with the label. + CHECK(GetSemanticOptions()->labeled()); + const BinaryFeatures &part_features = + semantic_features->GetLabeledPartFeatures(r); + SemanticPartSibling *sibling = + static_cast((*parts)[r]); + const vector &index_labeled_parts = + semantic_parts->GetLabeledParts(r); + vector bigram_labels(index_labeled_parts.size()); + for (int k = 0; k < index_labeled_parts.size(); ++k) { + int index_part = index_labeled_parts[k]; + CHECK_GE(index_part, 0); + CHECK_LT(index_part, parts->size()); + SemanticPartLabeledSibling *labeled_sibling = + static_cast( + (*parts)[index_part]); + CHECK(labeled_sibling != NULL); + int bigram_label = semantic_dictionary->GetRoleBigramLabel( + labeled_sibling->first_role(), + labeled_sibling->second_role()); + double value = predicted_output[index_part] - gold_output[index_part]; + if (value != 0.0) { + for (int j = 0; j < part_features.size(); ++j) { + difference->mutable_labeled_weights()->Add(part_features[j], + bigram_label, + value); + } + } + } + } + } +} + +void SemanticPipe::MakeParts(Instance *instance, + Parts *parts, + vector *gold_outputs) { + int sentence_length = + static_cast(instance)->size(); + SemanticParts *semantic_parts = static_cast(parts); + semantic_parts->Initialize(); + bool make_gold = (gold_outputs != NULL); + if (make_gold) gold_outputs->clear(); + + if (train_pruner_) { + // For the pruner, make only unlabeled arc-factored and predicate parts and + // compute indices. + MakePartsBasic(instance, false, parts, gold_outputs); + semantic_parts->BuildOffsets(); + semantic_parts->BuildIndices(sentence_length, false); + } else { + // Make arc-factored and predicate parts and compute indices. + MakePartsBasic(instance, parts, gold_outputs); + semantic_parts->BuildOffsets(); + semantic_parts->BuildIndices(sentence_length, + GetSemanticOptions()->labeled()); + + // Make global parts. + MakePartsGlobal(instance, parts, gold_outputs); + semantic_parts->BuildOffsets(); + } +} + +void SemanticPipe::MakePartsBasic(Instance *instance, + Parts *parts, + vector *gold_outputs) { + int sentence_length = + static_cast(instance)->size(); + SemanticParts *semantic_parts = static_cast(parts); + + MakePartsBasic(instance, false, parts, gold_outputs); + semantic_parts->BuildOffsets(); + semantic_parts->BuildIndices(sentence_length, false); + + // Prune using a basic first-order model. + if (GetSemanticOptions()->prune_basic()) { + if (options_->train()) { + Prune(instance, parts, gold_outputs, true); + } else { + Prune(instance, parts, gold_outputs, false); + } + semantic_parts->BuildOffsets(); + semantic_parts->BuildIndices(sentence_length, false); + } + + if (GetSemanticOptions()->labeled()) { + MakePartsBasic(instance, true, parts, gold_outputs); + } +} + +void SemanticPipe::MakePartsBasic(Instance *instance, + bool add_labeled_parts, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + bool prune_labels = semantic_options->prune_labels(); + bool prune_labels_with_relation_paths = + semantic_options->prune_labels_with_relation_paths(); + bool prune_labels_with_senses = semantic_options->prune_labels_with_senses(); + bool prune_distances = semantic_options->prune_distances(); + bool allow_self_loops = semantic_options->allow_self_loops(); + bool allow_root_predicate = semantic_options->allow_root_predicate(); + bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); + bool use_predicate_senses = semantic_options->use_predicate_senses(); + vector allowed_labels; + + if (add_labeled_parts && !prune_labels) { + allowed_labels.resize(semantic_dictionary->GetRoleAlphabet().size()); + for (int i = 0; i < allowed_labels.size(); ++i) { + allowed_labels[i] = i; + } + } + + // Add predicate parts. + int num_parts_initial = semantic_parts->size(); + if (!add_labeled_parts) { + for (int p = 0; p < sentence_length; ++p) { + if (p == 0 && !allow_root_predicate) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int s = 0; s < predicates->size(); ++s) { + Part *part = semantic_parts->CreatePartPredicate(p, s); + semantic_parts->AddPart(part); + if (make_gold) { + bool is_gold = false; + int k = sentence->FindPredicate(p); + if (k >= 0) { + int predicate_id = sentence->GetPredicateId(k); + if (!use_predicate_senses) { + CHECK_EQ((*predicates)[s]->id(), PREDICATE_UNKNOWN); + } + if (predicate_id < 0 || (*predicates)[s]->id() == predicate_id) { + is_gold = true; + } + } + if (is_gold) { + gold_outputs->push_back(1.0); + } else { + gold_outputs->push_back(0.0); + } + } + } + } + + // Compute offsets for predicate parts. + semantic_parts->SetOffsetPredicate(num_parts_initial, + semantic_parts->size() - num_parts_initial); + } + + // Add unlabeled/labeled arc parts. + num_parts_initial = semantic_parts->size(); + for (int p = 0; p < sentence_length; ++p) { + if (p == 0 && !allow_root_predicate) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int a = 1; a < sentence_length; ++a) { + if (!allow_self_loops && p == a) continue; + for (int s = 0; s < predicates->size(); ++s) { + int arc_index = -1; + if (add_labeled_parts) { + // If no unlabeled arc is there, just skip it. + // This happens if that arc was pruned out. + arc_index = semantic_parts->FindArc(p, a, s); + if (0 > arc_index) { + continue; + } + } else { + if (prune_distances) { + int predicate_pos_id = sentence->GetPosId(p); + int argument_pos_id = sentence->GetPosId(a); + if (p < a) { + // Right attachment. + if (a - p > semantic_dictionary->GetMaximumRightDistance + (predicate_pos_id, argument_pos_id)) continue; + } else { + // Left attachment. + if (p - a > semantic_dictionary->GetMaximumLeftDistance + (predicate_pos_id, argument_pos_id)) continue; + } + } + } + + if (prune_labels_with_relation_paths) { + int relation_path_id = sentence->GetRelationPathId(p, a); + allowed_labels.clear(); + if (relation_path_id >= 0 && + relation_path_id < semantic_dictionary-> + GetRelationPathAlphabet().size()) { + allowed_labels = semantic_dictionary-> + GetExistingRolesWithRelationPath(relation_path_id); + //LOG(INFO) << "Path: " << relation_path_id << " Roles: " << allowed_labels.size(); + } + set label_set; + for (int m = 0; m < allowed_labels.size(); ++m) { + if (!prune_labels_with_senses || + (*predicates)[s]->HasRole(allowed_labels[m])) { + label_set.insert(allowed_labels[m]); + } + } + allowed_labels.clear(); + for (set::iterator it = label_set.begin(); + it != label_set.end(); ++it) { + allowed_labels.push_back(*it); + } + if (!add_labeled_parts && allowed_labels.empty()) { + continue; + } + } else if (prune_labels) { + // TODO: allow both kinds of label pruning simultaneously? + int predicate_pos_id = sentence->GetPosId(p); + int argument_pos_id = sentence->GetPosId(a); + allowed_labels.clear(); + allowed_labels = semantic_dictionary-> + GetExistingRoles(predicate_pos_id, argument_pos_id); + set label_set; + for (int m = 0; m < allowed_labels.size(); ++m) { + if (!prune_labels_with_senses || + (*predicates)[s]->HasRole(allowed_labels[m])) { + label_set.insert(allowed_labels[m]); + } + } + allowed_labels.clear(); + for (set::iterator it = label_set.begin(); + it != label_set.end(); ++it) { + allowed_labels.push_back(*it); + } + if (!add_labeled_parts && allowed_labels.empty()) { + continue; + } + } + + // Add parts for labeled/unlabeled arcs. + if (add_labeled_parts) { + // If there is no allowed label for this arc, but the unlabeled arc was added, + // then it was forced to be present for some reason (e.g. to maintain connectivity of the + // graph). In that case (which should be pretty rare) consider all the + // possible labels. + if (allowed_labels.empty()) { + allowed_labels.resize(semantic_dictionary->GetRoleAlphabet().size()); + for (int role = 0; role < allowed_labels.size(); ++role) { + allowed_labels[role] = role; + } + } + + for (int m = 0; m < allowed_labels.size(); ++m) { + int role = allowed_labels[m]; + if (prune_labels && prune_labels_with_senses) { + CHECK((*predicates)[s]->HasRole(role)); + } + Part *part = semantic_parts->CreatePartLabeledArc(p, a, s, role); + CHECK_GE(arc_index, 0); + semantic_parts->AddLabeledPart(part, arc_index); + if (make_gold) { + int k = sentence->FindPredicate(p); + int l = sentence->FindArc(p, a); + bool is_gold = false; + + if (k >= 0 && l >= 0) { + int predicate_id = sentence->GetPredicateId(k); + int argument_id = sentence->GetArgumentRoleId(k, l); + if (!use_predicate_senses) { + CHECK_EQ((*predicates)[s]->id(), PREDICATE_UNKNOWN); + } + //if (use_predicate_senses) CHECK_LT(predicate_id, 0); + if ((predicate_id < 0 || + (*predicates)[s]->id() == predicate_id) && + role == argument_id) { + is_gold = true; + } + } + if (is_gold) { + gold_outputs->push_back(1.0); + } else { + gold_outputs->push_back(0.0); + } + } + } + } else { + Part *part = semantic_parts->CreatePartArc(p, a, s); + semantic_parts->AddPart(part); + if (make_gold) { + int k = sentence->FindPredicate(p); + int l = sentence->FindArc(p, a); + bool is_gold = false; + if (k >= 0 && l >= 0) { + int predicate_id = sentence->GetPredicateId(k); + if (!use_predicate_senses) { + CHECK_EQ((*predicates)[s]->id(), PREDICATE_UNKNOWN); + } + if (predicate_id < 0 || (*predicates)[s]->id() == predicate_id) { + is_gold = true; + } + } + if (is_gold) { + gold_outputs->push_back(1.0); + } else { + gold_outputs->push_back(0.0); + } + } + } + } + } + } + + // Compute offsets for labeled/unlabeled arcs. + if (!add_labeled_parts) { + semantic_parts->SetOffsetArc(num_parts_initial, + semantic_parts->size() - num_parts_initial); + } else { + semantic_parts->SetOffsetLabeledArc(num_parts_initial, + semantic_parts->size() - num_parts_initial); + } +} + +void SemanticPipe::MakePartsArbitrarySiblings(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + //bool allow_self_loops = semantic_options->allow_self_loops(); + bool allow_root_predicate = semantic_options->allow_root_predicate(); + bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); + bool use_predicate_senses = semantic_options->use_predicate_senses(); + + // Siblings: (p,s,a1) and (p,s,a2). + for (int p = 0; p < sentence_length; ++p) { + if (p == 0 && !allow_root_predicate) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int s = 0; s < predicates->size(); ++s) { + for (int a1 = 1; a1 < sentence_length; ++a1) { + int r1 = semantic_parts->FindArc(p, a1, s); + if (r1 < 0) continue; + for (int a2 = a1 + 1; a2 < sentence_length; ++a2) { + int r2 = semantic_parts->FindArc(p, a2, s); + if (r2 < 0) continue; + Part *part = semantic_parts->CreatePartSibling(p, s, a1, a2); + semantic_parts->AddPart(part); + if (make_gold) { + // Logical AND of the two individual arcs. + gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); + } + } + } + } + } +} + +void SemanticPipe::MakePartsLabeledArbitrarySiblings(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + + int offset, size; + semantic_parts->GetOffsetSibling(&offset, &size); + for (int r = offset; r < offset + size; ++r) { + SemanticPartSibling *sibling = + static_cast((*semantic_parts)[r]); + int p = sibling->predicate(); + int s = sibling->sense(); + int a1 = sibling->first_argument(); + int a2 = sibling->second_argument(); + const vector &labeled_first_arc_indices = + semantic_parts->FindLabeledArcs(p, a1, s); + const vector &labeled_second_arc_indices = + semantic_parts->FindLabeledArcs(p, a2, s); + for (int k = 0; k < labeled_first_arc_indices.size(); ++k) { + int r1 = labeled_first_arc_indices[k]; + SemanticPartLabeledArc *first_labeled_arc = + static_cast((*semantic_parts)[r1]); + int first_role = first_labeled_arc->role(); + for (int l = 0; l < labeled_second_arc_indices.size(); ++l) { + int r2 = labeled_second_arc_indices[l]; + SemanticPartLabeledArc *second_labeled_arc = + static_cast((*semantic_parts)[r2]); + int second_role = second_labeled_arc->role(); + // To keep the number of parts manageable, only create parts for: + // - same role (a1 == a2); + // - frequent role pairs. + if (first_role != second_role && + !semantic_dictionary->IsFrequentRolePair(first_role, second_role)) { + continue; + } + Part *part = semantic_parts->CreatePartLabeledSibling(p, s, a1, a2, + first_role, + second_role); + semantic_parts->AddLabeledPart(part, r); + if (make_gold) { + // Logical AND of the two individual labeled arcs. + gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); + } + } + } + } +} + +void SemanticPipe::MakePartsConsecutiveSiblings(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + //bool allow_self_loops = semantic_options->allow_self_loops(); + bool allow_root_predicate = semantic_options->allow_root_predicate(); + bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); + bool use_predicate_senses = semantic_options->use_predicate_senses(); + + // Find the predicate parts (necessary to identify the gold predicate senses). + // TODO: Replace this by semantic_parts->GetPredicateSenses(p) or something? + int offset_predicate_parts, num_predicate_parts; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + vector > predicate_part_indices(sentence_length); + for (int r = 0; r < num_predicate_parts; ++r) { + SemanticPartPredicate* predicate_part = + static_cast((*parts)[offset_predicate_parts + r]); + predicate_part_indices[predicate_part->predicate()]. + push_back(offset_predicate_parts + r); + } + + // Consecutive siblings: (p,s,a1) and (p,s,a2). + for (int p = 0; p < sentence_length; ++p) { + if (p == 0 && !allow_root_predicate) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + //const vector &senses = semantic_parts->GetSenses(p); + //CHECK_EQ(senses.size(), predicates->size()); + for (int s = 0; s < predicates->size(); ++s) { + bool sense_active; + bool first_arc_active; + bool second_arc_active = false; + bool arc_between; + + // Check if this is the correct sense. + if (make_gold) { + //int r = senses[s]; + int r = -1; + for (int k = 0; k < predicate_part_indices[p].size(); ++k) { + r = predicate_part_indices[p][k]; + SemanticPartPredicate* predicate_part = + static_cast((*parts)[r]); + if (predicate_part->sense() == s) break; + } + CHECK_GE(r, 0); + if (r >= 0 && NEARLY_EQ_TOL((*gold_outputs)[r], 1.0, 1e-9)) { + sense_active = true; + } else { + sense_active = false; + } + } + + // Right side. + // Allow self loops (a1 = p). We use a1 = p-1 to denote the special case + // in which a2 is the first argument. + for (int a1 = p - 1; a1 < sentence_length; ++a1) { + int r1 = -1; + if (a1 >= p) { + r1 = semantic_parts->FindArc(p, a1, s); + if (r1 < 0) continue; + } + + if (make_gold) { + // Check if the first arc is active. + if (a1 < p || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { + first_arc_active = true; + } else { + first_arc_active = false; + } + arc_between = false; + } + + for (int a2 = a1 + 1; a2 <= sentence_length; ++a2) { + int r2 = -1; + if (a2 < sentence_length) { + r2 = semantic_parts->FindArc(p, a2, s); + if (r2 < 0) continue; + } + if (make_gold) { + // Check if the second arc is active. + if (a2 == sentence_length || + NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { + second_arc_active = true; + } else { + second_arc_active = false; + } + } + + Part *part = (a1 >= p) ? + semantic_parts->CreatePartConsecutiveSibling(p, s, a1, a2) : + semantic_parts->CreatePartConsecutiveSibling(p, s, -1, a2); + semantic_parts->AddPart(part); + + if (make_gold) { + double value = 0.0; + if (sense_active && first_arc_active && second_arc_active && + !arc_between) { + value = 1.0; + arc_between = true; + } + gold_outputs->push_back(value); + } + } + } + + // Left side. + // NOTE: Self loops (a1 = p) are disabled on the left side, to prevent + // having repeated parts. We use a1 = p+1 to denote the special case + // in which a2 is the first argument. + for (int a1 = p + 1; a1 >= 0; --a1) { + int r1 = -1; + if (a1 <= p) { + r1 = semantic_parts->FindArc(p, a1, s); + if (r1 < 0) continue; + } + if (a1 == p) continue; // See NOTE above. + + if (make_gold) { + // Check if the first arc is active. + if (a1 > p || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { + first_arc_active = true; + } else { + first_arc_active = false; + } + arc_between = false; + } + + for (int a2 = a1 - 1; a2 >= -1; --a2) { + int r2 = -1; + if (a2 > -1) { + r2 = semantic_parts->FindArc(p, a2, s); + if (r2 < 0) continue; + } + if (a2 == p) continue; // See NOTE above. + + if (make_gold) { + // Check if the second arc is active. + if (a2 == -1 || + NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { + second_arc_active = true; + } else { + second_arc_active = false; + } + } + + Part *part = (a1 <= p) ? + semantic_parts->CreatePartConsecutiveSibling(p, s, a1, a2) : + semantic_parts->CreatePartConsecutiveSibling(p, s, -1, a2); + semantic_parts->AddPart(part); + + if (make_gold) { + double value = 0.0; + if (sense_active && first_arc_active && second_arc_active && + !arc_between) { + value = 1.0; + arc_between = true; + } + gold_outputs->push_back(value); + } + } + } + } + } +} + +void SemanticPipe::MakePartsGrandparents(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + //bool allow_self_loops = semantic_options->allow_self_loops(); + bool allow_root_predicate = semantic_options->allow_root_predicate(); + bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); + bool use_predicate_senses = semantic_options->use_predicate_senses(); + + // Grandparents: (g,t,p) and (p,s,a). + for (int g = 0; g < sentence_length; ++g) { + if (g == 0 && !allow_root_predicate) continue; + int lemma_id_g = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id_g = sentence->GetLemmaId(g); + CHECK_GE(lemma_id_g, 0); + } + const vector *predicates_g = + &semantic_dictionary->GetLemmaPredicates(lemma_id_g); + if (predicates_g->size() == 0 && allow_unseen_predicates) { + predicates_g = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int t = 0; t < predicates_g->size(); ++t) { + for (int p = 1; p < sentence_length; ++p) { + int r1 = semantic_parts->FindArc(g, p, t); + if (r1 < 0) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int s = 0; s < predicates->size(); ++s) { + for (int a = 1; a < sentence_length; ++a) { + int r2 = semantic_parts->FindArc(p, a, s); + if (r2 < 0) continue; + Part *part = semantic_parts->CreatePartGrandparent(g, t, p, s, a); + semantic_parts->AddPart(part); + if (make_gold) { + // Logical AND of the two individual arcs. + gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); + } + } + } + } + } + } +} + +void SemanticPipe::MakePartsCoparents(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + //bool allow_self_loops = semantic_options->allow_self_loops(); + bool allow_root_predicate = semantic_options->allow_root_predicate(); + bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); + bool use_predicate_senses = semantic_options->use_predicate_senses(); + + // Co-parents: (p1,s1,a) and (p2,s2,a). + // First predicate. + for (int p1 = 0; p1 < sentence_length; ++p1) { + if (p1 == 0 && !allow_root_predicate) continue; + int lemma_id_p1 = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id_p1 = sentence->GetLemmaId(p1); + CHECK_GE(lemma_id_p1, 0); + } + const vector *predicates_p1 = + &semantic_dictionary->GetLemmaPredicates(lemma_id_p1); + if (predicates_p1->size() == 0 && allow_unseen_predicates) { + predicates_p1 = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int s1 = 0; s1 < predicates_p1->size(); ++s1) { + // Second predicate. + for (int p2 = p1 + 1; p2 < sentence_length; ++p2) { + int lemma_id_p2 = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id_p2 = sentence->GetLemmaId(p2); + CHECK_GE(lemma_id_p2, 0); + } + const vector *predicates_p2 = + &semantic_dictionary->GetLemmaPredicates(lemma_id_p2); + if (predicates_p2->size() == 0 && allow_unseen_predicates) { + predicates_p2 = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + for (int s2 = 0; s2 < predicates_p2->size(); ++s2) { + // Common argument. + for (int a = 1; a < sentence_length; ++a) { + int r1 = semantic_parts->FindArc(p1, a, s1); + if (r1 < 0) continue; + int r2 = semantic_parts->FindArc(p2, a, s2); + if (r2 < 0) continue; + Part *part = semantic_parts->CreatePartCoparent(p1, s1, p2, s2, a); + semantic_parts->AddPart(part); + if (make_gold) { + // Logical AND of the two individual arcs. + gold_outputs->push_back((*gold_outputs)[r1] * (*gold_outputs)[r2]); + } + } + } + } + } + } +} + +void SemanticPipe::MakePartsConsecutiveCoparents(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + int sentence_length = sentence->size(); + bool make_gold = (gold_outputs != NULL); + SemanticDictionary *semantic_dictionary = GetSemanticDictionary(); + SemanticOptions *semantic_options = GetSemanticOptions(); + //bool allow_self_loops = semantic_options->allow_self_loops(); + bool allow_root_predicate = semantic_options->allow_root_predicate(); + bool allow_unseen_predicates = semantic_options->allow_unseen_predicates(); + bool use_predicate_senses = semantic_options->use_predicate_senses(); + + // Consecutive co-parents: (p1,s1,a) and (p2,s2,a). + for (int a = 1; a < sentence_length; ++a) { + bool first_arc_active; + bool second_arc_active = false; + bool arc_between; + + // Right side. + // Allow self loops (p1 = a). We use p1 = a-1 to denote the special case + // in which p2 is the first predicate. + for (int p1 = a - 1; p1 < sentence_length; ++p1) { + int num_senses1; + if (p1 < a) { + // If p1 = a-1, pretend there is a single sense (s1=0). + num_senses1 = 1; + } else { + //const vector &senses = semantic_parts->GetSenses(p); + //CHECK_EQ(senses.size(), predicates->size()); + if (p1 == 0 && !allow_root_predicate) continue; // Never happens. + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p1); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + num_senses1 = predicates->size(); + } + + for (int s1 = 0; s1 < num_senses1; ++s1) { + int r1 = -1; + if (p1 >= a) { + r1 = semantic_parts->FindArc(p1, a, s1); + if (r1 < 0) continue; + } + + if (make_gold) { + // Check if the first arc is active. + if (p1 < a || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { + first_arc_active = true; + } else { + first_arc_active = false; + } + arc_between = false; + } + + for (int p2 = p1 + 1; p2 <= sentence_length; ++p2) { + int num_senses2; + if (p2 == sentence_length) { + // If p2 = sentence_length, pretend there is a single sense (s2=0). + num_senses2 = 1; + } else { + //const vector &senses = semantic_parts->GetSenses(p); + //CHECK_EQ(senses.size(), predicates->size()); + if (p2 == 0 && !allow_root_predicate) continue; // Never happens. + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p2); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + num_senses2 = predicates->size(); + } + + for (int s2 = 0; s2 < num_senses2; ++s2) { + int r2 = -1; + if (p2 < sentence_length) { + r2 = semantic_parts->FindArc(p2, a, s2); + if (r2 < 0) continue; + } + if (make_gold) { + // Check if the second arc is active. + if (p2 == sentence_length || + NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { + second_arc_active = true; + } else { + second_arc_active = false; + } + } + + Part *part = (p1 >= a) ? + semantic_parts->CreatePartConsecutiveCoparent(p1, s1, p2, s2, a) : + semantic_parts->CreatePartConsecutiveCoparent(-1, 0, p2, s2, a); + semantic_parts->AddPart(part); + + if (make_gold) { + double value = 0.0; + if (first_arc_active && second_arc_active && !arc_between) { + value = 1.0; + arc_between = true; + } + gold_outputs->push_back(value); + } + } + } + } + } + + // Left side. + // NOTE: Self loops (p1 = a) are disabled on the left side, to prevent + // having repeated parts. We use p1 = a+1 to denote the special case + // in which p2 is the first predicate. + for (int p1 = a + 1; p1 >= 0; --p1) { + int num_senses1; + if (p1 > a) { + // If p1 = a+1, pretend there is a single sense (s1=0). + num_senses1 = 1; + } else if (p1 == a) { // See NOTE above. + continue; + } else { + //const vector &senses = semantic_parts->GetSenses(p); + //CHECK_EQ(senses.size(), predicates->size()); + if (p1 == 0 && !allow_root_predicate) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p1); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + num_senses1 = predicates->size(); + } + + for (int s1 = 0; s1 < num_senses1; ++s1) { + int r1 = -1; + if (p1 <= a) { + r1 = semantic_parts->FindArc(p1, a, s1); + if (r1 < 0) continue; + } + if (p1 == a) continue; // See NOTE above. + + if (make_gold) { + // Check if the first arc is active. + if (p1 > a || NEARLY_EQ_TOL((*gold_outputs)[r1], 1.0, 1e-9)) { + first_arc_active = true; + } else { + first_arc_active = false; + } + arc_between = false; + } + + for (int p2 = p1 - 1; p2 >= -1; --p2) { + int num_senses2; + if (p2 == -1) { + // If p2 = -1, pretend there is a single sense (s2=0). + num_senses2 = 1; + } else if (p2 == a) { // See NOTE above. + continue; + } else { + //const vector &senses = semantic_parts->GetSenses(p); + //CHECK_EQ(senses.size(), predicates->size()); + if (p2 == 0 && !allow_root_predicate) continue; + int lemma_id = TOKEN_UNKNOWN; + if (use_predicate_senses) { + lemma_id = sentence->GetLemmaId(p2); + CHECK_GE(lemma_id, 0); + } + const vector *predicates = + &semantic_dictionary->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && allow_unseen_predicates) { + predicates = &semantic_dictionary->GetLemmaPredicates(TOKEN_UNKNOWN); + } + num_senses2 = predicates->size(); + } + + for (int s2 = 0; s2 < num_senses2; ++s2) { + int r2 = -1; + if (p2 > -1) { + r2 = semantic_parts->FindArc(p2, a, s2); + if (r2 < 0) continue; + } + if (p2 == a) continue; // See NOTE above. + + if (make_gold) { + // Check if the second arc is active. + if (p2 == -1 || + NEARLY_EQ_TOL((*gold_outputs)[r2], 1.0, 1e-9)) { + second_arc_active = true; + } else { + second_arc_active = false; + } + } + + Part *part = (p1 <= a) ? + semantic_parts->CreatePartConsecutiveCoparent(p1, s1, p2, s2, a) : + semantic_parts->CreatePartConsecutiveCoparent(-1, 0, p2, s2, a); + semantic_parts->AddPart(part); + + if (make_gold) { + double value = 0.0; + if (first_arc_active && second_arc_active && !arc_between) { + value = 1.0; + arc_between = true; + } + gold_outputs->push_back(value); + } + } + } + } + } + } +} + +void SemanticPipe::MakePartsGlobal(Instance *instance, + Parts *parts, + vector *gold_outputs) { + SemanticOptions *semantic_options = GetSemanticOptions(); + SemanticParts *semantic_parts = static_cast(parts); + + int num_parts_initial = semantic_parts->size(); + if (semantic_options->use_arbitrary_siblings()) { + MakePartsArbitrarySiblings(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetSibling(num_parts_initial, + semantic_parts->size() - num_parts_initial); + //LOG(INFO) << "Num siblings: " << semantic_parts->size() - num_parts_initial; + + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_arbitrary_siblings() && + FLAGS_use_labeled_sibling_features) { + MakePartsLabeledArbitrarySiblings(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetLabeledSibling( + num_parts_initial, semantic_parts->size() - num_parts_initial); + //LOG(INFO) << "Num labeled siblings: " << semantic_parts->size() - num_parts_initial; + + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_consecutive_siblings()) { + MakePartsConsecutiveSiblings(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetConsecutiveSibling(num_parts_initial, + semantic_parts->size() - num_parts_initial); + + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_grandparents()) { + MakePartsGrandparents(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetGrandparent(num_parts_initial, + semantic_parts->size() - num_parts_initial); + + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_coparents()) { + MakePartsCoparents(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetCoparent(num_parts_initial, + semantic_parts->size() - num_parts_initial); + + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_consecutive_coparents()) { + MakePartsConsecutiveCoparents(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetConsecutiveCoparent(num_parts_initial, + semantic_parts->size() - num_parts_initial); + +#if 0 + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_grandsiblings()) { + MakePartsGrandSiblings(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetGrandSiblings(num_parts_initial, + semantic_parts->size() - num_parts_initial); + + num_parts_initial = semantic_parts->size(); + if (semantic_options->use_trisiblings()) { + MakePartsTriSiblings(instance, parts, gold_outputs); + } + semantic_parts->SetOffsetTriSiblings(num_parts_initial, + semantic_parts->size() - num_parts_initial); +#endif +} + +void SemanticPipe::MakeSelectedFeatures(Instance *instance, + Parts *parts, + bool pruner, + const vector& selected_parts, + Features *features) { + SemanticInstanceNumeric *sentence = + static_cast(instance); + SemanticParts *semantic_parts = static_cast(parts); + SemanticFeatures *semantic_features = + static_cast(features); + int sentence_length = sentence->size(); + + semantic_features->Initialize(instance, parts); + + // Build features for predicates. + int offset, size; + semantic_parts->GetOffsetPredicate(&offset, &size); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartPredicate *predicate_part = + static_cast((*semantic_parts)[r]); + // Get the predicate id for this part. + // TODO(atm): store this somewhere, so that we don't need to recompute this + // all the time. + int lemma_id = TOKEN_UNKNOWN; + if (GetSemanticOptions()->use_predicate_senses()) { + lemma_id = sentence->GetLemmaId(predicate_part->predicate()); + } + const vector *predicates = + &GetSemanticDictionary()->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && + GetSemanticOptions()->allow_unseen_predicates()) { + predicates = &GetSemanticDictionary()->GetLemmaPredicates(TOKEN_UNKNOWN); + } + int predicate_id = (*predicates)[predicate_part->sense()]->id(); + // Add the predicate features. + semantic_features->AddPredicateFeatures(sentence, r, + predicate_part->predicate(), + predicate_id); + } + + // Even in the case of labeled parsing, build features for unlabeled arcs + // only. They will later be conjoined with the labels. + semantic_parts->GetOffsetArc(&offset, &size); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartArc *arc = + static_cast((*semantic_parts)[r]); + // Get the predicate id for this part. + // TODO(atm): store this somewhere, so that we don't need to recompute this + // all the time. Maybe store this directly in arc->sense()? + int lemma_id = TOKEN_UNKNOWN; + if (GetSemanticOptions()->use_predicate_senses()) { + lemma_id = sentence->GetLemmaId(arc->predicate()); + } + const vector *predicates = + &GetSemanticDictionary()->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && + GetSemanticOptions()->allow_unseen_predicates()) { + predicates = &GetSemanticDictionary()->GetLemmaPredicates(TOKEN_UNKNOWN); + } + int predicate_id = (*predicates)[arc->sense()]->id(); + if (!pruner && GetSemanticOptions()->labeled()) { + semantic_features->AddLabeledArcFeatures(sentence, r, arc->predicate(), + arc->argument(), predicate_id); + if (!FLAGS_use_only_labeled_arc_features) { + semantic_features->AddArcFeatures(sentence, r, arc->predicate(), + arc->argument(), predicate_id); + } + } else { + semantic_features->AddArcFeatures(sentence, r, arc->predicate(), + arc->argument(), predicate_id); + } + } + + // Build features for arbitrary siblings. + semantic_parts->GetOffsetSibling(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartSibling *part = + static_cast((*semantic_parts)[r]); + CHECK_EQ(part->type(), SEMANTICPART_SIBLING); + if (FLAGS_use_labeled_sibling_features) { + semantic_features-> + AddArbitraryLabeledSiblingFeatures(sentence, r, + part->predicate(), + part->sense(), + part->first_argument(), + part->second_argument()); + if (!FLAGS_use_only_labeled_sibling_features) { + semantic_features->AddArbitrarySiblingFeatures(sentence, r, + part->predicate(), + part->sense(), + part->first_argument(), + part->second_argument()); + } + } else { + semantic_features->AddArbitrarySiblingFeatures(sentence, r, + part->predicate(), + part->sense(), + part->first_argument(), + part->second_argument()); + } + } + + // Build features for consecutive siblings. + semantic_parts->GetOffsetConsecutiveSibling(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartConsecutiveSibling *part = + static_cast((*semantic_parts)[r]); + CHECK_EQ(part->type(), SEMANTICPART_CONSECUTIVESIBLING); + semantic_features->AddConsecutiveSiblingFeatures( + sentence, r, + part->predicate(), + part->sense(), + part->first_argument(), + part->second_argument()); + } + + // Build features for grandparents. + semantic_parts->GetOffsetGrandparent(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartGrandparent *part = + static_cast((*semantic_parts)[r]); + CHECK_EQ(part->type(), SEMANTICPART_GRANDPARENT); + semantic_features->AddGrandparentFeatures(sentence, r, + part->grandparent_predicate(), + part->grandparent_sense(), + part->predicate(), + part->sense(), + part->argument()); + } + + // Build features for co-parents. + semantic_parts->GetOffsetCoparent(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartCoparent *part = + static_cast((*semantic_parts)[r]); + CHECK_EQ(part->type(), SEMANTICPART_COPARENT); + semantic_features->AddCoparentFeatures(sentence, r, + part->first_predicate(), + part->first_sense(), + part->second_predicate(), + part->second_sense(), + part->argument()); + } + + // Build features for consecutive co-parents. + semantic_parts->GetOffsetConsecutiveCoparent(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartConsecutiveCoparent *part = + static_cast((*semantic_parts)[r]); + CHECK_EQ(part->type(), SEMANTICPART_CONSECUTIVECOPARENT); + semantic_features->AddConsecutiveCoparentFeatures( + sentence, r, + part->first_predicate(), + part->first_sense(), + part->second_predicate(), + part->second_sense(), + part->argument()); + } + +#if 0 + // Build features for grand-siblings. + dependency_parts->GetOffsetGrandSibl(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartGrandSibl *part = + static_cast((*dependency_parts)[r]); + CHECK_EQ(part->type(), DEPENDENCYPART_GRANDSIBL); + CHECK_LE(part->modifier(), sentence_length); + CHECK_LE(part->sibling(), sentence_length); + dependency_features->AddGrandSiblingFeatures(sentence, r, + part->grandparent(), + part->head(), + part->modifier(), + part->sibling()); + } + + // Build features for tri-siblings. + dependency_parts->GetOffsetTriSibl(&offset, &size); + if (pruner) CHECK_EQ(size, 0); + for (int r = offset; r < offset + size; ++r) { + if (!selected_parts[r]) continue; + SemanticPartTriSibl *part = + static_cast((*dependency_parts)[r]); + CHECK_EQ(part->type(), DEPENDENCYPART_TRISIBL); + dependency_features->AddTriSiblingFeatures(sentence, r, + part->head(), + part->modifier(), + part->sibling(), + part->other_sibling()); + } + +#endif +} + +// Prune basic parts (arcs and labeled arcs) using a first-order model. +// The vectors of basic parts is given as input, and those elements that are +// to be pruned are deleted from the vector. +// If gold_outputs is not NULL that vector will also be pruned. +void SemanticPipe::Prune(Instance *instance, Parts *parts, + vector *gold_outputs, + bool preserve_gold) { + SemanticParts *semantic_parts = static_cast(parts); + Features *features = CreateFeatures(); + vector scores; + vector predicted_outputs; + + // Make sure gold parts are only preserved at training time. + CHECK(!preserve_gold || options_->train()); + + MakeFeatures(instance, parts, true, features); + ComputeScores(instance, parts, features, true, &scores); + GetSemanticDecoder()->DecodePruner(instance, parts, scores, + &predicted_outputs); + + int offset_predicate_parts, num_predicate_parts; + int offset_arcs, num_arcs; + semantic_parts->GetOffsetPredicate(&offset_predicate_parts, + &num_predicate_parts); + semantic_parts->GetOffsetArc(&offset_arcs, &num_arcs); + + double threshold = 0.5; + int r0 = offset_arcs; // Preserve all the predicate parts. + semantic_parts->ClearOffsets(); + semantic_parts->SetOffsetPredicate(offset_predicate_parts, + num_predicate_parts); + for (int r = 0; r < num_arcs; ++r) { + // Preserve gold parts (at training time). + if (predicted_outputs[offset_arcs + r] >= threshold || + (preserve_gold && (*gold_outputs)[offset_arcs + r] >= threshold)) { + (*parts)[r0] = (*parts)[offset_arcs + r]; + semantic_parts-> + SetLabeledParts(r0, semantic_parts->GetLabeledParts(offset_arcs + r)); + if (gold_outputs) { + (*gold_outputs)[r0] = (*gold_outputs)[offset_arcs + r]; + } + ++r0; + } else { + delete (*parts)[offset_arcs + r]; + } + } + + if (gold_outputs) gold_outputs->resize(r0); + semantic_parts->Resize(r0); + semantic_parts->DeleteIndices(); + semantic_parts->SetOffsetArc(offset_arcs, + parts->size() - offset_arcs); + + delete features; +} + +void SemanticPipe::LabelInstance(Parts *parts, + const vector &output, + Instance *instance) { + SemanticParts *semantic_parts = static_cast(parts); + SemanticInstance *semantic_instance = + static_cast(instance); + SemanticDictionary *semantic_dictionary = + static_cast(dictionary_); + //bool allow_root_predicate = GetSemanticOptions()->allow_root_predicate(); + int instance_length = semantic_instance->size(); + double threshold = 0.5; + semantic_instance->ClearPredicates(); + for (int p = 0; p < instance_length; ++p) { + //if (p == 0 && !allow_root_predicate) continue; + const vector &senses = semantic_parts->GetSenses(p); + vector argument_indices; + vector argument_roles; + int predicted_sense = -1; + for (int k = 0; k < senses.size(); k++) { + int s = senses[k]; + for (int a = 1; a < instance_length; ++a) { + if (GetSemanticOptions()->labeled()) { + int r = semantic_parts->FindArc(p, a, s); + if (r < 0) continue; + const vector &labeled_arcs = + semantic_parts->FindLabeledArcs(p, a, s); + for (int l = 0; l < labeled_arcs.size(); ++l) { + int r = labeled_arcs[l]; + if (output[r] > threshold) { + if (predicted_sense != s) { + CHECK_LT(predicted_sense, 0); + predicted_sense = s; + } + argument_indices.push_back(a); + SemanticPartLabeledArc *labeled_arc = + static_cast((*parts)[r]); + string role = + semantic_dictionary->GetRoleName(labeled_arc->role()); + argument_roles.push_back(role); + } + } + } else { + int r = semantic_parts->FindArc(p, a, s); + if (r < 0) continue; + if (output[r] > threshold) { + if (predicted_sense != s) { + CHECK_LT(predicted_sense, 0); + predicted_sense = s; + } + argument_indices.push_back(a); + argument_roles.push_back("ARG"); + } + } + } + } + + if (predicted_sense >= 0) { + int s = predicted_sense; + // Get the predicate id for this part. + // TODO(atm): store this somewhere, so that we don't need to recompute this + // all the time. Maybe store this directly in arc->sense()? + int lemma_id = TOKEN_UNKNOWN; + if (GetSemanticOptions()->use_predicate_senses()) { + lemma_id = semantic_dictionary->GetTokenDictionary()-> + GetLemmaId(semantic_instance->GetLemma(p)); + if (lemma_id < 0) lemma_id = TOKEN_UNKNOWN; + } + const vector *predicates = + &GetSemanticDictionary()->GetLemmaPredicates(lemma_id); + if (predicates->size() == 0 && + GetSemanticOptions()->allow_unseen_predicates()) { + predicates = &GetSemanticDictionary()->GetLemmaPredicates(TOKEN_UNKNOWN); + } + int predicate_id = (*predicates)[s]->id(); + string predicate_name = + semantic_dictionary->GetPredicateName(predicate_id); + semantic_instance->AddPredicate(predicate_name, p, argument_roles, + argument_indices); + } + } +} diff --git a/src/sequence/SequencePipe.cpp b/src/sequence/SequencePipe.cpp index 87b2105..7af0625 100644 --- a/src/sequence/SequencePipe.cpp +++ b/src/sequence/SequencePipe.cpp @@ -30,7 +30,7 @@ using namespace std; // Define the current model version and the oldest back-compatible version. // The format is AAAA.BBBB.CCCC, e.g., 2 0003 0000 means "2.3.0". -const uint64_t kSequenceModelVersion = 200030000; +const uint64_t kSequenceModelVersion = 200030001; const uint64_t kOldestCompatibleSequenceModelVersion = 200030000; const uint64_t kSequenceModelCheck = 1234567890; @@ -46,15 +46,13 @@ void SequencePipe::SaveModel(FILE* fs) { void SequencePipe::LoadModel(FILE* fs) { bool success; - uint64_t model_check; - uint64_t model_version; - success = ReadUINT64(fs, &model_check); + success = ReadUINT64(fs, &model_check_); CHECK(success); - CHECK_EQ(model_check, kSequenceModelCheck) + CHECK_EQ(model_check_, kSequenceModelCheck) << "The model file is too old and not supported anymore."; - success = ReadUINT64(fs, &model_version); + success = ReadUINT64(fs, &model_version_); CHECK(success); - CHECK_GE(model_version, kOldestCompatibleSequenceModelVersion) + CHECK_GE(model_version_, kOldestCompatibleSequenceModelVersion) << "The model file is too old and not supported anymore."; delete token_dictionary_; CreateTokenDictionary(); @@ -598,4 +596,4 @@ void SequencePipe::LabelInstance(Parts *parts, const vector &output, for (int i = 0; i < instance_length; ++i) { CHECK(sequence_instance->GetTag(i) != "NULL"); } -} +} diff --git a/src/util/SerializationUtils.cpp b/src/util/SerializationUtils.cpp index 0e45a0a..ec050ad 100644 --- a/src/util/SerializationUtils.cpp +++ b/src/util/SerializationUtils.cpp @@ -1,111 +1,129 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "SerializationUtils.h" -#include - -bool WriteString(FILE *fs, const std::string& data) { - const char *buffer = data.c_str(); - int length = strlen(buffer); - if (1 != fwrite(&length, sizeof(int), 1, fs)) return false; - if (length != fwrite(buffer, sizeof(char), length, fs)) return false; - return true; -} - -bool WriteBool(FILE *fs, bool value) { - if (1 != fwrite(&value, sizeof(bool), 1, fs)) return false; - return true; -} - -bool WriteInteger(FILE *fs, int value) { - if (1 != fwrite(&value, sizeof(int), 1, fs)) return false; - return true; -} - -bool WriteUINT8(FILE *fs, uint8_t value) { - if (1 != fwrite(&value, sizeof(uint8_t), 1, fs)) return false; - return true; -} - -bool WriteUINT64(FILE *fs, uint64_t value) { - if (1 != fwrite(&value, sizeof(uint64_t), 1, fs)) return false; - return true; -} - -bool WriteDouble(FILE *fs, double value) { - if (1 != fwrite(&value, sizeof(double), 1, fs)) return false; - return true; -} - -bool WriteIntegerVector(FILE *fs, const std::vector &values) { - int length = values.size(); - if (!WriteInteger(fs, length)) return false; - for (int i = 0; i < length; ++i) { - int value = values[i]; - if (!WriteInteger(fs, value)) return false; - } - return true; -} - -bool ReadString(FILE *fs, std::string *data) { - int length; - if (1 != fread(&length, sizeof(int), 1, fs)) return false; - char *buffer = new char[length + 1]; - if (length != fread(buffer, sizeof(char), length, fs)) return false; - buffer[length] = '\0'; - (*data).assign(buffer, length); //*data = buffer; - delete[] buffer; - return true; -} - -bool ReadBool(FILE *fs, bool *value) { - if (1 != fread(value, sizeof(bool), 1, fs)) return false; - return true; -} - -bool ReadInteger(FILE *fs, int *value) { - if (1 != fread(value, sizeof(int), 1, fs)) return false; - return true; -} - -bool ReadUINT8(FILE *fs, uint8_t *value) { - if (1 != fread(value, sizeof(uint8_t), 1, fs)) return false; - return true; -} - -bool ReadUINT64(FILE *fs, uint64_t *value) { - if (1 != fread(value, sizeof(uint64_t), 1, fs)) return false; - return true; -} - -bool ReadDouble(FILE *fs, double *value) { - if (1 != fread(value, sizeof(double), 1, fs)) return false; - return true; -} - -bool ReadIntegerVector(FILE *fs, std::vector *values) { - int length; - if (!ReadInteger(fs, &length)) return false; - values->resize(length); - for (int i = 0; i < length; ++i) { - int value; - if (!ReadInteger(fs, &value)) return false; - (*values)[i] = value; - } - return true; -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "SerializationUtils.h" +#include + +bool WriteString(FILE *fs, const std::string& data) { + const char *buffer = data.c_str(); + int length = strlen(buffer); + if (1 != fwrite(&length, sizeof(int), 1, fs)) + return false; + if (length != fwrite(buffer, sizeof(char), length, fs)) + return false; + return true; +} + +bool WriteBool(FILE *fs, bool value) { + if (1 != fwrite(&value, sizeof(bool), 1, fs)) + return false; + return true; +} + +bool WriteInteger(FILE *fs, int value) { + if (1 != fwrite(&value, sizeof(int), 1, fs)) + return false; + return true; +} + +bool WriteUINT8(FILE *fs, uint8_t value) { + if (1 != fwrite(&value, sizeof(uint8_t), 1, fs)) + return false; + return true; +} + +bool WriteUINT64(FILE *fs, uint64_t value) { + if (1 != fwrite(&value, sizeof(uint64_t), 1, fs)) + return false; + return true; +} + +bool WriteDouble(FILE *fs, double value) { + if (1 != fwrite(&value, sizeof(double), 1, fs)) + return false; + return true; +} + +bool WriteIntegerVector(FILE *fs, const std::vector &values) { + int length = values.size(); + if (!WriteInteger(fs, length)) + return false; + for (int i = 0; i < length; ++i) { + int value = values[i]; + if (!WriteInteger(fs, value)) + return false; + } + return true; +} + +bool ReadString(FILE *fs, std::string *data) { + int length; + if (1 != fread(&length, sizeof(int), 1, fs)) + return false; + char *buffer = new char[length + 1]; + if (length != fread(buffer, sizeof(char), length, fs)) + return false; + buffer[length] = '\0'; + (*data).assign(buffer, length); //*data = buffer; + delete[] buffer; + return true; +} + +bool ReadBool(FILE *fs, bool *value) { + if (1 != fread(value, sizeof(bool), 1, fs)) + return false; + return true; +} + +bool ReadInteger(FILE *fs, int *value) { + if (1 != fread(value, sizeof(int), 1, fs)) + return false; + return true; +} + +bool ReadUINT8(FILE *fs, uint8_t *value) { + if (1 != fread(value, sizeof(uint8_t), 1, fs)) + return false; + return true; +} + +bool ReadUINT64(FILE *fs, uint64_t *value) { + if (1 != fread(value, sizeof(uint64_t), 1, fs)) + return false; + return true; +} + +bool ReadDouble(FILE *fs, double *value) { + if (1 != fread(value, sizeof(double), 1, fs)) + return false; + return true; +} + +bool ReadIntegerVector(FILE *fs, std::vector *values) { + int length; + if (!ReadInteger(fs, &length)) + return false; + values->resize(length); + for (int i = 0; i < length; ++i) { + int value; + if (!ReadInteger(fs, &value)) + return false; + (*values)[i] = value; + } + return true; +} From e67e7e3cf804eafc4130007eff258759a1783907 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 31 Mar 2016 12:43:37 +0100 Subject: [PATCH 21/51] FIX repeated read/write operations for the same flag (entity gazetteer case sensitiveness) --- src/entity_recognizer/EntityDictionary.h | 324 +++++++++++------------ 1 file changed, 159 insertions(+), 165 deletions(-) diff --git a/src/entity_recognizer/EntityDictionary.h b/src/entity_recognizer/EntityDictionary.h index 5c20ad5..45ab009 100644 --- a/src/entity_recognizer/EntityDictionary.h +++ b/src/entity_recognizer/EntityDictionary.h @@ -1,165 +1,159 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef ENTITYDICTIONARY_H_ -#define ENTITYDICTIONARY_H_ - -#include "SequenceDictionary.h" -#include "TokenDictionary.h" -#include "EntityReader.h" - -class EntityDictionary : public SequenceDictionary { -public: - EntityDictionary() {} - EntityDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} - virtual ~EntityDictionary() {} - - void Clear() { - SequenceDictionary::Clear(); - - gazetteer_word_alphabet_.clear(); - gazetteer_entity_tag_alphabet_.clear(); - gazetteer_word_entity_tags_.clear(); - } - - void Save(FILE *fs) { - SequenceDictionary::Save(fs); - - if (0 > gazetteer_word_alphabet_.Save(fs)) CHECK(false); - if (0 > gazetteer_entity_tag_alphabet_.Save(fs)) CHECK(false); - - bool success; - int length = gazetteer_word_entity_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < gazetteer_word_entity_tags_.size(); ++j) { - length = gazetteer_word_entity_tags_[j].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int k = 0; k < gazetteer_word_entity_tags_[j].size(); ++k) { - int id = gazetteer_word_entity_tags_[j][k]; - success = WriteInteger(fs, id); - CHECK(success); - } - } - - length = allowed_bigrams_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < allowed_bigrams_.size(); ++j) { - length = allowed_bigrams_[j].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int k = 0; k < allowed_bigrams_[j].size(); ++k) { - bool allowed = allowed_bigrams_[j][k]; - success = WriteBool(fs, allowed); - CHECK(success); - } - } - - success = WriteBool(fs, gazetteer_case_sensitive_); - CHECK(success); - } - - void Load(FILE *fs) { - SequenceDictionary::Load(fs); - - if (0 > gazetteer_word_alphabet_.Load(fs)) CHECK(false); - if (0 > gazetteer_entity_tag_alphabet_.Load(fs)) CHECK(false); - - int length; - bool success = ReadInteger(fs, &length); - CHECK(success); - gazetteer_word_entity_tags_.resize(length); - for (int j = 0; j < gazetteer_word_entity_tags_.size(); ++j) { - success = ReadInteger(fs, &length); - CHECK(success); - gazetteer_word_entity_tags_[j].resize(length); - for (int k = 0; k < gazetteer_word_entity_tags_[j].size(); ++k) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - gazetteer_word_entity_tags_[j][k] = id; - } - } - - gazetteer_word_alphabet_.StopGrowth(); - gazetteer_entity_tag_alphabet_.StopGrowth(); - LOG(INFO) << "Number of gazetteer words: " - << gazetteer_word_alphabet_.size(); - LOG(INFO) << "Number of gazetteer entity tags: " - << gazetteer_entity_tag_alphabet_.size(); - - success = ReadInteger(fs, &length); - CHECK(success); - allowed_bigrams_.resize(length); - for (int j = 0; j < allowed_bigrams_.size(); ++j) { - success = ReadInteger(fs, &length); - CHECK(success); - allowed_bigrams_[j].resize(length); - for (int k = 0; k < allowed_bigrams_[j].size(); ++k) { - bool allowed; - success = ReadBool(fs, &allowed); - CHECK(success); - allowed_bigrams_[j][k] = allowed; - } - } - - success = ReadBool(fs, &gazetteer_case_sensitive_); - CHECK(success); - } - - void CreateTagDictionary(SequenceReader *reader); - - void ReadGazetteerFiles(); - - void GetWordGazetteerIds(const std::string &word, - std::vector *gazetteer_ids) const { - gazetteer_ids->clear(); - int id = gazetteer_word_alphabet_.Lookup(word); - if (id >= 0) { - gazetteer_ids->assign(gazetteer_word_entity_tags_[id].begin(), - gazetteer_word_entity_tags_[id].end()); - } - } - - bool IsAllowedBigram(int left_tag, int tag) { - CHECK_GE(left_tag, -1); - CHECK_GE(tag, -1); - return allowed_bigrams_[tag + 1][left_tag + 1]; - } - - const bool gazetteer_case_sensitive() const { - return gazetteer_case_sensitive_; - } - -protected: - std::vector > allowed_bigrams_; - Alphabet gazetteer_word_alphabet_; - Alphabet gazetteer_entity_tag_alphabet_; - std::vector > gazetteer_word_entity_tags_; - bool gazetteer_case_sensitive_; //stores the value of the corresponding flag -}; - -class EntityTokenDictionary : public TokenDictionary { -public: - EntityTokenDictionary() {}; - virtual ~EntityTokenDictionary() {}; - void Initialize(EntityReader *reader); -}; -#endif /* ENTITYDICTIONARY_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef ENTITYDICTIONARY_H_ +#define ENTITYDICTIONARY_H_ + +#include "SequenceDictionary.h" +#include "TokenDictionary.h" +#include "EntityReader.h" + +class EntityDictionary : public SequenceDictionary { +public: + EntityDictionary() {} + EntityDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} + virtual ~EntityDictionary() {} + + void Clear() { + SequenceDictionary::Clear(); + + gazetteer_word_alphabet_.clear(); + gazetteer_entity_tag_alphabet_.clear(); + gazetteer_word_entity_tags_.clear(); + } + + void Save(FILE *fs) { + SequenceDictionary::Save(fs); + + if (0 > gazetteer_word_alphabet_.Save(fs)) CHECK(false); + if (0 > gazetteer_entity_tag_alphabet_.Save(fs)) CHECK(false); + + bool success; + int length = gazetteer_word_entity_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < gazetteer_word_entity_tags_.size(); ++j) { + length = gazetteer_word_entity_tags_[j].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int k = 0; k < gazetteer_word_entity_tags_[j].size(); ++k) { + int id = gazetteer_word_entity_tags_[j][k]; + success = WriteInteger(fs, id); + CHECK(success); + } + } + + length = allowed_bigrams_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < allowed_bigrams_.size(); ++j) { + length = allowed_bigrams_[j].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int k = 0; k < allowed_bigrams_[j].size(); ++k) { + bool allowed = allowed_bigrams_[j][k]; + success = WriteBool(fs, allowed); + CHECK(success); + } + } + } + + void Load(FILE *fs) { + SequenceDictionary::Load(fs); + + if (0 > gazetteer_word_alphabet_.Load(fs)) CHECK(false); + if (0 > gazetteer_entity_tag_alphabet_.Load(fs)) CHECK(false); + + int length; + bool success = ReadInteger(fs, &length); + CHECK(success); + gazetteer_word_entity_tags_.resize(length); + for (int j = 0; j < gazetteer_word_entity_tags_.size(); ++j) { + success = ReadInteger(fs, &length); + CHECK(success); + gazetteer_word_entity_tags_[j].resize(length); + for (int k = 0; k < gazetteer_word_entity_tags_[j].size(); ++k) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + gazetteer_word_entity_tags_[j][k] = id; + } + } + + gazetteer_word_alphabet_.StopGrowth(); + gazetteer_entity_tag_alphabet_.StopGrowth(); + LOG(INFO) << "Number of gazetteer words: " + << gazetteer_word_alphabet_.size(); + LOG(INFO) << "Number of gazetteer entity tags: " + << gazetteer_entity_tag_alphabet_.size(); + + success = ReadInteger(fs, &length); + CHECK(success); + allowed_bigrams_.resize(length); + for (int j = 0; j < allowed_bigrams_.size(); ++j) { + success = ReadInteger(fs, &length); + CHECK(success); + allowed_bigrams_[j].resize(length); + for (int k = 0; k < allowed_bigrams_[j].size(); ++k) { + bool allowed; + success = ReadBool(fs, &allowed); + CHECK(success); + allowed_bigrams_[j][k] = allowed; + } + } + } + + void CreateTagDictionary(SequenceReader *reader); + + void ReadGazetteerFiles(); + + void GetWordGazetteerIds(const std::string &word, + std::vector *gazetteer_ids) const { + gazetteer_ids->clear(); + int id = gazetteer_word_alphabet_.Lookup(word); + if (id >= 0) { + gazetteer_ids->assign(gazetteer_word_entity_tags_[id].begin(), + gazetteer_word_entity_tags_[id].end()); + } + } + + bool IsAllowedBigram(int left_tag, int tag) { + CHECK_GE(left_tag, -1); + CHECK_GE(tag, -1); + return allowed_bigrams_[tag + 1][left_tag + 1]; + } + + const bool gazetteer_case_sensitive() const { + return gazetteer_case_sensitive_; + } + +protected: + std::vector > allowed_bigrams_; + Alphabet gazetteer_word_alphabet_; + Alphabet gazetteer_entity_tag_alphabet_; + std::vector > gazetteer_word_entity_tags_; + bool gazetteer_case_sensitive_; //stores the value of the corresponding option flag +}; + +class EntityTokenDictionary : public TokenDictionary { +public: + EntityTokenDictionary() {}; + virtual ~EntityTokenDictionary() {}; + void Initialize(EntityReader *reader); +}; +#endif /* ENTITYDICTIONARY_H_ */ From b3b5de938117c3210abc43f7cc0ca092ec86d7ae Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Fri, 1 Apr 2016 20:17:35 +0100 Subject: [PATCH 22/51] FIX port to cross-python2/3 of portuguese tokenizer files. --- python/tokenizers/portuguese/clitics.py | 4 ++-- python/tokenizers/portuguese/contractions.py | 2 +- python/tokenizers/portuguese/word_tokenizer.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/tokenizers/portuguese/clitics.py b/python/tokenizers/portuguese/clitics.py index 36c2def..07c7334 100644 --- a/python/tokenizers/portuguese/clitics.py +++ b/python/tokenizers/portuguese/clitics.py @@ -16,7 +16,7 @@ You should have received a copy of the GNU Lesser General Public License along with this file. If not, see . """ - +from __future__ import print_function import numpy as np def split_clitics(sentence, clitics, suffixes, use_cintil_format=True): @@ -171,5 +171,5 @@ def generate_clitics(): if __name__ == "__main__": - print generate_clitics() + print (generate_clitics() ) diff --git a/python/tokenizers/portuguese/contractions.py b/python/tokenizers/portuguese/contractions.py index e4379e6..a998be1 100644 --- a/python/tokenizers/portuguese/contractions.py +++ b/python/tokenizers/portuguese/contractions.py @@ -190,7 +190,7 @@ def generate_contractions(): contractions['hás-de'] = ['hás', 'de'], ['haver', 'de'] # Add upper cases. - contraction_toks = contractions.keys() + contraction_toks = list(contractions) for tok in contraction_toks: first_char = tok[0] if first_char.islower(): diff --git a/python/tokenizers/portuguese/word_tokenizer.py b/python/tokenizers/portuguese/word_tokenizer.py index 81038de..7d5ebea 100644 --- a/python/tokenizers/portuguese/word_tokenizer.py +++ b/python/tokenizers/portuguese/word_tokenizer.py @@ -17,8 +17,8 @@ import re from nltk.tokenize.api import TokenizerI -import contractions as contr -import clitics as clit +from . import contractions as contr +from . import clitics as clit class PortugueseWordTokenizer(TokenizerI): """ From 88f4ce4bfe6016a32ff306806fe6d5daa1439936 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Fri, 13 May 2016 14:44:55 +0100 Subject: [PATCH 23/51] Update gitignnore. --- .gitignore | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index f73f21e..ea06b33 100644 --- a/.gitignore +++ b/.gitignore @@ -19,15 +19,24 @@ ner/ *.tlog stamp-h1 .deps +vsprojects/*.suo +vsprojects/*.user +vsprojects/*.userosscache +vsprojects/*.sln.docstates +vsprojects/*.aps +vsprojects/*.ncb +vsprojects/*.opendb +vsprojects/*.opensdf +vsprojects/*.sdf +vsprojects/*.cachefile +vsprojects/*.psess +vsprojects/*.vsp +vsprojects/*.vspx +vsprojects/*/*.vcxproj.user +vsprojects/*/*.vcxproj.filters vsprojects/*/x64 vsprojects/x64/* vsprojects/*/Debug vsprojects/Debug/* vsprojects/*/Release vsprojects/Release/* -vsprojects/*/*.vcxproj.user -vsprojects/*/*.vcxproj.filters -vsprojects/*.opendb -vsprojects/*.opensdf -vsprojects/*.sdf -vsprojects/*.cachefile \ No newline at end of file From e9acb17e88e4d08c31d491536d3945cd972a9d74 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 18 May 2016 12:58:38 +0100 Subject: [PATCH 24/51] Propagate GFLAGS_DLL_DECL=; static lib Gflag. Move TurboWorkers Options and Pipe to Opaque structures in .cpp (instead of .h) to reduce the number of includes in projects using libturboparser TurboParserInterface. --- libturboparser/TurboParserInterface.cpp | 221 ++++++++++-------- libturboparser/TurboParserInterface.h | 52 +++-- vsprojects/classifier/classifier.vcxproj | 6 +- .../constituency_labeler.vcxproj | 6 +- .../coreference_resolver.vcxproj | 6 +- .../dependency_labeler.vcxproj | 6 +- .../entity_recognizer.vcxproj | 6 +- .../libturboparser/libturboparser.vcxproj | 6 +- .../morphological_tagger.vcxproj | 6 +- vsprojects/parser/parser.vcxproj | 6 +- .../semantic_parser/semantic_parser.vcxproj | 6 +- vsprojects/sequence/sequence.vcxproj | 6 +- vsprojects/tagger/tagger.vcxproj | 6 +- .../turbo_constituency_labeler.vcxproj | 6 +- .../turbo_coreference_resolver.vcxproj | 6 +- .../turbo_dependency_labeler.vcxproj | 6 +- .../turbo_entity_recognizer.vcxproj | 6 +- .../turbo_morphological_tagger.vcxproj | 6 +- vsprojects/turbo_parser/turbo_parser.vcxproj | 6 +- .../turbo_semantic_parser.vcxproj | 6 +- vsprojects/turbo_tagger/turbo_tagger.vcxproj | 6 +- vsprojects/util/util.vcxproj | 6 +- 22 files changed, 217 insertions(+), 176 deletions(-) diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index a979505..1a5638f 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -9,31 +9,77 @@ #include #include "Utils.h" #include "TurboParserInterface.h" +#include "TaggerPipe.h" +#include "EntityPipe.h" +#include "DependencyPipe.h" +#include "SemanticPipe.h" +#include "CoreferencePipe.h" +#include "MorphologicalPipe.h" + namespace TurboParserInterface { +struct TurboTaggerWorker::TaggerOptionsOpaque { + TaggerOptions options_; +}; +struct TurboTaggerWorker::TaggerPipeOpaque { + TaggerPipe pipe_; +}; + +struct TurboEntityRecognizerWorker::EntityOptionsOpaque { + EntityOptions options_; +}; +struct TurboEntityRecognizerWorker::EntityPipeOpaque { + EntityPipe pipe_; +}; + +struct TurboParserWorker::DependencyOptionsOpaque { + DependencyOptions options_; +}; +struct TurboParserWorker::DependencyPipeOpaque { + DependencyPipe pipe_; +}; + +struct TurboSemanticParserWorker::SemanticOptionsOpaque { + SemanticOptions options_; +}; +struct TurboSemanticParserWorker::SemanticPipeOpaque { + SemanticPipe pipe_; +}; + +struct TurboCoreferenceResolverWorker::CoreferenceOptionsOpaque { + CoreferenceOptions options_; +}; +struct TurboCoreferenceResolverWorker::CoreferencePipeOpaque { + CoreferencePipe pipe_; +}; + +struct TurboMorphologicalTaggerWorker::MorphologicalOptionsOpaque { + MorphologicalOptions options_; +}; +struct TurboMorphologicalTaggerWorker::MorphologicalPipeOpaque { + MorphologicalPipe pipe_; +}; + TurboTaggerWorker::TurboTaggerWorker() { - tagger_options_ = new TaggerOptions; - tagger_options_->Initialize(); + options_opaque_ = std::make_unique(); + options_opaque_->options_.Initialize(); - tagger_pipe_ = new TaggerPipe(tagger_options_); - tagger_pipe_->Initialize(); + pipe_opaque_ = + std::make_unique + (TaggerPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_->pipe_.Initialize(); } -TurboTaggerWorker::~TurboTaggerWorker() { - LOG(INFO) << "Deleting tagger pipe."; - delete tagger_pipe_; - LOG(INFO) << "Deleting tagger options."; - delete tagger_options_; -} +TurboTaggerWorker::~TurboTaggerWorker() {} void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { - tagger_options_->SetModelFilePath(file_model); + options_opaque_->options_.SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - tagger_pipe_->LoadModelFile(); + pipe_opaque_->pipe_.LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -43,14 +89,14 @@ void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { void TurboTaggerWorker::Tag(const std::string &file_test, const std::string &file_prediction) { - tagger_options_->SetTestFilePath(file_test); - tagger_options_->SetOutputFilePath(file_prediction); + options_opaque_->options_.SetTestFilePath(file_test); + options_opaque_->options_.SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - tagger_pipe_->Run(); + pipe_opaque_->pipe_.Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -59,33 +105,29 @@ void TurboTaggerWorker::Tag(const std::string &file_test, } void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { - tagger_pipe_->ClassifyInstance(sentence); + pipe_opaque_->pipe_.ClassifyInstance(sentence); } TurboEntityRecognizerWorker::TurboEntityRecognizerWorker() { - entity_options_ = new EntityOptions; - entity_options_->Initialize(); + options_opaque_ = std::make_unique(); + options_opaque_->options_.Initialize(); - entity_pipe_ = new EntityPipe(entity_options_); - entity_pipe_->Initialize(); + pipe_opaque_ = std::make_unique + (EntityPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_->pipe_.Initialize(); } -TurboEntityRecognizerWorker::~TurboEntityRecognizerWorker() { - LOG(INFO) << "Deleting entity recognizer pipe."; - delete entity_pipe_; - LOG(INFO) << "Deleting entity recognizer options."; - delete entity_options_; -} +TurboEntityRecognizerWorker::~TurboEntityRecognizerWorker() {} void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( const std::string &file_model) { - entity_options_->SetModelFilePath(file_model); + options_opaque_->options_.SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - entity_pipe_->LoadModelFile(); + pipe_opaque_->pipe_.LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -95,14 +137,14 @@ void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( void TurboEntityRecognizerWorker::Tag(const std::string &file_test, const std::string &file_prediction) { - entity_options_->SetTestFilePath(file_test); - entity_options_->SetOutputFilePath(file_prediction); + options_opaque_->options_.SetTestFilePath(file_test); + options_opaque_->options_.SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - entity_pipe_->Run(); + pipe_opaque_->pipe_.Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -111,32 +153,28 @@ void TurboEntityRecognizerWorker::Tag(const std::string &file_test, } void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { - entity_pipe_->ClassifyInstance(sentence); + pipe_opaque_->pipe_.ClassifyInstance(sentence); } TurboParserWorker::TurboParserWorker() { - parser_options_ = new DependencyOptions; - parser_options_->Initialize(); + options_opaque_ = std::make_unique(); + options_opaque_->options_.Initialize(); - parser_pipe_ = new DependencyPipe(parser_options_); - parser_pipe_->Initialize(); + pipe_opaque_ = std::make_unique + (DependencyPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_->pipe_.Initialize(); } -TurboParserWorker::~TurboParserWorker() { - LOG(INFO) << "Deleting parser pipe."; - delete parser_pipe_; - LOG(INFO) << "Deleting parser options."; - delete parser_options_; -} +TurboParserWorker::~TurboParserWorker() {} void TurboParserWorker::LoadParserModel(const std::string &file_model) { - parser_options_->SetModelFilePath(file_model); + options_opaque_->options_.SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - parser_pipe_->LoadModelFile(); + pipe_opaque_->pipe_.LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -146,14 +184,14 @@ void TurboParserWorker::LoadParserModel(const std::string &file_model) { void TurboParserWorker::Parse(const std::string &file_test, const std::string &file_prediction) { - parser_options_->SetTestFilePath(file_test); - parser_options_->SetOutputFilePath(file_prediction); + options_opaque_->options_.SetTestFilePath(file_test); + options_opaque_->options_.SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - parser_pipe_->Run(); + pipe_opaque_->pipe_.Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -162,27 +200,23 @@ void TurboParserWorker::Parse(const std::string &file_test, } void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { - parser_pipe_->ClassifyInstance(sentence); + pipe_opaque_->pipe_.ClassifyInstance(sentence); } TurboSemanticParserWorker::TurboSemanticParserWorker() { - semantic_options_ = new SemanticOptions; - semantic_options_->Initialize(); + options_opaque_ = std::make_unique(); + options_opaque_->options_.Initialize(); - semantic_pipe_ = new SemanticPipe(semantic_options_); - semantic_pipe_->Initialize(); + pipe_opaque_ = std::make_unique + (SemanticPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_->pipe_.Initialize(); } -TurboSemanticParserWorker::~TurboSemanticParserWorker() { - LOG(INFO) << "Deleting semantic pipe."; - delete semantic_pipe_; - LOG(INFO) << "Deleting semantic options."; - delete semantic_options_; -} +TurboSemanticParserWorker::~TurboSemanticParserWorker() {} void TurboSemanticParserWorker::LoadSemanticParserModel( const std::string &file_model) { - semantic_options_->SetModelFilePath(file_model); + options_opaque_->options_.SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; @@ -190,7 +224,7 @@ void TurboSemanticParserWorker::LoadSemanticParserModel( LOG(INFO) << "Loading model file " << file_model; - semantic_pipe_->LoadModelFile(); + pipe_opaque_->pipe_.LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -201,14 +235,14 @@ void TurboSemanticParserWorker::LoadSemanticParserModel( void TurboSemanticParserWorker::ParseSemanticDependencies( const std::string &file_test, const std::string &file_prediction) { - semantic_options_->SetTestFilePath(file_test); - semantic_options_->SetOutputFilePath(file_prediction); + options_opaque_->options_.SetTestFilePath(file_test); + options_opaque_->options_.SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - semantic_pipe_->Run(); + pipe_opaque_->pipe_.Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -218,27 +252,23 @@ void TurboSemanticParserWorker::ParseSemanticDependencies( void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( SemanticInstance *sentence) { - semantic_pipe_->ClassifyInstance(sentence); + pipe_opaque_->pipe_.ClassifyInstance(sentence); } TurboCoreferenceResolverWorker::TurboCoreferenceResolverWorker() { - coreference_options_ = new CoreferenceOptions; - coreference_options_->Initialize(); + options_opaque_ = std::make_unique(); + options_opaque_->options_.Initialize(); - coreference_pipe_ = new CoreferencePipe(coreference_options_); - coreference_pipe_->Initialize(); + pipe_opaque_ = std::make_unique + (CoreferencePipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_->pipe_.Initialize(); } -TurboCoreferenceResolverWorker::~TurboCoreferenceResolverWorker() { - LOG(INFO) << "Deleting coreference pipe."; - delete coreference_pipe_; - LOG(INFO) << "Deleting coreference options."; - delete coreference_options_; -} +TurboCoreferenceResolverWorker::~TurboCoreferenceResolverWorker() {} void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( const std::string &file_model) { - coreference_options_->SetModelFilePath(file_model); + options_opaque_->options_.SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; @@ -246,7 +276,7 @@ void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( LOG(INFO) << "Loading model file " << file_model; - coreference_pipe_->LoadModelFile(); + pipe_opaque_->pipe_.LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -257,14 +287,14 @@ void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( void TurboCoreferenceResolverWorker::ResolveCoreferences( const std::string &file_test, const std::string &file_prediction) { - coreference_options_->SetTestFilePath(file_test); - coreference_options_->SetOutputFilePath(file_prediction); + options_opaque_->options_.SetTestFilePath(file_test); + options_opaque_->options_.SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - coreference_pipe_->Run(); + pipe_opaque_->pipe_.Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -274,35 +304,30 @@ void TurboCoreferenceResolverWorker::ResolveCoreferences( void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( CoreferenceDocument *document) { - coreference_pipe_->ClassifyInstance(document); + pipe_opaque_->pipe_.ClassifyInstance(document); } TurboMorphologicalTaggerWorker::TurboMorphologicalTaggerWorker() { - morphological_tagger_options_ = new MorphologicalOptions; - morphological_tagger_options_->Initialize(); + options_opaque_ = std::make_unique(); + options_opaque_->options_.Initialize(); - morphological_tagger_pipe_ = - new MorphologicalPipe(morphological_tagger_options_); - morphological_tagger_pipe_->Initialize(); + pipe_opaque_ = std::make_unique + (MorphologicalPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_->pipe_.Initialize(); } -TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() { - LOG(INFO) << "Deleting tagger pipe."; - delete morphological_tagger_pipe_; - LOG(INFO) << "Deleting tagger options."; - delete morphological_tagger_options_; -} +TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() {} void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( const std::string &file_model) { - morphological_tagger_options_->SetModelFilePath(file_model); + options_opaque_->options_.SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - morphological_tagger_pipe_->LoadModelFile(); + pipe_opaque_->pipe_.LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -312,14 +337,14 @@ void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, const std::string &file_prediction) { - morphological_tagger_options_->SetTestFilePath(file_test); - morphological_tagger_options_->SetOutputFilePath(file_prediction); + options_opaque_->options_.SetTestFilePath(file_test); + options_opaque_->options_.SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - morphological_tagger_pipe_->Run(); + pipe_opaque_->pipe_.Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -329,7 +354,7 @@ void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, void TurboMorphologicalTaggerWorker::TagSentence( MorphologicalInstance *sentence) { - morphological_tagger_pipe_->ClassifyInstance(sentence); + pipe_opaque_->pipe_.ClassifyInstance(sentence); } TurboParserInterface::TurboParserInterface() { @@ -341,7 +366,7 @@ TurboParserInterface::TurboParserInterface() { google::InitGoogleLogging(argv_[0]); // Parse command line flags. - google::ParseCommandLineFlags(&argc_, &argv_, false); + google::ParseCommandLineFlags(&argc_, &argv_, true); #ifdef _WIN32 google::LogToStderr(); diff --git a/libturboparser/TurboParserInterface.h b/libturboparser/TurboParserInterface.h index dd26a7f..2d0d5e2 100644 --- a/libturboparser/TurboParserInterface.h +++ b/libturboparser/TurboParserInterface.h @@ -1,11 +1,15 @@ #include #include -#include "TaggerPipe.h" -#include "EntityPipe.h" -#include "DependencyPipe.h" -#include "SemanticPipe.h" -#include "CoreferencePipe.h" -#include "MorphologicalPipe.h" +#include +#include "Instance.h" +#include "SequenceInstance.h" +#include "EntityInstance.h" +#include "DependencyInstance.h" +#include "SemanticInstance.h" +#include "EntitySpan.h" +#include "CoreferenceSentence.h" +#include "CoreferenceDocument.h" +#include "MorphologicalInstance.h" namespace TurboParserInterface { class TurboTaggerWorker { @@ -21,8 +25,10 @@ class TurboTaggerWorker { void TagSentence(SequenceInstance *sentence); private: - TaggerOptions *tagger_options_; - TaggerPipe *tagger_pipe_; + struct TaggerOptionsOpaque; + std::unique_ptr options_opaque_; + struct TaggerPipeOpaque; + std::unique_ptr pipe_opaque_; }; class TurboEntityRecognizerWorker { @@ -38,8 +44,10 @@ class TurboEntityRecognizerWorker { void TagSentence(EntityInstance *sentence); private: - EntityOptions *entity_options_; - EntityPipe *entity_pipe_; + struct EntityOptionsOpaque; + std::unique_ptr options_opaque_; + struct EntityPipeOpaque; + std::unique_ptr pipe_opaque_; }; class TurboParserWorker { @@ -55,8 +63,10 @@ class TurboParserWorker { void ParseSentence(DependencyInstance *sentence); private: - DependencyOptions *parser_options_; - DependencyPipe *parser_pipe_; + struct DependencyOptionsOpaque; + std::unique_ptr options_opaque_; + struct DependencyPipeOpaque; + std::unique_ptr pipe_opaque_; }; class TurboSemanticParserWorker { @@ -72,8 +82,10 @@ class TurboSemanticParserWorker { void ParseSemanticDependenciesFromSentence(SemanticInstance *sentence); private: - SemanticOptions *semantic_options_; - SemanticPipe *semantic_pipe_; + struct SemanticOptionsOpaque; + std::unique_ptr options_opaque_; + struct SemanticPipeOpaque; + std::unique_ptr pipe_opaque_; }; class TurboCoreferenceResolverWorker { @@ -89,8 +101,10 @@ class TurboCoreferenceResolverWorker { void ResolveCoreferencesFromDocument(CoreferenceDocument *document); private: - CoreferenceOptions *coreference_options_; - CoreferencePipe *coreference_pipe_; + struct CoreferenceOptionsOpaque; + std::unique_ptr options_opaque_; + struct CoreferencePipeOpaque; + std::unique_ptr pipe_opaque_; }; class TurboMorphologicalTaggerWorker { @@ -106,8 +120,10 @@ class TurboMorphologicalTaggerWorker { void TagSentence(MorphologicalInstance *sentence); private: - MorphologicalOptions *morphological_tagger_options_; - MorphologicalPipe *morphological_tagger_pipe_; + struct MorphologicalOptionsOpaque; + std::unique_ptr options_opaque_; + struct MorphologicalPipeOpaque; + std::unique_ptr pipe_opaque_; }; class TurboParserInterface { diff --git a/vsprojects/classifier/classifier.vcxproj b/vsprojects/classifier/classifier.vcxproj index 2e2c469..28c72db 100644 --- a/vsprojects/classifier/classifier.vcxproj +++ b/vsprojects/classifier/classifier.vcxproj @@ -129,7 +129,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;%(AdditionalIncludeDirectories) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) Disabled @@ -185,7 +185,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable @@ -208,7 +208,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/constituency_labeler/constituency_labeler.vcxproj b/vsprojects/constituency_labeler/constituency_labeler.vcxproj index d11094b..204fc3c 100644 --- a/vsprojects/constituency_labeler/constituency_labeler.vcxproj +++ b/vsprojects/constituency_labeler/constituency_labeler.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -205,7 +205,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/coreference_resolver/coreference_resolver.vcxproj b/vsprojects/coreference_resolver/coreference_resolver.vcxproj index 38960ba..4c9a22a 100644 --- a/vsprojects/coreference_resolver/coreference_resolver.vcxproj +++ b/vsprojects/coreference_resolver/coreference_resolver.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -185,7 +185,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -203,7 +203,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/dependency_labeler/dependency_labeler.vcxproj b/vsprojects/dependency_labeler/dependency_labeler.vcxproj index 7439ecc..3dd7851 100644 --- a/vsprojects/dependency_labeler/dependency_labeler.vcxproj +++ b/vsprojects/dependency_labeler/dependency_labeler.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -185,7 +185,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) @@ -203,7 +203,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/entity_recognizer/entity_recognizer.vcxproj b/vsprojects/entity_recognizer/entity_recognizer.vcxproj index 002e777..916c960 100644 --- a/vsprojects/entity_recognizer/entity_recognizer.vcxproj +++ b/vsprojects/entity_recognizer/entity_recognizer.vcxproj @@ -132,7 +132,7 @@ NotUsing Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -209,7 +209,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index 8289d1e..b8b97e8 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -115,7 +115,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -168,7 +168,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -190,7 +190,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/morphological_tagger/morphological_tagger.vcxproj b/vsprojects/morphological_tagger/morphological_tagger.vcxproj index 73671eb..623c319 100644 --- a/vsprojects/morphological_tagger/morphological_tagger.vcxproj +++ b/vsprojects/morphological_tagger/morphological_tagger.vcxproj @@ -132,7 +132,7 @@ NotUsing Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -209,7 +209,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/parser/parser.vcxproj b/vsprojects/parser/parser.vcxproj index be731a7..4cead66 100644 --- a/vsprojects/parser/parser.vcxproj +++ b/vsprojects/parser/parser.vcxproj @@ -100,7 +100,7 @@ $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) Level3 Disabled @@ -137,7 +137,7 @@ true true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) @@ -153,7 +153,7 @@ false false false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) Disabled diff --git a/vsprojects/semantic_parser/semantic_parser.vcxproj b/vsprojects/semantic_parser/semantic_parser.vcxproj index 38dbccb..5dedbc6 100644 --- a/vsprojects/semantic_parser/semantic_parser.vcxproj +++ b/vsprojects/semantic_parser/semantic_parser.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -189,7 +189,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -211,7 +211,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/sequence/sequence.vcxproj b/vsprojects/sequence/sequence.vcxproj index 988931c..dc8075d 100644 --- a/vsprojects/sequence/sequence.vcxproj +++ b/vsprojects/sequence/sequence.vcxproj @@ -115,7 +115,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -168,7 +168,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -190,7 +190,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/tagger/tagger.vcxproj b/vsprojects/tagger/tagger.vcxproj index 17bf818..65a731b 100644 --- a/vsprojects/tagger/tagger.vcxproj +++ b/vsprojects/tagger/tagger.vcxproj @@ -141,7 +141,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) /wd4018 /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) Disabled @@ -205,7 +205,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable @@ -231,7 +231,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) /D GFLAGS_DLL_DECL= /D GFLAGS_DLL_DECLARE_FLAG= /D GFLAGS_DLL_DEFINE_FLAG= %(AdditionalOptions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj index 99c0e71..700a21d 100644 --- a/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj +++ b/vsprojects/turbo_constituency_labeler/turbo_constituency_labeler.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -207,7 +207,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj index 87d5f16..1c28bca 100644 --- a/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj +++ b/vsprojects/turbo_coreference_resolver/turbo_coreference_resolver.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -207,7 +207,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj index c49ec8c..3902bcb 100644 --- a/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj +++ b/vsprojects/turbo_dependency_labeler/turbo_dependency_labeler.vcxproj @@ -134,7 +134,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -187,7 +187,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -207,7 +207,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj index 3f9d63c..4337ecb 100644 --- a/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj +++ b/vsprojects/turbo_entity_recognizer/turbo_entity_recognizer.vcxproj @@ -135,7 +135,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -194,7 +194,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -218,7 +218,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj index 24dd770..6e72ca8 100644 --- a/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj +++ b/vsprojects/turbo_morphological_tagger/turbo_morphological_tagger.vcxproj @@ -135,7 +135,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -194,7 +194,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -218,7 +218,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_parser/turbo_parser.vcxproj b/vsprojects/turbo_parser/turbo_parser.vcxproj index 98e1e56..71d1310 100644 --- a/vsprojects/turbo_parser/turbo_parser.vcxproj +++ b/vsprojects/turbo_parser/turbo_parser.vcxproj @@ -135,7 +135,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -194,7 +194,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -218,7 +218,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj index 340a685..6ea0d91 100644 --- a/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj +++ b/vsprojects/turbo_semantic_parser/turbo_semantic_parser.vcxproj @@ -158,7 +158,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -217,7 +217,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) @@ -237,7 +237,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/turbo_tagger/turbo_tagger.vcxproj b/vsprojects/turbo_tagger/turbo_tagger.vcxproj index 9c39763..15c9f55 100644 --- a/vsprojects/turbo_tagger/turbo_tagger.vcxproj +++ b/vsprojects/turbo_tagger/turbo_tagger.vcxproj @@ -135,7 +135,7 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;%(AdditionalIncludeDirectories) Disabled @@ -194,7 +194,7 @@ MaxSpeed true true - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -218,7 +218,7 @@ Disabled true false - WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\parser;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled diff --git a/vsprojects/util/util.vcxproj b/vsprojects/util/util.vcxproj index 5b6269a..537ec66 100644 --- a/vsprojects/util/util.vcxproj +++ b/vsprojects/util/util.vcxproj @@ -121,7 +121,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;_DEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled @@ -174,7 +174,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) AnySuitable Speed @@ -196,7 +196,7 @@ Disabled true false - WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;%(PreprocessorDefinitions) + WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled From df566003e04325475ce0e50625d6a866d92159f2 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 18 May 2016 13:01:01 +0100 Subject: [PATCH 25/51] Propagate GFLAGS_DLL_DECL=; static lib Gflag. Zip with Gflags was updated. --- deps/gflags-2.0_fix_for_MSVCv40.7z | Bin 292611 -> 293867 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/deps/gflags-2.0_fix_for_MSVCv40.7z b/deps/gflags-2.0_fix_for_MSVCv40.7z index d64e145902cfd7f1265fcbea64e88febdf329b33..4d06e4a6084e79592b0ca719be23cd9e0ac09b96 100644 GIT binary patch delta 176709 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

l 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%0A258YE!00wMgOD)^y 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

DaPC@%wc$gX2h>izB+~(P@h< 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 Kp5N%SMjhJ<@jtNR@8c zoFr~jCs7Ho&7PvMagj{F)`Ok1@un@L-6Eq{VtOrOW-MGvS0V}oSoM_VZG2}4SpmiV zzBmgI{+O8(@mnTUv<;R%hQBZZ8YHNuwxK?NtJJ$whN1I;2;z%?$qMkD6lzg z+%-=#Dzv-6>Ht7*!)ilmWjL?EtBds&56u@Q6os*Fz8`B& zQZLMymv>Ho8vlgj=_y4XWy`E|5LbSRpE@_;8?Ss&SY*^G4P+J4c3#D(lk6{Xj#0&V zkSEnxLN5)Rq)r24nDpH=H%~mbsTNbx0rHT5DiLCTWI@Sx!2T5IMlUmxUFd=VIpMY1 z-6UZkTwEjI2~+{xhgzSH6JoH&PIaNXrCrI+NA0M8)i;%U!s+n7>8MXT2G6vA#-)F) zYpjHH#S__3A#3BZCnT6v6B(NvW3K*w1w1?xYu5&i_c&GLHkb092tK1MTtF&;cfdR6ia?n=bu0vFYq!qS=o8oj zv~lf!XKC>U>mn9_P-+j2FzYqt#D@q4lxkeO|MKZ{T943!IpceN$B!D3wUiPiR8ZXW zxiQLHbfQ-Xamo|Wsk!F;1Lkeho5P83ynV>b#eH;D2m00_6#S-KRf|U9njRxPe%qu+ z^s4g6RLr8bP%zA;b}^?MbPo*_DZYki*DURSN=BnKmtzDVkCKfO6*jOi#*T*Qzr^Xe zeA{c=R?9$mXU9ny#tWmMc3k~~B%%^)y7GsRy`F((IY+A*!zR4Dft(_pA(2ip3fVgB z;oSPnC&Ss4s-yR0X>424lZSi*uh@L_7o&U-Jw|H0kDeTz4OoGO)ic(bZ=yIK`avXr z3u=MRM?-araA5TzkM%9FVNMh*B0nz=raqT1rioePgo$de8{+@~finlL57-+{0K!Z~ z!wp^Ygz{bQp+aNkO#d$Qycju7;za7eKoUWQ--8!{4}6=?&#-HK=uo+|brJ9$`VnFs zD?_4Gi6hEXx+iS%L1bMgaX!HOh)=+Ohkxv{m}^hu&F2K7WetAm;U!MBMUb|jh|EZ- zW3b9hf@PHX%sV9_4ApHZo(&*Ikl+u3(khlr(yL$%S+9a3(M4rnKl;bAGoDpcb=aWo-qVi?Sh->W>&VSt%>qNb4%NV!H>FOnkx;#VGHbV;cw3zYULJmw>p(@ZZKB|eu zvh&e^c-rHzs#plK_@!nVo<2s&xQ4VYieyeO#-hP(XylfzUU4J$Rm8nph zs70}*mDB?=P!6F2(MTc>=}gxW4tVE;77SM(67S{2!P}=IVY!66Bc-OjWy_rk^`@ZL z11F;ygasDOLz3H!SY3}>Icsocv~IY^y)&nck!SY^j3@KJSz(`{WCW-JIuIj*hm96U zJieFaq7fEvH^>f@3d&V~T2*@Ef!0R$g( zngPbkB6yOfGXA!CHrr3BEbFd0Z_}G9FcyHqrP4aFTnYwLnK1%?D}~E3V`a1a|CCv# z?g{t#sep|gc9l+61)^Nz-&{1+VV!-kBiRZ8S8;i#sJ~AMqpvjKVErOO7NY-c#MHdA zw`fMgw>kBPU51AWx7iq)R|C^RS|o{PRP55Cm|0*YEYROFYjwMLOeAK#3cW11Dd_vs zAn?VT(96z`h%;V)69xM5b-uq1r7Z!BaYP2ppcK+u2A7T@~8-6l>Uh|cc%C;*nMArtfm%rNM)0Ez9ey*-i}2n zbRO|5Jh$y8&3SIx;MG*BEe4k`&ib*>d`$_|zN{Q0!?c&9FJlh=WE_Q>DeVW*OQjAs zPUwnLLhoE4vF=NUkGV!YM6!Ml7}P^Q)IvE6%wXrp3e|L%@=GJs7_D0#&6haH6w1~+ zIai)rA*_>s2CNxyN8(BmTAt_#jD(NpTYW-&)KRAvUe6RwI}!{axw68H#UT?zrlQ#y zd61$9oEW;HJIxe_&EYm$a)G~=! z)}8Z?Z^KM)qnZ6OWNE+dk|xDmCEs&*5=ZJNBh!rYa(;bA$)-!IHZP>dpCzd zB`#loXmV0LSa(OQOw*n-e{6)$yQ~bpQ^{tNA*8&Tn3QFKkP<9F98Lk6 z?DYCf?v^unhL@2>ES7|-#9v^br{K^~yeItxxD#Zb!~bubstZ<7&^{m1Upn#=ra z6feUuNRn2{H$b0rfYiq3!Y}CVo0HI8!>DmPIbj8&b5upL=k?Gxm9UJ{zBG&k5-iex zQIBT$qx0c#dHNyGrjSK}31=c`i4RW`I3!NcfY06QU(DtjW7VUFGFopod6*~%o~bye zuwc#LC_!1~^+(MydqA1zq7|=O{yt8S!p7uKn{895AI50$1;mUqMs@flZqQb-b_fdP zBf@<6TEB)2qMusA1ev(`t@^VslTa^zb@b}{lukq;Y$VS7gh7ijK*IGSO&s;X@f#KN z$m11hD`NAn-l-#F9#ps9-g7ndhUHw?Weq6%2RsH6Dqb47P#0J-k{XyboRbKfl^W~a zD9k`|C%;N}`3Mnj?7U&7|F59C<*KU*`;AE_&v)3RCl?09YIFe!hdlrX3jqKY0V4we V0R>$EFaQ7yqLT^%)=N2M001)FjvoL3 delta 175428 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ć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 Date: Fri, 20 May 2016 20:55:22 +0100 Subject: [PATCH 26/51] Fix python code regarding morphological tagger module with python v3. --- libturboparser/TurboParserInterface.h | 6 ++-- python/nlp_pipeline.py | 3 +- python/nlp_sentence.py | 41 ++++++++++++++++++++------- python/test.py | 14 +++++++-- src/classifier/Alphabet.h | 2 +- 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/libturboparser/TurboParserInterface.h b/libturboparser/TurboParserInterface.h index 2d0d5e2..abd7e30 100644 --- a/libturboparser/TurboParserInterface.h +++ b/libturboparser/TurboParserInterface.h @@ -147,7 +147,8 @@ class TurboParserInterface { } TurboTaggerWorker *CreateTagger() { - TurboTaggerWorker *tagger = new TurboTaggerWorker(); + TurboTaggerWorker *tagger = + new TurboTaggerWorker(); taggers_.push_back(tagger); return tagger; } @@ -160,7 +161,8 @@ class TurboParserInterface { } TurboParserWorker *CreateParser() { - TurboParserWorker *parser = new TurboParserWorker(); + TurboParserWorker *parser = + new TurboParserWorker(); parsers_.push_back(parser); return parser; } diff --git a/python/nlp_pipeline.py b/python/nlp_pipeline.py index aea3906..2d317e4 100644 --- a/python/nlp_pipeline.py +++ b/python/nlp_pipeline.py @@ -262,7 +262,8 @@ def parse_conll(self, text, language): conll_str += str(i+1) + '\t' + token + '\t' + lemmas[i] + \ '\t' + tags[i].decode(encoding='UTF-8') + '\t' + \ tags[i].decode(encoding='UTF-8') + '\t' + \ - feats[i] + '\t' + str(heads[i]+1) + '\t' + \ + feats[i] + '\t' + \ + str(heads[i]+1) + '\t' + \ deprels[i].decode(encoding='UTF-8') + '\n' conll_str += '\n' return conll_str diff --git a/python/nlp_sentence.py b/python/nlp_sentence.py index 0e09bd5..9835264 100644 --- a/python/nlp_sentence.py +++ b/python/nlp_sentence.py @@ -24,7 +24,8 @@ def compute_morphology(self, worker): if sys.version_info[0] == 2: lemmas = worker.lemmatizer.lemmatize_sentence(words, tags) if sys.version_info[0] == 3: - lemmas = worker.lemmatizer.lemmatize_sentence(words, [t.decode(encoding="UTF-8") for t in tags]) + lemmas = worker.lemmatizer.lemmatize_sentence(words, + [t.decode(encoding="UTF-8") for t in tags]) self['lemmas'] = lemmas else: lemmas = ['_' for word in words] @@ -33,11 +34,20 @@ def compute_morphology(self, worker): self['morphological_tags'] = None if worker.morphological_tagger != None: feats = ['_' for word in words] - morphological_instance = tp.PMorphologicalInstance() - morphological_instance.initialize(words, lemmas, tags, feats) + morphological_instance = tp.PMorphologicalInstance() + if sys.version_info[0] == 2: + morphological_instance.initialize(words, lemmas, tags, feats) + if sys.version_info[0] == 3: + morphological_instance.initialize(words, + lemmas, + [t.decode(encoding="UTF-8") for t in tags], + feats) + worker.morphological_tagger.tag_sentence(morphological_instance) feats = [morphological_instance.get_tag(i) \ for i in range(len(words))] + if sys.version_info[0] == 3: + feats = [f.decode(encoding="UTF-8") for f in feats] self['morphological_tags'] = [feat.split('|') if feat != '_' \ else [] \ for feat in feats] @@ -70,9 +80,12 @@ def compute_syntactic_dependencies(self, worker): deprels_with_root = ['_root_'] + deprels heads_with_root = [-1] + heads dependency_instance = tp.PDependencyInstance() - dependency_instance.initialize(words_with_root, lemmas_with_root, \ - tags_with_root, tags_with_root, \ - feats_with_root, deprels_with_root, \ + dependency_instance.initialize(words_with_root, \ + lemmas_with_root, \ + tags_with_root, \ + tags_with_root, \ + feats_with_root, \ + deprels_with_root, \ heads_with_root) worker.parser.parse_sentence(dependency_instance) # Convert back to 0-based indexing. Words attached to the root will get @@ -103,11 +116,17 @@ def compute_semantic_dependencies(self, worker): deprels_with_root = ['_root_'] + deprels heads_with_root = [-1] + heads semantic_instance = tp.PSemanticInstance() - semantic_instance.initialize('', words_with_root, lemmas_with_root, \ - tags_with_root, tags_with_root, \ - feats_with_root, deprels_with_root, \ - heads_with_root, predicate_names, \ - predicate_indices, argument_roles, \ + semantic_instance.initialize('', \ + words_with_root, \ + lemmas_with_root, \ + tags_with_root, \ + tags_with_root, \ + feats_with_root, \ + deprels_with_root, \ + heads_with_root, \ + predicate_names, \ + predicate_indices, \ + argument_roles, \ argument_indices) worker.semantic_parser.parse_semantic_dependencies_from_sentence( \ semantic_instance) diff --git a/python/test.py b/python/test.py index 612f8b2..fe1f978 100644 --- a/python/test.py +++ b/python/test.py @@ -1,5 +1,15 @@ import nlp_pipeline pipe = nlp_pipeline.NLPPipeline() -conll_str = pipe.parse_conll('I solved the problem with statistics.', 'EN-Nonprojective') -print(conll_str) \ No newline at end of file +text = 'I solved the problem with statistics.' +language = 'EN-Nonprojective' +conll_str = pipe.parse_conll(text, language ) +print(conll_str) + +text = 'Lisbon is the capital and the largest city of Portugal.' +sentences = pipe.split_sentences(text, language) +for sentence in sentences: + tokenized_sentence = pipe.tokenize(sentence, language) + tags, lemmas, feats = pipe.tag(tokenized_sentence, language) + entity_tags = pipe.recognize_entities(tokenized_sentence,tags, language) + print(entity_tags) \ No newline at end of file diff --git a/src/classifier/Alphabet.h b/src/classifier/Alphabet.h index 5592213..a5aa0ba 100644 --- a/src/classifier/Alphabet.h +++ b/src/classifier/Alphabet.h @@ -35,7 +35,7 @@ using namespace std; // This class implements a dictionary of strings, stored as an hash table // for fast lookup. It allows looking up a string for its ID, and also obtain // the string with a given ID. -class Alphabet : public std::tr1::unordered_map { +class Alphabet : public std::unordered_map { public: Alphabet(); virtual ~Alphabet(); From f757ab2a0f8e226b0580c515b70ea0cfd86dd539 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 1 Jun 2016 20:45:36 +0100 Subject: [PATCH 27/51] Fix lib turboparserinterface glog init so that the Google's logging library can be pre initialized in another application that uses the libturboparser. --- libturboparser/TurboParserInterface.cpp | 12 ++-- src/util/Utils.h | 88 +++++++++++++++++-------- 2 files changed, 68 insertions(+), 32 deletions(-) diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 1a5638f..73f2db4 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -362,15 +362,17 @@ TurboParserInterface::TurboParserInterface() { argv_ = NULL; BuildArgumentList(); + InitGlog(argv_[0]); + // Initialize Google's logging library. - google::InitGoogleLogging(argv_[0]); + //google::InitGoogleLogging(argv_[0]); // Parse command line flags. - google::ParseCommandLineFlags(&argc_, &argv_, true); + //google::ParseCommandLineFlags(&argc_, &argv_, true); -#ifdef _WIN32 - google::LogToStderr(); -#endif +//#ifdef _WIN32 +// google::LogToStderr(); +//#endif } TurboParserInterface::~TurboParserInterface() { diff --git a/src/util/Utils.h b/src/util/Utils.h index cd2ae11..88b5fe5 100644 --- a/src/util/Utils.h +++ b/src/util/Utils.h @@ -1,27 +1,61 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef UTILS_H -#define UTILS_H - -#include -#include -#include "TimeUtils.h" -#include "StringUtils.h" - -#endif // UTILS_H +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef UTILS_H +#define UTILS_H + +#include +#include +#include +#include "TimeUtils.h" +#include "StringUtils.h" + +class GlogIsInit { +public: + static GlogIsInit & Instance() { + static GlogIsInit instance; + return instance; + } + + static bool Value() { + return Instance().value_; + } + + static void Set(bool value) { + Instance().value_.store(value); + } +private: + GlogIsInit() {}; + std::atomic_bool value_{ false }; +}; + +static void InitGlog(const char * logging_name) { + + + if (!GlogIsInit::Value()) { + //fLB::FLAGS_colorlogtostderr = true; + fLB::FLAGS_alsologtostderr = true; + fLI::FLAGS_stderrthreshold = 0; + fLI::FLAGS_minloglevel = 0; + fLI::FLAGS_v = 0; + google::InitGoogleLogging(logging_name); + GlogIsInit::Set(true); + } +} + +#endif // UTILS_H From c301f78d672efc65719db0e856453629f651e8ce Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Fri, 3 Jun 2016 16:56:29 +0100 Subject: [PATCH 28/51] Replace calls to make_unique with unique_ptr as make_unique is an upcoming C++14 feature (may not be available in some compilers). --- libturboparser/TurboParserInterface.cpp | 42 ++++++++++++++----------- src/classifier/Alphabet.h | 6 +--- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 73f2db4..3dfdb08 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -61,12 +61,13 @@ struct TurboMorphologicalTaggerWorker::MorphologicalPipeOpaque { }; TurboTaggerWorker::TurboTaggerWorker() { - options_opaque_ = std::make_unique(); + options_opaque_ = std::unique_ptr + (new TaggerOptionsOpaque()); options_opaque_->options_.Initialize(); pipe_opaque_ = - std::make_unique - (TaggerPipeOpaque({ &(options_opaque_->options_) })); + std::unique_ptr + (new TaggerPipeOpaque({ &(options_opaque_->options_) })); pipe_opaque_->pipe_.Initialize(); } @@ -109,11 +110,12 @@ void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { } TurboEntityRecognizerWorker::TurboEntityRecognizerWorker() { - options_opaque_ = std::make_unique(); + options_opaque_ = std::unique_ptr + (new EntityOptionsOpaque()); options_opaque_->options_.Initialize(); - pipe_opaque_ = std::make_unique - (EntityPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_ = std::unique_ptr + (new EntityPipeOpaque({ &(options_opaque_->options_) })); pipe_opaque_->pipe_.Initialize(); } @@ -157,11 +159,12 @@ void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { } TurboParserWorker::TurboParserWorker() { - options_opaque_ = std::make_unique(); + options_opaque_ = std::unique_ptr + (new DependencyOptionsOpaque()); options_opaque_->options_.Initialize(); - pipe_opaque_ = std::make_unique - (DependencyPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_ = std::unique_ptr + (new DependencyPipeOpaque({ &(options_opaque_->options_) })); pipe_opaque_->pipe_.Initialize(); } @@ -204,11 +207,12 @@ void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { } TurboSemanticParserWorker::TurboSemanticParserWorker() { - options_opaque_ = std::make_unique(); + options_opaque_ = std::unique_ptr + (new SemanticOptionsOpaque()); options_opaque_->options_.Initialize(); - pipe_opaque_ = std::make_unique - (SemanticPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_ = std::unique_ptr + (new SemanticPipeOpaque({ &(options_opaque_->options_) })); pipe_opaque_->pipe_.Initialize(); } @@ -256,11 +260,12 @@ void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( } TurboCoreferenceResolverWorker::TurboCoreferenceResolverWorker() { - options_opaque_ = std::make_unique(); + options_opaque_ = std::unique_ptr + (new CoreferenceOptionsOpaque()); options_opaque_->options_.Initialize(); - pipe_opaque_ = std::make_unique - (CoreferencePipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_ = std::unique_ptr + (new CoreferencePipeOpaque({ &(options_opaque_->options_) })); pipe_opaque_->pipe_.Initialize(); } @@ -308,11 +313,12 @@ void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( } TurboMorphologicalTaggerWorker::TurboMorphologicalTaggerWorker() { - options_opaque_ = std::make_unique(); + options_opaque_ = std::unique_ptr + (new MorphologicalOptionsOpaque()); options_opaque_->options_.Initialize(); - pipe_opaque_ = std::make_unique - (MorphologicalPipeOpaque({ &(options_opaque_->options_) })); + pipe_opaque_ = std::unique_ptr + (new MorphologicalPipeOpaque({ &(options_opaque_->options_) })); pipe_opaque_->pipe_.Initialize(); } diff --git a/src/classifier/Alphabet.h b/src/classifier/Alphabet.h index a5aa0ba..32d727a 100644 --- a/src/classifier/Alphabet.h +++ b/src/classifier/Alphabet.h @@ -20,11 +20,7 @@ #define ALPHABET_H_ #include "Utils.h" -#ifdef _WIN32 #include -#else -#include -#endif #include #ifdef _WIN32 #include @@ -48,7 +44,7 @@ class Alphabet : public std::unordered_map { void clear() { num_entries_ = 0; names_.clear(); - std::tr1::unordered_map ::clear(); + std::unordered_map ::clear(); } // Return the dictionary size. From f84a52f67de80e17f65c5f7c3d1c5e4229cdc928 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 21 Jun 2016 16:06:56 +0100 Subject: [PATCH 29/51] Add string.h to recognize strdup. --- libturboparser/TurboParserInterface.h | 1 + python/setup.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libturboparser/TurboParserInterface.h b/libturboparser/TurboParserInterface.h index abd7e30..abcaba9 100644 --- a/libturboparser/TurboParserInterface.h +++ b/libturboparser/TurboParserInterface.h @@ -1,5 +1,6 @@ #include #include +#include #include #include "Instance.h" #include "SequenceInstance.h" diff --git a/python/setup.py b/python/setup.py index 8bd0cdf..d2e4dd5 100644 --- a/python/setup.py +++ b/python/setup.py @@ -6,7 +6,7 @@ if os.name == 'nt': ext_modules=[Extension("turboparser", - ["turboparser.pyx"], + ["turbo_parser.pyx"], language="c++", extra_compile_args=["/Zi", "/Od", "/DGOOGLE_GLOG_DLL_DECL="], extra_link_args=['/DEBUG'], From ee5813972e37249f2c9a23ace4fa886750d3ea48 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 22 Jun 2016 15:37:14 +0100 Subject: [PATCH 30/51] Fixes and code/project cleanup. --- libturboparser/TurboParserInterface.cpp | 225 ++++++++----------- libturboparser/TurboParserInterface.h | 59 ++--- python/nlp_pipeline.win.config | 1 + python/nlp_sentence.py | 2 +- python/setup.py | 18 +- python/{turbo_parser.pyx => turboparser.pyx} | 2 +- 6 files changed, 124 insertions(+), 183 deletions(-) rename python/{turbo_parser.pyx => turboparser.pyx} (97%) diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 3dfdb08..a8e8a93 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -9,78 +9,31 @@ #include #include "Utils.h" #include "TurboParserInterface.h" -#include "TaggerPipe.h" -#include "EntityPipe.h" -#include "DependencyPipe.h" -#include "SemanticPipe.h" -#include "CoreferencePipe.h" -#include "MorphologicalPipe.h" - namespace TurboParserInterface { -struct TurboTaggerWorker::TaggerOptionsOpaque { - TaggerOptions options_; -}; -struct TurboTaggerWorker::TaggerPipeOpaque { - TaggerPipe pipe_; -}; - -struct TurboEntityRecognizerWorker::EntityOptionsOpaque { - EntityOptions options_; -}; -struct TurboEntityRecognizerWorker::EntityPipeOpaque { - EntityPipe pipe_; -}; - -struct TurboParserWorker::DependencyOptionsOpaque { - DependencyOptions options_; -}; -struct TurboParserWorker::DependencyPipeOpaque { - DependencyPipe pipe_; -}; - -struct TurboSemanticParserWorker::SemanticOptionsOpaque { - SemanticOptions options_; -}; -struct TurboSemanticParserWorker::SemanticPipeOpaque { - SemanticPipe pipe_; -}; - -struct TurboCoreferenceResolverWorker::CoreferenceOptionsOpaque { - CoreferenceOptions options_; -}; -struct TurboCoreferenceResolverWorker::CoreferencePipeOpaque { - CoreferencePipe pipe_; -}; - -struct TurboMorphologicalTaggerWorker::MorphologicalOptionsOpaque { - MorphologicalOptions options_; -}; -struct TurboMorphologicalTaggerWorker::MorphologicalPipeOpaque { - MorphologicalPipe pipe_; -}; - TurboTaggerWorker::TurboTaggerWorker() { - options_opaque_ = std::unique_ptr - (new TaggerOptionsOpaque()); - options_opaque_->options_.Initialize(); + tagger_options_ = new TaggerOptions; + tagger_options_->Initialize(); - pipe_opaque_ = - std::unique_ptr - (new TaggerPipeOpaque({ &(options_opaque_->options_) })); - pipe_opaque_->pipe_.Initialize(); + tagger_pipe_ = new TaggerPipe(tagger_options_); + tagger_pipe_->Initialize(); } -TurboTaggerWorker::~TurboTaggerWorker() {} +TurboTaggerWorker::~TurboTaggerWorker() { + LOG(INFO) << "Deleting tagger pipe."; + delete tagger_pipe_; + LOG(INFO) << "Deleting tagger options."; + delete tagger_options_; +} void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { - options_opaque_->options_.SetModelFilePath(file_model); + tagger_options_->SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.LoadModelFile(); + tagger_pipe_->LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -90,14 +43,14 @@ void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { void TurboTaggerWorker::Tag(const std::string &file_test, const std::string &file_prediction) { - options_opaque_->options_.SetTestFilePath(file_test); - options_opaque_->options_.SetOutputFilePath(file_prediction); + tagger_options_->SetTestFilePath(file_test); + tagger_options_->SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.Run(); + tagger_pipe_->Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -106,30 +59,33 @@ void TurboTaggerWorker::Tag(const std::string &file_test, } void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { - pipe_opaque_->pipe_.ClassifyInstance(sentence); + tagger_pipe_->ClassifyInstance(sentence); } TurboEntityRecognizerWorker::TurboEntityRecognizerWorker() { - options_opaque_ = std::unique_ptr - (new EntityOptionsOpaque()); - options_opaque_->options_.Initialize(); + entity_options_ = new EntityOptions; + entity_options_->Initialize(); - pipe_opaque_ = std::unique_ptr - (new EntityPipeOpaque({ &(options_opaque_->options_) })); - pipe_opaque_->pipe_.Initialize(); + entity_pipe_ = new EntityPipe(entity_options_); + entity_pipe_->Initialize(); } -TurboEntityRecognizerWorker::~TurboEntityRecognizerWorker() {} +TurboEntityRecognizerWorker::~TurboEntityRecognizerWorker() { + LOG(INFO) << "Deleting entity recognizer pipe."; + delete entity_pipe_; + LOG(INFO) << "Deleting entity recognizer options."; + delete entity_options_; +} void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( const std::string &file_model) { - options_opaque_->options_.SetModelFilePath(file_model); + entity_options_->SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.LoadModelFile(); + entity_pipe_->LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -139,14 +95,14 @@ void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( void TurboEntityRecognizerWorker::Tag(const std::string &file_test, const std::string &file_prediction) { - options_opaque_->options_.SetTestFilePath(file_test); - options_opaque_->options_.SetOutputFilePath(file_prediction); + entity_options_->SetTestFilePath(file_test); + entity_options_->SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.Run(); + entity_pipe_->Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -155,29 +111,32 @@ void TurboEntityRecognizerWorker::Tag(const std::string &file_test, } void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { - pipe_opaque_->pipe_.ClassifyInstance(sentence); + entity_pipe_->ClassifyInstance(sentence); } TurboParserWorker::TurboParserWorker() { - options_opaque_ = std::unique_ptr - (new DependencyOptionsOpaque()); - options_opaque_->options_.Initialize(); + parser_options_ = new DependencyOptions; + parser_options_->Initialize(); - pipe_opaque_ = std::unique_ptr - (new DependencyPipeOpaque({ &(options_opaque_->options_) })); - pipe_opaque_->pipe_.Initialize(); + parser_pipe_ = new DependencyPipe(parser_options_); + parser_pipe_->Initialize(); } -TurboParserWorker::~TurboParserWorker() {} +TurboParserWorker::~TurboParserWorker() { + LOG(INFO) << "Deleting parser pipe."; + delete parser_pipe_; + LOG(INFO) << "Deleting parser options."; + delete parser_options_; +} void TurboParserWorker::LoadParserModel(const std::string &file_model) { - options_opaque_->options_.SetModelFilePath(file_model); + parser_options_->SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.LoadModelFile(); + parser_pipe_->LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -187,14 +146,14 @@ void TurboParserWorker::LoadParserModel(const std::string &file_model) { void TurboParserWorker::Parse(const std::string &file_test, const std::string &file_prediction) { - options_opaque_->options_.SetTestFilePath(file_test); - options_opaque_->options_.SetOutputFilePath(file_prediction); + parser_options_->SetTestFilePath(file_test); + parser_options_->SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.Run(); + parser_pipe_->Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -203,24 +162,27 @@ void TurboParserWorker::Parse(const std::string &file_test, } void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { - pipe_opaque_->pipe_.ClassifyInstance(sentence); + parser_pipe_->ClassifyInstance(sentence); } TurboSemanticParserWorker::TurboSemanticParserWorker() { - options_opaque_ = std::unique_ptr - (new SemanticOptionsOpaque()); - options_opaque_->options_.Initialize(); + semantic_options_ = new SemanticOptions; + semantic_options_->Initialize(); - pipe_opaque_ = std::unique_ptr - (new SemanticPipeOpaque({ &(options_opaque_->options_) })); - pipe_opaque_->pipe_.Initialize(); + semantic_pipe_ = new SemanticPipe(semantic_options_); + semantic_pipe_->Initialize(); } -TurboSemanticParserWorker::~TurboSemanticParserWorker() {} +TurboSemanticParserWorker::~TurboSemanticParserWorker() { + LOG(INFO) << "Deleting semantic pipe."; + delete semantic_pipe_; + LOG(INFO) << "Deleting semantic options."; + delete semantic_options_; +} void TurboSemanticParserWorker::LoadSemanticParserModel( const std::string &file_model) { - options_opaque_->options_.SetModelFilePath(file_model); + semantic_options_->SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; @@ -228,7 +190,7 @@ void TurboSemanticParserWorker::LoadSemanticParserModel( LOG(INFO) << "Loading model file " << file_model; - pipe_opaque_->pipe_.LoadModelFile(); + semantic_pipe_->LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -239,14 +201,14 @@ void TurboSemanticParserWorker::LoadSemanticParserModel( void TurboSemanticParserWorker::ParseSemanticDependencies( const std::string &file_test, const std::string &file_prediction) { - options_opaque_->options_.SetTestFilePath(file_test); - options_opaque_->options_.SetOutputFilePath(file_prediction); + semantic_options_->SetTestFilePath(file_test); + semantic_options_->SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.Run(); + semantic_pipe_->Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -256,24 +218,27 @@ void TurboSemanticParserWorker::ParseSemanticDependencies( void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( SemanticInstance *sentence) { - pipe_opaque_->pipe_.ClassifyInstance(sentence); + semantic_pipe_->ClassifyInstance(sentence); } TurboCoreferenceResolverWorker::TurboCoreferenceResolverWorker() { - options_opaque_ = std::unique_ptr - (new CoreferenceOptionsOpaque()); - options_opaque_->options_.Initialize(); + coreference_options_ = new CoreferenceOptions; + coreference_options_->Initialize(); - pipe_opaque_ = std::unique_ptr - (new CoreferencePipeOpaque({ &(options_opaque_->options_) })); - pipe_opaque_->pipe_.Initialize(); + coreference_pipe_ = new CoreferencePipe(coreference_options_); + coreference_pipe_->Initialize(); } -TurboCoreferenceResolverWorker::~TurboCoreferenceResolverWorker() {} +TurboCoreferenceResolverWorker::~TurboCoreferenceResolverWorker() { + LOG(INFO) << "Deleting coreference pipe."; + delete coreference_pipe_; + LOG(INFO) << "Deleting coreference options."; + delete coreference_options_; +} void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( const std::string &file_model) { - options_opaque_->options_.SetModelFilePath(file_model); + coreference_options_->SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; @@ -281,7 +246,7 @@ void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( LOG(INFO) << "Loading model file " << file_model; - pipe_opaque_->pipe_.LoadModelFile(); + coreference_pipe_->LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -292,14 +257,14 @@ void TurboCoreferenceResolverWorker::LoadCoreferenceResolverModel( void TurboCoreferenceResolverWorker::ResolveCoreferences( const std::string &file_test, const std::string &file_prediction) { - options_opaque_->options_.SetTestFilePath(file_test); - options_opaque_->options_.SetOutputFilePath(file_prediction); + coreference_options_->SetTestFilePath(file_test); + coreference_options_->SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.Run(); + coreference_pipe_->Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -309,31 +274,35 @@ void TurboCoreferenceResolverWorker::ResolveCoreferences( void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( CoreferenceDocument *document) { - pipe_opaque_->pipe_.ClassifyInstance(document); + coreference_pipe_->ClassifyInstance(document); } TurboMorphologicalTaggerWorker::TurboMorphologicalTaggerWorker() { - options_opaque_ = std::unique_ptr - (new MorphologicalOptionsOpaque()); - options_opaque_->options_.Initialize(); + morphological_tagger_options_ = new MorphologicalOptions; + morphological_tagger_options_->Initialize(); - pipe_opaque_ = std::unique_ptr - (new MorphologicalPipeOpaque({ &(options_opaque_->options_) })); - pipe_opaque_->pipe_.Initialize(); + morphological_tagger_pipe_ = + new MorphologicalPipe(morphological_tagger_options_); + morphological_tagger_pipe_->Initialize(); } -TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() {} +TurboMorphologicalTaggerWorker::~TurboMorphologicalTaggerWorker() { + LOG(INFO) << "Deleting tagger pipe."; + delete morphological_tagger_pipe_; + LOG(INFO) << "Deleting tagger options."; + delete morphological_tagger_options_; +} void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( const std::string &file_model) { - options_opaque_->options_.SetModelFilePath(file_model); + morphological_tagger_options_->SetModelFilePath(file_model); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.LoadModelFile(); + morphological_tagger_pipe_->LoadModelFile(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -343,14 +312,14 @@ void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, const std::string &file_prediction) { - options_opaque_->options_.SetTestFilePath(file_test); - options_opaque_->options_.SetOutputFilePath(file_prediction); + morphological_tagger_options_->SetTestFilePath(file_test); + morphological_tagger_options_->SetOutputFilePath(file_prediction); double time; chronowrap::Chronometer chrono; chrono.GetTime(); - pipe_opaque_->pipe_.Run(); + morphological_tagger_pipe_->Run(); chrono.StopTime(); time = chrono.GetElapsedTime(); @@ -360,7 +329,7 @@ void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, void TurboMorphologicalTaggerWorker::TagSentence( MorphologicalInstance *sentence) { - pipe_opaque_->pipe_.ClassifyInstance(sentence); + morphological_tagger_pipe_->ClassifyInstance(sentence); } TurboParserInterface::TurboParserInterface() { diff --git a/libturboparser/TurboParserInterface.h b/libturboparser/TurboParserInterface.h index abcaba9..dd26a7f 100644 --- a/libturboparser/TurboParserInterface.h +++ b/libturboparser/TurboParserInterface.h @@ -1,16 +1,11 @@ #include #include -#include -#include -#include "Instance.h" -#include "SequenceInstance.h" -#include "EntityInstance.h" -#include "DependencyInstance.h" -#include "SemanticInstance.h" -#include "EntitySpan.h" -#include "CoreferenceSentence.h" -#include "CoreferenceDocument.h" -#include "MorphologicalInstance.h" +#include "TaggerPipe.h" +#include "EntityPipe.h" +#include "DependencyPipe.h" +#include "SemanticPipe.h" +#include "CoreferencePipe.h" +#include "MorphologicalPipe.h" namespace TurboParserInterface { class TurboTaggerWorker { @@ -26,10 +21,8 @@ class TurboTaggerWorker { void TagSentence(SequenceInstance *sentence); private: - struct TaggerOptionsOpaque; - std::unique_ptr options_opaque_; - struct TaggerPipeOpaque; - std::unique_ptr pipe_opaque_; + TaggerOptions *tagger_options_; + TaggerPipe *tagger_pipe_; }; class TurboEntityRecognizerWorker { @@ -45,10 +38,8 @@ class TurboEntityRecognizerWorker { void TagSentence(EntityInstance *sentence); private: - struct EntityOptionsOpaque; - std::unique_ptr options_opaque_; - struct EntityPipeOpaque; - std::unique_ptr pipe_opaque_; + EntityOptions *entity_options_; + EntityPipe *entity_pipe_; }; class TurboParserWorker { @@ -64,10 +55,8 @@ class TurboParserWorker { void ParseSentence(DependencyInstance *sentence); private: - struct DependencyOptionsOpaque; - std::unique_ptr options_opaque_; - struct DependencyPipeOpaque; - std::unique_ptr pipe_opaque_; + DependencyOptions *parser_options_; + DependencyPipe *parser_pipe_; }; class TurboSemanticParserWorker { @@ -83,10 +72,8 @@ class TurboSemanticParserWorker { void ParseSemanticDependenciesFromSentence(SemanticInstance *sentence); private: - struct SemanticOptionsOpaque; - std::unique_ptr options_opaque_; - struct SemanticPipeOpaque; - std::unique_ptr pipe_opaque_; + SemanticOptions *semantic_options_; + SemanticPipe *semantic_pipe_; }; class TurboCoreferenceResolverWorker { @@ -102,10 +89,8 @@ class TurboCoreferenceResolverWorker { void ResolveCoreferencesFromDocument(CoreferenceDocument *document); private: - struct CoreferenceOptionsOpaque; - std::unique_ptr options_opaque_; - struct CoreferencePipeOpaque; - std::unique_ptr pipe_opaque_; + CoreferenceOptions *coreference_options_; + CoreferencePipe *coreference_pipe_; }; class TurboMorphologicalTaggerWorker { @@ -121,10 +106,8 @@ class TurboMorphologicalTaggerWorker { void TagSentence(MorphologicalInstance *sentence); private: - struct MorphologicalOptionsOpaque; - std::unique_ptr options_opaque_; - struct MorphologicalPipeOpaque; - std::unique_ptr pipe_opaque_; + MorphologicalOptions *morphological_tagger_options_; + MorphologicalPipe *morphological_tagger_pipe_; }; class TurboParserInterface { @@ -148,8 +131,7 @@ class TurboParserInterface { } TurboTaggerWorker *CreateTagger() { - TurboTaggerWorker *tagger = - new TurboTaggerWorker(); + TurboTaggerWorker *tagger = new TurboTaggerWorker(); taggers_.push_back(tagger); return tagger; } @@ -162,8 +144,7 @@ class TurboParserInterface { } TurboParserWorker *CreateParser() { - TurboParserWorker *parser = - new TurboParserWorker(); + TurboParserWorker *parser = new TurboParserWorker(); parsers_.push_back(parser); return parser; } diff --git a/python/nlp_pipeline.win.config b/python/nlp_pipeline.win.config index 448f22c..d839bb5 100644 --- a/python/nlp_pipeline.win.config +++ b/python/nlp_pipeline.win.config @@ -26,6 +26,7 @@ parser="C:\\Corpora\\TurboModels\\all_models\\english\\english_parser_pruned-tru semantic_parser="C:\\Corpora\\TurboModels\\all_models\\srl\\models\\english\\english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" coreference_resolver="C:\\Corpora\\TurboModels\\all_models\\coreference_models\\english_ontonotes_conll2012\\english_ontonotes_conll2012_coreference_resolver.model" lemmatizer="C:\\Corpora\\TurboModels\\all_models\\english\\english_lemmatizer.model" +morphological_tagger="C:\\Corpora\\TurboModels\\all_models\\morphological_tagger\\models\\UD_English\\en-ud_morphological_tagger.model" PT-BR-Universal splitter="tokenizers/punkt/portuguese.pickle" diff --git a/python/nlp_sentence.py b/python/nlp_sentence.py index 9835264..a97cefe 100644 --- a/python/nlp_sentence.py +++ b/python/nlp_sentence.py @@ -34,7 +34,7 @@ def compute_morphology(self, worker): self['morphological_tags'] = None if worker.morphological_tagger != None: feats = ['_' for word in words] - morphological_instance = tp.PMorphologicalInstance() + morphological_instance = tp.PMorphologicalInstance() if sys.version_info[0] == 2: morphological_instance.initialize(words, lemmas, tags, feats) if sys.version_info[0] == 3: diff --git a/python/setup.py b/python/setup.py index d2e4dd5..db22a31 100644 --- a/python/setup.py +++ b/python/setup.py @@ -6,9 +6,9 @@ if os.name == 'nt': ext_modules=[Extension("turboparser", - ["turbo_parser.pyx"], + ["turboparser.pyx"], language="c++", - extra_compile_args=["/Zi", "/Od", "/DGOOGLE_GLOG_DLL_DECL="], + extra_compile_args=["/Zi", "/Od", "/DGOOGLE_GLOG_DLL_DECL=", "/DGFLAGS_DLL_DECL="], extra_link_args=['/DEBUG'], include_dirs=["..\\src\\util", "..\\src\\classifier", @@ -29,22 +29,12 @@ "..\\deps\\glog-0.3.2\\x64\\Release", "..\\deps\\gflags-2.0\\x64\\Release", "..\\deps\\AD3-2.0.2\\vsprojects\\x64\\Release", - "..\\deps\\googletest\\msvc\\x64\\Release"], - #library_dirs=["..\\vsprojects\\x64\\Debug", - #"..\\deps\\glog-0.3.2\\x64\\Debug", - #"..\\deps\\gflags-2.0\\x64\\Debug", - #"..\\deps\\AD3-2.0.2\\vsprojects\\x64\\Debug", - #"..\\deps\\googletest\\msvc\\x64\\Debug"], + "..\\deps\\googletest\\msvc\\x64\\Release"], extra_objects=["libturboparser.lib", "AD3_140mdx64.lib", "libgflags_140mdx64.lib", "libglog_static_140mdx64.lib", - "gtest-md_140mdx64.lib"])] - #extra_objects=["libturboparser.lib", - #"AD3_140mddx64.lib", - #"libgflags_140mddx64.lib", - #"libglog_static_140mddx64.lib", - #"gtest-md_140mddx64.lib"])] + "gtest-md_140mdx64.lib"])] setup(cmdclass={'build_ext': build_ext}, ext_modules = cythonize(ext_modules, gdb_debug=True) ) diff --git a/python/turbo_parser.pyx b/python/turboparser.pyx similarity index 97% rename from python/turbo_parser.pyx rename to python/turboparser.pyx index 8b288fb..5920c65 100644 --- a/python/turbo_parser.pyx +++ b/python/turboparser.pyx @@ -350,7 +350,7 @@ cdef class PCoreferenceSentence: p_entity_spans, \ p_constituent_spans, \ p_coreference_spans): - cdef vector[NamedSpan*] entity_spans + cdef vector[EntitySpan*] entity_spans for p_span in p_entity_spans: entity_spans.push_back((p_span).thisptr) cdef vector[NamedSpan*] constituent_spans From fcd6cc9ed2af9c48b6a5bd97c23241ed5332caa1 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Wed, 22 Jun 2016 19:32:24 +0100 Subject: [PATCH 31/51] Minor changes. --- libturboparser/Makefile | 2 +- libturboparser/TurboParserInterface.cpp | 8 + python/nlp_pipeline.config | 60 +-- src/classifier/Pipe.h | 551 ++++++++++++------------ 4 files changed, 315 insertions(+), 306 deletions(-) diff --git a/libturboparser/Makefile b/libturboparser/Makefile index 4a94c85..533cf2a 100644 --- a/libturboparser/Makefile +++ b/libturboparser/Makefile @@ -15,7 +15,7 @@ CC = g++ DEBUG = -g INCLUDES = -I$(UTIL)/ -I$(CLASSIFIER) -I$(SEQUENCE) -I$(TAGGER) -I$(ENTITYRECOGNIZER) -I$(PARSER) -I$(SEMANTICPARSER) -I$(COREFERENCERESOLVER) -I$(MORPHOLOGICALTAGGER) -I$(AUXINCLUDES) LIBS = -L/usr/local/lib/ -L$(AUXLIBS) -CFLAGS = -std=c++0x -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) +CFLAGS = -std=gnu++11 -std=c++11 -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) LDFLAGS = -shared LFLAGS = $(LIBS) -Wl,-whole-archive -lad3 -Wl,-no-whole-archive -lgflags -lglog diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index a8e8a93..11a51b9 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -33,6 +33,8 @@ void TurboTaggerWorker::LoadTaggerModel(const std::string &file_model) { chronowrap::Chronometer chrono; chrono.GetTime(); + LOG(INFO) << "Loading model file " << file_model; + tagger_pipe_->LoadModelFile(); chrono.StopTime(); @@ -85,6 +87,8 @@ void TurboEntityRecognizerWorker::LoadEntityRecognizerModel( chronowrap::Chronometer chrono; chrono.GetTime(); + LOG(INFO) << "Loading model file " << file_model; + entity_pipe_->LoadModelFile(); chrono.StopTime(); @@ -136,6 +140,8 @@ void TurboParserWorker::LoadParserModel(const std::string &file_model) { chronowrap::Chronometer chrono; chrono.GetTime(); + LOG(INFO) << "Loading model file " << file_model; + parser_pipe_->LoadModelFile(); chrono.StopTime(); @@ -302,6 +308,8 @@ void TurboMorphologicalTaggerWorker::LoadMorphologicalTaggerModel( chronowrap::Chronometer chrono; chrono.GetTime(); + LOG(INFO) << "Loading model file " << file_model; + morphological_tagger_pipe_->LoadModelFile(); chrono.StopTime(); diff --git a/python/nlp_pipeline.config b/python/nlp_pipeline.config index 4ec0989..9774703 100644 --- a/python/nlp_pipeline.config +++ b/python/nlp_pipeline.config @@ -1,56 +1,56 @@ PT splitter="tokenizers/punkt/portuguese.pickle" -tagger="/opt/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_tagger.model" -parser="/opt/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" -lemmatizer="/opt/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_lemmatizer.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" +lemmatizer="/home/atm/workspace/CPP/TurboParser/models/portuguese_floresta_v2.0_nomwe_auto/portuguese_floresta_v2.0_nomwe_auto_lemmatizer.model" ES splitter="tokenizers/punkt/spanish.pickle" -tagger="/opt/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_tagger.model" -entity_recognizer="/opt/TurboParser/ner/models/spanish/spanish_entity_recognizer.model" -parser="/opt/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" -semantic_parser="/opt/TurboParser/srl/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" -coreference_resolver="/opt/TurboParser/coreference_resolver/models/spanish/spanish_coreference_resolver.model" -lemmatizer="/opt/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_lemmatizer.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_tagger.model" +entity_recognizer="/home/atm/workspace/CPP/TurboParser/ner/models/spanish/spanish_entity_recognizer.model" +parser="/home/atm/workspace/CPP/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_parser_pruned-true_model-standard.model" +semantic_parser="/home/atm/workspace/CPP/TurboParser/srl/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" +coreference_resolver="/home/atm/workspace/CPP/TurboParser/coreference_resolver/models/spanish/spanish_coreference_resolver.model" +lemmatizer="/home/atm/workspace/CPP/TurboParser/models/spanish_conll2009_v2.0_nomwe_auto/spanish_conll2009_v2.0_nomwe_auto_lemmatizer.model" EN splitter="tokenizers/punkt/english.pickle" -tagger="/opt/TurboParser/models/english_proj/english_proj_tagger.model" -parser="/opt/TurboParser/models/english_proj/english_proj_parser_pruned-true_model-standard.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/english_proj/english_proj_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/english_proj/english_proj_parser_pruned-true_model-standard.model" EN-Nonprojective splitter="tokenizers/punkt/english.pickle" -tagger="/opt/TurboParser/models/english_proj/english_proj_tagger.model" -entity_recognizer="/opt/TurboParser/ner/models/english/english_entity_recognizer.model" -parser="/opt/TurboParser/models/english/english_parser_pruned-true_model-standard.model" -semantic_parser="/opt/TurboParser/srl/models/english/english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" -coreference_resolver="/opt/TurboParser/coreference_resolver/models/english_ontonotes_conll2012/english_ontonotes_conll2012_coreference_resolver.model" -lemmatizer="/opt/TurboParser/models/english/english_lemmatizer.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/english_proj/english_proj_tagger.model" +entity_recognizer="/home/atm/workspace/CPP/TurboParser/ner/models/english/english_entity_recognizer.model" +parser="/home/atm/workspace/CPP/TurboParser/models/english/english_parser_pruned-true_model-standard.model" +semantic_parser="/home/atm/workspace/CPP/TurboParser/srl/models/english/english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" +coreference_resolver="/home/atm/workspace/CPP/TurboParser/coreference_resolver/models/english_ontonotes_conll2012/english_ontonotes_conll2012_coreference_resolver.model" +lemmatizer="/home/atm/workspace/CPP/TurboParser/models/english/english_lemmatizer.model" PT-BR-Universal splitter="tokenizers/punkt/portuguese.pickle" -tagger="/opt/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_tagger.model" -parser="/opt/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_parser_pruned-true_model-standard.model" -morphological_tagger="/opt/TurboParser/morphological_tagger/models/UD_Portuguese/pt-ud_morphological_tagger.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/brazilian_portuguese_universal/brazilian_portuguese_universal_parser_pruned-true_model-standard.model" +morphological_tagger="/home/atm/workspace/CPP/TurboParser/morphological_tagger/models/UD_Portuguese/pt-ud_morphological_tagger.model" ES-Universal splitter="tokenizers/punkt/spanish.pickle" -tagger="/opt/TurboParser/models/spanish_universal/spanish_universal_tagger.model" -parser="/opt/TurboParser/models/spanish_universal/spanish_universal_parser_pruned-true_model-standard.model" -morphological_tagger="/opt/TurboParser/morphological_tagger/models/UD_Spanish/es-ud_morphological_tagger.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/spanish_universal/spanish_universal_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/spanish_universal/spanish_universal_parser_pruned-true_model-standard.model" +morphological_tagger="/home/atm/workspace/CPP/TurboParser/morphological_tagger/models/UD_Spanish/es-ud_morphological_tagger.model" FR-Universal splitter="tokenizers/punkt/french.pickle" -tagger="/opt/TurboParser/models/french_universal/french_universal_tagger.model" -parser="/opt/TurboParser/models/french_universal/french_universal_parser_pruned-true_model-standard.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/french_universal/french_universal_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/french_universal/french_universal_parser_pruned-true_model-standard.model" IT-Universal splitter="tokenizers/punkt/italian.pickle" -tagger="/opt/TurboParser/models/italian_universal/italian_universal_tagger.model" -parser="/opt/TurboParser/models/italian_universal/italian_universal_parser_pruned-true_model-standard.model" -morphological_tagger="/opt/TurboParser/morphological_tagger/models/UD_Italian/it-ud_morphological_tagger.model" +tagger="/home/atm/workspace/CPP/TurboParser/models/italian_universal/italian_universal_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/italian_universal/italian_universal_parser_pruned-true_model-standard.model" +morphological_tagger="/home/atm/workspace/CPP/TurboParser/morphological_tagger/models/UD_Italian/it-ud_morphological_tagger.model" DE-Universal splitter="tokenizers/punkt/german.pickle" -tagger="/opt/TurboParser/models/german_universal/german_universal_tagger.model" -parser="/opt/TurboParser/models/german_universal/german_universal_parser_pruned-true_model-standard.model" \ No newline at end of file +tagger="/home/atm/workspace/CPP/TurboParser/models/german_universal/german_universal_tagger.model" +parser="/home/atm/workspace/CPP/TurboParser/models/german_universal/german_universal_parser_pruned-true_model-standard.model" diff --git a/src/classifier/Pipe.h b/src/classifier/Pipe.h index ea110ee..3549a5a 100644 --- a/src/classifier/Pipe.h +++ b/src/classifier/Pipe.h @@ -1,275 +1,276 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef PIPE_H_ -#define PIPE_H_ - -#include "Dictionary.h" -#include "Features.h" -#include "Part.h" -#include "Reader.h" -#include "Writer.h" -#include "Options.h" -#include "Decoder.h" -#include "Parameters.h" -#include "AlgUtils.h" - -// Abstract class for the structured classifier mainframe. -// It requires parts, features, a dictionary, a reader and writer, and -// instances, all of which are abstract classes. -// Task-specific classifiers should derive from this class and implement the -// pure virtual methods. -class Pipe { -public: - // Constructor/destructor. - Pipe() {}; - Pipe(Options* options); - virtual ~Pipe(); - - // Save/load the model to/from a file. - void SaveModelFile() { SaveModelByName(options_->GetModelFilePath()); } - void LoadModelFile() { LoadModelByName(options_->GetModelFilePath()); } - - // Initialize. Override this method for task-specific initialization. - virtual void Initialize(); - - // Get options. - Options* GetOptions() { return options_; }; - - // Get/Set parameters. - Parameters *GetParameters() { return parameters_; } - void SetParameters(Parameters *parameters) { parameters_ = parameters; } - - // Train the classifier. - void Train(); - - // Run a previously trained classifier on new data. - void Run(); - - // Run a previously trained classifier on a single instance. - void ClassifyInstance(Instance *instance); - - // Get model version. - uint64_t GetModelVersion() { - return model_version_; - } -protected: - // Create basic objects. - virtual void CreateDictionary() = 0; - virtual void CreateReader() = 0; - virtual void CreateWriter() = 0; - virtual void CreateDecoder() = 0; - virtual Parts *CreateParts() = 0; - virtual Features *CreateFeatures() = 0; - - // Save/load model. - void SaveModelByName(const std::string &model_name); - void LoadModelByName(const std::string &model_name); - virtual void SaveModel(FILE* fs); - virtual void LoadModel(FILE* fs); - - // Create/add/delete instances. - void DeleteInstances() { - for (int i = 0; i < instances_.size(); ++i) { - delete instances_[i]; - } - instances_.clear(); - } - - void AddInstance(Instance *instance) { - Instance *formatted_instance = GetFormattedInstance(instance); - instances_.push_back(formatted_instance); - if (instance != formatted_instance) delete instance; - } - - // Obtain a "formatted" instance. Override this function for task-specific - // formatted instances, which may be different from instance since they - // may have extra information, data in numeric format for faster - // processing, etc. - virtual Instance *GetFormattedInstance(Instance *instance) { - return instance; - } - - // Create a vector of instances by reading the training data. - void CreateInstances(); - - // Construct the vector of parts for a particular instance. - // Eventually, obtain the binary vector of gold outputs (one entry per part) - // if this information is available. - // Note: this function is task-specific and needs to be implemented by the - // deriving class. - virtual void MakeParts(Instance *instance, Parts *parts, - vector *gold_outputs) = 0; - - // Construct the vector of features for a particular instance and given the - // parts. The vector will be of the same size as the vector of parts. - void MakeFeatures(Instance *instance, Parts *parts, Features *features) { - vector selected_parts(parts->size(), true); - MakeSelectedFeatures(instance, parts, selected_parts, features); - } - - // Construct the vector of features for a particular instance and given a - // selected set of parts (parts which are selected as marked as true). The - // vector will be of the same size as the vector of parts. - // Note: this function is task-specific and needs to be implemented by the - // deriving class. - virtual void MakeSelectedFeatures(Instance *instance, Parts *parts, - const vector &selected_parts, - Features *features) = 0; - - // Given an instance, parts, and features, compute the scores. This will - // look at the current parameters. Each part will receive a score, so the - // vector of scores will be of the same size as the vector of parts. - // NOTE: Override this method for task-specific score computation (e.g. - // to handle labeled features, etc.). - // TODO: handle labeled features here instead of having to override. - virtual void ComputeScores(Instance *instance, Parts *parts, - Features *features, - vector *scores); - - // Perform a gradient step with stepsize eta. The iteration number is - // provided as input since it may be necessary to keep track of the averaged - // weights. The gold output and the predicted output are also provided. - // The meaning of "predicted_output" depends on the training algorithm. - // In perceptron, it is the most likely output predicted by the model. - // In cost-augmented MIRA and structured SVMs, it is the cost-augmented - // prediction. - // In CRFs, it is the vector of posterior marginals for the parts. - // TODO: use "FeatureVector *difference" as input (see function - // MakeFeatureDifference(...) instead of computing on the fly). - virtual void MakeGradientStep(Parts *parts, Features *features, double eta, - int iteration, - const vector &gold_output, - const vector &predicted_output); - - // Compute the difference between the predicted feature vector and the gold - // one. - // The meaning of "predicted_output" depends on the training algorithm. - // In perceptron, it is the most likely output predicted by the model. - // In cost-augmented MIRA and structured SVMs, it is the cost-augmented - // prediction. - // In CRFs, it is the vector of posterior marginals for the parts. - virtual void MakeFeatureDifference(Parts *parts, - Features *features, - const vector &gold_output, - const vector &predicted_output, - FeatureVector *difference); - - // Given an instance, a vector of parts, and features for those parts, - // remove all the features which are not supported, i.e., that were not - // previously created in the parameter vector. This is used for training - // with supported features (flag --only_supported_features). - void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - Features *features) { - vector selected_parts(parts->size(), true); - RemoveUnsupportedFeatures(instance, parts, selected_parts, features); - } - - // Given an instance, a vector of selected parts, and features for those - // parts, remove all the features which are not supported. See description - // above. - virtual void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, - const vector &selected_parts, - Features *features); - - // Given a vector of parts, and features for those parts, "touch" all the - // parameters corresponding to those features. This will be a no-op for the - // parameters that exist already, and will create a parameter with a zero - // weight otherwise. This is used in a preprocessing stage for training - // with supported features (flag --only_supported_features). - virtual void TouchParameters(Parts *parts, Features *features, - const vector &selected_parts); - - // This is a no-op by default. But it's convenient to have it here to build - // latent-variable structured classifiers (e.g. for coreference resolution). - virtual void TransformGold(Instance *instance, - Parts *parts, - const std::vector &scores, - std::vector *gold_output, - double *loss_inner) { - *loss_inner = 0.0; - } - - // Given a vector of parts of a desired output, builds the output information - // in the instance that corresponds to that output. - // Note: this function is task-specific and needs to be implemented by the - // deriving class. - virtual void LabelInstance(Parts *parts, const vector &output, - Instance *instance) = 0; - - // Preprocess an instance before training begins. Override this function for - // task-specific instance preprocessing. - virtual void PreprocessInstance(Instance* instance) {}; - - // Preprocess the data before training begins. Override this function for - // task-specific instance preprocessing. - virtual void PreprocessData() {}; - - // Build and lock a parameter vector with only supported parameters, by - // looking at the gold outputs in the training data. This is a preprocessing - // stage for training with supported features (flag - // --only_supported_features). - void MakeSupportedParameters(); - - // Run one epoch of training. - void TrainEpoch(int epoch); - - // Start all the evaluation counters for evaluating the classifier, - // evaluate each instance, and plot evaluation information at the end. - // This is done at test time when the flag --evaluate is activated. - // The version implemented here plots accuracy based on Hamming distance - // for the predicted and gold parts. Override this function for - // task-specific evaluation. - virtual void BeginEvaluation() { num_mistakes_ = 0; num_total_parts_ = 0; } - virtual void EvaluateInstance(Instance *instance, - Instance *output_instance, - Parts *parts, - const vector &gold_outputs, - const vector &predicted_outputs) { - for (int r = 0; r < parts->size(); ++r) { - if (!NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { - ++num_mistakes_; - } - ++num_total_parts_; - } - } - virtual void EndEvaluation() { - LOG(INFO) << "Accuracy (parts): " << - static_cast(num_total_parts_ - num_mistakes_) / - static_cast(num_total_parts_); - } - -protected: - Options *options_; // Classifier options. - Dictionary *dictionary_; // Dictionary for the classifier. - Reader *reader_; // Reader for reading instances from a file. - Writer *writer_; // Writer for writing instance to a file. - Decoder *decoder_; // Decoder for this classification task. - Parameters *parameters_; // Parameter vector. - vector instances_; // Set of instances. - - // Number of mistakes and number of total parts at test time (used for - // evaluation purposes). - int num_mistakes_; - int num_total_parts_; - //Model check - uint64_t model_check_; - uint64_t model_version_; -}; - -#endif /* PIPE_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef PIPE_H_ +#define PIPE_H_ + +#include "Dictionary.h" +#include "Features.h" +#include "Part.h" +#include "Reader.h" +#include "Writer.h" +#include "Options.h" +#include "Decoder.h" +#include "Parameters.h" +#include "AlgUtils.h" + +// Abstract class for the structured classifier mainframe. +// It requires parts, features, a dictionary, a reader and writer, and +// instances, all of which are abstract classes. +// Task-specific classifiers should derive from this class and implement the +// pure virtual methods. +class Pipe { +public: + // Constructor/destructor. + Pipe() {}; + Pipe(Options* options); + virtual ~Pipe(); + + // Save/load the model to/from a file. + void SaveModelFile() { SaveModelByName(options_->GetModelFilePath()); } + void LoadModelFile() { LoadModelByName(options_->GetModelFilePath()); } + + // Initialize. Override this method for task-specific initialization. + virtual void Initialize(); + + // Get options. + Options* GetOptions() { return options_; }; + + // Get/Set parameters. + Parameters *GetParameters() { return parameters_; } + void SetParameters(Parameters *parameters) { parameters_ = parameters; } + + // Train the classifier. + void Train(); + + // Run a previously trained classifier on new data. + void Run(); + + // Run a previously trained classifier on a single instance. + void ClassifyInstance(Instance *instance); + + // Get model version. + uint64_t GetModelVersion() { + LOG(INFO) << "model version: " << model_version_; + return model_version_; + } +protected: + // Create basic objects. + virtual void CreateDictionary() = 0; + virtual void CreateReader() = 0; + virtual void CreateWriter() = 0; + virtual void CreateDecoder() = 0; + virtual Parts *CreateParts() = 0; + virtual Features *CreateFeatures() = 0; + + // Save/load model. + void SaveModelByName(const std::string &model_name); + void LoadModelByName(const std::string &model_name); + virtual void SaveModel(FILE* fs); + virtual void LoadModel(FILE* fs); + + // Create/add/delete instances. + void DeleteInstances() { + for (int i = 0; i < instances_.size(); ++i) { + delete instances_[i]; + } + instances_.clear(); + } + + void AddInstance(Instance *instance) { + Instance *formatted_instance = GetFormattedInstance(instance); + instances_.push_back(formatted_instance); + if (instance != formatted_instance) delete instance; + } + + // Obtain a "formatted" instance. Override this function for task-specific + // formatted instances, which may be different from instance since they + // may have extra information, data in numeric format for faster + // processing, etc. + virtual Instance *GetFormattedInstance(Instance *instance) { + return instance; + } + + // Create a vector of instances by reading the training data. + void CreateInstances(); + + // Construct the vector of parts for a particular instance. + // Eventually, obtain the binary vector of gold outputs (one entry per part) + // if this information is available. + // Note: this function is task-specific and needs to be implemented by the + // deriving class. + virtual void MakeParts(Instance *instance, Parts *parts, + vector *gold_outputs) = 0; + + // Construct the vector of features for a particular instance and given the + // parts. The vector will be of the same size as the vector of parts. + void MakeFeatures(Instance *instance, Parts *parts, Features *features) { + vector selected_parts(parts->size(), true); + MakeSelectedFeatures(instance, parts, selected_parts, features); + } + + // Construct the vector of features for a particular instance and given a + // selected set of parts (parts which are selected as marked as true). The + // vector will be of the same size as the vector of parts. + // Note: this function is task-specific and needs to be implemented by the + // deriving class. + virtual void MakeSelectedFeatures(Instance *instance, Parts *parts, + const vector &selected_parts, + Features *features) = 0; + + // Given an instance, parts, and features, compute the scores. This will + // look at the current parameters. Each part will receive a score, so the + // vector of scores will be of the same size as the vector of parts. + // NOTE: Override this method for task-specific score computation (e.g. + // to handle labeled features, etc.). + // TODO: handle labeled features here instead of having to override. + virtual void ComputeScores(Instance *instance, Parts *parts, + Features *features, + vector *scores); + + // Perform a gradient step with stepsize eta. The iteration number is + // provided as input since it may be necessary to keep track of the averaged + // weights. The gold output and the predicted output are also provided. + // The meaning of "predicted_output" depends on the training algorithm. + // In perceptron, it is the most likely output predicted by the model. + // In cost-augmented MIRA and structured SVMs, it is the cost-augmented + // prediction. + // In CRFs, it is the vector of posterior marginals for the parts. + // TODO: use "FeatureVector *difference" as input (see function + // MakeFeatureDifference(...) instead of computing on the fly). + virtual void MakeGradientStep(Parts *parts, Features *features, double eta, + int iteration, + const vector &gold_output, + const vector &predicted_output); + + // Compute the difference between the predicted feature vector and the gold + // one. + // The meaning of "predicted_output" depends on the training algorithm. + // In perceptron, it is the most likely output predicted by the model. + // In cost-augmented MIRA and structured SVMs, it is the cost-augmented + // prediction. + // In CRFs, it is the vector of posterior marginals for the parts. + virtual void MakeFeatureDifference(Parts *parts, + Features *features, + const vector &gold_output, + const vector &predicted_output, + FeatureVector *difference); + + // Given an instance, a vector of parts, and features for those parts, + // remove all the features which are not supported, i.e., that were not + // previously created in the parameter vector. This is used for training + // with supported features (flag --only_supported_features). + void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + Features *features) { + vector selected_parts(parts->size(), true); + RemoveUnsupportedFeatures(instance, parts, selected_parts, features); + } + + // Given an instance, a vector of selected parts, and features for those + // parts, remove all the features which are not supported. See description + // above. + virtual void RemoveUnsupportedFeatures(Instance *instance, Parts *parts, + const vector &selected_parts, + Features *features); + + // Given a vector of parts, and features for those parts, "touch" all the + // parameters corresponding to those features. This will be a no-op for the + // parameters that exist already, and will create a parameter with a zero + // weight otherwise. This is used in a preprocessing stage for training + // with supported features (flag --only_supported_features). + virtual void TouchParameters(Parts *parts, Features *features, + const vector &selected_parts); + + // This is a no-op by default. But it's convenient to have it here to build + // latent-variable structured classifiers (e.g. for coreference resolution). + virtual void TransformGold(Instance *instance, + Parts *parts, + const std::vector &scores, + std::vector *gold_output, + double *loss_inner) { + *loss_inner = 0.0; + } + + // Given a vector of parts of a desired output, builds the output information + // in the instance that corresponds to that output. + // Note: this function is task-specific and needs to be implemented by the + // deriving class. + virtual void LabelInstance(Parts *parts, const vector &output, + Instance *instance) = 0; + + // Preprocess an instance before training begins. Override this function for + // task-specific instance preprocessing. + virtual void PreprocessInstance(Instance* instance) {}; + + // Preprocess the data before training begins. Override this function for + // task-specific instance preprocessing. + virtual void PreprocessData() {}; + + // Build and lock a parameter vector with only supported parameters, by + // looking at the gold outputs in the training data. This is a preprocessing + // stage for training with supported features (flag + // --only_supported_features). + void MakeSupportedParameters(); + + // Run one epoch of training. + void TrainEpoch(int epoch); + + // Start all the evaluation counters for evaluating the classifier, + // evaluate each instance, and plot evaluation information at the end. + // This is done at test time when the flag --evaluate is activated. + // The version implemented here plots accuracy based on Hamming distance + // for the predicted and gold parts. Override this function for + // task-specific evaluation. + virtual void BeginEvaluation() { num_mistakes_ = 0; num_total_parts_ = 0; } + virtual void EvaluateInstance(Instance *instance, + Instance *output_instance, + Parts *parts, + const vector &gold_outputs, + const vector &predicted_outputs) { + for (int r = 0; r < parts->size(); ++r) { + if (!NEARLY_EQ_TOL(gold_outputs[r], predicted_outputs[r], 1e-6)) { + ++num_mistakes_; + } + ++num_total_parts_; + } + } + virtual void EndEvaluation() { + LOG(INFO) << "Accuracy (parts): " << + static_cast(num_total_parts_ - num_mistakes_) / + static_cast(num_total_parts_); + } + +protected: + Options *options_; // Classifier options. + Dictionary *dictionary_; // Dictionary for the classifier. + Reader *reader_; // Reader for reading instances from a file. + Writer *writer_; // Writer for writing instance to a file. + Decoder *decoder_; // Decoder for this classification task. + Parameters *parameters_; // Parameter vector. + vector instances_; // Set of instances. + + // Number of mistakes and number of total parts at test time (used for + // evaluation purposes). + int num_mistakes_; + int num_total_parts_; + //Model check + uint64_t model_check_; + uint64_t model_version_; +}; + +#endif /* PIPE_H_ */ From d4eba508020cf642c9db16f675ff8f1f340cb322 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 23 Jun 2016 21:08:38 +0100 Subject: [PATCH 32/51] ERROR FIX: uninitialised value in EntityDictionary. Remove part of the warnings from compilation. --- python/nlp_pipeline.win.config | 2 +- src/classifier/Pipe.cpp | 4 +- src/classifier/SparseLabeledParameterVector.h | 6 +- src/classifier/SparseParameterVector.h | 2 +- .../CoreferenceDecoder.cpp | 550 ++++---- .../CoreferenceDeterminer.h | 304 ++--- .../CoreferenceDictionary.h | 1214 ++++++++--------- .../CoreferenceDocument.h | 126 +- .../CoreferenceDocumentNumeric.h | 256 ++-- .../CoreferenceFeatures.h | 162 +-- src/coreference_resolver/CoreferencePart.cpp | 110 +- src/coreference_resolver/CoreferencePipe.cpp | 4 +- src/coreference_resolver/CoreferencePronoun.h | 408 +++--- .../CoreferenceReader.cpp | 816 +++++------ src/coreference_resolver/Mention.h | 374 ++--- src/entity_recognizer/EntityDictionary.cpp | 6 + src/entity_recognizer/EntityDictionary.h | 10 +- .../MorphologicalDictionary.h | 236 ++-- src/parser/DependencyDictionary.h | 320 ++--- src/parser/DependencyFeatures.h | 344 ++--- src/parser/DependencyInstance.h | 164 +-- src/parser/DependencyInstanceNumeric.h | 310 ++--- src/parser/DependencyPart.h | 4 +- src/semantic_parser/SemanticDictionary.h | 702 +++++----- src/semantic_parser/SemanticFeatures.h | 444 +++--- src/semantic_parser/SemanticInstance.h | 192 +-- src/semantic_parser/SemanticInstanceNumeric.h | 300 ++-- src/semantic_parser/SemanticPart.h | 1210 ++++++++-------- src/semantic_parser/SemanticPredicate.h | 164 +-- src/sequence/SequenceDecoder.h | 10 +- src/sequence/SequenceInstance.h | 108 +- src/sequence/SequenceInstanceNumeric.h | 384 +++--- src/sequence/SequencePart.h | 4 +- src/tagger/TaggerDictionary.h | 220 +-- .../libturboparser/libturboparser.vcxproj | 3 +- 35 files changed, 4739 insertions(+), 4734 deletions(-) diff --git a/python/nlp_pipeline.win.config b/python/nlp_pipeline.win.config index d839bb5..867a07d 100644 --- a/python/nlp_pipeline.win.config +++ b/python/nlp_pipeline.win.config @@ -21,7 +21,7 @@ parser="C:\\Corpora\\TurboModels\\all_models\\english_proj\\english_proj_parser_ EN-Nonprojective splitter="tokenizers/punkt/english.pickle" tagger="C:\\Corpora\\TurboModels\\all_models\\english_proj\\english_proj_tagger.model" -entity_recognizer="C:\\Corpora\\TurboModels\\all_models\\ner\\models\\english\\english_entity_recognizer.model" +entity_recognizer="C:\\Corpora\\TurboModels\\all_models\\ner\\models\\english\\english_entity_recognizer.DN.model" parser="C:\\Corpora\\TurboModels\\all_models\\english\\english_parser_pruned-true_model-standard.model" semantic_parser="C:\\Corpora\\TurboModels\\all_models\\srl\\models\\english\\english_semantic_parser_conll2008_pruned-false_model-basic_syntax-true_C-0.01_fp-0.4_fn-0.6.model" coreference_resolver="C:\\Corpora\\TurboModels\\all_models\\coreference_models\\english_ontonotes_conll2012\\english_ontonotes_conll2012_coreference_resolver.model" diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index 64952a3..a881fbd 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -153,7 +153,7 @@ void Pipe::Train() { TrainEpoch(i); } - parameters_->Finalize(options_->GetNumEpochs() * instances_.size()); + parameters_->Finalize(options_->GetNumEpochs() * (int)instances_.size()); } void Pipe::CreateInstances() { @@ -216,7 +216,7 @@ void Pipe::TrainEpoch(int epoch) { double total_cost = 0.0; double total_loss = 0.0; double eta; - int num_instances = instances_.size(); + int num_instances = (int)instances_.size(); double lambda = 1.0 / (options_->GetRegularizationConstant() * (static_cast(num_instances))); chronowrap::Chronometer chrono; diff --git a/src/classifier/SparseLabeledParameterVector.h b/src/classifier/SparseLabeledParameterVector.h index c1fc15f..5fb5d98 100644 --- a/src/classifier/SparseLabeledParameterVector.h +++ b/src/classifier/SparseLabeledParameterVector.h @@ -77,7 +77,7 @@ class SparseLabelWeights : public LabelWeights { virtual ~SparseLabelWeights() {}; bool IsSparse() const { return true; } - int Size() const { return label_weights_.size(); } + int Size() const { return (int) label_weights_.size(); } double GetWeight(int label) const { for (int k = 0; k < label_weights_.size(); ++k) { @@ -169,7 +169,7 @@ class DenseLabelWeights : public LabelWeights { virtual ~DenseLabelWeights() {}; bool IsSparse() const { return false; } - int Size() const { return weights_.size(); } + int Size() const { return (int) weights_.size(); } double GetWeight(int label) const { if (label >= weights_.size()) return 0.0; @@ -352,7 +352,7 @@ class SparseLabeledParameterVector { // Get the number of instantiated features. // This is the number of parameters up to different labels. - int Size() const { return values_.size(); } + int Size() const { return (int) values_.size(); } // True if this feature key is already instantiated. bool Exists(uint64_t key) const { diff --git a/src/classifier/SparseParameterVector.h b/src/classifier/SparseParameterVector.h index 415ccfc..669bb30 100644 --- a/src/classifier/SparseParameterVector.h +++ b/src/classifier/SparseParameterVector.h @@ -138,7 +138,7 @@ class SparseParameterVector { } // Get the number of instantiated features. - int Size() const { return values_.size(); } + int Size() const { return (int) values_.size(); } // True if this feature key is already instantiated. bool Exists(uint64_t key) const { diff --git a/src/coreference_resolver/CoreferenceDecoder.cpp b/src/coreference_resolver/CoreferenceDecoder.cpp index 7255859..53b1e6d 100644 --- a/src/coreference_resolver/CoreferenceDecoder.cpp +++ b/src/coreference_resolver/CoreferenceDecoder.cpp @@ -1,275 +1,275 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "CoreferenceDecoder.h" -#include "CoreferencePart.h" -#include "CoreferencePipe.h" -#include -#include "logval.h" - -// Define a matrix of doubles using Eigen. -typedef LogVal LogValD; -namespace Eigen { -typedef Eigen::Matrix MatrixXlogd; -} - -void CoreferenceDecoder::ComputeLinearCostFunction( - Instance *instance, - Parts *parts, - const std::vector &gold_output, - std::vector *p, - double *q) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceParts *coreference_parts = static_cast(parts); - int num_parts = coreference_parts->size(); - const std::vector &mentions = document->GetMentions(); - - // The cost fucntion is = p'*z + q. - *q = 0.0; // Always 0.0 in this case. - p->assign(num_parts, 0.0); - - for (int j = 0; j < mentions.size(); ++j) { - int entity_id = mentions[j]->id(); // Gold entity (-1 if not gold mention). - // List all possible antecedents. - const std::vector &arcs = coreference_parts->FindArcParts(j); - for (int k = 0; k < arcs.size(); ++k) { - int r = arcs[k]; - int i = static_cast((*parts)[r])->parent_mention(); - // Gold parent entity. - int parent_entity_id = (i >= 0) ? mentions[i]->id() : -1; - if (!document->IsMentionAnaphoric(j) && i >= 0) { - // Mention j starts a gold cluster, but this part doesn't. - (*p)[r] = pipe_->GetCoreferenceOptions()->false_anaphor_cost(); - } else if (document->IsMentionAnaphoric(j) && i < 0) { - // Mention j does not start a gold cluster, but this part does. - (*p)[r] = pipe_->GetCoreferenceOptions()->false_new_cost(); - } else if (document->IsMentionAnaphoric(j) && - entity_id != parent_entity_id) { - // Neither mention j or this part start a gold cluster, but the - // antecedents are different. - CHECK_GE(i, 0); - (*p)[r] = pipe_->GetCoreferenceOptions()->false_wrong_link_cost(); - } else { - (*p)[r] = 0.0; - } - } - } -} - -void CoreferenceDecoder::DecodeCostAugmented( - Instance *instance, Parts *parts, - const std::vector &scores, - const std::vector &gold_output, - std::vector *predicted_output, - double *cost, - double *loss) { - CoreferenceParts *coreference_parts = static_cast(parts); - int num_parts = parts->size(); - - std::vector p; - double q; - ComputeLinearCostFunction(instance, parts, gold_output, &p, &q); - - std::vector scores_cost = scores; - for (int r = 0; r < num_parts; ++r) { - scores_cost[r] += p[r]; - } - - Decode(instance, parts, scores_cost, predicted_output); - - *cost = q; - for (int r = 0; r < num_parts; ++r) { - *cost += p[r] * (*predicted_output)[r]; - } - - *loss = *cost; - for (int r = 0; r < num_parts; ++r) { - *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); - } -} - -void CoreferenceDecoder::DecodeCostAugmentedMarginals( - Instance *instance, - Parts *parts, - const std::vector &scores, - const std::vector &gold_output, - std::vector *predicted_output, - double *entropy, - double *cost, - double *loss) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceParts *coreference_parts = static_cast(parts); - int num_parts = coreference_parts->size(); - - predicted_output->clear(); - predicted_output->resize(num_parts, 0.0); - - std::vector p; - double q; - ComputeLinearCostFunction(instance, parts, gold_output, &p, &q); - - std::vector scores_cost = scores; - for (int r = 0; r < num_parts; ++r) { - scores_cost[r] += p[r]; - } - - double log_partition_function; - DecodeBasicMarginals(instance, parts, scores_cost, predicted_output, - &log_partition_function, entropy); - - *cost = q; - for (int r = 0; r < num_parts; ++r) { - *cost += p[r] * (*predicted_output)[r]; - } - - *loss = *cost; - for (int r = 0; r < num_parts; ++r) { - *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); - } - - *loss += *entropy; - if (*loss < 0.0) { - LOG(INFO) << "Loss truncated to zero (" << *loss << ")"; - *loss = 0.0; - } -} - -void CoreferenceDecoder::Decode(Instance *instance, Parts *parts, - const std::vector &scores, - std::vector *predicted_output) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceParts *coreference_parts = static_cast(parts); - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - const std::vector &mentions = document->GetMentions(); - for (int j = 0; j < mentions.size(); ++j) { - // List all possible antecedents and pick the one with highest score. - const std::vector &arcs = coreference_parts->FindArcParts(j); - int best_antecedent = -1; - for (int k = 0; k < arcs.size(); ++k) { - int r = arcs[k]; - if (best_antecedent < 0 || scores[r] > scores[best_antecedent]) { - best_antecedent = r; - } - } - CHECK_GE(best_antecedent, 0); - (*predicted_output)[best_antecedent] = 1.0; - } -} - -void CoreferenceDecoder::DecodeMarginals(Instance *instance, Parts *parts, - const std::vector &scores, - const std::vector &gold_output, - std::vector *predicted_output, - double *entropy, - double *loss) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceParts *coreference_parts = static_cast(parts); - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - int offset_arcs = 0; - int num_arcs = coreference_parts->size(); - - double log_partition_function; - DecodeBasicMarginals(instance, parts, scores, predicted_output, - &log_partition_function, entropy); - - *loss = 0.0; - for (int r = 0; r < parts->size(); ++r) { - *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); - } - - *loss += *entropy; - if (*loss < 0.0) { - LOG(INFO) << "Loss truncated to zero (" << *loss << ")"; - *loss = 0.0; - } -} - -// Compute marginals and evaluate log partition function for a coreference tree -// model. -void CoreferenceDecoder::DecodeBasicMarginals( - Instance *instance, Parts *parts, - const std::vector &scores, - std::vector *predicted_output, - double *log_partition_function, - double *entropy) { - CoreferenceDocumentNumeric *document = - static_cast(instance); - CoreferenceParts *coreference_parts = static_cast(parts); - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - *log_partition_function = 0.0; - *entropy = 0.0; - const std::vector &mentions = document->GetMentions(); - for (int j = 0; j < mentions.size(); ++j) { - // List all possible antecedents and pick the one with highest score. - const std::vector &arcs = coreference_parts->FindArcParts(j); - int best_antecedent = -1; - // Find the best label for each candidate arc. - LogValD total_score = LogValD::Zero(); - //LOG(INFO) << "num_arcs = " << arcs.size(); - for (int k = 0; k < arcs.size(); ++k) { - int r = arcs[k]; - total_score += LogValD(scores[r], false); - //LOG(INFO) << "scores[" << r << "] = " << scores[r]; - } - //LOG(INFO) << "total score = " << total_score.logabs(); - *log_partition_function += total_score.logabs(); - double sum = 0.0; - for (int k = 0; k < arcs.size(); ++k) { - int r = arcs[k]; - LogValD marginal = LogValD(scores[r], false) / total_score; - double marginal_value = marginal.as_float(); - (*predicted_output)[r] = marginal_value; -#if 0 - if (marginal_value > 0.0) { - LOG(INFO) << "Marginal[" << j << ", " - << static_cast((*parts)[r])->parent_mention() - << "] = " << marginal_value; - } -#endif - if (scores[r] != -std::numeric_limits::infinity()) { - *entropy -= scores[r] * marginal_value; - } else { - CHECK_EQ(marginal_value, 0.0); - } - sum += marginal_value; - } - if (!NEARLY_EQ_TOL(sum, 1.0, 1e-9)) { - LOG(INFO) << "Antecedent marginals don't sum to one: sum = " << sum; - } - } - - *entropy += *log_partition_function; - -#if 0 - LOG(INFO) << "Log-partition function: " << *log_partition_function; - LOG(INFO) << "Entropy: " << *entropy; -#endif -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "CoreferenceDecoder.h" +#include "CoreferencePart.h" +#include "CoreferencePipe.h" +#include +#include "logval.h" + +// Define a matrix of doubles using Eigen. +typedef LogVal LogValD; +namespace Eigen { +typedef Eigen::Matrix MatrixXlogd; +} + +void CoreferenceDecoder::ComputeLinearCostFunction( + Instance *instance, + Parts *parts, + const std::vector &gold_output, + std::vector *p, + double *q) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceParts *coreference_parts = static_cast(parts); + int num_parts = (int)coreference_parts->size(); + const std::vector &mentions = document->GetMentions(); + + // The cost fucntion is = p'*z + q. + *q = 0.0; // Always 0.0 in this case. + p->assign(num_parts, 0.0); + + for (int j = 0; j < mentions.size(); ++j) { + int entity_id = mentions[j]->id(); // Gold entity (-1 if not gold mention). + // List all possible antecedents. + const std::vector &arcs = coreference_parts->FindArcParts(j); + for (int k = 0; k < arcs.size(); ++k) { + int r = arcs[k]; + int i = static_cast((*parts)[r])->parent_mention(); + // Gold parent entity. + int parent_entity_id = (i >= 0) ? mentions[i]->id() : -1; + if (!document->IsMentionAnaphoric(j) && i >= 0) { + // Mention j starts a gold cluster, but this part doesn't. + (*p)[r] = pipe_->GetCoreferenceOptions()->false_anaphor_cost(); + } else if (document->IsMentionAnaphoric(j) && i < 0) { + // Mention j does not start a gold cluster, but this part does. + (*p)[r] = pipe_->GetCoreferenceOptions()->false_new_cost(); + } else if (document->IsMentionAnaphoric(j) && + entity_id != parent_entity_id) { + // Neither mention j or this part start a gold cluster, but the + // antecedents are different. + CHECK_GE(i, 0); + (*p)[r] = pipe_->GetCoreferenceOptions()->false_wrong_link_cost(); + } else { + (*p)[r] = 0.0; + } + } + } +} + +void CoreferenceDecoder::DecodeCostAugmented( + Instance *instance, Parts *parts, + const std::vector &scores, + const std::vector &gold_output, + std::vector *predicted_output, + double *cost, + double *loss) { + CoreferenceParts *coreference_parts = static_cast(parts); + int num_parts = (int)parts->size(); + + std::vector p; + double q; + ComputeLinearCostFunction(instance, parts, gold_output, &p, &q); + + std::vector scores_cost = scores; + for (int r = 0; r < num_parts; ++r) { + scores_cost[r] += p[r]; + } + + Decode(instance, parts, scores_cost, predicted_output); + + *cost = q; + for (int r = 0; r < num_parts; ++r) { + *cost += p[r] * (*predicted_output)[r]; + } + + *loss = *cost; + for (int r = 0; r < num_parts; ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } +} + +void CoreferenceDecoder::DecodeCostAugmentedMarginals( + Instance *instance, + Parts *parts, + const std::vector &scores, + const std::vector &gold_output, + std::vector *predicted_output, + double *entropy, + double *cost, + double *loss) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceParts *coreference_parts = static_cast(parts); + int num_parts = (int)coreference_parts->size(); + + predicted_output->clear(); + predicted_output->resize(num_parts, 0.0); + + std::vector p; + double q; + ComputeLinearCostFunction(instance, parts, gold_output, &p, &q); + + std::vector scores_cost = scores; + for (int r = 0; r < num_parts; ++r) { + scores_cost[r] += p[r]; + } + + double log_partition_function; + DecodeBasicMarginals(instance, parts, scores_cost, predicted_output, + &log_partition_function, entropy); + + *cost = q; + for (int r = 0; r < num_parts; ++r) { + *cost += p[r] * (*predicted_output)[r]; + } + + *loss = *cost; + for (int r = 0; r < num_parts; ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } + + *loss += *entropy; + if (*loss < 0.0) { + LOG(INFO) << "Loss truncated to zero (" << *loss << ")"; + *loss = 0.0; + } +} + +void CoreferenceDecoder::Decode(Instance *instance, Parts *parts, + const std::vector &scores, + std::vector *predicted_output) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceParts *coreference_parts = static_cast(parts); + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + const std::vector &mentions = document->GetMentions(); + for (int j = 0; j < mentions.size(); ++j) { + // List all possible antecedents and pick the one with highest score. + const std::vector &arcs = coreference_parts->FindArcParts(j); + int best_antecedent = -1; + for (int k = 0; k < arcs.size(); ++k) { + int r = arcs[k]; + if (best_antecedent < 0 || scores[r] > scores[best_antecedent]) { + best_antecedent = r; + } + } + CHECK_GE(best_antecedent, 0); + (*predicted_output)[best_antecedent] = 1.0; + } +} + +void CoreferenceDecoder::DecodeMarginals(Instance *instance, Parts *parts, + const std::vector &scores, + const std::vector &gold_output, + std::vector *predicted_output, + double *entropy, + double *loss) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceParts *coreference_parts = static_cast(parts); + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + int offset_arcs = 0; + int num_arcs = (int)coreference_parts->size(); + + double log_partition_function; + DecodeBasicMarginals(instance, parts, scores, predicted_output, + &log_partition_function, entropy); + + *loss = 0.0; + for (int r = 0; r < parts->size(); ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } + + *loss += *entropy; + if (*loss < 0.0) { + LOG(INFO) << "Loss truncated to zero (" << *loss << ")"; + *loss = 0.0; + } +} + +// Compute marginals and evaluate log partition function for a coreference tree +// model. +void CoreferenceDecoder::DecodeBasicMarginals( + Instance *instance, Parts *parts, + const std::vector &scores, + std::vector *predicted_output, + double *log_partition_function, + double *entropy) { + CoreferenceDocumentNumeric *document = + static_cast(instance); + CoreferenceParts *coreference_parts = static_cast(parts); + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + *log_partition_function = 0.0; + *entropy = 0.0; + const std::vector &mentions = document->GetMentions(); + for (int j = 0; j < mentions.size(); ++j) { + // List all possible antecedents and pick the one with highest score. + const std::vector &arcs = coreference_parts->FindArcParts(j); + int best_antecedent = -1; + // Find the best label for each candidate arc. + LogValD total_score = LogValD::Zero(); + //LOG(INFO) << "num_arcs = " << arcs.size(); + for (int k = 0; k < arcs.size(); ++k) { + int r = arcs[k]; + total_score += LogValD(scores[r], false); + //LOG(INFO) << "scores[" << r << "] = " << scores[r]; + } + //LOG(INFO) << "total score = " << total_score.logabs(); + *log_partition_function += total_score.logabs(); + double sum = 0.0; + for (int k = 0; k < arcs.size(); ++k) { + int r = arcs[k]; + LogValD marginal = LogValD(scores[r], false) / total_score; + double marginal_value = marginal.as_float(); + (*predicted_output)[r] = marginal_value; +#if 0 + if (marginal_value > 0.0) { + LOG(INFO) << "Marginal[" << j << ", " + << static_cast((*parts)[r])->parent_mention() + << "] = " << marginal_value; + } +#endif + if (scores[r] != -std::numeric_limits::infinity()) { + *entropy -= scores[r] * marginal_value; + } else { + CHECK_EQ(marginal_value, 0.0); + } + sum += marginal_value; + } + if (!NEARLY_EQ_TOL(sum, 1.0, 1e-9)) { + LOG(INFO) << "Antecedent marginals don't sum to one: sum = " << sum; + } + } + + *entropy += *log_partition_function; + +#if 0 + LOG(INFO) << "Log-partition function: " << *log_partition_function; + LOG(INFO) << "Entropy: " << *entropy; +#endif +} diff --git a/src/coreference_resolver/CoreferenceDeterminer.h b/src/coreference_resolver/CoreferenceDeterminer.h index 626eaa0..f7e5ce1 100644 --- a/src/coreference_resolver/CoreferenceDeterminer.h +++ b/src/coreference_resolver/CoreferenceDeterminer.h @@ -1,152 +1,152 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEDETERMINER_H_ -#define COREFERENCEDETERMINER_H_ - -// TODO(atm): there is a lot of redundancy here with CoreferenceDeterminer. -// We should refactor this some time later. -struct CoreferenceDeterminerNumber { - enum types { - SINGULAR = 0, - PLURAL, - UNDEFINED, - COUNT - }; -}; - -struct CoreferenceDeterminerGender { - enum types { - MALE = 0, - FEMALE, - NEUTRAL, - UNDEFINED, - COUNT - }; -}; - -class CoreferenceDeterminer { -public: - CoreferenceDeterminer() { ClearFlags(); } - CoreferenceDeterminer(const std::string &code_flags) { SetFlags(code_flags); } - virtual ~CoreferenceDeterminer() {} - - void Save(FILE *fs) { - bool success; - success = WriteUINT8(fs, number_flag_); - CHECK(success); - success = WriteUINT8(fs, gender_flag_); - CHECK(success); - } - - void Load(FILE *fs) { - bool success; - success = ReadUINT8(fs, &number_flag_); - CHECK(success); - success = ReadUINT8(fs, &gender_flag_); - CHECK(success); - } - - uint8_t number_flag() { return number_flag_; } - uint8_t gender_flag() { return gender_flag_; } - - void ClearFlags() { - number_flag_ = 0x0; - gender_flag_ = 0x0; - } - - void SetFlags(const std::string &code_flags) { - CHECK_EQ(code_flags.length(), 2); - - ClearFlags(); - char ch = code_flags[0]; // Number flag. - if (ch == 's') { - SetNumberSingular(); - } else if (ch == 'p') { - SetNumberPlural(); - } else if (ch == 'x') { - SetNumberUndefined(); - } else { - CHECK(false) << "Invalid number flag: " << ch; - } - - ch = code_flags[1]; // Gender flag. - if (ch == 'm') { - SetGenderMale(); - } else if (ch == 'f') { - SetGenderFemale(); - } else if (ch == 'n') { - SetGenderNeutral(); - } else if (ch == 'x') { - SetGenderUndefined(); - } else { - CHECK(false) << "Invalid gender flag: " << ch; - } - } - -public: - bool IsNumberSingular() { - return number_flag_ & (0x1 << CoreferenceDeterminerNumber::SINGULAR); - } - bool IsNumberPlural() { - return number_flag_ & (0x1 << CoreferenceDeterminerNumber::PLURAL); - } - bool IsNumberUndefined() { - return number_flag_ & (0x1 << CoreferenceDeterminerNumber::UNDEFINED); - } - bool IsGenderMale() { - return gender_flag_ & (0x1 << CoreferenceDeterminerGender::MALE); - } - bool IsGenderFemale() { - return gender_flag_ & (0x1 << CoreferenceDeterminerGender::FEMALE); - } - bool IsGenderNeutral() { - return gender_flag_ & (0x1 << CoreferenceDeterminerGender::NEUTRAL); - } - bool IsGenderUndefined() { - return gender_flag_ & (0x1 << CoreferenceDeterminerGender::UNDEFINED); - } - - void SetNumberSingular() { - number_flag_ |= (0x1 << CoreferenceDeterminerNumber::SINGULAR); - } - void SetNumberPlural() { - number_flag_ |= (0x1 << CoreferenceDeterminerNumber::PLURAL); - } - void SetNumberUndefined() { - number_flag_ |= (0x1 << CoreferenceDeterminerNumber::UNDEFINED); - } - void SetGenderMale() { - gender_flag_ |= (0x1 << CoreferenceDeterminerGender::MALE); - } - void SetGenderFemale() { - gender_flag_ |= (0x1 << CoreferenceDeterminerGender::FEMALE); - } - void SetGenderNeutral() { - gender_flag_ |= (0x1 << CoreferenceDeterminerGender::NEUTRAL); - } - void SetGenderUndefined() { - gender_flag_ |= (0x1 << CoreferenceDeterminerGender::UNDEFINED); - } - -protected: - uint8_t number_flag_; - uint8_t gender_flag_; -}; - -#endif /* COREFERENCEDETERMINER_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEDETERMINER_H_ +#define COREFERENCEDETERMINER_H_ + +// TODO(atm): there is a lot of redundancy here with CoreferenceDeterminer. +// We should refactor this some time later. +struct CoreferenceDeterminerNumber { + enum types { + SINGULAR = 0, + PLURAL, + UNDEFINED, + COUNT + }; +}; + +struct CoreferenceDeterminerGender { + enum types { + MALE = 0, + FEMALE, + NEUTRAL, + UNDEFINED, + COUNT + }; +}; + +class CoreferenceDeterminer { +public: + CoreferenceDeterminer() { ClearFlags(); } + CoreferenceDeterminer(const std::string &code_flags) { SetFlags(code_flags); } + virtual ~CoreferenceDeterminer() {} + + void Save(FILE *fs) { + bool success; + success = WriteUINT8(fs, number_flag_); + CHECK(success); + success = WriteUINT8(fs, gender_flag_); + CHECK(success); + } + + void Load(FILE *fs) { + bool success; + success = ReadUINT8(fs, &number_flag_); + CHECK(success); + success = ReadUINT8(fs, &gender_flag_); + CHECK(success); + } + + uint8_t number_flag() { return number_flag_; } + uint8_t gender_flag() { return gender_flag_; } + + void ClearFlags() { + number_flag_ = 0x0; + gender_flag_ = 0x0; + } + + void SetFlags(const std::string &code_flags) { + CHECK_EQ(code_flags.length(), 2); + + ClearFlags(); + char ch = code_flags[0]; // Number flag. + if (ch == 's') { + SetNumberSingular(); + } else if (ch == 'p') { + SetNumberPlural(); + } else if (ch == 'x') { + SetNumberUndefined(); + } else { + CHECK(false) << "Invalid number flag: " << ch; + } + + ch = code_flags[1]; // Gender flag. + if (ch == 'm') { + SetGenderMale(); + } else if (ch == 'f') { + SetGenderFemale(); + } else if (ch == 'n') { + SetGenderNeutral(); + } else if (ch == 'x') { + SetGenderUndefined(); + } else { + CHECK(false) << "Invalid gender flag: " << ch; + } + } + +public: + bool IsNumberSingular() { + return (number_flag_ & (0x1 << CoreferenceDeterminerNumber::SINGULAR)) != 0; + } + bool IsNumberPlural() { + return (number_flag_ & (0x1 << CoreferenceDeterminerNumber::PLURAL)) != 0; + } + bool IsNumberUndefined() { + return (number_flag_ & (0x1 << CoreferenceDeterminerNumber::UNDEFINED)) != 0; + } + bool IsGenderMale() { + return (gender_flag_ & (0x1 << CoreferenceDeterminerGender::MALE)) != 0; + } + bool IsGenderFemale() { + return (gender_flag_ & (0x1 << CoreferenceDeterminerGender::FEMALE)) != 0; + } + bool IsGenderNeutral() { + return (gender_flag_ & (0x1 << CoreferenceDeterminerGender::NEUTRAL)) != 0; + } + bool IsGenderUndefined() { + return (gender_flag_ & (0x1 << CoreferenceDeterminerGender::UNDEFINED) ) != 0; + } + + void SetNumberSingular() { + number_flag_ |= (0x1 << CoreferenceDeterminerNumber::SINGULAR); + } + void SetNumberPlural() { + number_flag_ |= (0x1 << CoreferenceDeterminerNumber::PLURAL); + } + void SetNumberUndefined() { + number_flag_ |= (0x1 << CoreferenceDeterminerNumber::UNDEFINED); + } + void SetGenderMale() { + gender_flag_ |= (0x1 << CoreferenceDeterminerGender::MALE); + } + void SetGenderFemale() { + gender_flag_ |= (0x1 << CoreferenceDeterminerGender::FEMALE); + } + void SetGenderNeutral() { + gender_flag_ |= (0x1 << CoreferenceDeterminerGender::NEUTRAL); + } + void SetGenderUndefined() { + gender_flag_ |= (0x1 << CoreferenceDeterminerGender::UNDEFINED); + } + +protected: + uint8_t number_flag_; + uint8_t gender_flag_; +}; + +#endif /* COREFERENCEDETERMINER_H_ */ diff --git a/src/coreference_resolver/CoreferenceDictionary.h b/src/coreference_resolver/CoreferenceDictionary.h index 21d5ca2..10cec09 100644 --- a/src/coreference_resolver/CoreferenceDictionary.h +++ b/src/coreference_resolver/CoreferenceDictionary.h @@ -1,607 +1,607 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEDICTIONARY_H_ -#define COREFERENCEDICTIONARY_H_ - -#include -#include "Dictionary.h" -#include "TokenDictionary.h" -#include "DependencyDictionary.h" -#include "SemanticDictionary.h" -#include "SerializationUtils.h" -#include "CoreferenceReader.h" -#include "CoreferencePronoun.h" -#include "CoreferenceDeterminer.h" - -class Pipe; - -class GenderNumberStatistics { -public: - GenderNumberStatistics() {} - virtual ~GenderNumberStatistics() { Clear(); } - - void Clear() { phrase_counts_.clear(); } - - void Save(FILE *fs) { - bool success; - success = WriteInteger(fs, phrase_counts_.size()); - CHECK(success); - for (std::map, std::vector >::iterator it = - phrase_counts_.begin(); - it != phrase_counts_.end(); - ++it) { - success = WriteIntegerVector(fs, it->first); - CHECK(success); - success = WriteIntegerVector(fs, it->second); - CHECK(success); - } - } - - void Load(FILE *fs) { - bool success; - int length; - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - std::vector phrase; - success = ReadIntegerVector(fs, &phrase); - CHECK(success); - std::vector counts; - success = ReadIntegerVector(fs, &counts); - CHECK(success); - AddPhrase(phrase, counts); - } - } - - bool AddPhrase(const std::vector &phrase, - const std::vector &counts) { - if (phrase_counts_.find(phrase) == phrase_counts_.end()) { - phrase_counts_[phrase] = counts; - return true; - } else { - return false; - } - } - - int ComputeNumber(const std::vector &phrase, int head_index) const; - int ComputeGender(const std::vector &phrase, int head_index) const; - -protected: - std::map, std::vector > phrase_counts_; -}; - -class CoreferenceDictionary : public Dictionary { -public: - CoreferenceDictionary() {} - CoreferenceDictionary(Pipe* pipe) : pipe_(pipe) {} - virtual ~CoreferenceDictionary() { Clear(); } - - void Clear() { - // Don't clear token_dictionary, since this class does not own it. - entity_alphabet_.clear(); - constituent_alphabet_.clear(); - word_alphabet_.clear(); - word_lower_alphabet_.clear(); - unigram_ancestry_alphabet_.clear(); - bigram_ancestry_alphabet_.clear(); - - // TODO(atm): clear all the other stuff!!! - } - - void Save(FILE *fs) { - if (0 > entity_alphabet_.Save(fs)) CHECK(false); - if (0 > constituent_alphabet_.Save(fs)) CHECK(false); - if (0 > word_alphabet_.Save(fs)) CHECK(false); - if (0 > word_lower_alphabet_.Save(fs)) CHECK(false); - if (0 > unigram_ancestry_alphabet_.Save(fs)) CHECK(false); - if (0 > bigram_ancestry_alphabet_.Save(fs)) CHECK(false); - - // Save gender/number statistics. - gender_number_statistics_.Save(fs); - - // Save pronouns. - bool success; - int length = all_pronouns_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::map::iterator it = - all_pronouns_.begin(); - it != all_pronouns_.end(); - ++it) { - int id = it->first; - CoreferencePronoun *pronoun = it->second; - success = WriteInteger(fs, id); - CHECK(success); - pronoun->Save(fs); - } - - // Save determiners. - length = all_determiners_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::map::iterator it = - all_determiners_.begin(); - it != all_determiners_.end(); - ++it) { - int id = it->first; - CoreferenceDeterminer *determiner = it->second; - success = WriteInteger(fs, id); - CHECK(success); - determiner->Save(fs); - } - - // Save various tags. - length = named_entity_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = named_entity_tags_.begin(); - it != named_entity_tags_.end(); - ++it) { - int id = *it; - success = WriteInteger(fs, id); - CHECK(success); - } - - length = person_entity_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = person_entity_tags_.begin(); - it != person_entity_tags_.end(); - ++it) { - int id = *it; - success = WriteInteger(fs, id); - CHECK(success); - } - - length = noun_phrase_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = noun_phrase_tags_.begin(); - it != noun_phrase_tags_.end(); - ++it) { - int id = *it; - success = WriteInteger(fs, id); - CHECK(success); - } - - length = proper_noun_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = proper_noun_tags_.begin(); - it != proper_noun_tags_.end(); - ++it) { - int id = *it; - success = WriteInteger(fs, id); - CHECK(success); - } - - length = noun_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = noun_tags_.begin(); - it != noun_tags_.end(); - ++it) { - int id = *it; - success = WriteInteger(fs, id); - CHECK(success); - } - - length = pronominal_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = pronominal_tags_.begin(); - it != pronominal_tags_.end(); - ++it) { - int id = *it; - success = WriteInteger(fs, id); - CHECK(success); - } - } - - void Load(FILE *fs) { - if (0 > entity_alphabet_.Load(fs)) CHECK(false); - if (0 > constituent_alphabet_.Load(fs)) CHECK(false); - if (0 > word_alphabet_.Load(fs)) CHECK(false); - if (0 > word_lower_alphabet_.Load(fs)) CHECK(false); - if (0 > unigram_ancestry_alphabet_.Load(fs)) CHECK(false); - if (0 > bigram_ancestry_alphabet_.Load(fs)) CHECK(false); - entity_alphabet_.BuildNames(); - constituent_alphabet_.BuildNames(); - // TODO(atm): Remove this for memory efficiency. - word_alphabet_.BuildNames(); - word_lower_alphabet_.BuildNames(); - unigram_ancestry_alphabet_.BuildNames(); - bigram_ancestry_alphabet_.BuildNames(); - - // Load gender/number statistics. - gender_number_statistics_.Load(fs); - - // Load pronouns. - bool success; - int length; - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - CoreferencePronoun *pronoun = new CoreferencePronoun; - success = ReadInteger(fs, &id); - CHECK(success); - pronoun->Load(fs); - all_pronouns_[id] = pronoun; - } - - // Load determiners. - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - CoreferenceDeterminer *determiner = new CoreferenceDeterminer; - success = ReadInteger(fs, &id); - CHECK(success); - determiner->Load(fs); - all_determiners_[id] = determiner; - } - - // Load various tags. - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - named_entity_tags_.insert(id); - } - - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - person_entity_tags_.insert(id); - } - - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - noun_phrase_tags_.insert(id); - } - - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - proper_noun_tags_.insert(id); - } - - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - noun_tags_.insert(id); - } - - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int id; - success = ReadInteger(fs, &id); - CHECK(success); - pronominal_tags_.insert(id); - } - } - - void AllowGrowth() { - entity_alphabet_.AllowGrowth(); - constituent_alphabet_.AllowGrowth(); - word_alphabet_.AllowGrowth(); - word_lower_alphabet_.AllowGrowth(); - unigram_ancestry_alphabet_.AllowGrowth(); - bigram_ancestry_alphabet_.AllowGrowth(); - token_dictionary_->AllowGrowth(); - dependency_dictionary_->AllowGrowth(); - semantic_dictionary_->AllowGrowth(); - } - void StopGrowth() { - entity_alphabet_.StopGrowth(); - constituent_alphabet_.StopGrowth(); - word_alphabet_.StopGrowth(); - word_lower_alphabet_.StopGrowth(); - unigram_ancestry_alphabet_.StopGrowth(); - bigram_ancestry_alphabet_.StopGrowth(); - token_dictionary_->StopGrowth(); - dependency_dictionary_->StopGrowth(); - semantic_dictionary_->StopGrowth(); - } - - void CreateEntityDictionary(CoreferenceSentenceReader *reader); - - void CreateConstituentDictionary(CoreferenceSentenceReader *reader); - - void CreateWordDictionaries(CoreferenceSentenceReader *reader); - - void CreateAncestryDictionaries(CoreferenceSentenceReader *reader); - - void BuildEntityNames() { - entity_alphabet_.BuildNames(); - } - - void BuildConstituentNames() { - constituent_alphabet_.BuildNames(); - } - - void BuildWordNames() { - word_alphabet_.BuildNames(); - word_lower_alphabet_.BuildNames(); - } - - void BuildAncestryNames() { - unigram_ancestry_alphabet_.BuildNames(); - bigram_ancestry_alphabet_.BuildNames(); - } - - const string &GetEntityName(int tag) const { - return entity_alphabet_.GetName(tag); - } - - const string &GetConstituentName(int tag) const { - return constituent_alphabet_.GetName(tag); - } - - const string &GetWord(int word) const { - return word_alphabet_.GetName(word); - } - - const string &GetWordLower(int word) const { - return word_lower_alphabet_.GetName(word); - } - - const string &GetUnigramAncestry(int ancestry) const { - return unigram_ancestry_alphabet_.GetName(ancestry); - } - - const string &GetBigramAncestry(int ancestry) const { - return bigram_ancestry_alphabet_.GetName(ancestry); - } - - Pipe *GetPipe() const { return pipe_; } - - TokenDictionary *GetTokenDictionary() const { return token_dictionary_; } - DependencyDictionary *GetDependencyDictionary() const { - return dependency_dictionary_; - } - SemanticDictionary *GetSemanticDictionary() const { - return semantic_dictionary_; - } - void SetTokenDictionary(TokenDictionary *token_dictionary) { - token_dictionary_ = token_dictionary; - } - void SetDependencyDictionary(DependencyDictionary *dependency_dictionary) { - dependency_dictionary_ = dependency_dictionary; - } - void SetSemanticDictionary(SemanticDictionary *semantic_dictionary) { - semantic_dictionary_ = semantic_dictionary; - } - - const Alphabet &GetConstituentAlphabet() const { - return constituent_alphabet_; - }; - - const Alphabet &GetEntityAlphabet() const { - return entity_alphabet_; - }; - - const Alphabet &GetWordAlphabet() const { - return word_alphabet_; - }; - - const Alphabet &GetWordLowerAlphabet() const { - return word_lower_alphabet_; - }; - - const Alphabet &GetUnigramAncestryAlphabet() const { - return unigram_ancestry_alphabet_; - }; - - const Alphabet &GetBigramAncestryAlphabet() const { - return bigram_ancestry_alphabet_; - }; - - const GenderNumberStatistics &GetGenderNumberStatistics() const { - return gender_number_statistics_; - }; - - void ReadGenderNumberStatistics(); - void ReadMentionTags(); - void ReadPronouns(); - void ReadDeterminers(); - - bool IsNamedEntity(int entity_tag) const { - return named_entity_tags_.find(entity_tag) != named_entity_tags_.end(); - } - - bool IsPersonEntity(int entity_tag) const { - return person_entity_tags_.find(entity_tag) != person_entity_tags_.end(); - } - - bool IsNounPhrase(int constituent_tag) const { - return noun_phrase_tags_.find(constituent_tag) != noun_phrase_tags_.end(); - } - - bool IsProperNoun(int pos_tag) const { - return proper_noun_tags_.find(pos_tag) != proper_noun_tags_.end(); - } - - bool IsNoun(int pos_tag) const { - return noun_tags_.find(pos_tag) != noun_tags_.end(); - } - - bool IsPronounTag(int pos_tag) const { - return pronominal_tags_.find(pos_tag) != pronominal_tags_.end(); - } - - bool IsPronoun(int word_lower) const { - std::map::const_iterator it = - all_pronouns_.find(word_lower); - return it != all_pronouns_.end(); - } - - CoreferencePronoun *GetPronoun(int word_lower) const { - std::map::const_iterator it = - all_pronouns_.find(word_lower); - if (it == all_pronouns_.end()) return NULL; - return it->second; - } - - bool IsMalePronoun(int word_lower) const { - CoreferencePronoun *pronoun = GetPronoun(word_lower); - if (!pronoun) return false; - return pronoun->IsGenderMale(); - } - - bool IsFemalePronoun(int word_lower) const { - CoreferencePronoun *pronoun = GetPronoun(word_lower); - if (!pronoun) return false; - return pronoun->IsGenderFemale(); - } - - bool IsNeutralPronoun(int word_lower) const { - CoreferencePronoun *pronoun = GetPronoun(word_lower); - if (!pronoun) return false; - return pronoun->IsGenderNeutral(); - } - - bool IsSingularPronoun(int word_lower) const { - CoreferencePronoun *pronoun = GetPronoun(word_lower); - if (!pronoun) return false; - return pronoun->IsNumberSingular(); - } - - bool IsPluralPronoun(int word_lower) const { - CoreferencePronoun *pronoun = GetPronoun(word_lower); - if (!pronoun) return false; - return pronoun->IsNumberPlural(); - } - - bool IsDeterminer(int word_lower) const { - std::map::const_iterator it = - all_determiners_.find(word_lower); - return it != all_determiners_.end(); - } - - CoreferenceDeterminer *GetDeterminer(int word_lower) const { - std::map::const_iterator it = - all_determiners_.find(word_lower); - if (it == all_determiners_.end()) return NULL; - return it->second; - } - - bool IsMaleDeterminer(int word_lower) const { - CoreferenceDeterminer *determiner = GetDeterminer(word_lower); - if (!determiner) return false; - return determiner->IsGenderMale(); - } - - bool IsFemaleDeterminer(int word_lower) const { - CoreferenceDeterminer *determiner = GetDeterminer(word_lower); - if (!determiner) return false; - return determiner->IsGenderFemale(); - } - - bool IsNeutralDeterminer(int word_lower) const { - CoreferenceDeterminer *determiner = GetDeterminer(word_lower); - if (!determiner) return false; - return determiner->IsGenderNeutral(); - } - - bool IsSingularDeterminer(int word_lower) const { - CoreferenceDeterminer *determiner = GetDeterminer(word_lower); - if (!determiner) return false; - return determiner->IsNumberSingular(); - } - - bool IsPluralDeterminer(int word_lower) const { - CoreferenceDeterminer *determiner = GetDeterminer(word_lower); - if (!determiner) return false; - return determiner->IsNumberPlural(); - } - - // TODO(atm): this should not be here, but let us keep it for now... - void ComputeDependencyAncestryStrings( - DependencyInstance *instance, - int i, - std::string *unigram_ancestry_string, - std::string *bigram_ancestry_string) const; - -protected: - void DeleteAllPronouns() { - for (std::map::iterator it = - all_pronouns_.begin(); - it != all_pronouns_.end(); - ++it) { - delete it->second; - } - all_pronouns_.clear(); - } - - void DeleteAllDeterminers() { - for (std::map::iterator it = - all_determiners_.begin(); - it != all_determiners_.end(); - ++it) { - delete it->second; - } - all_determiners_.clear(); - } - -protected: - Pipe *pipe_; - TokenDictionary *token_dictionary_; - DependencyDictionary *dependency_dictionary_; - SemanticDictionary *semantic_dictionary_; - Alphabet entity_alphabet_; - Alphabet constituent_alphabet_; - // The two form alphabets below come in addition to the TokenDictionary's - // form alphabet. We have these additional alphabets here since we do not want - // a cutoff and we want to allow loading a lexicon (for gender/number - // computation). - Alphabet word_alphabet_; - Alphabet word_lower_alphabet_; - Alphabet unigram_ancestry_alphabet_; - Alphabet bigram_ancestry_alphabet_; - GenderNumberStatistics gender_number_statistics_; - std::map all_pronouns_; - std::map all_determiners_; - std::set named_entity_tags_; - std::set person_entity_tags_; - std::set noun_tags_; - std::set noun_phrase_tags_; - std::set proper_noun_tags_; - std::set pronominal_tags_; - //Alphabet tag_alphabet_; -}; - -#endif /* COREFERENCEDICTIONARY_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEDICTIONARY_H_ +#define COREFERENCEDICTIONARY_H_ + +#include +#include "Dictionary.h" +#include "TokenDictionary.h" +#include "DependencyDictionary.h" +#include "SemanticDictionary.h" +#include "SerializationUtils.h" +#include "CoreferenceReader.h" +#include "CoreferencePronoun.h" +#include "CoreferenceDeterminer.h" + +class Pipe; + +class GenderNumberStatistics { +public: + GenderNumberStatistics() {} + virtual ~GenderNumberStatistics() { Clear(); } + + void Clear() { phrase_counts_.clear(); } + + void Save(FILE *fs) { + bool success; + success = WriteInteger(fs, (int) phrase_counts_.size()); + CHECK(success); + for (std::map, std::vector >::iterator it = + phrase_counts_.begin(); + it != phrase_counts_.end(); + ++it) { + success = WriteIntegerVector(fs, it->first); + CHECK(success); + success = WriteIntegerVector(fs, it->second); + CHECK(success); + } + } + + void Load(FILE *fs) { + bool success; + int length; + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + std::vector phrase; + success = ReadIntegerVector(fs, &phrase); + CHECK(success); + std::vector counts; + success = ReadIntegerVector(fs, &counts); + CHECK(success); + AddPhrase(phrase, counts); + } + } + + bool AddPhrase(const std::vector &phrase, + const std::vector &counts) { + if (phrase_counts_.find(phrase) == phrase_counts_.end()) { + phrase_counts_[phrase] = counts; + return true; + } else { + return false; + } + } + + int ComputeNumber(const std::vector &phrase, int head_index) const; + int ComputeGender(const std::vector &phrase, int head_index) const; + +protected: + std::map, std::vector > phrase_counts_; +}; + +class CoreferenceDictionary : public Dictionary { +public: + CoreferenceDictionary() {} + CoreferenceDictionary(Pipe* pipe) : pipe_(pipe) {} + virtual ~CoreferenceDictionary() { Clear(); } + + void Clear() { + // Don't clear token_dictionary, since this class does not own it. + entity_alphabet_.clear(); + constituent_alphabet_.clear(); + word_alphabet_.clear(); + word_lower_alphabet_.clear(); + unigram_ancestry_alphabet_.clear(); + bigram_ancestry_alphabet_.clear(); + + // TODO(atm): clear all the other stuff!!! + } + + void Save(FILE *fs) { + if (0 > entity_alphabet_.Save(fs)) CHECK(false); + if (0 > constituent_alphabet_.Save(fs)) CHECK(false); + if (0 > word_alphabet_.Save(fs)) CHECK(false); + if (0 > word_lower_alphabet_.Save(fs)) CHECK(false); + if (0 > unigram_ancestry_alphabet_.Save(fs)) CHECK(false); + if (0 > bigram_ancestry_alphabet_.Save(fs)) CHECK(false); + + // Save gender/number statistics. + gender_number_statistics_.Save(fs); + + // Save pronouns. + bool success; + int length = (int)all_pronouns_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::map::iterator it = + all_pronouns_.begin(); + it != all_pronouns_.end(); + ++it) { + int id = it->first; + CoreferencePronoun *pronoun = it->second; + success = WriteInteger(fs, id); + CHECK(success); + pronoun->Save(fs); + } + + // Save determiners. + length = (int)all_determiners_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::map::iterator it = + all_determiners_.begin(); + it != all_determiners_.end(); + ++it) { + int id = it->first; + CoreferenceDeterminer *determiner = it->second; + success = WriteInteger(fs, id); + CHECK(success); + determiner->Save(fs); + } + + // Save various tags. + length = (int)named_entity_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = named_entity_tags_.begin(); + it != named_entity_tags_.end(); + ++it) { + int id = *it; + success = WriteInteger(fs, id); + CHECK(success); + } + + length = (int)person_entity_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = person_entity_tags_.begin(); + it != person_entity_tags_.end(); + ++it) { + int id = *it; + success = WriteInteger(fs, id); + CHECK(success); + } + + length = (int)noun_phrase_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = noun_phrase_tags_.begin(); + it != noun_phrase_tags_.end(); + ++it) { + int id = *it; + success = WriteInteger(fs, id); + CHECK(success); + } + + length = (int)proper_noun_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = proper_noun_tags_.begin(); + it != proper_noun_tags_.end(); + ++it) { + int id = *it; + success = WriteInteger(fs, id); + CHECK(success); + } + + length = (int)noun_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = noun_tags_.begin(); + it != noun_tags_.end(); + ++it) { + int id = *it; + success = WriteInteger(fs, id); + CHECK(success); + } + + length = (int)pronominal_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = pronominal_tags_.begin(); + it != pronominal_tags_.end(); + ++it) { + int id = *it; + success = WriteInteger(fs, id); + CHECK(success); + } + } + + void Load(FILE *fs) { + if (0 > entity_alphabet_.Load(fs)) CHECK(false); + if (0 > constituent_alphabet_.Load(fs)) CHECK(false); + if (0 > word_alphabet_.Load(fs)) CHECK(false); + if (0 > word_lower_alphabet_.Load(fs)) CHECK(false); + if (0 > unigram_ancestry_alphabet_.Load(fs)) CHECK(false); + if (0 > bigram_ancestry_alphabet_.Load(fs)) CHECK(false); + entity_alphabet_.BuildNames(); + constituent_alphabet_.BuildNames(); + // TODO(atm): Remove this for memory efficiency. + word_alphabet_.BuildNames(); + word_lower_alphabet_.BuildNames(); + unigram_ancestry_alphabet_.BuildNames(); + bigram_ancestry_alphabet_.BuildNames(); + + // Load gender/number statistics. + gender_number_statistics_.Load(fs); + + // Load pronouns. + bool success; + int length; + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + CoreferencePronoun *pronoun = new CoreferencePronoun; + success = ReadInteger(fs, &id); + CHECK(success); + pronoun->Load(fs); + all_pronouns_[id] = pronoun; + } + + // Load determiners. + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + CoreferenceDeterminer *determiner = new CoreferenceDeterminer; + success = ReadInteger(fs, &id); + CHECK(success); + determiner->Load(fs); + all_determiners_[id] = determiner; + } + + // Load various tags. + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + named_entity_tags_.insert(id); + } + + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + person_entity_tags_.insert(id); + } + + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + noun_phrase_tags_.insert(id); + } + + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + proper_noun_tags_.insert(id); + } + + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + noun_tags_.insert(id); + } + + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int id; + success = ReadInteger(fs, &id); + CHECK(success); + pronominal_tags_.insert(id); + } + } + + void AllowGrowth() { + entity_alphabet_.AllowGrowth(); + constituent_alphabet_.AllowGrowth(); + word_alphabet_.AllowGrowth(); + word_lower_alphabet_.AllowGrowth(); + unigram_ancestry_alphabet_.AllowGrowth(); + bigram_ancestry_alphabet_.AllowGrowth(); + token_dictionary_->AllowGrowth(); + dependency_dictionary_->AllowGrowth(); + semantic_dictionary_->AllowGrowth(); + } + void StopGrowth() { + entity_alphabet_.StopGrowth(); + constituent_alphabet_.StopGrowth(); + word_alphabet_.StopGrowth(); + word_lower_alphabet_.StopGrowth(); + unigram_ancestry_alphabet_.StopGrowth(); + bigram_ancestry_alphabet_.StopGrowth(); + token_dictionary_->StopGrowth(); + dependency_dictionary_->StopGrowth(); + semantic_dictionary_->StopGrowth(); + } + + void CreateEntityDictionary(CoreferenceSentenceReader *reader); + + void CreateConstituentDictionary(CoreferenceSentenceReader *reader); + + void CreateWordDictionaries(CoreferenceSentenceReader *reader); + + void CreateAncestryDictionaries(CoreferenceSentenceReader *reader); + + void BuildEntityNames() { + entity_alphabet_.BuildNames(); + } + + void BuildConstituentNames() { + constituent_alphabet_.BuildNames(); + } + + void BuildWordNames() { + word_alphabet_.BuildNames(); + word_lower_alphabet_.BuildNames(); + } + + void BuildAncestryNames() { + unigram_ancestry_alphabet_.BuildNames(); + bigram_ancestry_alphabet_.BuildNames(); + } + + const string &GetEntityName(int tag) const { + return entity_alphabet_.GetName(tag); + } + + const string &GetConstituentName(int tag) const { + return constituent_alphabet_.GetName(tag); + } + + const string &GetWord(int word) const { + return word_alphabet_.GetName(word); + } + + const string &GetWordLower(int word) const { + return word_lower_alphabet_.GetName(word); + } + + const string &GetUnigramAncestry(int ancestry) const { + return unigram_ancestry_alphabet_.GetName(ancestry); + } + + const string &GetBigramAncestry(int ancestry) const { + return bigram_ancestry_alphabet_.GetName(ancestry); + } + + Pipe *GetPipe() const { return pipe_; } + + TokenDictionary *GetTokenDictionary() const { return token_dictionary_; } + DependencyDictionary *GetDependencyDictionary() const { + return dependency_dictionary_; + } + SemanticDictionary *GetSemanticDictionary() const { + return semantic_dictionary_; + } + void SetTokenDictionary(TokenDictionary *token_dictionary) { + token_dictionary_ = token_dictionary; + } + void SetDependencyDictionary(DependencyDictionary *dependency_dictionary) { + dependency_dictionary_ = dependency_dictionary; + } + void SetSemanticDictionary(SemanticDictionary *semantic_dictionary) { + semantic_dictionary_ = semantic_dictionary; + } + + const Alphabet &GetConstituentAlphabet() const { + return constituent_alphabet_; + }; + + const Alphabet &GetEntityAlphabet() const { + return entity_alphabet_; + }; + + const Alphabet &GetWordAlphabet() const { + return word_alphabet_; + }; + + const Alphabet &GetWordLowerAlphabet() const { + return word_lower_alphabet_; + }; + + const Alphabet &GetUnigramAncestryAlphabet() const { + return unigram_ancestry_alphabet_; + }; + + const Alphabet &GetBigramAncestryAlphabet() const { + return bigram_ancestry_alphabet_; + }; + + const GenderNumberStatistics &GetGenderNumberStatistics() const { + return gender_number_statistics_; + }; + + void ReadGenderNumberStatistics(); + void ReadMentionTags(); + void ReadPronouns(); + void ReadDeterminers(); + + bool IsNamedEntity(int entity_tag) const { + return named_entity_tags_.find(entity_tag) != named_entity_tags_.end(); + } + + bool IsPersonEntity(int entity_tag) const { + return person_entity_tags_.find(entity_tag) != person_entity_tags_.end(); + } + + bool IsNounPhrase(int constituent_tag) const { + return noun_phrase_tags_.find(constituent_tag) != noun_phrase_tags_.end(); + } + + bool IsProperNoun(int pos_tag) const { + return proper_noun_tags_.find(pos_tag) != proper_noun_tags_.end(); + } + + bool IsNoun(int pos_tag) const { + return noun_tags_.find(pos_tag) != noun_tags_.end(); + } + + bool IsPronounTag(int pos_tag) const { + return pronominal_tags_.find(pos_tag) != pronominal_tags_.end(); + } + + bool IsPronoun(int word_lower) const { + std::map::const_iterator it = + all_pronouns_.find(word_lower); + return it != all_pronouns_.end(); + } + + CoreferencePronoun *GetPronoun(int word_lower) const { + std::map::const_iterator it = + all_pronouns_.find(word_lower); + if (it == all_pronouns_.end()) return NULL; + return it->second; + } + + bool IsMalePronoun(int word_lower) const { + CoreferencePronoun *pronoun = GetPronoun(word_lower); + if (!pronoun) return false; + return pronoun->IsGenderMale(); + } + + bool IsFemalePronoun(int word_lower) const { + CoreferencePronoun *pronoun = GetPronoun(word_lower); + if (!pronoun) return false; + return pronoun->IsGenderFemale(); + } + + bool IsNeutralPronoun(int word_lower) const { + CoreferencePronoun *pronoun = GetPronoun(word_lower); + if (!pronoun) return false; + return pronoun->IsGenderNeutral(); + } + + bool IsSingularPronoun(int word_lower) const { + CoreferencePronoun *pronoun = GetPronoun(word_lower); + if (!pronoun) return false; + return pronoun->IsNumberSingular(); + } + + bool IsPluralPronoun(int word_lower) const { + CoreferencePronoun *pronoun = GetPronoun(word_lower); + if (!pronoun) return false; + return pronoun->IsNumberPlural(); + } + + bool IsDeterminer(int word_lower) const { + std::map::const_iterator it = + all_determiners_.find(word_lower); + return it != all_determiners_.end(); + } + + CoreferenceDeterminer *GetDeterminer(int word_lower) const { + std::map::const_iterator it = + all_determiners_.find(word_lower); + if (it == all_determiners_.end()) return NULL; + return it->second; + } + + bool IsMaleDeterminer(int word_lower) const { + CoreferenceDeterminer *determiner = GetDeterminer(word_lower); + if (!determiner) return false; + return determiner->IsGenderMale(); + } + + bool IsFemaleDeterminer(int word_lower) const { + CoreferenceDeterminer *determiner = GetDeterminer(word_lower); + if (!determiner) return false; + return determiner->IsGenderFemale(); + } + + bool IsNeutralDeterminer(int word_lower) const { + CoreferenceDeterminer *determiner = GetDeterminer(word_lower); + if (!determiner) return false; + return determiner->IsGenderNeutral(); + } + + bool IsSingularDeterminer(int word_lower) const { + CoreferenceDeterminer *determiner = GetDeterminer(word_lower); + if (!determiner) return false; + return determiner->IsNumberSingular(); + } + + bool IsPluralDeterminer(int word_lower) const { + CoreferenceDeterminer *determiner = GetDeterminer(word_lower); + if (!determiner) return false; + return determiner->IsNumberPlural(); + } + + // TODO(atm): this should not be here, but let us keep it for now... + void ComputeDependencyAncestryStrings( + DependencyInstance *instance, + int i, + std::string *unigram_ancestry_string, + std::string *bigram_ancestry_string) const; + +protected: + void DeleteAllPronouns() { + for (std::map::iterator it = + all_pronouns_.begin(); + it != all_pronouns_.end(); + ++it) { + delete it->second; + } + all_pronouns_.clear(); + } + + void DeleteAllDeterminers() { + for (std::map::iterator it = + all_determiners_.begin(); + it != all_determiners_.end(); + ++it) { + delete it->second; + } + all_determiners_.clear(); + } + +protected: + Pipe *pipe_; + TokenDictionary *token_dictionary_; + DependencyDictionary *dependency_dictionary_; + SemanticDictionary *semantic_dictionary_; + Alphabet entity_alphabet_; + Alphabet constituent_alphabet_; + // The two form alphabets below come in addition to the TokenDictionary's + // form alphabet. We have these additional alphabets here since we do not want + // a cutoff and we want to allow loading a lexicon (for gender/number + // computation). + Alphabet word_alphabet_; + Alphabet word_lower_alphabet_; + Alphabet unigram_ancestry_alphabet_; + Alphabet bigram_ancestry_alphabet_; + GenderNumberStatistics gender_number_statistics_; + std::map all_pronouns_; + std::map all_determiners_; + std::set named_entity_tags_; + std::set person_entity_tags_; + std::set noun_tags_; + std::set noun_phrase_tags_; + std::set proper_noun_tags_; + std::set pronominal_tags_; + //Alphabet tag_alphabet_; +}; + +#endif /* COREFERENCEDICTIONARY_H_ */ diff --git a/src/coreference_resolver/CoreferenceDocument.h b/src/coreference_resolver/CoreferenceDocument.h index 9c0b078..25339f1 100644 --- a/src/coreference_resolver/CoreferenceDocument.h +++ b/src/coreference_resolver/CoreferenceDocument.h @@ -1,63 +1,63 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEDOCUMENT_H_ -#define COREFERENCEDOCUMENT_H_ - -#include -#include -#include "CoreferenceSentence.h" - -class CoreferenceDocument : public Instance { -public: - CoreferenceDocument() { conversation_ = false; } - virtual ~CoreferenceDocument() { DeleteAllSentences(); } - - Instance* Copy() { - CoreferenceDocument* document = new CoreferenceDocument(); - document->Initialize(name_, part_number_, sentences_); - return static_cast(document); - } - - void Initialize(const std::string &name, - int part_number, - const std::vector &sentences); - - int GetNumSentences() { return sentences_.size(); } - CoreferenceSentence *GetSentence(int i) { return sentences_[i]; } - - const std::string &name() { return name_; } - int part_number() { return part_number_; } - bool is_conversation() { return conversation_; } - -protected: - void DeleteAllSentences(); - -protected: - // Document name and part number. - std::string name_; - int part_number_; - - // True if conversation. - bool conversation_; - - // List of sentences composing this document. - std::vector sentences_; -}; - -#endif /* COREFERENCEDOCUMENT_H_*/ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEDOCUMENT_H_ +#define COREFERENCEDOCUMENT_H_ + +#include +#include +#include "CoreferenceSentence.h" + +class CoreferenceDocument : public Instance { +public: + CoreferenceDocument() { conversation_ = false; } + virtual ~CoreferenceDocument() { DeleteAllSentences(); } + + Instance* Copy() { + CoreferenceDocument* document = new CoreferenceDocument(); + document->Initialize(name_, part_number_, sentences_); + return static_cast(document); + } + + void Initialize(const std::string &name, + int part_number, + const std::vector &sentences); + + int GetNumSentences() { return (int)sentences_.size(); } + CoreferenceSentence *GetSentence(int i) { return sentences_[i]; } + + const std::string &name() { return name_; } + int part_number() { return part_number_; } + bool is_conversation() { return conversation_; } + +protected: + void DeleteAllSentences(); + +protected: + // Document name and part number. + std::string name_; + int part_number_; + + // True if conversation. + bool conversation_; + + // List of sentences composing this document. + std::vector sentences_; +}; + +#endif /* COREFERENCEDOCUMENT_H_*/ diff --git a/src/coreference_resolver/CoreferenceDocumentNumeric.h b/src/coreference_resolver/CoreferenceDocumentNumeric.h index 44f10c0..f7e434c 100644 --- a/src/coreference_resolver/CoreferenceDocumentNumeric.h +++ b/src/coreference_resolver/CoreferenceDocumentNumeric.h @@ -1,128 +1,128 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEDOCUMENTNUMERIC_H_ -#define COREFERENCEDOCUMENTNUMERIC_H_ - -#include "CoreferenceSentenceNumeric.h" -#include "CoreferenceDocument.h" -#include "CoreferenceDictionary.h" - -class CoreferenceDocumentNumeric : public Instance { -public: - CoreferenceDocumentNumeric() { conversation_ = false; }; - virtual ~CoreferenceDocumentNumeric() { Clear(); }; - - Instance* Copy() { - CHECK(false) << "Not implemented."; - return NULL; - } - - void Clear() { - sentence_cumulative_lengths_.clear(); - for (int i = 0; i < coreference_spans_.size(); ++i) { - delete coreference_spans_[i]; - } - coreference_spans_.clear(); - // TODO(atm): if document owns mentions, they should be deleted here. - mentions_.clear(); - entity_clusters_.clear(); - DeleteAllSentences(); - } - - void Initialize(const CoreferenceDictionary &dictionary, - CoreferenceDocument *instance, - bool add_gold_mentions); - - // True if document is a conversation. - bool is_conversation() { return conversation_; } - - // Returns the number of sentences in the document. - int GetNumSentences() { return sentences_.size(); } - - // Returns the number of words in the document. - int GetNumWords() { return sentence_cumulative_lengths_.back(); } - - // Returns the i-th sentence. - CoreferenceSentenceNumeric *GetSentence(int i) { return sentences_[i]; } - - // Returns the mentions. - const std::vector &GetMentions() { return mentions_; } - - // Returns the mentions. - const std::vector > &GetEntityClusters() { - return entity_clusters_; - } - - bool IsMentionAnaphoric(int j) { - return mentions_[j]->id() >= 0 && - entity_clusters_[mentions_[j]->id()][0] != j; - } - - // Get the sentence to which a word belongs. - // Note: this takes linear time w.r.t. the number of sentences. - void FindSentencePosition(int word_document_index, int *sentence_index, - int *word_sentence_index) { - *sentence_index = -1; - for (int i = 0; i < sentence_cumulative_lengths_.size(); ++i) { - ++(*sentence_index); - if (word_document_index < sentence_cumulative_lengths_[i]) break; - } - if (*sentence_index > 0) { - *word_sentence_index = - word_document_index - sentence_cumulative_lengths_[*sentence_index - 1]; - } else { - *word_sentence_index = word_document_index; - } - // Increment the word index since sentences have a start symbol. - ++(*word_sentence_index); - } - - // Return the global word position at document level. - int GetDocumentPosition(int sentence_index, int word_sentence_index) { - // Subtract 1 since sentences have a start symbol. - if (sentence_index == 0) { - return word_sentence_index - 1; - } else { - return word_sentence_index - 1 + - sentence_cumulative_lengths_[sentence_index - 1]; - } - } - -protected: - void DeleteAllSentences() { - for (int i = 0; i < sentences_.size(); ++i) { - delete sentences_[i]; - } - sentences_.clear(); - } - - void ComputeEntityClusters(); - - void ComputeGlobalWordPositions(CoreferenceDocument* instance); - -private: - bool conversation_; - std::vector sentences_; - std::vector sentence_cumulative_lengths_; - std::vector coreference_spans_; - std::vector mentions_; - std::vector > entity_clusters_; -}; - -#endif /* COREFERENCEDOCUMENTNUMERIC_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEDOCUMENTNUMERIC_H_ +#define COREFERENCEDOCUMENTNUMERIC_H_ + +#include "CoreferenceSentenceNumeric.h" +#include "CoreferenceDocument.h" +#include "CoreferenceDictionary.h" + +class CoreferenceDocumentNumeric : public Instance { +public: + CoreferenceDocumentNumeric() { conversation_ = false; }; + virtual ~CoreferenceDocumentNumeric() { Clear(); }; + + Instance* Copy() { + CHECK(false) << "Not implemented."; + return NULL; + } + + void Clear() { + sentence_cumulative_lengths_.clear(); + for (int i = 0; i < coreference_spans_.size(); ++i) { + delete coreference_spans_[i]; + } + coreference_spans_.clear(); + // TODO(atm): if document owns mentions, they should be deleted here. + mentions_.clear(); + entity_clusters_.clear(); + DeleteAllSentences(); + } + + void Initialize(const CoreferenceDictionary &dictionary, + CoreferenceDocument *instance, + bool add_gold_mentions); + + // True if document is a conversation. + bool is_conversation() { return conversation_; } + + // Returns the number of sentences in the document. + int GetNumSentences() { return (int)sentences_.size(); } + + // Returns the number of words in the document. + int GetNumWords() { return sentence_cumulative_lengths_.back(); } + + // Returns the i-th sentence. + CoreferenceSentenceNumeric *GetSentence(int i) { return sentences_[i]; } + + // Returns the mentions. + const std::vector &GetMentions() { return mentions_; } + + // Returns the mentions. + const std::vector > &GetEntityClusters() { + return entity_clusters_; + } + + bool IsMentionAnaphoric(int j) { + return mentions_[j]->id() >= 0 && + entity_clusters_[mentions_[j]->id()][0] != j; + } + + // Get the sentence to which a word belongs. + // Note: this takes linear time w.r.t. the number of sentences. + void FindSentencePosition(int word_document_index, int *sentence_index, + int *word_sentence_index) { + *sentence_index = -1; + for (int i = 0; i < sentence_cumulative_lengths_.size(); ++i) { + ++(*sentence_index); + if (word_document_index < sentence_cumulative_lengths_[i]) break; + } + if (*sentence_index > 0) { + *word_sentence_index = + word_document_index - sentence_cumulative_lengths_[*sentence_index - 1]; + } else { + *word_sentence_index = word_document_index; + } + // Increment the word index since sentences have a start symbol. + ++(*word_sentence_index); + } + + // Return the global word position at document level. + int GetDocumentPosition(int sentence_index, int word_sentence_index) { + // Subtract 1 since sentences have a start symbol. + if (sentence_index == 0) { + return word_sentence_index - 1; + } else { + return word_sentence_index - 1 + + sentence_cumulative_lengths_[sentence_index - 1]; + } + } + +protected: + void DeleteAllSentences() { + for (int i = 0; i < sentences_.size(); ++i) { + delete sentences_[i]; + } + sentences_.clear(); + } + + void ComputeEntityClusters(); + + void ComputeGlobalWordPositions(CoreferenceDocument* instance); + +private: + bool conversation_; + std::vector sentences_; + std::vector sentence_cumulative_lengths_; + std::vector coreference_spans_; + std::vector mentions_; + std::vector > entity_clusters_; +}; + +#endif /* COREFERENCEDOCUMENTNUMERIC_H_ */ diff --git a/src/coreference_resolver/CoreferenceFeatures.h b/src/coreference_resolver/CoreferenceFeatures.h index 4a2d53c..d9f5944 100644 --- a/src/coreference_resolver/CoreferenceFeatures.h +++ b/src/coreference_resolver/CoreferenceFeatures.h @@ -1,81 +1,81 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEFEATURES_H_ -#define COREFERENCEFEATURES_H_ - -#include "Features.h" -#include "CoreferenceDocumentNumeric.h" -#include "FeatureEncoder.h" - -class CoreferenceOptions; - -class CoreferenceFeatures : public Features { -public: - CoreferenceFeatures() {}; - CoreferenceFeatures(Pipe* pipe) { pipe_ = pipe; } - virtual ~CoreferenceFeatures() { Clear(); } - -public: - void Clear() { - for (int r = 0; r < input_features_.size(); ++r) { - if (!input_features_[r]) continue; - input_features_[r]->clear(); - delete input_features_[r]; - input_features_[r] = NULL; - } - input_features_.clear(); - } - - void Initialize(Instance *instance, Parts *parts) { - Clear(); - input_features_.resize(parts->size(), static_cast(NULL)); - } - - int GetNumPartFeatures(int r) const { - return (NULL == input_features_[r]) ? 0 : input_features_[r]->size(); - }; - - int GetPartFeature(int r, int j) const { - return (*input_features_[r])[j]; - } - - const BinaryFeatures &GetPartFeatures(int r) const { - return *(input_features_[r]); - }; - - BinaryFeatures *GetMutablePartFeatures(int r) const { - return input_features_[r]; - }; - -public: - void AddArcFeatures(CoreferenceDocumentNumeric *document, - int r, - int parent_mention, - int child_mention); - - void AddFeature(uint64_t fkey, BinaryFeatures* features) { - features->push_back(fkey); - } - -protected: - vector input_features_; // Vector of input features. - FeatureEncoder encoder_; // Encoder that converts features into a codeword. -}; - -#endif /* COREFERENCEFEATURES_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEFEATURES_H_ +#define COREFERENCEFEATURES_H_ + +#include "Features.h" +#include "CoreferenceDocumentNumeric.h" +#include "FeatureEncoder.h" + +class CoreferenceOptions; + +class CoreferenceFeatures : public Features { +public: + CoreferenceFeatures() {}; + CoreferenceFeatures(Pipe* pipe) { pipe_ = pipe; } + virtual ~CoreferenceFeatures() { Clear(); } + +public: + void Clear() { + for (int r = 0; r < input_features_.size(); ++r) { + if (!input_features_[r]) continue; + input_features_[r]->clear(); + delete input_features_[r]; + input_features_[r] = NULL; + } + input_features_.clear(); + } + + void Initialize(Instance *instance, Parts *parts) { + Clear(); + input_features_.resize(parts->size(), static_cast(NULL)); + } + + int GetNumPartFeatures(int r) const { + return (NULL == input_features_[r]) ? 0 : (int)(input_features_[r]->size()); + }; + + int GetPartFeature(int r, int j) const { + return (*input_features_[r])[j]; + } + + const BinaryFeatures &GetPartFeatures(int r) const { + return *(input_features_[r]); + }; + + BinaryFeatures *GetMutablePartFeatures(int r) const { + return input_features_[r]; + }; + +public: + void AddArcFeatures(CoreferenceDocumentNumeric *document, + int r, + int parent_mention, + int child_mention); + + void AddFeature(uint64_t fkey, BinaryFeatures* features) { + features->push_back(fkey); + } + +protected: + vector input_features_; // Vector of input features. + FeatureEncoder encoder_; // Encoder that converts features into a codeword. +}; + +#endif /* COREFERENCEFEATURES_H_ */ diff --git a/src/coreference_resolver/CoreferencePart.cpp b/src/coreference_resolver/CoreferencePart.cpp index 3cc388b..4f461ea 100644 --- a/src/coreference_resolver/CoreferencePart.cpp +++ b/src/coreference_resolver/CoreferencePart.cpp @@ -1,55 +1,55 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "CoreferencePart.h" - -void CoreferenceParts::DeleteAll() { - DeleteIndices(); - - for (iterator iter = begin(); iter != end(); iter++) { - if ((*iter) != NULL) { - delete (*iter); - *iter = NULL; - } - } - - clear(); -} - -void CoreferenceParts::DeleteIndices() { - for (int i = 0; i < index_.size(); ++i) { - index_[i].clear(); - } - index_.clear(); -} - -void CoreferenceParts::BuildIndices(int num_mentions) { - DeleteIndices(); - index_.resize(num_mentions); - - int num_arcs = size(); - int offset = 0; - for (int r = 0; r < num_arcs; ++r) { - Part *part = (*this)[offset + r]; - CHECK(part->type() == COREFERENCEPART_ARC); - int i = static_cast(part)->child_mention(); - CHECK_GE(i, 0); - CHECK_LT(i, num_mentions); - index_[i].push_back(offset + r); - } -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "CoreferencePart.h" + +void CoreferenceParts::DeleteAll() { + DeleteIndices(); + + for (iterator iter = begin(); iter != end(); iter++) { + if ((*iter) != NULL) { + delete (*iter); + *iter = NULL; + } + } + + clear(); +} + +void CoreferenceParts::DeleteIndices() { + for (int i = 0; i < index_.size(); ++i) { + index_[i].clear(); + } + index_.clear(); +} + +void CoreferenceParts::BuildIndices(int num_mentions) { + DeleteIndices(); + index_.resize(num_mentions); + + int num_arcs = (int)size(); + int offset = 0; + for (int r = 0; r < num_arcs; ++r) { + Part *part = (*this)[offset + r]; + CHECK(part->type() == COREFERENCEPART_ARC); + int i = static_cast(part)->child_mention(); + CHECK_GE(i, 0); + CHECK_LT(i, num_mentions); + index_[i].push_back(offset + r); + } +} diff --git a/src/coreference_resolver/CoreferencePipe.cpp b/src/coreference_resolver/CoreferencePipe.cpp index cbec9c2..b5e995f 100644 --- a/src/coreference_resolver/CoreferencePipe.cpp +++ b/src/coreference_resolver/CoreferencePipe.cpp @@ -221,7 +221,7 @@ void CoreferencePipe::MakeParts(Instance *instance, } } - coreference_parts->BuildIndices(mentions.size()); + coreference_parts->BuildIndices((int)mentions.size()); // Necessary to store this information here for LabelInstance at test time. coreference_parts->SetMentions(mentions); } @@ -268,7 +268,7 @@ void CoreferencePipe::LabelInstance(Parts *parts, CHECK_EQ(mention_clusters[arc->child_mention()], -1); if (arc->parent_mention() < 0) { // Non-anaphoric mention; create its own cluster. - mention_clusters[arc->child_mention()] = entities.size(); + mention_clusters[arc->child_mention()] = (int)entities.size(); entities.push_back(std::vector(1, arc->child_mention())); } else { int k = mention_clusters[arc->parent_mention()]; diff --git a/src/coreference_resolver/CoreferencePronoun.h b/src/coreference_resolver/CoreferencePronoun.h index 14c7084..76768e0 100644 --- a/src/coreference_resolver/CoreferencePronoun.h +++ b/src/coreference_resolver/CoreferencePronoun.h @@ -1,204 +1,204 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef COREFERENCEPRONOUN_H_ -#define COREFERENCEPRONOUN_H_ - -struct CoreferencePronounPerson { - enum types { - FIRST = 0, - SECOND, - THIRD, - UNDEFINED, - COUNT - }; -}; - -struct CoreferencePronounNumber { - enum types { - SINGULAR = 0, - PLURAL, - UNDEFINED, - COUNT - }; -}; - -struct CoreferencePronounGender { - enum types { - MALE = 0, - FEMALE, - NEUTRAL, - UNDEFINED, - COUNT - }; -}; - -class CoreferencePronoun { -public: - CoreferencePronoun() { ClearFlags(); } - CoreferencePronoun(const std::string &code_flags) { SetFlags(code_flags); } - virtual ~CoreferencePronoun() {} - - void Save(FILE *fs) { - bool success; - success = WriteUINT8(fs, person_flag_); - CHECK(success); - success = WriteUINT8(fs, number_flag_); - CHECK(success); - success = WriteUINT8(fs, gender_flag_); - CHECK(success); - } - - void Load(FILE *fs) { - bool success; - success = ReadUINT8(fs, &person_flag_); - CHECK(success); - success = ReadUINT8(fs, &number_flag_); - CHECK(success); - success = ReadUINT8(fs, &gender_flag_); - CHECK(success); - } - - uint8_t person_flag() { return person_flag_; } - uint8_t number_flag() { return number_flag_; } - uint8_t gender_flag() { return gender_flag_; } - - void ClearFlags() { - person_flag_ = 0x0; - number_flag_ = 0x0; - gender_flag_ = 0x0; - } - - void SetFlags(const std::string &code_flags) { - CHECK_EQ(code_flags.length(), 3); - - ClearFlags(); - char ch = code_flags[0]; // Person flag. - if (ch == '1') { - SetPersonFirst(); - } else if (ch == '2') { - SetPersonSecond(); - } else if (ch == '3') { - SetPersonThird(); - } else if (ch == 'x') { - SetPersonUndefined(); - } else { - CHECK(false) << "Invalid person flag: " << ch; - } - - ch = code_flags[1]; // Number flag. - if (ch == 's') { - SetNumberSingular(); - } else if (ch == 'p') { - SetNumberPlural(); - } else if (ch == 'x') { - SetNumberUndefined(); - } else { - CHECK(false) << "Invalid number flag: " << ch; - } - - ch = code_flags[2]; // Gender flag. - if (ch == 'm') { - SetGenderMale(); - } else if (ch == 'f') { - SetGenderFemale(); - } else if (ch == 'n') { - SetGenderNeutral(); - } else if (ch == 'x') { - SetGenderUndefined(); - } else { - CHECK(false) << "Invalid gender flag: " << ch; - } - } - -public: - bool IsPersonFirst() { - return person_flag_ & (0x1 << CoreferencePronounPerson::FIRST); - } - bool IsPersonSecond() { - return person_flag_ & (0x1 << CoreferencePronounPerson::SECOND); - } - bool IsPersonThird() { - return person_flag_ & (0x1 << CoreferencePronounPerson::THIRD); - } - bool IsPersonUndefined() { - return person_flag_ & (0x1 << CoreferencePronounPerson::UNDEFINED); - } - bool IsNumberSingular() { - return number_flag_ & (0x1 << CoreferencePronounNumber::SINGULAR); - } - bool IsNumberPlural() { - return number_flag_ & (0x1 << CoreferencePronounNumber::PLURAL); - } - bool IsNumberUndefined() { - return number_flag_ & (0x1 << CoreferencePronounNumber::UNDEFINED); - } - bool IsGenderMale() { - return gender_flag_ & (0x1 << CoreferencePronounGender::MALE); - } - bool IsGenderFemale() { - return gender_flag_ & (0x1 << CoreferencePronounGender::FEMALE); - } - bool IsGenderNeutral() { - return gender_flag_ & (0x1 << CoreferencePronounGender::NEUTRAL); - } - bool IsGenderUndefined() { - return gender_flag_ & (0x1 << CoreferencePronounGender::UNDEFINED); - } - - void SetPersonFirst() { - person_flag_ |= (0x1 << CoreferencePronounPerson::FIRST); - } - void SetPersonSecond() { - person_flag_ |= (0x1 << CoreferencePronounPerson::SECOND); - } - void SetPersonThird() { - person_flag_ |= (0x1 << CoreferencePronounPerson::THIRD); - } - void SetPersonUndefined() { - person_flag_ |= (0x1 << CoreferencePronounPerson::UNDEFINED); - } - void SetNumberSingular() { - number_flag_ |= (0x1 << CoreferencePronounNumber::SINGULAR); - } - void SetNumberPlural() { - number_flag_ |= (0x1 << CoreferencePronounNumber::PLURAL); - } - void SetNumberUndefined() { - number_flag_ |= (0x1 << CoreferencePronounNumber::UNDEFINED); - } - void SetGenderMale() { - gender_flag_ |= (0x1 << CoreferencePronounGender::MALE); - } - void SetGenderFemale() { - gender_flag_ |= (0x1 << CoreferencePronounGender::FEMALE); - } - void SetGenderNeutral() { - gender_flag_ |= (0x1 << CoreferencePronounGender::NEUTRAL); - } - void SetGenderUndefined() { - gender_flag_ |= (0x1 << CoreferencePronounGender::UNDEFINED); - } - -protected: - uint8_t person_flag_; - uint8_t number_flag_; - uint8_t gender_flag_; -}; - -#endif /* COREFERENCEPRONOUN_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef COREFERENCEPRONOUN_H_ +#define COREFERENCEPRONOUN_H_ + +struct CoreferencePronounPerson { + enum types { + FIRST = 0, + SECOND, + THIRD, + UNDEFINED, + COUNT + }; +}; + +struct CoreferencePronounNumber { + enum types { + SINGULAR = 0, + PLURAL, + UNDEFINED, + COUNT + }; +}; + +struct CoreferencePronounGender { + enum types { + MALE = 0, + FEMALE, + NEUTRAL, + UNDEFINED, + COUNT + }; +}; + +class CoreferencePronoun { +public: + CoreferencePronoun() { ClearFlags(); } + CoreferencePronoun(const std::string &code_flags) { SetFlags(code_flags); } + virtual ~CoreferencePronoun() {} + + void Save(FILE *fs) { + bool success; + success = WriteUINT8(fs, person_flag_); + CHECK(success); + success = WriteUINT8(fs, number_flag_); + CHECK(success); + success = WriteUINT8(fs, gender_flag_); + CHECK(success); + } + + void Load(FILE *fs) { + bool success; + success = ReadUINT8(fs, &person_flag_); + CHECK(success); + success = ReadUINT8(fs, &number_flag_); + CHECK(success); + success = ReadUINT8(fs, &gender_flag_); + CHECK(success); + } + + uint8_t person_flag() { return person_flag_; } + uint8_t number_flag() { return number_flag_; } + uint8_t gender_flag() { return gender_flag_; } + + void ClearFlags() { + person_flag_ = 0x0; + number_flag_ = 0x0; + gender_flag_ = 0x0; + } + + void SetFlags(const std::string &code_flags) { + CHECK_EQ(code_flags.length(), 3); + + ClearFlags(); + char ch = code_flags[0]; // Person flag. + if (ch == '1') { + SetPersonFirst(); + } else if (ch == '2') { + SetPersonSecond(); + } else if (ch == '3') { + SetPersonThird(); + } else if (ch == 'x') { + SetPersonUndefined(); + } else { + CHECK(false) << "Invalid person flag: " << ch; + } + + ch = code_flags[1]; // Number flag. + if (ch == 's') { + SetNumberSingular(); + } else if (ch == 'p') { + SetNumberPlural(); + } else if (ch == 'x') { + SetNumberUndefined(); + } else { + CHECK(false) << "Invalid number flag: " << ch; + } + + ch = code_flags[2]; // Gender flag. + if (ch == 'm') { + SetGenderMale(); + } else if (ch == 'f') { + SetGenderFemale(); + } else if (ch == 'n') { + SetGenderNeutral(); + } else if (ch == 'x') { + SetGenderUndefined(); + } else { + CHECK(false) << "Invalid gender flag: " << ch; + } + } + +public: + bool IsPersonFirst() { + return ( person_flag_ & (0x1 << CoreferencePronounPerson::FIRST) ) != 0; + } + bool IsPersonSecond() { + return (person_flag_ & (0x1 << CoreferencePronounPerson::SECOND) ) != 0; + } + bool IsPersonThird() { + return (person_flag_ & (0x1 << CoreferencePronounPerson::THIRD) ) != 0; + } + bool IsPersonUndefined() { + return (person_flag_ & (0x1 << CoreferencePronounPerson::UNDEFINED) ) != 0; + } + bool IsNumberSingular() { + return (number_flag_ & (0x1 << CoreferencePronounNumber::SINGULAR) ) != 0; + } + bool IsNumberPlural() { + return (number_flag_ & (0x1 << CoreferencePronounNumber::PLURAL) ) != 0; + } + bool IsNumberUndefined() { + return (number_flag_ & (0x1 << CoreferencePronounNumber::UNDEFINED) ) != 0; + } + bool IsGenderMale() { + return (gender_flag_ & (0x1 << CoreferencePronounGender::MALE) ) != 0; + } + bool IsGenderFemale() { + return (gender_flag_ & (0x1 << CoreferencePronounGender::FEMALE) ) != 0; + } + bool IsGenderNeutral() { + return (gender_flag_ & (0x1 << CoreferencePronounGender::NEUTRAL) ) != 0; + } + bool IsGenderUndefined() { + return (gender_flag_ & (0x1 << CoreferencePronounGender::UNDEFINED) ) != 0; + } + + void SetPersonFirst() { + person_flag_ |= (0x1 << CoreferencePronounPerson::FIRST); + } + void SetPersonSecond() { + person_flag_ |= (0x1 << CoreferencePronounPerson::SECOND); + } + void SetPersonThird() { + person_flag_ |= (0x1 << CoreferencePronounPerson::THIRD); + } + void SetPersonUndefined() { + person_flag_ |= (0x1 << CoreferencePronounPerson::UNDEFINED); + } + void SetNumberSingular() { + number_flag_ |= (0x1 << CoreferencePronounNumber::SINGULAR); + } + void SetNumberPlural() { + number_flag_ |= (0x1 << CoreferencePronounNumber::PLURAL); + } + void SetNumberUndefined() { + number_flag_ |= (0x1 << CoreferencePronounNumber::UNDEFINED); + } + void SetGenderMale() { + gender_flag_ |= (0x1 << CoreferencePronounGender::MALE); + } + void SetGenderFemale() { + gender_flag_ |= (0x1 << CoreferencePronounGender::FEMALE); + } + void SetGenderNeutral() { + gender_flag_ |= (0x1 << CoreferencePronounGender::NEUTRAL); + } + void SetGenderUndefined() { + gender_flag_ |= (0x1 << CoreferencePronounGender::UNDEFINED); + } + +protected: + uint8_t person_flag_; + uint8_t number_flag_; + uint8_t gender_flag_; +}; + +#endif /* COREFERENCEPRONOUN_H_ */ diff --git a/src/coreference_resolver/CoreferenceReader.cpp b/src/coreference_resolver/CoreferenceReader.cpp index ed44d8c..8fd7855 100644 --- a/src/coreference_resolver/CoreferenceReader.cpp +++ b/src/coreference_resolver/CoreferenceReader.cpp @@ -1,408 +1,408 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#include "CoreferenceReader.h" -#include "CoreferenceOptions.h" -#include "Utils.h" -#include -#include -#include - -Instance *CoreferenceReader::GetNext() { - int num_sentences = 0; - std::string line; - std::string name = ""; - int part_number = 0; - bool found_begin = false; - bool found_end = false; - if (is_.is_open()) { - while (!is_.eof()) { - getline(is_, line); - // E.g. "#begin document (nw/wsj/02/wsj_0242); part 000" - if (0 == line.substr(0, 6).compare("#begin")) { - name = line; - part_number = 0; - // Extract name. - size_t start = line.find("("); - size_t end = line.find(")"); - CHECK_NE(start, std::string::npos); - CHECK_NE(end, std::string::npos); - CHECK_LT(start, end); - CHECK_LT(end + 1, line.size()); - CHECK_EQ(line[end + 1], ';'); - name = line.substr(start + 1, end - start - 1); // Document id. - // Extract part number. - start = line.find("part "); - CHECK_NE(start, std::string::npos); - start += 5; - end = line.find_first_not_of("0123456789", start); - if (end == std::string::npos) end = line.length(); - CHECK_LT(start, end); - std::string part_name = line.substr(start, end - start); - std::stringstream ss(part_name); - ss >> part_number; // Document part number. - - //LOG(INFO) << "Document: " << name << " Part: " << part_number; - CHECK(!found_begin); - CHECK(!found_end); - found_begin = true; - } else if (0 == line.substr(0, 4).compare("#end")) { - // End of document. - CHECK(found_begin); - CHECK(!found_end); - found_end = true; - break; - } else if (line.length() == 0) { - // End of sentence; update counter. - if (found_begin) ++num_sentences; - } - } - } - - // Now read all the sentences in this document. - std::vector sentences; - for (int i = 0; i < num_sentences; ++i) { - // Start reading sentences. - //LOG(INFO) << "Reading sentence #" << i << "..."; - CoreferenceSentence *sentence = - static_cast(sentence_reader_.GetNext()); - CHECK(sentence); - sentences.push_back(sentence); - } - - // Create document instance. - if (num_sentences == 0 && is_.is_open() && is_.eof()) return NULL; - - //LOG(INFO) << "Found " << num_sentences << " sentences in document " << name << "."; - - CoreferenceDocument *instance = new CoreferenceDocument; - instance->Initialize(name, part_number, sentences); - - return static_cast(instance); -} - -Instance *CoreferenceSentenceReader::GetNext() { - // Fill all fields for the entire sentence. - std::string name = ""; - //int part_number = 0; - std::vector > sentence_fields; - std::string line; - - if (is_.is_open()) { - while (!is_.eof()) { - getline(is_, line); - if (line.length() <= 0) break; - if (0 == line.substr(0, 1).compare("#")) { - continue; - } - //LOG(INFO) << line; - std::vector fields; - StringSplit(line, "\t ", &fields, true); - sentence_fields.push_back(fields); - } - } - - bool read_next_sentence = false; - if (!is_.eof()) read_next_sentence = true; - - // Sentence length. - int length = sentence_fields.size(); - - //LOG(INFO) << "Sentence has length " << length; - - // Convert to array of forms, lemmas, etc. - // Note: the first token is the root symbol. - std::vector forms(length + 1); - std::vector lemmas(length + 1); - std::vector cpos(length + 1); - std::vector pos(length + 1); - std::vector > feats(length + 1); - std::vector deprels(length + 1); - std::vector heads(length + 1); - std::vector predicate_names; // Names of predicates (e.g. "take.01"). - std::vector predicate_indices; // Positions of each predicate in the sentence. - std::vector > argument_roles; // Semantic roles. - std::vector > argument_indices; // Positions of each argument. - std::vector parse_info(length + 1); - std::vector author_info(length + 1); - std::vector entity_info(length + 1); - std::vector coreference_info(length + 1); - - forms[0] = "_root_"; - lemmas[0] = "_root_"; - cpos[0] = "_root_"; - pos[0] = "_root_"; - deprels[0] = "_root_"; - heads[0] = -1; - feats[0] = std::vector(1, "_root_"); - parse_info[0] = "*"; - author_info[0] = "__"; - entity_info[0] = "*"; - coreference_info[0] = "-"; - - int num_predicates = 0; - for (int i = 0; i < length; i++) { - const vector &info = sentence_fields[i]; - - int offset = 0; - if (i == 0) { - name = info[offset] + "\t" + info[offset + 1]; // Document name and part. - } - offset += 3; - - // Use splitted forms. - forms[i + 1] = info[offset]; - lemmas[i + 1] = "_"; - ++offset; - cpos[i + 1] = info[offset]; - pos[i + 1] = info[offset]; // No distiction between pos and cpos. - ++offset; - parse_info[i + 1] = info[offset]; // Parse span (e.g. "(NP (NN *") - ++offset; - - // No morpho-syntactic information. - feats[i + 1].clear(); - - // Dependency syntactic information. - if (false) { //!semantic_options->use_dependency_syntactic_features()) { - heads[i + 1] = 0; - deprels[i + 1] = "NULL"; - } else { - std::stringstream ss(info[offset]); - ++offset; - ss >> heads[i + 1]; - //++heads[i+1]; // Note: heads start at -1 here! - deprels[i + 1] = info[offset]; - ++offset; - - if (heads[i + 1] < 0 || heads[i + 1] > length) { - LOG(INFO) << "Invalid value of head (" << heads[i + 1] - << ") not in range [0.." << length - << "] - attaching to the root."; - heads[i + 1] = 0; - } - } - - // Semantic role labeling information. - bool is_predicate = false; - std::string predicate_name = info[offset]; - ++offset; - std::string predicate_sense = info[offset]; - ++offset; - // Added the comparison below due to the CONLL 2012 data. - if (0 != predicate_sense.compare("_") && - 0 != predicate_sense.compare("-")) { - predicate_name += "." + predicate_sense; // Predicate lemma+sense in PropBank. - is_predicate = true; - } - // if (0 != predicate_name.compare("_") && - // 0 != predicate_name.compare("-")) { - //} - - std::string word_sense = info[offset]; - ++offset; - author_info[i + 1] = info[offset]; - ++offset; - entity_info[i + 1] = info[offset]; - ++offset; - - if (i == 0) { - // Allocate space for predicates. - num_predicates = info.size() - 1 - offset; - //LOG(INFO) << num_predicates; - // Top nodes will be considered arguments of a special root node. - if (use_top_nodes_) ++num_predicates; - //LOG(INFO) << num_predicates; - predicate_names.resize(num_predicates); - predicate_indices.resize(num_predicates); - argument_roles.resize(num_predicates); - argument_indices.resize(num_predicates); - num_predicates = 0; - if (use_top_nodes_) { - predicate_names[num_predicates] = "__ROOT__"; - predicate_indices[num_predicates] = 0; - ++num_predicates; - } - } - - if (is_predicate) { - //LOG(INFO) << predicate_name; - CHECK_LT(num_predicates, predicate_names.size()); - predicate_names[num_predicates] = predicate_name; - predicate_indices[num_predicates] = i + 1; - ++num_predicates; - } - - // Note: this is assuming arguments are encoded as dependents. - // However, in some datasets (e.g. Ontonotes) arguments are encoded as - // spans. - for (int j = offset; j < info.size() - 1; ++j) { - string argument_role = info[j]; - bool is_argument = false; - if (0 != argument_role.compare("_")) is_argument = true; - if (is_argument) { - int k = j - offset; - if (use_top_nodes_) ++k; - argument_roles[k].push_back(argument_role); - argument_indices[k].push_back(i + 1); - } - } - offset = info.size() - 1; - - // Add coreference information. - coreference_info[i + 1] = info[offset]; - ++offset; - } - - CHECK_EQ(num_predicates, predicate_names.size()); - - // TODO: Create spans... - std::vector entity_spans; - std::vector constituent_spans; - std::vector coreference_spans; - - ConstructSpansFromText(entity_info, &entity_spans); - ConstructSpansFromText(parse_info, &constituent_spans); - ConstructCoreferenceSpansFromText(coreference_info, &coreference_spans); - -#if 0 - for (int k = 0; k < entity_spans.size(); ++k) { - LOG(INFO) << "Entity " << entity_spans[k]->name() - << "(" << entity_spans[k]->start() - << "," << entity_spans[k]->end() - << ")"; - } - for (int k = 0; k < constituent_spans.size(); ++k) { - LOG(INFO) << "Constituent " << constituent_spans[k]->name() - << "(" << constituent_spans[k]->start() - << "," << constituent_spans[k]->end() - << ")"; - } - for (int k = 0; k < coreference_spans.size(); ++k) { - LOG(INFO) << "Mention " << coreference_spans[k]->name() - << " (" << coreference_spans[k]->start() - << "," << coreference_spans[k]->end() - << ")"; - } -#endif - - CoreferenceSentence *instance = NULL; - if (read_next_sentence && length >= 0) { - instance = new CoreferenceSentence; - instance->Initialize(name, forms, lemmas, cpos, pos, feats, deprels, heads, - predicate_names, predicate_indices, argument_roles, - argument_indices, author_info, entity_spans, - constituent_spans, coreference_spans); - } - - return static_cast(instance); -} - -void CoreferenceSentenceReader::ConstructSpansFromText( - const std::vector &span_lines, - std::vector *spans) { - char left_bracket = '('; - char right_bracket = ')'; - std::string characters_to_ignore = "*-"; - std::string name = ""; - std::stack span_names_stack; - std::stack span_start_stack; - - for (int i = 0; i < span_lines.size(); ++i) { - std::string line = span_lines[i]; - //LOG(INFO) << line; - for (int j = 0; j < line.length(); ++j) { - char ch = line[j]; - if (ch == left_bracket) { - name = ""; - span_start_stack.push(i); - } else if (ch == right_bracket) { - name = span_names_stack.top(); - int start_position = span_start_stack.top(); - int end_position = i; - span_names_stack.pop(); - span_start_stack.pop(); - NamedSpan *span = new NamedSpan(start_position, end_position, name); - spans->push_back(span); - } else if (characters_to_ignore.find(ch) != std::string::npos) { - continue; - } else { - name += ch; - if (j + 1 >= line.length() || - line[j + 1] == left_bracket || line[j + 1] == right_bracket || - characters_to_ignore.find(line[j + 1]) != std::string::npos) { - span_names_stack.push(name); - } - } - } - } - - CHECK_EQ(span_names_stack.size(), 0); - CHECK_EQ(span_start_stack.size(), 0); -} - -void CoreferenceSentenceReader::ConstructCoreferenceSpansFromText( - const std::vector &span_lines, - std::vector *spans) { - char left_bracket = '('; - char right_bracket = ')'; - std::string characters_to_ignore = "*-"; - std::string name = ""; - - for (int i = 0; i < span_lines.size(); ++i) { - std::string line = span_lines[i]; - std::vector fields; - StringSplit(line, "|", &fields, true); - //LOG(INFO) << "Span " << i << ": " << line; - for (int j = 0; j < fields.size(); ++j) { - std::string field = fields[j]; - CHECK_GE(field.length(), 1); - char first_ch = field[0]; - char last_ch = field[field.length() - 1]; - if (first_ch == left_bracket && last_ch == right_bracket) { - int start_position = i; - int end_position = i; - name = field.substr(1, field.length() - 2); - NamedSpan *span = new NamedSpan(start_position, end_position, name); - spans->push_back(span); - } else if (first_ch == left_bracket) { - int start_position = i; - int end_position = -1; - name = field.substr(1, field.length() - 1); - NamedSpan *span = new NamedSpan(start_position, end_position, name); - spans->push_back(span); - } else if (last_ch == right_bracket) { - name = field.substr(0, field.length() - 1); - NamedSpan *selected_span = NULL; - for (int k = spans->size() - 1; k >= 0; --k) { - if ((*spans)[k]->name() == name && (*spans)[k]->end() < 0) { - CHECK(!selected_span); - selected_span = (*spans)[k]; - break; - } - } - CHECK(selected_span); - selected_span->set_end(i); - } - } - } - - for (int k = 0; k < spans->size(); ++k) { - CHECK_GE((*spans)[k]->end(), 0); - } -} +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "CoreferenceReader.h" +#include "CoreferenceOptions.h" +#include "Utils.h" +#include +#include +#include + +Instance *CoreferenceReader::GetNext() { + int num_sentences = 0; + std::string line; + std::string name = ""; + int part_number = 0; + bool found_begin = false; + bool found_end = false; + if (is_.is_open()) { + while (!is_.eof()) { + getline(is_, line); + // E.g. "#begin document (nw/wsj/02/wsj_0242); part 000" + if (0 == line.substr(0, 6).compare("#begin")) { + name = line; + part_number = 0; + // Extract name. + size_t start = line.find("("); + size_t end = line.find(")"); + CHECK_NE(start, std::string::npos); + CHECK_NE(end, std::string::npos); + CHECK_LT(start, end); + CHECK_LT(end + 1, line.size()); + CHECK_EQ(line[end + 1], ';'); + name = line.substr(start + 1, end - start - 1); // Document id. + // Extract part number. + start = line.find("part "); + CHECK_NE(start, std::string::npos); + start += 5; + end = line.find_first_not_of("0123456789", start); + if (end == std::string::npos) end = line.length(); + CHECK_LT(start, end); + std::string part_name = line.substr(start, end - start); + std::stringstream ss(part_name); + ss >> part_number; // Document part number. + + //LOG(INFO) << "Document: " << name << " Part: " << part_number; + CHECK(!found_begin); + CHECK(!found_end); + found_begin = true; + } else if (0 == line.substr(0, 4).compare("#end")) { + // End of document. + CHECK(found_begin); + CHECK(!found_end); + found_end = true; + break; + } else if (line.length() == 0) { + // End of sentence; update counter. + if (found_begin) ++num_sentences; + } + } + } + + // Now read all the sentences in this document. + std::vector sentences; + for (int i = 0; i < num_sentences; ++i) { + // Start reading sentences. + //LOG(INFO) << "Reading sentence #" << i << "..."; + CoreferenceSentence *sentence = + static_cast(sentence_reader_.GetNext()); + CHECK(sentence); + sentences.push_back(sentence); + } + + // Create document instance. + if (num_sentences == 0 && is_.is_open() && is_.eof()) return NULL; + + //LOG(INFO) << "Found " << num_sentences << " sentences in document " << name << "."; + + CoreferenceDocument *instance = new CoreferenceDocument; + instance->Initialize(name, part_number, sentences); + + return static_cast(instance); +} + +Instance *CoreferenceSentenceReader::GetNext() { + // Fill all fields for the entire sentence. + std::string name = ""; + //int part_number = 0; + std::vector > sentence_fields; + std::string line; + + if (is_.is_open()) { + while (!is_.eof()) { + getline(is_, line); + if (line.length() <= 0) break; + if (0 == line.substr(0, 1).compare("#")) { + continue; + } + //LOG(INFO) << line; + std::vector fields; + StringSplit(line, "\t ", &fields, true); + sentence_fields.push_back(fields); + } + } + + bool read_next_sentence = false; + if (!is_.eof()) read_next_sentence = true; + + // Sentence length. + int length = (int)sentence_fields.size(); + + //LOG(INFO) << "Sentence has length " << length; + + // Convert to array of forms, lemmas, etc. + // Note: the first token is the root symbol. + std::vector forms(length + 1); + std::vector lemmas(length + 1); + std::vector cpos(length + 1); + std::vector pos(length + 1); + std::vector > feats(length + 1); + std::vector deprels(length + 1); + std::vector heads(length + 1); + std::vector predicate_names; // Names of predicates (e.g. "take.01"). + std::vector predicate_indices; // Positions of each predicate in the sentence. + std::vector > argument_roles; // Semantic roles. + std::vector > argument_indices; // Positions of each argument. + std::vector parse_info(length + 1); + std::vector author_info(length + 1); + std::vector entity_info(length + 1); + std::vector coreference_info(length + 1); + + forms[0] = "_root_"; + lemmas[0] = "_root_"; + cpos[0] = "_root_"; + pos[0] = "_root_"; + deprels[0] = "_root_"; + heads[0] = -1; + feats[0] = std::vector(1, "_root_"); + parse_info[0] = "*"; + author_info[0] = "__"; + entity_info[0] = "*"; + coreference_info[0] = "-"; + + int num_predicates = 0; + for (int i = 0; i < length; i++) { + const vector &info = sentence_fields[i]; + + int offset = 0; + if (i == 0) { + name = info[offset] + "\t" + info[offset + 1]; // Document name and part. + } + offset += 3; + + // Use splitted forms. + forms[i + 1] = info[offset]; + lemmas[i + 1] = "_"; + ++offset; + cpos[i + 1] = info[offset]; + pos[i + 1] = info[offset]; // No distiction between pos and cpos. + ++offset; + parse_info[i + 1] = info[offset]; // Parse span (e.g. "(NP (NN *") + ++offset; + + // No morpho-syntactic information. + feats[i + 1].clear(); + + // Dependency syntactic information. + if (false) { //!semantic_options->use_dependency_syntactic_features()) { + heads[i + 1] = 0; + deprels[i + 1] = "NULL"; + } else { + std::stringstream ss(info[offset]); + ++offset; + ss >> heads[i + 1]; + //++heads[i+1]; // Note: heads start at -1 here! + deprels[i + 1] = info[offset]; + ++offset; + + if (heads[i + 1] < 0 || heads[i + 1] > length) { + LOG(INFO) << "Invalid value of head (" << heads[i + 1] + << ") not in range [0.." << length + << "] - attaching to the root."; + heads[i + 1] = 0; + } + } + + // Semantic role labeling information. + bool is_predicate = false; + std::string predicate_name = info[offset]; + ++offset; + std::string predicate_sense = info[offset]; + ++offset; + // Added the comparison below due to the CONLL 2012 data. + if (0 != predicate_sense.compare("_") && + 0 != predicate_sense.compare("-")) { + predicate_name += "." + predicate_sense; // Predicate lemma+sense in PropBank. + is_predicate = true; + } + // if (0 != predicate_name.compare("_") && + // 0 != predicate_name.compare("-")) { + //} + + std::string word_sense = info[offset]; + ++offset; + author_info[i + 1] = info[offset]; + ++offset; + entity_info[i + 1] = info[offset]; + ++offset; + + if (i == 0) { + // Allocate space for predicates. + num_predicates = (int)info.size() - 1 - offset; + //LOG(INFO) << num_predicates; + // Top nodes will be considered arguments of a special root node. + if (use_top_nodes_) ++num_predicates; + //LOG(INFO) << num_predicates; + predicate_names.resize(num_predicates); + predicate_indices.resize(num_predicates); + argument_roles.resize(num_predicates); + argument_indices.resize(num_predicates); + num_predicates = 0; + if (use_top_nodes_) { + predicate_names[num_predicates] = "__ROOT__"; + predicate_indices[num_predicates] = 0; + ++num_predicates; + } + } + + if (is_predicate) { + //LOG(INFO) << predicate_name; + CHECK_LT(num_predicates, predicate_names.size()); + predicate_names[num_predicates] = predicate_name; + predicate_indices[num_predicates] = i + 1; + ++num_predicates; + } + + // Note: this is assuming arguments are encoded as dependents. + // However, in some datasets (e.g. Ontonotes) arguments are encoded as + // spans. + for (int j = offset; j < info.size() - 1; ++j) { + string argument_role = info[j]; + bool is_argument = false; + if (0 != argument_role.compare("_")) is_argument = true; + if (is_argument) { + int k = j - offset; + if (use_top_nodes_) ++k; + argument_roles[k].push_back(argument_role); + argument_indices[k].push_back(i + 1); + } + } + offset = (int)info.size() - 1; + + // Add coreference information. + coreference_info[i + 1] = info[offset]; + ++offset; + } + + CHECK_EQ(num_predicates, predicate_names.size()); + + // TODO: Create spans... + std::vector entity_spans; + std::vector constituent_spans; + std::vector coreference_spans; + + ConstructSpansFromText(entity_info, &entity_spans); + ConstructSpansFromText(parse_info, &constituent_spans); + ConstructCoreferenceSpansFromText(coreference_info, &coreference_spans); + +#if 0 + for (int k = 0; k < entity_spans.size(); ++k) { + LOG(INFO) << "Entity " << entity_spans[k]->name() + << "(" << entity_spans[k]->start() + << "," << entity_spans[k]->end() + << ")"; + } + for (int k = 0; k < constituent_spans.size(); ++k) { + LOG(INFO) << "Constituent " << constituent_spans[k]->name() + << "(" << constituent_spans[k]->start() + << "," << constituent_spans[k]->end() + << ")"; + } + for (int k = 0; k < coreference_spans.size(); ++k) { + LOG(INFO) << "Mention " << coreference_spans[k]->name() + << " (" << coreference_spans[k]->start() + << "," << coreference_spans[k]->end() + << ")"; + } +#endif + + CoreferenceSentence *instance = NULL; + if (read_next_sentence && length >= 0) { + instance = new CoreferenceSentence; + instance->Initialize(name, forms, lemmas, cpos, pos, feats, deprels, heads, + predicate_names, predicate_indices, argument_roles, + argument_indices, author_info, entity_spans, + constituent_spans, coreference_spans); + } + + return static_cast(instance); +} + +void CoreferenceSentenceReader::ConstructSpansFromText( + const std::vector &span_lines, + std::vector *spans) { + char left_bracket = '('; + char right_bracket = ')'; + std::string characters_to_ignore = "*-"; + std::string name = ""; + std::stack span_names_stack; + std::stack span_start_stack; + + for (int i = 0; i < span_lines.size(); ++i) { + std::string line = span_lines[i]; + //LOG(INFO) << line; + for (int j = 0; j < line.length(); ++j) { + char ch = line[j]; + if (ch == left_bracket) { + name = ""; + span_start_stack.push(i); + } else if (ch == right_bracket) { + name = span_names_stack.top(); + int start_position = span_start_stack.top(); + int end_position = i; + span_names_stack.pop(); + span_start_stack.pop(); + NamedSpan *span = new NamedSpan(start_position, end_position, name); + spans->push_back(span); + } else if (characters_to_ignore.find(ch) != std::string::npos) { + continue; + } else { + name += ch; + if (j + 1 >= line.length() || + line[j + 1] == left_bracket || line[j + 1] == right_bracket || + characters_to_ignore.find(line[j + 1]) != std::string::npos) { + span_names_stack.push(name); + } + } + } + } + + CHECK_EQ(span_names_stack.size(), 0); + CHECK_EQ(span_start_stack.size(), 0); +} + +void CoreferenceSentenceReader::ConstructCoreferenceSpansFromText( + const std::vector &span_lines, + std::vector *spans) { + char left_bracket = '('; + char right_bracket = ')'; + std::string characters_to_ignore = "*-"; + std::string name = ""; + + for (int i = 0; i < span_lines.size(); ++i) { + std::string line = span_lines[i]; + std::vector fields; + StringSplit(line, "|", &fields, true); + //LOG(INFO) << "Span " << i << ": " << line; + for (int j = 0; j < fields.size(); ++j) { + std::string field = fields[j]; + CHECK_GE(field.length(), 1); + char first_ch = field[0]; + char last_ch = field[field.length() - 1]; + if (first_ch == left_bracket && last_ch == right_bracket) { + int start_position = i; + int end_position = i; + name = field.substr(1, field.length() - 2); + NamedSpan *span = new NamedSpan(start_position, end_position, name); + spans->push_back(span); + } else if (first_ch == left_bracket) { + int start_position = i; + int end_position = -1; + name = field.substr(1, field.length() - 1); + NamedSpan *span = new NamedSpan(start_position, end_position, name); + spans->push_back(span); + } else if (last_ch == right_bracket) { + name = field.substr(0, field.length() - 1); + NamedSpan *selected_span = NULL; + for (int k = spans->size() - 1; k >= 0; --k) { + if ((*spans)[k]->name() == name && (*spans)[k]->end() < 0) { + CHECK(!selected_span); + selected_span = (*spans)[k]; + break; + } + } + CHECK(selected_span); + selected_span->set_end(i); + } + } + } + + for (int k = 0; k < spans->size(); ++k) { + CHECK_GE((*spans)[k]->end(), 0); + } +} diff --git a/src/coreference_resolver/Mention.h b/src/coreference_resolver/Mention.h index f782d85..03042f3 100644 --- a/src/coreference_resolver/Mention.h +++ b/src/coreference_resolver/Mention.h @@ -1,187 +1,187 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef MENTION_H_ -#define MENTION_H_ - -#include "EntitySpan.h" -#include "CoreferenceDictionary.h" - -struct MentionType { - enum { - PRONOMINAL = 0, - PROPER, - NOMINAL, - NUM_MENTION_TYPES - }; -}; - -struct MentionGender { - enum { - MALE = 0, - FEMALE, - NEUTRAL, - UNKNOWN, - NUM_MENTION_GENDERS - }; -}; - -struct MentionNumber { - enum { - SINGULAR = 0, - PLURAL, - UNKNOWN, - NUM_MENTION_NUMBERS - }; -}; - -class CoreferenceSentenceNumeric; -class CoreferenceSentence; - -class Mention : public NumericSpan { -public: - Mention() { sentence_ = NULL; } - Mention(int start, int end, int id) : NumericSpan(start, end, id) {} - virtual ~Mention() {} - - int type() const { return type_; } - int gender() const { return gender_; } - int number() const { return number_; } - int unigram_ancestry() const { return unigram_ancestry_; } - int bigram_ancestry() const { return bigram_ancestry_; } - - int head_index() const { return head_index_; } - void set_head_index(int head_index) { head_index_ = head_index; } - - int sentence_index() const { return sentence_index_; } - void set_sentence_index(int sentence_index) { - sentence_index_ = sentence_index; - } - - int offset() const { return offset_; } - void set_offset(int offset) { offset_ = offset; } - - int global_start() const { return offset_ + start_; } - int global_end() const { return offset_ + end_; } - int global_head_index() { return offset_ + head_index_; } - - int speaker_id() const { return speaker_id_; } - void set_speaker_id(int speaker_id) { - speaker_id_ = speaker_id; - } - - int head_string_id() const { return head_string_id_; } - void set_head_string_id(int head_string_id) { - head_string_id_ = head_string_id; - } - - int phrase_string_id() const { return phrase_string_id_; } - void set_phrase_string_id(int phrase_string_id) { - phrase_string_id_ = phrase_string_id; - } - - const std::vector &all_word_string_ids() const { - return all_word_string_ids_; - } - void set_all_word_string_ids(const std::vector &all_word_string_ids) { - all_word_string_ids_ = all_word_string_ids; - } - - CoreferencePronoun *pronoun() const { return pronoun_; } - -public: - void ComputeProperties(const CoreferenceDictionary &dictionary, - CoreferenceSentence* instance, - CoreferenceSentenceNumeric *sentence); - - bool ContainsMentionHead(const Mention &mention) const { - const std::vector &all_word_string_ids = mention.all_word_string_ids(); - int head_string_id = all_word_string_ids[mention.head_index() - start_]; - for (int i = 0; i < all_word_string_ids_.size(); ++i) { - if (head_string_id == all_word_string_ids_[i]) return true; - } - return false; - } - - bool ContainsMentionString(const Mention &mention) const { - const std::vector &all_word_string_ids = mention.all_word_string_ids(); - int maximum_start = - all_word_string_ids_.size() - all_word_string_ids.size(); - for (int i = 0; i <= maximum_start; ++i) { - bool found_match = true; - for (int j = 0; j < all_word_string_ids.size(); ++j) { - if (all_word_string_ids[j] != all_word_string_ids_[i + j]) { - found_match = false; - break; - } - } - if (found_match) return true; - } - return false; - } - - // Print debug information about this mention. - void Print(const CoreferenceDictionary &dictionary, - CoreferenceSentence *instance); - void GetSpeaker(CoreferenceSentence *instance, - std::string *speaker); - void GetPhraseString(CoreferenceSentence *instance, - std::string *phrase_string); - void GetHeadString(CoreferenceSentence *instance, - std::string *head_string); - -protected: - void ComputeHead(); - int ComputeNumber(const std::vector &words, - const std::vector &words_lower, - int head_index) { - return MentionNumber::SINGULAR; - } - int ComputePersonGender(const std::vector &words, - const std::vector &words_lower, - int head_index) { - return MentionGender::MALE; - } - int ComputeNonPersonGender(const std::vector &words, - const std::vector &words_lower, - int head_index) { - return MentionGender::MALE; - } - -protected: - CoreferenceSentenceNumeric *sentence_; - int type_; // Type of mention (pronominal, proper, or nominal). - int entity_tag_; // Entity tag, if applicable (otherwise, -1). - CoreferencePronoun *pronoun_; // Pronoun information, if applicable. - int gender_; // Gender (male, female, neutral, unknown). - int number_; // Number (singular, plural, unknown). - int head_index_; // Position of the head word. - int unigram_ancestry_; // Dependency (syntactic) unigram ancestry. - int bigram_ancestry_; // Dependency (syntactic) bigram ancestry. - std::vector words_; // Mention words. - std::vector words_lower_; // Mention words in lower case. - std::vector tags_; // Mention POS tags. - int offset_; // Global offset position (start of sentence at document level). - int sentence_index_; // Index of the sentence to which this mention belongs. - int speaker_id_; - int head_string_id_; // ID of head word to test head match w/ other mentions. - int phrase_string_id_; // ID of the entire phrase to test exact match. - std::vector all_word_string_ids_; // IDs of the all mention words. -}; - -#endif /* MENTION_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef MENTION_H_ +#define MENTION_H_ + +#include "EntitySpan.h" +#include "CoreferenceDictionary.h" + +struct MentionType { + enum { + PRONOMINAL = 0, + PROPER, + NOMINAL, + NUM_MENTION_TYPES + }; +}; + +struct MentionGender { + enum { + MALE = 0, + FEMALE, + NEUTRAL, + UNKNOWN, + NUM_MENTION_GENDERS + }; +}; + +struct MentionNumber { + enum { + SINGULAR = 0, + PLURAL, + UNKNOWN, + NUM_MENTION_NUMBERS + }; +}; + +class CoreferenceSentenceNumeric; +class CoreferenceSentence; + +class Mention : public NumericSpan { +public: + Mention() { sentence_ = NULL; } + Mention(int start, int end, int id) : NumericSpan(start, end, id) {} + virtual ~Mention() {} + + int type() const { return type_; } + int gender() const { return gender_; } + int number() const { return number_; } + int unigram_ancestry() const { return unigram_ancestry_; } + int bigram_ancestry() const { return bigram_ancestry_; } + + int head_index() const { return head_index_; } + void set_head_index(int head_index) { head_index_ = head_index; } + + int sentence_index() const { return sentence_index_; } + void set_sentence_index(int sentence_index) { + sentence_index_ = sentence_index; + } + + int offset() const { return offset_; } + void set_offset(int offset) { offset_ = offset; } + + int global_start() const { return offset_ + start_; } + int global_end() const { return offset_ + end_; } + int global_head_index() { return offset_ + head_index_; } + + int speaker_id() const { return speaker_id_; } + void set_speaker_id(int speaker_id) { + speaker_id_ = speaker_id; + } + + int head_string_id() const { return head_string_id_; } + void set_head_string_id(int head_string_id) { + head_string_id_ = head_string_id; + } + + int phrase_string_id() const { return phrase_string_id_; } + void set_phrase_string_id(int phrase_string_id) { + phrase_string_id_ = phrase_string_id; + } + + const std::vector &all_word_string_ids() const { + return all_word_string_ids_; + } + void set_all_word_string_ids(const std::vector &all_word_string_ids) { + all_word_string_ids_ = all_word_string_ids; + } + + CoreferencePronoun *pronoun() const { return pronoun_; } + +public: + void ComputeProperties(const CoreferenceDictionary &dictionary, + CoreferenceSentence* instance, + CoreferenceSentenceNumeric *sentence); + + bool ContainsMentionHead(const Mention &mention) const { + const std::vector &all_word_string_ids = mention.all_word_string_ids(); + int head_string_id = all_word_string_ids[mention.head_index() - start_]; + for (int i = 0; i < all_word_string_ids_.size(); ++i) { + if (head_string_id == all_word_string_ids_[i]) return true; + } + return false; + } + + bool ContainsMentionString(const Mention &mention) const { + const std::vector &all_word_string_ids = mention.all_word_string_ids(); + int maximum_start = + (int)(all_word_string_ids_.size() - all_word_string_ids.size()); + for (int i = 0; i <= maximum_start; ++i) { + bool found_match = true; + for (int j = 0; j < all_word_string_ids.size(); ++j) { + if (all_word_string_ids[j] != all_word_string_ids_[i + j]) { + found_match = false; + break; + } + } + if (found_match) return true; + } + return false; + } + + // Print debug information about this mention. + void Print(const CoreferenceDictionary &dictionary, + CoreferenceSentence *instance); + void GetSpeaker(CoreferenceSentence *instance, + std::string *speaker); + void GetPhraseString(CoreferenceSentence *instance, + std::string *phrase_string); + void GetHeadString(CoreferenceSentence *instance, + std::string *head_string); + +protected: + void ComputeHead(); + int ComputeNumber(const std::vector &words, + const std::vector &words_lower, + int head_index) { + return MentionNumber::SINGULAR; + } + int ComputePersonGender(const std::vector &words, + const std::vector &words_lower, + int head_index) { + return MentionGender::MALE; + } + int ComputeNonPersonGender(const std::vector &words, + const std::vector &words_lower, + int head_index) { + return MentionGender::MALE; + } + +protected: + CoreferenceSentenceNumeric *sentence_; + int type_; // Type of mention (pronominal, proper, or nominal). + int entity_tag_; // Entity tag, if applicable (otherwise, -1). + CoreferencePronoun *pronoun_; // Pronoun information, if applicable. + int gender_; // Gender (male, female, neutral, unknown). + int number_; // Number (singular, plural, unknown). + int head_index_; // Position of the head word. + int unigram_ancestry_; // Dependency (syntactic) unigram ancestry. + int bigram_ancestry_; // Dependency (syntactic) bigram ancestry. + std::vector words_; // Mention words. + std::vector words_lower_; // Mention words in lower case. + std::vector tags_; // Mention POS tags. + int offset_; // Global offset position (start of sentence at document level). + int sentence_index_; // Index of the sentence to which this mention belongs. + int speaker_id_; + int head_string_id_; // ID of head word to test head match w/ other mentions. + int phrase_string_id_; // ID of the entire phrase to test exact match. + std::vector all_word_string_ids_; // IDs of the all mention words. +}; + +#endif /* MENTION_H_ */ diff --git a/src/entity_recognizer/EntityDictionary.cpp b/src/entity_recognizer/EntityDictionary.cpp index 1766d34..90ea704 100644 --- a/src/entity_recognizer/EntityDictionary.cpp +++ b/src/entity_recognizer/EntityDictionary.cpp @@ -22,6 +22,12 @@ #include #include +EntityDictionary::EntityDictionary(Pipe* pipe) : SequenceDictionary(pipe) { + EntityOptions *options = + static_cast(pipe->GetOptions()); + gazetteer_case_sensitive_ = options->gazetteer_case_sensitive(); +} + void EntityDictionary::CreateTagDictionary(SequenceReader *reader) { SequenceDictionary::CreateTagDictionary(reader); diff --git a/src/entity_recognizer/EntityDictionary.h b/src/entity_recognizer/EntityDictionary.h index 45ab009..2c88b7f 100644 --- a/src/entity_recognizer/EntityDictionary.h +++ b/src/entity_recognizer/EntityDictionary.h @@ -26,7 +26,7 @@ class EntityDictionary : public SequenceDictionary { public: EntityDictionary() {} - EntityDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} + EntityDictionary(Pipe* pipe); virtual ~EntityDictionary() {} void Clear() { @@ -44,11 +44,11 @@ class EntityDictionary : public SequenceDictionary { if (0 > gazetteer_entity_tag_alphabet_.Save(fs)) CHECK(false); bool success; - int length = gazetteer_word_entity_tags_.size(); + int length = (int)gazetteer_word_entity_tags_.size(); success = WriteInteger(fs, length); CHECK(success); for (int j = 0; j < gazetteer_word_entity_tags_.size(); ++j) { - length = gazetteer_word_entity_tags_[j].size(); + length = (int)gazetteer_word_entity_tags_[j].size(); success = WriteInteger(fs, length); CHECK(success); for (int k = 0; k < gazetteer_word_entity_tags_[j].size(); ++k) { @@ -58,11 +58,11 @@ class EntityDictionary : public SequenceDictionary { } } - length = allowed_bigrams_.size(); + length = (int)allowed_bigrams_.size(); success = WriteInteger(fs, length); CHECK(success); for (int j = 0; j < allowed_bigrams_.size(); ++j) { - length = allowed_bigrams_[j].size(); + length = (int)allowed_bigrams_[j].size(); success = WriteInteger(fs, length); CHECK(success); for (int k = 0; k < allowed_bigrams_[j].size(); ++k) { diff --git a/src/morphological_tagger/MorphologicalDictionary.h b/src/morphological_tagger/MorphologicalDictionary.h index 5d5332e..c0f9c15 100644 --- a/src/morphological_tagger/MorphologicalDictionary.h +++ b/src/morphological_tagger/MorphologicalDictionary.h @@ -1,118 +1,118 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef MORPHOLOGICALDICTIONARY_H_ -#define MORPHOLOGICALDICTIONARY_H_ - -#include "SequenceDictionary.h" -#include "TokenDictionary.h" -#include "MorphologicalReader.h" - -class MorphologicalDictionary : public SequenceDictionary { -public: - MorphologicalDictionary() {} - MorphologicalDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} - virtual ~MorphologicalDictionary() {} - - void Clear() { - SequenceDictionary::Clear(); - cpostag_morphologicaltags_.clear(); - } - - void Save(FILE *fs) { - SequenceDictionary::Save(fs); - bool success; - int length = unknown_cpostag_morphologicaltags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < unknown_cpostag_morphologicaltags_.size(); ++j) { - int tag = unknown_cpostag_morphologicaltags_[j]; - success = WriteInteger(fs, tag); - CHECK(success); - } - - length = cpostag_morphologicaltags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < cpostag_morphologicaltags_.size(); ++i) { - length = cpostag_morphologicaltags_[i].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < cpostag_morphologicaltags_[i].size(); ++j) { - int tag = cpostag_morphologicaltags_[i][j]; - success = WriteInteger(fs, tag); - CHECK(success); - } - } - } - - void Load(FILE *fs) { - SequenceDictionary::Load(fs); - bool success; - int length; - success = ReadInteger(fs, &length); - CHECK(success); - unknown_cpostag_morphologicaltags_.resize(length); - for (int j = 0; j < unknown_cpostag_morphologicaltags_.size(); ++j) { - int tag; - success = ReadInteger(fs, &tag); - CHECK(success); - unknown_cpostag_morphologicaltags_[j] = tag; - } - success = ReadInteger(fs, &length); - CHECK(success); - cpostag_morphologicaltags_.resize(length); - for (int i = 0; i < cpostag_morphologicaltags_.size(); ++i) { - success = ReadInteger(fs, &length); - CHECK(success); - cpostag_morphologicaltags_[i].resize(length); - for (int j = 0; j < cpostag_morphologicaltags_[i].size(); ++j) { - int tag; - success = ReadInteger(fs, &tag); - CHECK(success); - cpostag_morphologicaltags_[i][j] = tag; - } - } - } - - void CreateTagDictionary(MorphologicalReader *reader); - - const std::vector &GetAllowedMorphologicalTags(int cpostag) { - // return cpostag_morphologicaltags_[cpostag]; - // TODO: Not sure is this should be done here... - // It may be cleaner to return an empty vector here and - // fill it with the unknown tags elsewhere. - if (!cpostag_morphologicaltags_[cpostag].empty()) { - return cpostag_morphologicaltags_[cpostag]; - } else { - return unknown_cpostag_morphologicaltags_; - } - } - -protected: - std::vector > cpostag_morphologicaltags_; - std::vector unknown_cpostag_morphologicaltags_; -}; - -class MorphologicalTokenDictionary : public TokenDictionary { -public: - MorphologicalTokenDictionary() {}; - virtual ~MorphologicalTokenDictionary() {}; - void Initialize(MorphologicalReader *reader); -}; -#endif /* MORPHOLOGICALDICTIONARY_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef MORPHOLOGICALDICTIONARY_H_ +#define MORPHOLOGICALDICTIONARY_H_ + +#include "SequenceDictionary.h" +#include "TokenDictionary.h" +#include "MorphologicalReader.h" + +class MorphologicalDictionary : public SequenceDictionary { +public: + MorphologicalDictionary() {} + MorphologicalDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} + virtual ~MorphologicalDictionary() {} + + void Clear() { + SequenceDictionary::Clear(); + cpostag_morphologicaltags_.clear(); + } + + void Save(FILE *fs) { + SequenceDictionary::Save(fs); + bool success; + int length = (int) unknown_cpostag_morphologicaltags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < unknown_cpostag_morphologicaltags_.size(); ++j) { + int tag = unknown_cpostag_morphologicaltags_[j]; + success = WriteInteger(fs, tag); + CHECK(success); + } + + length = (int)cpostag_morphologicaltags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < cpostag_morphologicaltags_.size(); ++i) { + length = (int)cpostag_morphologicaltags_[i].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < cpostag_morphologicaltags_[i].size(); ++j) { + int tag = cpostag_morphologicaltags_[i][j]; + success = WriteInteger(fs, tag); + CHECK(success); + } + } + } + + void Load(FILE *fs) { + SequenceDictionary::Load(fs); + bool success; + int length; + success = ReadInteger(fs, &length); + CHECK(success); + unknown_cpostag_morphologicaltags_.resize(length); + for (int j = 0; j < unknown_cpostag_morphologicaltags_.size(); ++j) { + int tag; + success = ReadInteger(fs, &tag); + CHECK(success); + unknown_cpostag_morphologicaltags_[j] = tag; + } + success = ReadInteger(fs, &length); + CHECK(success); + cpostag_morphologicaltags_.resize(length); + for (int i = 0; i < cpostag_morphologicaltags_.size(); ++i) { + success = ReadInteger(fs, &length); + CHECK(success); + cpostag_morphologicaltags_[i].resize(length); + for (int j = 0; j < cpostag_morphologicaltags_[i].size(); ++j) { + int tag; + success = ReadInteger(fs, &tag); + CHECK(success); + cpostag_morphologicaltags_[i][j] = tag; + } + } + } + + void CreateTagDictionary(MorphologicalReader *reader); + + const std::vector &GetAllowedMorphologicalTags(int cpostag) { + // return cpostag_morphologicaltags_[cpostag]; + // TODO: Not sure is this should be done here... + // It may be cleaner to return an empty vector here and + // fill it with the unknown tags elsewhere. + if (!cpostag_morphologicaltags_[cpostag].empty()) { + return cpostag_morphologicaltags_[cpostag]; + } else { + return unknown_cpostag_morphologicaltags_; + } + } + +protected: + std::vector > cpostag_morphologicaltags_; + std::vector unknown_cpostag_morphologicaltags_; +}; + +class MorphologicalTokenDictionary : public TokenDictionary { +public: + MorphologicalTokenDictionary() {}; + virtual ~MorphologicalTokenDictionary() {}; + void Initialize(MorphologicalReader *reader); +}; +#endif /* MORPHOLOGICALDICTIONARY_H_ */ diff --git a/src/parser/DependencyDictionary.h b/src/parser/DependencyDictionary.h index 073a790..20a07d2 100644 --- a/src/parser/DependencyDictionary.h +++ b/src/parser/DependencyDictionary.h @@ -1,160 +1,160 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef DEPENDENCYDICTIONARY_H_ -#define DEPENDENCYDICTIONARY_H_ - -#include "Dictionary.h" -#include "TokenDictionary.h" -#include "DependencyReader.h" -#include "SerializationUtils.h" - -class Pipe; - -class DependencyDictionary : public Dictionary { -public: - DependencyDictionary() { token_dictionary_ = NULL; } - DependencyDictionary(Pipe* pipe) : pipe_(pipe) {} - virtual ~DependencyDictionary() { - Clear(); - } - - void CreateLabelDictionary(DependencyReader *reader); - - void Clear() { - // Don't clear token_dictionary, since this class does not own it. - label_alphabet_.clear(); - existing_labels_.clear(); - maximum_left_distances_.clear(); - maximum_right_distances_.clear(); - } - - void BuildLabelNames() { - label_alphabet_.BuildNames(); - } - - const string &GetLabelName(int label) const { - return label_alphabet_.GetName(label); - } - - void AllowGrowth() { token_dictionary_->AllowGrowth(); } - void StopGrowth() { token_dictionary_->StopGrowth(); } - - void Save(FILE *fs) { - if (0 > label_alphabet_.Save(fs)) CHECK(false); - bool success; - int length = existing_labels_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < existing_labels_.size(); ++i) { - length = existing_labels_[i].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < existing_labels_[i].size(); ++j) { - length = existing_labels_[i][j].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int k = 0; k < existing_labels_[i][j].size(); ++k) { - int label = existing_labels_[i][j][k]; - success = WriteInteger(fs, label); - CHECK(success); - } - int distance; - distance = maximum_left_distances_[i][j]; - success = WriteInteger(fs, distance); - CHECK(success); - distance = maximum_right_distances_[i][j]; - success = WriteInteger(fs, distance); - CHECK(success); - } - } - } - - void Load(FILE *fs) { - if (0 > label_alphabet_.Load(fs)) CHECK(false); - bool success; - int length; - success = ReadInteger(fs, &length); - CHECK(success); - existing_labels_.resize(length); - maximum_left_distances_.resize(length); - maximum_right_distances_.resize(length); - for (int i = 0; i < existing_labels_.size(); ++i) { - success = ReadInteger(fs, &length); - CHECK(success); - existing_labels_[i].resize(length); - maximum_left_distances_[i].resize(length); - maximum_right_distances_[i].resize(length); - for (int j = 0; j < existing_labels_[i].size(); ++j) { - success = ReadInteger(fs, &length); - CHECK(success); - existing_labels_[i][j].resize(length); - for (int k = 0; k < existing_labels_[i][j].size(); ++k) { - int label; - success = ReadInteger(fs, &label); - CHECK(success); - existing_labels_[i][j][k] = label; - } - int distance; - success = ReadInteger(fs, &distance); - CHECK(success); - maximum_left_distances_[i][j] = distance; - success = ReadInteger(fs, &distance); - CHECK(success); - maximum_right_distances_[i][j] = distance; - } - } - BuildLabelNames(); - } - - TokenDictionary *GetTokenDictionary() const { return token_dictionary_; } - void SetTokenDictionary(TokenDictionary *token_dictionary) { - token_dictionary_ = token_dictionary; - //CHECK(token_dictionary_ == NULL); - } - - const vector &GetExistingLabels(int modifier_pos_id, int head_pos_id) { - return existing_labels_[modifier_pos_id][head_pos_id]; - } - - int GetMaximumLeftDistance(int modifier_pos_id, int head_pos_id) { - return maximum_left_distances_[modifier_pos_id][head_pos_id]; - } - - int GetMaximumRightDistance(int modifier_pos_id, int head_pos_id) { - return maximum_right_distances_[modifier_pos_id][head_pos_id]; - } - - const Alphabet &GetLabelAlphabet() const { return label_alphabet_; }; - -protected: - Pipe *pipe_; - TokenDictionary *token_dictionary_; - Alphabet label_alphabet_; - vector > > existing_labels_; - vector > maximum_left_distances_; - vector > maximum_right_distances_; -}; - -class DependencyTokenDictionary : public TokenDictionary { -public: - DependencyTokenDictionary() {}; - virtual ~DependencyTokenDictionary() {}; - void Initialize(DependencyReader *reader); -}; -#endif /* DEPENDENCYDICTIONARY_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef DEPENDENCYDICTIONARY_H_ +#define DEPENDENCYDICTIONARY_H_ + +#include "Dictionary.h" +#include "TokenDictionary.h" +#include "DependencyReader.h" +#include "SerializationUtils.h" + +class Pipe; + +class DependencyDictionary : public Dictionary { +public: + DependencyDictionary() { token_dictionary_ = NULL; } + DependencyDictionary(Pipe* pipe) : pipe_(pipe) {} + virtual ~DependencyDictionary() { + Clear(); + } + + void CreateLabelDictionary(DependencyReader *reader); + + void Clear() { + // Don't clear token_dictionary, since this class does not own it. + label_alphabet_.clear(); + existing_labels_.clear(); + maximum_left_distances_.clear(); + maximum_right_distances_.clear(); + } + + void BuildLabelNames() { + label_alphabet_.BuildNames(); + } + + const string &GetLabelName(int label) const { + return label_alphabet_.GetName(label); + } + + void AllowGrowth() { token_dictionary_->AllowGrowth(); } + void StopGrowth() { token_dictionary_->StopGrowth(); } + + void Save(FILE *fs) { + if (0 > label_alphabet_.Save(fs)) CHECK(false); + bool success; + int length = (int)existing_labels_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < existing_labels_.size(); ++i) { + length = (int)existing_labels_[i].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < existing_labels_[i].size(); ++j) { + length = (int)existing_labels_[i][j].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int k = 0; k < existing_labels_[i][j].size(); ++k) { + int label = existing_labels_[i][j][k]; + success = WriteInteger(fs, label); + CHECK(success); + } + int distance; + distance = maximum_left_distances_[i][j]; + success = WriteInteger(fs, distance); + CHECK(success); + distance = maximum_right_distances_[i][j]; + success = WriteInteger(fs, distance); + CHECK(success); + } + } + } + + void Load(FILE *fs) { + if (0 > label_alphabet_.Load(fs)) CHECK(false); + bool success; + int length; + success = ReadInteger(fs, &length); + CHECK(success); + existing_labels_.resize(length); + maximum_left_distances_.resize(length); + maximum_right_distances_.resize(length); + for (int i = 0; i < existing_labels_.size(); ++i) { + success = ReadInteger(fs, &length); + CHECK(success); + existing_labels_[i].resize(length); + maximum_left_distances_[i].resize(length); + maximum_right_distances_[i].resize(length); + for (int j = 0; j < existing_labels_[i].size(); ++j) { + success = ReadInteger(fs, &length); + CHECK(success); + existing_labels_[i][j].resize(length); + for (int k = 0; k < existing_labels_[i][j].size(); ++k) { + int label; + success = ReadInteger(fs, &label); + CHECK(success); + existing_labels_[i][j][k] = label; + } + int distance; + success = ReadInteger(fs, &distance); + CHECK(success); + maximum_left_distances_[i][j] = distance; + success = ReadInteger(fs, &distance); + CHECK(success); + maximum_right_distances_[i][j] = distance; + } + } + BuildLabelNames(); + } + + TokenDictionary *GetTokenDictionary() const { return token_dictionary_; } + void SetTokenDictionary(TokenDictionary *token_dictionary) { + token_dictionary_ = token_dictionary; + //CHECK(token_dictionary_ == NULL); + } + + const vector &GetExistingLabels(int modifier_pos_id, int head_pos_id) { + return existing_labels_[modifier_pos_id][head_pos_id]; + } + + int GetMaximumLeftDistance(int modifier_pos_id, int head_pos_id) { + return maximum_left_distances_[modifier_pos_id][head_pos_id]; + } + + int GetMaximumRightDistance(int modifier_pos_id, int head_pos_id) { + return maximum_right_distances_[modifier_pos_id][head_pos_id]; + } + + const Alphabet &GetLabelAlphabet() const { return label_alphabet_; }; + +protected: + Pipe *pipe_; + TokenDictionary *token_dictionary_; + Alphabet label_alphabet_; + vector > > existing_labels_; + vector > maximum_left_distances_; + vector > maximum_right_distances_; +}; + +class DependencyTokenDictionary : public TokenDictionary { +public: + DependencyTokenDictionary() {}; + virtual ~DependencyTokenDictionary() {}; + void Initialize(DependencyReader *reader); +}; +#endif /* DEPENDENCYDICTIONARY_H_ */ diff --git a/src/parser/DependencyFeatures.h b/src/parser/DependencyFeatures.h index b575458..20bf226 100644 --- a/src/parser/DependencyFeatures.h +++ b/src/parser/DependencyFeatures.h @@ -1,172 +1,172 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef DEPENDENCYFEATURES_H_ -#define DEPENDENCYFEATURES_H_ - -#include "Features.h" -#include "DependencyInstanceNumeric.h" -#include "FeatureEncoder.h" - -class DependencyOptions; - -// This class implements the features for dependency parsing. -// The feature templates are largely inspired by the ones used in MSTParser -// (http://sourceforge.net/projects/mstparser/) and egstra -// (http://groups.csail.mit.edu/nlp/egstra/), which are described in -// the following papers: -// -// Non-Projective Dependency Parsing using Spanning Tree Algorithms. -// R. McDonald, F. Pereira, K. Ribarov and J. Hajič. -// Human Language Technologies and Empirical Methods in Natural Language -// Processing (HLT-EMNLP), 2005. -// -// M. Collins, A. Glober­son, T. Koo, X. Car­reras, and P. Bartlett. -// Ex­po­nen­ti­at­ed Gra­di­ent Al­go­rithms for Con­di­tion­al Ran­dom Fields and -// Max-​Mar­gin Markov Net­works. -// Jour­nal of Ma­chine Learn­ing Re­search 9(Aug):​1775–1822, 2008. - -class DependencyFeatures : public Features { -public: - DependencyFeatures() {}; - DependencyFeatures(Pipe* pipe) { pipe_ = pipe; } - virtual ~DependencyFeatures() { Clear(); } - -public: - void Clear() { - for (int r = 0; r < input_features_.size(); ++r) { - if (!input_features_[r]) continue; - input_features_[r]->clear(); - delete input_features_[r]; - input_features_[r] = NULL; - } - input_features_.clear(); - } - - void Initialize(Instance *instance, Parts *parts) { - Clear(); - input_features_.resize(parts->size(), static_cast(NULL)); - } - - int GetNumPartFeatures(int r) const { - return (NULL == input_features_[r]) ? 0 : input_features_[r]->size(); - }; - - int GetPartFeature(int r, int j) const { - return (*input_features_[r])[j]; - } - - const BinaryFeatures &GetPartFeatures(int r) const { - return *(input_features_[r]); - }; - - BinaryFeatures *GetMutablePartFeatures(int r) const { - return input_features_[r]; - }; - -public: - void AddArcFeaturesLight(DependencyInstanceNumeric *sentence, - int r, - int head, - int modifier); - - void AddArcFeatures(DependencyInstanceNumeric *sentence, - int r, - int head, - int modifier); - - void AddArbitrarySiblingFeatures(DependencyInstanceNumeric* sentence, - int r, - int head, - int modifier, - int sibling); - - void AddConsecutiveSiblingFeatures(DependencyInstanceNumeric* sentence, - int r, - int head, - int modifier, - int sibling); - - void AddSiblingFeatures(DependencyInstanceNumeric* sentence, - int r, - int head, - int modifier, - int sibling, - bool consecutive); - - void AddGrandparentFeatures(DependencyInstanceNumeric* sentence, - int r, - int grandparent, - int head, - int modifier); - - void AddGrandSiblingFeatures(DependencyInstanceNumeric* sentence, - int r, - int grandparent, - int head, - int modifier, - int sibling); - - void AddTriSiblingFeatures(DependencyInstanceNumeric* sentence, - int r, - int head, - int modifier, - int sibling, - int other_sibling); - - void AddNonprojectiveArcFeatures(DependencyInstanceNumeric* sentence, - int r, - int head, - int modifier); - - void AddDirectedPathFeatures(DependencyInstanceNumeric* sentence, - int r, - int ancestor, - int descendant); - - void AddHeadBigramFeatures(DependencyInstanceNumeric* sentence, - int r, - int head, - int modifier, - int previous_head); - -protected: - void AddWordPairFeatures(DependencyInstanceNumeric* sentence, - int pair_type, - int head, - int modifier, - bool use_lemma_features, - bool use_morphological_features, - BinaryFeatures *features); - - void AddWordPairFeaturesMST(DependencyInstanceNumeric* sentence, - int pair_type, - int head, - int modifier, - BinaryFeatures *features); - - void AddFeature(uint64_t fkey, BinaryFeatures* features) { - features->push_back(fkey); - } - -protected: - vector input_features_; // Vector of input features. - FeatureEncoder encoder_; // Encoder that converts features into a codeword. -}; - -#endif /* DEPENDENCYFEATURES_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef DEPENDENCYFEATURES_H_ +#define DEPENDENCYFEATURES_H_ + +#include "Features.h" +#include "DependencyInstanceNumeric.h" +#include "FeatureEncoder.h" + +class DependencyOptions; + +// This class implements the features for dependency parsing. +// The feature templates are largely inspired by the ones used in MSTParser +// (http://sourceforge.net/projects/mstparser/) and egstra +// (http://groups.csail.mit.edu/nlp/egstra/), which are described in +// the following papers: +// +// Non-Projective Dependency Parsing using Spanning Tree Algorithms. +// R. McDonald, F. Pereira, K. Ribarov and J. Hajič. +// Human Language Technologies and Empirical Methods in Natural Language +// Processing (HLT-EMNLP), 2005. +// +// M. Collins, A. Glober­son, T. Koo, X. Car­reras, and P. Bartlett. +// Ex­po­nen­ti­at­ed Gra­di­ent Al­go­rithms for Con­di­tion­al Ran­dom Fields and +// Max-​Mar­gin Markov Net­works. +// Jour­nal of Ma­chine Learn­ing Re­search 9(Aug):​1775–1822, 2008. + +class DependencyFeatures : public Features { +public: + DependencyFeatures() {}; + DependencyFeatures(Pipe* pipe) { pipe_ = pipe; } + virtual ~DependencyFeatures() { Clear(); } + +public: + void Clear() { + for (int r = 0; r < input_features_.size(); ++r) { + if (!input_features_[r]) continue; + input_features_[r]->clear(); + delete input_features_[r]; + input_features_[r] = NULL; + } + input_features_.clear(); + } + + void Initialize(Instance *instance, Parts *parts) { + Clear(); + input_features_.resize(parts->size(), static_cast(NULL)); + } + + int GetNumPartFeatures(int r) const { + return (NULL == input_features_[r]) ? 0 : (int)(input_features_[r]->size()); + }; + + int GetPartFeature(int r, int j) const { + return (*input_features_[r])[j]; + } + + const BinaryFeatures &GetPartFeatures(int r) const { + return *(input_features_[r]); + }; + + BinaryFeatures *GetMutablePartFeatures(int r) const { + return input_features_[r]; + }; + +public: + void AddArcFeaturesLight(DependencyInstanceNumeric *sentence, + int r, + int head, + int modifier); + + void AddArcFeatures(DependencyInstanceNumeric *sentence, + int r, + int head, + int modifier); + + void AddArbitrarySiblingFeatures(DependencyInstanceNumeric* sentence, + int r, + int head, + int modifier, + int sibling); + + void AddConsecutiveSiblingFeatures(DependencyInstanceNumeric* sentence, + int r, + int head, + int modifier, + int sibling); + + void AddSiblingFeatures(DependencyInstanceNumeric* sentence, + int r, + int head, + int modifier, + int sibling, + bool consecutive); + + void AddGrandparentFeatures(DependencyInstanceNumeric* sentence, + int r, + int grandparent, + int head, + int modifier); + + void AddGrandSiblingFeatures(DependencyInstanceNumeric* sentence, + int r, + int grandparent, + int head, + int modifier, + int sibling); + + void AddTriSiblingFeatures(DependencyInstanceNumeric* sentence, + int r, + int head, + int modifier, + int sibling, + int other_sibling); + + void AddNonprojectiveArcFeatures(DependencyInstanceNumeric* sentence, + int r, + int head, + int modifier); + + void AddDirectedPathFeatures(DependencyInstanceNumeric* sentence, + int r, + int ancestor, + int descendant); + + void AddHeadBigramFeatures(DependencyInstanceNumeric* sentence, + int r, + int head, + int modifier, + int previous_head); + +protected: + void AddWordPairFeatures(DependencyInstanceNumeric* sentence, + int pair_type, + int head, + int modifier, + bool use_lemma_features, + bool use_morphological_features, + BinaryFeatures *features); + + void AddWordPairFeaturesMST(DependencyInstanceNumeric* sentence, + int pair_type, + int head, + int modifier, + BinaryFeatures *features); + + void AddFeature(uint64_t fkey, BinaryFeatures* features) { + features->push_back(fkey); + } + +protected: + vector input_features_; // Vector of input features. + FeatureEncoder encoder_; // Encoder that converts features into a codeword. +}; + +#endif /* DEPENDENCYFEATURES_H_ */ diff --git a/src/parser/DependencyInstance.h b/src/parser/DependencyInstance.h index c467d4d..3bd7f45 100644 --- a/src/parser/DependencyInstance.h +++ b/src/parser/DependencyInstance.h @@ -1,82 +1,82 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef DEPENDENCYINSTANCE_H_ -#define DEPENDENCYINSTANCE_H_ - -#include -#include -#include "Instance.h" - -class DependencyInstance : public Instance { -public: - DependencyInstance() {}; - virtual ~DependencyInstance() {}; - - Instance* Copy() { - DependencyInstance* instance = new DependencyInstance(); - instance->Initialize(forms_, lemmas_, cpostags_, postags_, - feats_, deprels_, heads_); - return static_cast(instance); - } - - void Initialize(const vector &forms, - const vector &lemmas, - const vector &cpos, - const vector &pos, - const vector > &feats, - const vector &deprels, - const vector &heads); - - int size() { return forms_.size(); }; - - const vector &GetHeads() { return heads_; } - const vector &GetDependencyRelations() { return deprels_; } - - const string &GetForm(int i) { return forms_[i]; }; - const string &GetLemma(int i) { return lemmas_[i]; }; - const string &GetCoarsePosTag(int i) { return cpostags_[i]; }; - const string &GetPosTag(int i) { return postags_[i]; }; - int GetNumMorphFeatures(int i) { return feats_[i].size(); }; - const string &GetMorphFeature(int i, int j) { return feats_[i][j]; }; - int GetHead(int i) { return heads_[i]; }; - const string &GetDependencyRelation(int i) { return deprels_[i]; }; - - void SetHead(int i, int head) { heads_[i] = head; } - void SetDependencyRelation(int i, const string &dependency_relation) { - deprels_[i] = dependency_relation; - } - -protected: - // FORM: the forms - usually words, like "thought" - vector forms_; - // LEMMA: the lemmas, or stems, e.g. "think" - vector lemmas_; - // COURSE-POS: the course part-of-speech tags, e.g."V" - vector cpostags_; - // FINE-POS: the fine-grained part-of-speech tags, e.g."VBD" - vector postags_; - // FEATURES: some features associated with the elements separated by "|", e.g. "PAST|3P" - vector > feats_; - // HEAD: the IDs of the heads for each element - vector heads_; - // DEPREL: the dependency relations, e.g. "SUBJ" - vector deprels_; -}; - -#endif /* DEPENDENCYINSTANCE_H_*/ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef DEPENDENCYINSTANCE_H_ +#define DEPENDENCYINSTANCE_H_ + +#include +#include +#include "Instance.h" + +class DependencyInstance : public Instance { +public: + DependencyInstance() {}; + virtual ~DependencyInstance() {}; + + Instance* Copy() { + DependencyInstance* instance = new DependencyInstance(); + instance->Initialize(forms_, lemmas_, cpostags_, postags_, + feats_, deprels_, heads_); + return static_cast(instance); + } + + void Initialize(const vector &forms, + const vector &lemmas, + const vector &cpos, + const vector &pos, + const vector > &feats, + const vector &deprels, + const vector &heads); + + int size() { return (int) forms_.size(); }; + + const vector &GetHeads() { return heads_; } + const vector &GetDependencyRelations() { return deprels_; } + + const string &GetForm(int i) { return forms_[i]; }; + const string &GetLemma(int i) { return lemmas_[i]; }; + const string &GetCoarsePosTag(int i) { return cpostags_[i]; }; + const string &GetPosTag(int i) { return postags_[i]; }; + int GetNumMorphFeatures(int i) { return (int)(feats_[i].size()); }; + const string &GetMorphFeature(int i, int j) { return feats_[i][j]; }; + int GetHead(int i) { return heads_[i]; }; + const string &GetDependencyRelation(int i) { return deprels_[i]; }; + + void SetHead(int i, int head) { heads_[i] = head; } + void SetDependencyRelation(int i, const string &dependency_relation) { + deprels_[i] = dependency_relation; + } + +protected: + // FORM: the forms - usually words, like "thought" + vector forms_; + // LEMMA: the lemmas, or stems, e.g. "think" + vector lemmas_; + // COURSE-POS: the course part-of-speech tags, e.g."V" + vector cpostags_; + // FINE-POS: the fine-grained part-of-speech tags, e.g."VBD" + vector postags_; + // FEATURES: some features associated with the elements separated by "|", e.g. "PAST|3P" + vector > feats_; + // HEAD: the IDs of the heads for each element + vector heads_; + // DEPREL: the dependency relations, e.g. "SUBJ" + vector deprels_; +}; + +#endif /* DEPENDENCYINSTANCE_H_*/ diff --git a/src/parser/DependencyInstanceNumeric.h b/src/parser/DependencyInstanceNumeric.h index 252f0b3..04d5805 100644 --- a/src/parser/DependencyInstanceNumeric.h +++ b/src/parser/DependencyInstanceNumeric.h @@ -1,155 +1,155 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef DEPENDENCYINSTANCENUMERIC_H_ -#define DEPENDENCYINSTANCENUMERIC_H_ - -#include -#include -#include "Dictionary.h" -#include "Instance.h" -#include "DependencyInstance.h" -#include "DependencyDictionary.h" - -using namespace std; - -class DependencyInstanceNumeric : public Instance { -public: - DependencyInstanceNumeric() {}; - virtual ~DependencyInstanceNumeric() { Clear(); }; - - Instance* Copy() { - CHECK(false) << "Not implemented."; - return NULL; - } - - int size() { return form_ids_.size(); }; - - void Clear() { - form_ids_.clear(); - form_lower_ids_.clear(); - lemma_ids_.clear(); - prefix_ids_.clear(); - suffix_ids_.clear(); - pos_ids_.clear(); - cpos_ids_.clear(); - for (int i = 0; i < feats_ids_.size(); i++) { - feats_ids_[i].clear(); - } - //shapes_.clear(); - is_noun_.clear(); - is_verb_.clear(); - is_punc_.clear(); - is_coord_.clear(); - heads_.clear(); - } - - void Initialize(const DependencyDictionary &dictionary, - DependencyInstance *instance); - - void GetAllAncestors(const std::vector &heads, - int descend, - std::vector* ancestors) const { - ancestors->clear(); - int h = heads[descend]; - while (h >= 0) { - ancestors->push_back(h); - h = heads[h]; - } - } - -#if 0 - // TODO(atm): this is repeated in other tasks. Should move some of these - // functions to a common class and use inheritance. - void GetWordShape(const string &word, string *shape) { - string type = ""; - char last = '\0'; - for (int i = 0; i < word.size(); ++i) { - if (word[i] >= 'A' && word[i] <= 'Z') { - if (last != 'A') { - type += 'A'; - last = 'A'; - } else if (type[type.size() - 1] != '+') { - type += '+'; - } - } else if (word[i] >= 'a' && word[i] <= 'z') { - if (last != 'a') { - type += 'a'; - last = 'a'; - } else if (type[type.size() - 1] != '+') { - type += '+'; - } - } else if (word[i] >= '0' && word[i] <= '9') { - if (last != '0') { - type += '0'; - last = '0'; - } else if (type[type.size() - 1] != '+') { - type += '+'; - last = '0'; - } - } else { - type += word[i]; - } - } - *shape = type; - } -#endif - - const vector &GetFormIds() const { return form_ids_; } - const vector &GetFormLowerIds() const { return form_lower_ids_; } - const vector &GetLemmaIds() const { return lemma_ids_; } - const vector &GetPosIds() const { return pos_ids_; } - const vector &GetCoarsePosIds() const { return cpos_ids_; } - const vector &GetHeads() const { return heads_; } - const vector &GetRelations() const { return relations_; } - - int GetFormId(int i) { return form_ids_[i]; }; - int GetFormLowerId(int i) { return form_lower_ids_[i]; }; - int GetLemmaId(int i) { return lemma_ids_[i]; }; - int GetPrefixId(int i) { return prefix_ids_[i]; }; - int GetSuffixId(int i) { return suffix_ids_[i]; }; - int GetPosId(int i) { return pos_ids_[i]; }; - int GetCoarsePosId(int i) { return cpos_ids_[i]; }; - int GetNumMorphFeatures(int i) { return feats_ids_[i].size(); }; - int GetMorphFeature(int i, int j) { return feats_ids_[i][j]; }; - bool IsNoun(int i) { return is_noun_[i]; }; - bool IsVerb(int i) { return is_verb_[i]; }; - bool IsPunctuation(int i) { return is_punc_[i]; }; - bool IsCoordination(int i) { return is_coord_[i]; }; - int GetHead(int i) { return heads_[i]; }; - int GetRelationId(int i) { return relations_[i]; }; - -protected: - vector form_ids_; - vector form_lower_ids_; - vector lemma_ids_; - vector prefix_ids_; - vector suffix_ids_; - vector pos_ids_; - vector cpos_ids_; - vector > feats_ids_; - //vector shapes_; - vector is_noun_; - vector is_verb_; - vector is_punc_; - vector is_coord_; - vector heads_; - vector relations_; -}; - -#endif /* DEPENDENCYINSTANCENUMERIC_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef DEPENDENCYINSTANCENUMERIC_H_ +#define DEPENDENCYINSTANCENUMERIC_H_ + +#include +#include +#include "Dictionary.h" +#include "Instance.h" +#include "DependencyInstance.h" +#include "DependencyDictionary.h" + +using namespace std; + +class DependencyInstanceNumeric : public Instance { +public: + DependencyInstanceNumeric() {}; + virtual ~DependencyInstanceNumeric() { Clear(); }; + + Instance* Copy() { + CHECK(false) << "Not implemented."; + return NULL; + } + + int size() { return (int)form_ids_.size(); }; + + void Clear() { + form_ids_.clear(); + form_lower_ids_.clear(); + lemma_ids_.clear(); + prefix_ids_.clear(); + suffix_ids_.clear(); + pos_ids_.clear(); + cpos_ids_.clear(); + for (int i = 0; i < feats_ids_.size(); i++) { + feats_ids_[i].clear(); + } + //shapes_.clear(); + is_noun_.clear(); + is_verb_.clear(); + is_punc_.clear(); + is_coord_.clear(); + heads_.clear(); + } + + void Initialize(const DependencyDictionary &dictionary, + DependencyInstance *instance); + + void GetAllAncestors(const std::vector &heads, + int descend, + std::vector* ancestors) const { + ancestors->clear(); + int h = heads[descend]; + while (h >= 0) { + ancestors->push_back(h); + h = heads[h]; + } + } + +#if 0 + // TODO(atm): this is repeated in other tasks. Should move some of these + // functions to a common class and use inheritance. + void GetWordShape(const string &word, string *shape) { + string type = ""; + char last = '\0'; + for (int i = 0; i < word.size(); ++i) { + if (word[i] >= 'A' && word[i] <= 'Z') { + if (last != 'A') { + type += 'A'; + last = 'A'; + } else if (type[type.size() - 1] != '+') { + type += '+'; + } + } else if (word[i] >= 'a' && word[i] <= 'z') { + if (last != 'a') { + type += 'a'; + last = 'a'; + } else if (type[type.size() - 1] != '+') { + type += '+'; + } + } else if (word[i] >= '0' && word[i] <= '9') { + if (last != '0') { + type += '0'; + last = '0'; + } else if (type[type.size() - 1] != '+') { + type += '+'; + last = '0'; + } + } else { + type += word[i]; + } + } + *shape = type; + } +#endif + + const vector &GetFormIds() const { return form_ids_; } + const vector &GetFormLowerIds() const { return form_lower_ids_; } + const vector &GetLemmaIds() const { return lemma_ids_; } + const vector &GetPosIds() const { return pos_ids_; } + const vector &GetCoarsePosIds() const { return cpos_ids_; } + const vector &GetHeads() const { return heads_; } + const vector &GetRelations() const { return relations_; } + + int GetFormId(int i) { return form_ids_[i]; }; + int GetFormLowerId(int i) { return form_lower_ids_[i]; }; + int GetLemmaId(int i) { return lemma_ids_[i]; }; + int GetPrefixId(int i) { return prefix_ids_[i]; }; + int GetSuffixId(int i) { return suffix_ids_[i]; }; + int GetPosId(int i) { return pos_ids_[i]; }; + int GetCoarsePosId(int i) { return cpos_ids_[i]; }; + int GetNumMorphFeatures(int i) { return (int) feats_ids_[i].size(); }; + int GetMorphFeature(int i, int j) { return feats_ids_[i][j]; }; + bool IsNoun(int i) { return is_noun_[i]; }; + bool IsVerb(int i) { return is_verb_[i]; }; + bool IsPunctuation(int i) { return is_punc_[i]; }; + bool IsCoordination(int i) { return is_coord_[i]; }; + int GetHead(int i) { return heads_[i]; }; + int GetRelationId(int i) { return relations_[i]; }; + +protected: + vector form_ids_; + vector form_lower_ids_; + vector lemma_ids_; + vector prefix_ids_; + vector suffix_ids_; + vector pos_ids_; + vector cpos_ids_; + vector > feats_ids_; + //vector shapes_; + vector is_noun_; + vector is_verb_; + vector is_punc_; + vector is_coord_; + vector heads_; + vector relations_; +}; + +#endif /* DEPENDENCYINSTANCENUMERIC_H_ */ diff --git a/src/parser/DependencyPart.h b/src/parser/DependencyPart.h index 6e82d88..e799b63 100644 --- a/src/parser/DependencyPart.h +++ b/src/parser/DependencyPart.h @@ -482,7 +482,7 @@ class DependencyParts : public Parts { void BuildOffsets() { for (int i = NUM_DEPENDENCYPARTS - 1; i >= 0; --i) { if (offsets_[i] < 0) { - offsets_[i] = (i == NUM_DEPENDENCYPARTS - 1) ? size() : offsets_[i + 1]; + offsets_[i] = (i == NUM_DEPENDENCYPARTS - 1) ? (int)size() : offsets_[i + 1]; } } }; @@ -554,7 +554,7 @@ class DependencyParts : public Parts { void GetOffset(int i, int *offset, int *size) const { *offset = offsets_[i]; *size = (i < NUM_DEPENDENCYPARTS - 1) ? offsets_[i + 1] - (*offset) : - DependencyParts::size() - (*offset); + (int)DependencyParts::size() - (*offset); } // Set offset from part index. diff --git a/src/semantic_parser/SemanticDictionary.h b/src/semantic_parser/SemanticDictionary.h index 6e25bfd..f348f5f 100644 --- a/src/semantic_parser/SemanticDictionary.h +++ b/src/semantic_parser/SemanticDictionary.h @@ -1,351 +1,351 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICDICTIONARY_H_ -#define SEMANTICDICTIONARY_H_ - -#include "Dictionary.h" -#include "TokenDictionary.h" -#include "DependencyDictionary.h" -#include "SerializationUtils.h" -#include "SemanticPredicate.h" -#include "SemanticReader.h" - -class Pipe; - -enum SpecialPredicates { - PREDICATE_UNKNOWN = 0, - NUM_SPECIAL_PREDICATES -}; - -enum SpecialDependencyPaths { - PATH_UNKNOWN = 0, - NUM_SPECIAL_PATHS -}; - -class SemanticDictionary : public Dictionary { -public: - SemanticDictionary() { token_dictionary_ = NULL; } - SemanticDictionary(Pipe* pipe) : pipe_(pipe) {} - virtual ~SemanticDictionary() { - Clear(); - } - - void CreatePredicateRoleDictionaries(SemanticReader *reader); - - void Clear() { - // Don't clear token_dictionary, since this class does not own it. - for (int i = 0; i < lemma_predicates_.size(); ++i) { - for (int j = 0; j < lemma_predicates_[i].size(); ++j) { - delete lemma_predicates_[i][j]; - } - lemma_predicates_[i].clear(); - } - lemma_predicates_.clear(); - predicate_alphabet_.clear(); - role_alphabet_.clear(); - relation_path_alphabet_.clear(); - pos_path_alphabet_.clear(); - existing_roles_.clear(); - existing_roles_with_relation_path_.clear(); - maximum_left_distances_.clear(); - maximum_right_distances_.clear(); - } - - void BuildPredicateRoleNames() { - predicate_alphabet_.BuildNames(); - role_alphabet_.BuildNames(); - relation_path_alphabet_.BuildNames(); - pos_path_alphabet_.BuildNames(); - } - - const vector &GetLemmaPredicates(int lemma) const { - return lemma_predicates_[lemma]; - } - - const string &GetPredicateName(int predicate) const { - return predicate_alphabet_.GetName(predicate); - } - - const string &GetRoleName(int role) const { - return role_alphabet_.GetName(role); - } - - int GetRoleBigramLabel(int first_role, int second_role) const { - CHECK_GE(first_role, 0); - CHECK_GE(second_role, 0); - return first_role * role_alphabet_.size() + second_role; - } - - int GetNumRoleBigramLabels() const { - return role_alphabet_.size()*role_alphabet_.size(); - } - - int GetNumRoles() const { - return role_alphabet_.size(); - } - - bool IsFrequentRolePair(int first_role, int second_role) const { - int label_bigram = GetRoleBigramLabel(first_role, second_role); - return frequent_role_pairs_.find(label_bigram) != - frequent_role_pairs_.end(); - } - - bool IsRoleDeterministic(int role) const { - return deterministic_roles_[role]; - } - - const string &GetRelationPathName(int path) const { - return relation_path_alphabet_.GetName(path); - } - - const string &GetPosPathName(int path) const { - return pos_path_alphabet_.GetName(path); - } - - // TODO(atm): check if we should allow/stop growth of the other dictionaries - // as well. - void AllowGrowth() { token_dictionary_->AllowGrowth(); } - void StopGrowth() { token_dictionary_->StopGrowth(); } - - void Save(FILE *fs) { - if (0 > predicate_alphabet_.Save(fs)) CHECK(false); - if (0 > role_alphabet_.Save(fs)) CHECK(false); - if (0 > relation_path_alphabet_.Save(fs)) CHECK(false); - if (0 > pos_path_alphabet_.Save(fs)) CHECK(false); - bool success; - int length = lemma_predicates_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < lemma_predicates_.size(); ++i) { - length = lemma_predicates_[i].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < lemma_predicates_[i].size(); ++j) { - lemma_predicates_[i][j]->Save(fs); - } - } - CHECK_EQ(deterministic_roles_.size(), GetNumRoles()); - length = deterministic_roles_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < deterministic_roles_.size(); ++i) { - bool deterministic = deterministic_roles_[i]; - success = WriteBool(fs, deterministic); - CHECK(success); - } - length = existing_roles_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < existing_roles_.size(); ++i) { - length = existing_roles_[i].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < existing_roles_[i].size(); ++j) { - length = existing_roles_[i][j].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int k = 0; k < existing_roles_[i][j].size(); ++k) { - int label = existing_roles_[i][j][k]; - success = WriteInteger(fs, label); - CHECK(success); - } - int distance; - distance = maximum_left_distances_[i][j]; - success = WriteInteger(fs, distance); - CHECK(success); - distance = maximum_right_distances_[i][j]; - success = WriteInteger(fs, distance); - CHECK(success); - } - } - length = existing_roles_with_relation_path_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < existing_roles_with_relation_path_.size(); ++i) { - length = existing_roles_with_relation_path_[i].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int k = 0; k < existing_roles_with_relation_path_[i].size(); ++k) { - int label = existing_roles_with_relation_path_[i][k]; - success = WriteInteger(fs, label); - CHECK(success); - } - } - length = frequent_role_pairs_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (set::iterator it = frequent_role_pairs_.begin(); - it != frequent_role_pairs_.end(); - ++it) { - int label_bigram = *it; - success = WriteInteger(fs, label_bigram); - CHECK(success); - } - } - - void Load(FILE *fs) { - if (0 > predicate_alphabet_.Load(fs)) CHECK(false); - if (0 > role_alphabet_.Load(fs)) CHECK(false); - if (0 > relation_path_alphabet_.Load(fs)) CHECK(false); - if (0 > pos_path_alphabet_.Load(fs)) CHECK(false); - bool success; - int length; - success = ReadInteger(fs, &length); - CHECK(success); - lemma_predicates_.resize(length); - for (int i = 0; i < lemma_predicates_.size(); ++i) { - success = ReadInteger(fs, &length); - CHECK(success); - lemma_predicates_[i].resize(length); - for (int j = 0; j < lemma_predicates_[i].size(); ++j) { - lemma_predicates_[i][j] = new SemanticPredicate(); - lemma_predicates_[i][j]->Load(fs); - } - } - success = ReadInteger(fs, &length); - CHECK(success); - deterministic_roles_.resize(length); - CHECK_EQ(deterministic_roles_.size(), GetNumRoles()); - for (int i = 0; i < deterministic_roles_.size(); ++i) { - bool deterministic; - success = ReadBool(fs, &deterministic); - CHECK(success); - deterministic_roles_[i] = deterministic; - } - success = ReadInteger(fs, &length); - CHECK(success); - existing_roles_.resize(length); - maximum_left_distances_.resize(length); - maximum_right_distances_.resize(length); - for (int i = 0; i < existing_roles_.size(); ++i) { - success = ReadInteger(fs, &length); - CHECK(success); - existing_roles_[i].resize(length); - maximum_left_distances_[i].resize(length); - maximum_right_distances_[i].resize(length); - for (int j = 0; j < existing_roles_[i].size(); ++j) { - success = ReadInteger(fs, &length); - CHECK(success); - existing_roles_[i][j].resize(length); - for (int k = 0; k < existing_roles_[i][j].size(); ++k) { - int label; - success = ReadInteger(fs, &label); - CHECK(success); - existing_roles_[i][j][k] = label; - } - int distance; - success = ReadInteger(fs, &distance); - CHECK(success); - maximum_left_distances_[i][j] = distance; - success = ReadInteger(fs, &distance); - CHECK(success); - maximum_right_distances_[i][j] = distance; - } - } - success = ReadInteger(fs, &length); - CHECK(success); - existing_roles_with_relation_path_.resize(length); - for (int i = 0; i < existing_roles_with_relation_path_.size(); ++i) { - success = ReadInteger(fs, &length); - CHECK(success); - existing_roles_with_relation_path_[i].resize(length); - for (int k = 0; k < existing_roles_with_relation_path_[i].size(); ++k) { - int label; - success = ReadInteger(fs, &label); - CHECK(success); - existing_roles_with_relation_path_[i][k] = label; - } - } - success = ReadInteger(fs, &length); - CHECK(success); - frequent_role_pairs_.clear(); - for (int k = 0; k < length; ++k) { - int label_bigram; - success = ReadInteger(fs, &label_bigram); - CHECK(success); - frequent_role_pairs_.insert(label_bigram); - } - BuildPredicateRoleNames(); - } - - Pipe *GetPipe() const { return pipe_; } - - TokenDictionary *GetTokenDictionary() const { return token_dictionary_; } - void SetTokenDictionary(TokenDictionary *token_dictionary) { - token_dictionary_ = token_dictionary; - //CHECK(token_dictionary_ == NULL); - } - - DependencyDictionary *GetDependencyDictionary() const { - return dependency_dictionary_; - } - void SetDependencyDictionary(DependencyDictionary *dependency_dictionary) { - dependency_dictionary_ = dependency_dictionary; - //CHECK(token_dictionary_ == NULL); - } - - const vector &GetExistingRoles(int predicate_pos_id, int argument_pos_id) { - return existing_roles_[predicate_pos_id][argument_pos_id]; - } - - const vector &GetExistingRolesWithRelationPath(int relation_path_id) { - return existing_roles_with_relation_path_[relation_path_id]; - } - - int GetMaximumLeftDistance(int predicate_pos_id, int argument_pos_id) { - return maximum_left_distances_[predicate_pos_id][argument_pos_id]; - } - - int GetMaximumRightDistance(int predicate_pos_id, int argument_pos_id) { - return maximum_right_distances_[predicate_pos_id][argument_pos_id]; - } - - const Alphabet &GetPredicateAlphabet() const { return predicate_alphabet_; }; - const Alphabet &GetRoleAlphabet() const { return role_alphabet_; }; - const Alphabet &GetRelationPathAlphabet() const { - return relation_path_alphabet_; - }; - const Alphabet &GetPosPathAlphabet() const { return pos_path_alphabet_; }; - - void ComputeDependencyPath(SemanticInstance *instance, - int p, int a, - string *relation_path, - string *pos_path) const; - -protected: - int FindLowestCommonAncestor(const vector& heads, int p, int a) const; - -protected: - Pipe *pipe_; - TokenDictionary *token_dictionary_; - DependencyDictionary *dependency_dictionary_; - vector > lemma_predicates_; - Alphabet predicate_alphabet_; - Alphabet role_alphabet_; - Alphabet relation_path_alphabet_; - Alphabet pos_path_alphabet_; - vector deterministic_roles_; - vector > > existing_roles_; - vector > existing_roles_with_relation_path_; - vector > maximum_left_distances_; - vector > maximum_right_distances_; - set frequent_role_pairs_; -}; - -#endif /* SEMANTICDICTIONARY_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICDICTIONARY_H_ +#define SEMANTICDICTIONARY_H_ + +#include "Dictionary.h" +#include "TokenDictionary.h" +#include "DependencyDictionary.h" +#include "SerializationUtils.h" +#include "SemanticPredicate.h" +#include "SemanticReader.h" + +class Pipe; + +enum SpecialPredicates { + PREDICATE_UNKNOWN = 0, + NUM_SPECIAL_PREDICATES +}; + +enum SpecialDependencyPaths { + PATH_UNKNOWN = 0, + NUM_SPECIAL_PATHS +}; + +class SemanticDictionary : public Dictionary { +public: + SemanticDictionary() { token_dictionary_ = NULL; } + SemanticDictionary(Pipe* pipe) : pipe_(pipe) {} + virtual ~SemanticDictionary() { + Clear(); + } + + void CreatePredicateRoleDictionaries(SemanticReader *reader); + + void Clear() { + // Don't clear token_dictionary, since this class does not own it. + for (int i = 0; i < lemma_predicates_.size(); ++i) { + for (int j = 0; j < lemma_predicates_[i].size(); ++j) { + delete lemma_predicates_[i][j]; + } + lemma_predicates_[i].clear(); + } + lemma_predicates_.clear(); + predicate_alphabet_.clear(); + role_alphabet_.clear(); + relation_path_alphabet_.clear(); + pos_path_alphabet_.clear(); + existing_roles_.clear(); + existing_roles_with_relation_path_.clear(); + maximum_left_distances_.clear(); + maximum_right_distances_.clear(); + } + + void BuildPredicateRoleNames() { + predicate_alphabet_.BuildNames(); + role_alphabet_.BuildNames(); + relation_path_alphabet_.BuildNames(); + pos_path_alphabet_.BuildNames(); + } + + const vector &GetLemmaPredicates(int lemma) const { + return lemma_predicates_[lemma]; + } + + const string &GetPredicateName(int predicate) const { + return predicate_alphabet_.GetName(predicate); + } + + const string &GetRoleName(int role) const { + return role_alphabet_.GetName(role); + } + + int GetRoleBigramLabel(int first_role, int second_role) const { + CHECK_GE(first_role, 0); + CHECK_GE(second_role, 0); + return first_role * role_alphabet_.size() + second_role; + } + + int GetNumRoleBigramLabels() const { + return role_alphabet_.size()*role_alphabet_.size(); + } + + int GetNumRoles() const { + return role_alphabet_.size(); + } + + bool IsFrequentRolePair(int first_role, int second_role) const { + int label_bigram = GetRoleBigramLabel(first_role, second_role); + return frequent_role_pairs_.find(label_bigram) != + frequent_role_pairs_.end(); + } + + bool IsRoleDeterministic(int role) const { + return deterministic_roles_[role]; + } + + const string &GetRelationPathName(int path) const { + return relation_path_alphabet_.GetName(path); + } + + const string &GetPosPathName(int path) const { + return pos_path_alphabet_.GetName(path); + } + + // TODO(atm): check if we should allow/stop growth of the other dictionaries + // as well. + void AllowGrowth() { token_dictionary_->AllowGrowth(); } + void StopGrowth() { token_dictionary_->StopGrowth(); } + + void Save(FILE *fs) { + if (0 > predicate_alphabet_.Save(fs)) CHECK(false); + if (0 > role_alphabet_.Save(fs)) CHECK(false); + if (0 > relation_path_alphabet_.Save(fs)) CHECK(false); + if (0 > pos_path_alphabet_.Save(fs)) CHECK(false); + bool success; + int length = (int)lemma_predicates_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < lemma_predicates_.size(); ++i) { + length = (int)lemma_predicates_[i].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < lemma_predicates_[i].size(); ++j) { + lemma_predicates_[i][j]->Save(fs); + } + } + CHECK_EQ(deterministic_roles_.size(), GetNumRoles()); + length = (int)deterministic_roles_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < deterministic_roles_.size(); ++i) { + bool deterministic = deterministic_roles_[i]; + success = WriteBool(fs, deterministic); + CHECK(success); + } + length = (int)existing_roles_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < existing_roles_.size(); ++i) { + length = (int)existing_roles_[i].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < existing_roles_[i].size(); ++j) { + length = (int)existing_roles_[i][j].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int k = 0; k < existing_roles_[i][j].size(); ++k) { + int label = existing_roles_[i][j][k]; + success = WriteInteger(fs, label); + CHECK(success); + } + int distance; + distance = maximum_left_distances_[i][j]; + success = WriteInteger(fs, distance); + CHECK(success); + distance = maximum_right_distances_[i][j]; + success = WriteInteger(fs, distance); + CHECK(success); + } + } + length = (int)existing_roles_with_relation_path_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < existing_roles_with_relation_path_.size(); ++i) { + length = (int)existing_roles_with_relation_path_[i].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int k = 0; k < existing_roles_with_relation_path_[i].size(); ++k) { + int label = existing_roles_with_relation_path_[i][k]; + success = WriteInteger(fs, label); + CHECK(success); + } + } + length = (int)frequent_role_pairs_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (set::iterator it = frequent_role_pairs_.begin(); + it != frequent_role_pairs_.end(); + ++it) { + int label_bigram = *it; + success = WriteInteger(fs, label_bigram); + CHECK(success); + } + } + + void Load(FILE *fs) { + if (0 > predicate_alphabet_.Load(fs)) CHECK(false); + if (0 > role_alphabet_.Load(fs)) CHECK(false); + if (0 > relation_path_alphabet_.Load(fs)) CHECK(false); + if (0 > pos_path_alphabet_.Load(fs)) CHECK(false); + bool success; + int length; + success = ReadInteger(fs, &length); + CHECK(success); + lemma_predicates_.resize(length); + for (int i = 0; i < lemma_predicates_.size(); ++i) { + success = ReadInteger(fs, &length); + CHECK(success); + lemma_predicates_[i].resize(length); + for (int j = 0; j < lemma_predicates_[i].size(); ++j) { + lemma_predicates_[i][j] = new SemanticPredicate(); + lemma_predicates_[i][j]->Load(fs); + } + } + success = ReadInteger(fs, &length); + CHECK(success); + deterministic_roles_.resize(length); + CHECK_EQ(deterministic_roles_.size(), GetNumRoles()); + for (int i = 0; i < deterministic_roles_.size(); ++i) { + bool deterministic; + success = ReadBool(fs, &deterministic); + CHECK(success); + deterministic_roles_[i] = deterministic; + } + success = ReadInteger(fs, &length); + CHECK(success); + existing_roles_.resize(length); + maximum_left_distances_.resize(length); + maximum_right_distances_.resize(length); + for (int i = 0; i < existing_roles_.size(); ++i) { + success = ReadInteger(fs, &length); + CHECK(success); + existing_roles_[i].resize(length); + maximum_left_distances_[i].resize(length); + maximum_right_distances_[i].resize(length); + for (int j = 0; j < existing_roles_[i].size(); ++j) { + success = ReadInteger(fs, &length); + CHECK(success); + existing_roles_[i][j].resize(length); + for (int k = 0; k < existing_roles_[i][j].size(); ++k) { + int label; + success = ReadInteger(fs, &label); + CHECK(success); + existing_roles_[i][j][k] = label; + } + int distance; + success = ReadInteger(fs, &distance); + CHECK(success); + maximum_left_distances_[i][j] = distance; + success = ReadInteger(fs, &distance); + CHECK(success); + maximum_right_distances_[i][j] = distance; + } + } + success = ReadInteger(fs, &length); + CHECK(success); + existing_roles_with_relation_path_.resize(length); + for (int i = 0; i < existing_roles_with_relation_path_.size(); ++i) { + success = ReadInteger(fs, &length); + CHECK(success); + existing_roles_with_relation_path_[i].resize(length); + for (int k = 0; k < existing_roles_with_relation_path_[i].size(); ++k) { + int label; + success = ReadInteger(fs, &label); + CHECK(success); + existing_roles_with_relation_path_[i][k] = label; + } + } + success = ReadInteger(fs, &length); + CHECK(success); + frequent_role_pairs_.clear(); + for (int k = 0; k < length; ++k) { + int label_bigram; + success = ReadInteger(fs, &label_bigram); + CHECK(success); + frequent_role_pairs_.insert(label_bigram); + } + BuildPredicateRoleNames(); + } + + Pipe *GetPipe() const { return pipe_; } + + TokenDictionary *GetTokenDictionary() const { return token_dictionary_; } + void SetTokenDictionary(TokenDictionary *token_dictionary) { + token_dictionary_ = token_dictionary; + //CHECK(token_dictionary_ == NULL); + } + + DependencyDictionary *GetDependencyDictionary() const { + return dependency_dictionary_; + } + void SetDependencyDictionary(DependencyDictionary *dependency_dictionary) { + dependency_dictionary_ = dependency_dictionary; + //CHECK(token_dictionary_ == NULL); + } + + const vector &GetExistingRoles(int predicate_pos_id, int argument_pos_id) { + return existing_roles_[predicate_pos_id][argument_pos_id]; + } + + const vector &GetExistingRolesWithRelationPath(int relation_path_id) { + return existing_roles_with_relation_path_[relation_path_id]; + } + + int GetMaximumLeftDistance(int predicate_pos_id, int argument_pos_id) { + return maximum_left_distances_[predicate_pos_id][argument_pos_id]; + } + + int GetMaximumRightDistance(int predicate_pos_id, int argument_pos_id) { + return maximum_right_distances_[predicate_pos_id][argument_pos_id]; + } + + const Alphabet &GetPredicateAlphabet() const { return predicate_alphabet_; }; + const Alphabet &GetRoleAlphabet() const { return role_alphabet_; }; + const Alphabet &GetRelationPathAlphabet() const { + return relation_path_alphabet_; + }; + const Alphabet &GetPosPathAlphabet() const { return pos_path_alphabet_; }; + + void ComputeDependencyPath(SemanticInstance *instance, + int p, int a, + string *relation_path, + string *pos_path) const; + +protected: + int FindLowestCommonAncestor(const vector& heads, int p, int a) const; + +protected: + Pipe *pipe_; + TokenDictionary *token_dictionary_; + DependencyDictionary *dependency_dictionary_; + vector > lemma_predicates_; + Alphabet predicate_alphabet_; + Alphabet role_alphabet_; + Alphabet relation_path_alphabet_; + Alphabet pos_path_alphabet_; + vector deterministic_roles_; + vector > > existing_roles_; + vector > existing_roles_with_relation_path_; + vector > maximum_left_distances_; + vector > maximum_right_distances_; + set frequent_role_pairs_; +}; + +#endif /* SEMANTICDICTIONARY_H_ */ diff --git a/src/semantic_parser/SemanticFeatures.h b/src/semantic_parser/SemanticFeatures.h index 79c2e74..b57be13 100644 --- a/src/semantic_parser/SemanticFeatures.h +++ b/src/semantic_parser/SemanticFeatures.h @@ -1,222 +1,222 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICFEATURES_H_ -#define SEMANTICFEATURES_H_ - -#include "Features.h" -#include "SemanticInstanceNumeric.h" -#include "FeatureEncoder.h" - -class SemanticOptions; - -class SemanticFeatures : public Features { -public: - SemanticFeatures() {}; - SemanticFeatures(Pipe* pipe) { pipe_ = pipe; } - virtual ~SemanticFeatures() { Clear(); } - -public: - void Clear() { - CHECK_EQ(input_features_.size(), input_labeled_features_.size()); - for (int r = 0; r < input_features_.size(); ++r) { - if (input_features_[r]) { - input_features_[r]->clear(); - delete input_features_[r]; - input_features_[r] = NULL; - } - if (input_labeled_features_[r]) { - input_labeled_features_[r]->clear(); - delete input_labeled_features_[r]; - input_labeled_features_[r] = NULL; - } - } - input_features_.clear(); - input_labeled_features_.clear(); - } - - void Initialize(Instance *instance, Parts *parts) { - Clear(); - input_features_.resize(parts->size(), static_cast(NULL)); - input_labeled_features_.resize(parts->size(), - static_cast(NULL)); - } - - int GetNumPartFeatures(int r) const { - return (NULL == input_features_[r]) ? 0 : input_features_[r]->size(); - }; - - int GetNumLabeledPartFeatures(int r) const { - return (NULL == input_labeled_features_[r]) ? - 0 : input_labeled_features_[r]->size(); - }; - - int GetPartFeature(int r, int j) const { - return (*input_features_[r])[j]; - } - - int GetLabeledPartFeature(int r, int j) const { - return (*input_labeled_features_[r])[j]; - } - - const BinaryFeatures &GetPartFeatures(int r) const { - CHECK(input_features_[r] != NULL); - return *(input_features_[r]); - }; - - const BinaryFeatures &GetLabeledPartFeatures(int r) const { - CHECK(input_labeled_features_[r] != NULL); - return *(input_labeled_features_[r]); - }; - - BinaryFeatures *GetMutablePartFeatures(int r) const { - return input_features_[r]; - }; - - BinaryFeatures *GetMutableLabeledPartFeatures(int r) const { - return input_labeled_features_[r]; - }; - -public: - void AddPredicateFeatures(SemanticInstanceNumeric *sentence, - int r, - int predicate, - int predicate_id); - - void AddArcFeatures(SemanticInstanceNumeric *sentence, - int r, - int predicate, - int argument, - int predicate_id); - - void AddLabeledArcFeatures(SemanticInstanceNumeric *sentence, - int r, - int predicate, - int argument, - int predicate_id); - - void AddArbitrarySiblingFeatures(SemanticInstanceNumeric* sentence, - int r, - int predicate, - int sense, - int first_argument, - int second_argument); - - void AddArbitraryLabeledSiblingFeatures(SemanticInstanceNumeric* sentence, - int r, - int predicate, - int sense, - int first_argument, - int second_argument); - - void AddConsecutiveSiblingFeatures(SemanticInstanceNumeric* sentence, - int r, - int predicate, - int sense, - int first_argument, - int second_argument); - - void AddGrandparentFeatures(SemanticInstanceNumeric* sentence, - int r, - int grandparent_predicate, - int grandparent_sense, - int predicate, - int sense, - int argument); - - void AddCoparentFeatures(SemanticInstanceNumeric* sentence, - int r, - int first_predicate, - int first_sense, - int second_predicate, - int second_sense, - int argument); - - void AddConsecutiveCoparentFeatures(SemanticInstanceNumeric* sentence, - int r, - int first_predicate, - int first_sense, - int second_predicate, - int second_sense, - int argument); - - void AddSecondOrderFeatures(SemanticInstanceNumeric* sentence, - int r, - int first_predicate, - int first_sense, - int second_predicate, - int second_sense, - int argument, - bool coparents, - bool consecutive); - -#if 0 - void AddGrandSiblingFeatures(SemanticInstanceNumeric* sentence, - int r, - int grandparent, - int head, - int modifier, - int sibling); - - void AddTriSiblingFeatures(SemanticInstanceNumeric* sentence, - int r, - int head, - int modifier, - int sibling, - int other_sibling); -#endif - -protected: - void AddPredicateFeatures(SemanticInstanceNumeric *sentence, - bool labeled, - uint8_t feature_type, - int r, - int predicate, - int predicate_id); - - void AddArcFeatures(SemanticInstanceNumeric *sentence, - bool labeled, - int r, - int predicate, - int argument, - int predicate_id); - - void AddSiblingFeatures(SemanticInstanceNumeric* sentence, - bool labeled, - int r, - int predicate, - int sense, - int first_argument, - int second_argument, - bool consecutive); - - void AddFeature(uint64_t fkey, BinaryFeatures* features) { - features->push_back(fkey); - } - -protected: - // Vector of input features. - vector input_features_; - // Vector of input features to be conjoined with a label to produce a - // "labeled" feature. - vector input_labeled_features_; - // Encoder that converts features into a codeword. - FeatureEncoder encoder_; -}; - -#endif /* SEMANTICFEATURES_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICFEATURES_H_ +#define SEMANTICFEATURES_H_ + +#include "Features.h" +#include "SemanticInstanceNumeric.h" +#include "FeatureEncoder.h" + +class SemanticOptions; + +class SemanticFeatures : public Features { +public: + SemanticFeatures() {}; + SemanticFeatures(Pipe* pipe) { pipe_ = pipe; } + virtual ~SemanticFeatures() { Clear(); } + +public: + void Clear() { + CHECK_EQ(input_features_.size(), input_labeled_features_.size()); + for (int r = 0; r < input_features_.size(); ++r) { + if (input_features_[r]) { + input_features_[r]->clear(); + delete input_features_[r]; + input_features_[r] = NULL; + } + if (input_labeled_features_[r]) { + input_labeled_features_[r]->clear(); + delete input_labeled_features_[r]; + input_labeled_features_[r] = NULL; + } + } + input_features_.clear(); + input_labeled_features_.clear(); + } + + void Initialize(Instance *instance, Parts *parts) { + Clear(); + input_features_.resize(parts->size(), static_cast(NULL)); + input_labeled_features_.resize(parts->size(), + static_cast(NULL)); + } + + int GetNumPartFeatures(int r) const { + return (NULL == input_features_[r]) ? 0 : (int)(input_features_[r]->size()); + }; + + int GetNumLabeledPartFeatures(int r) const { + return (NULL == input_labeled_features_[r]) ? + 0 : (int)(input_labeled_features_[r]->size()); + }; + + int GetPartFeature(int r, int j) const { + return (*input_features_[r])[j]; + } + + int GetLabeledPartFeature(int r, int j) const { + return (*input_labeled_features_[r])[j]; + } + + const BinaryFeatures &GetPartFeatures(int r) const { + CHECK(input_features_[r] != NULL); + return *(input_features_[r]); + }; + + const BinaryFeatures &GetLabeledPartFeatures(int r) const { + CHECK(input_labeled_features_[r] != NULL); + return *(input_labeled_features_[r]); + }; + + BinaryFeatures *GetMutablePartFeatures(int r) const { + return input_features_[r]; + }; + + BinaryFeatures *GetMutableLabeledPartFeatures(int r) const { + return input_labeled_features_[r]; + }; + +public: + void AddPredicateFeatures(SemanticInstanceNumeric *sentence, + int r, + int predicate, + int predicate_id); + + void AddArcFeatures(SemanticInstanceNumeric *sentence, + int r, + int predicate, + int argument, + int predicate_id); + + void AddLabeledArcFeatures(SemanticInstanceNumeric *sentence, + int r, + int predicate, + int argument, + int predicate_id); + + void AddArbitrarySiblingFeatures(SemanticInstanceNumeric* sentence, + int r, + int predicate, + int sense, + int first_argument, + int second_argument); + + void AddArbitraryLabeledSiblingFeatures(SemanticInstanceNumeric* sentence, + int r, + int predicate, + int sense, + int first_argument, + int second_argument); + + void AddConsecutiveSiblingFeatures(SemanticInstanceNumeric* sentence, + int r, + int predicate, + int sense, + int first_argument, + int second_argument); + + void AddGrandparentFeatures(SemanticInstanceNumeric* sentence, + int r, + int grandparent_predicate, + int grandparent_sense, + int predicate, + int sense, + int argument); + + void AddCoparentFeatures(SemanticInstanceNumeric* sentence, + int r, + int first_predicate, + int first_sense, + int second_predicate, + int second_sense, + int argument); + + void AddConsecutiveCoparentFeatures(SemanticInstanceNumeric* sentence, + int r, + int first_predicate, + int first_sense, + int second_predicate, + int second_sense, + int argument); + + void AddSecondOrderFeatures(SemanticInstanceNumeric* sentence, + int r, + int first_predicate, + int first_sense, + int second_predicate, + int second_sense, + int argument, + bool coparents, + bool consecutive); + +#if 0 + void AddGrandSiblingFeatures(SemanticInstanceNumeric* sentence, + int r, + int grandparent, + int head, + int modifier, + int sibling); + + void AddTriSiblingFeatures(SemanticInstanceNumeric* sentence, + int r, + int head, + int modifier, + int sibling, + int other_sibling); +#endif + +protected: + void AddPredicateFeatures(SemanticInstanceNumeric *sentence, + bool labeled, + uint8_t feature_type, + int r, + int predicate, + int predicate_id); + + void AddArcFeatures(SemanticInstanceNumeric *sentence, + bool labeled, + int r, + int predicate, + int argument, + int predicate_id); + + void AddSiblingFeatures(SemanticInstanceNumeric* sentence, + bool labeled, + int r, + int predicate, + int sense, + int first_argument, + int second_argument, + bool consecutive); + + void AddFeature(uint64_t fkey, BinaryFeatures* features) { + features->push_back(fkey); + } + +protected: + // Vector of input features. + vector input_features_; + // Vector of input features to be conjoined with a label to produce a + // "labeled" feature. + vector input_labeled_features_; + // Encoder that converts features into a codeword. + FeatureEncoder encoder_; +}; + +#endif /* SEMANTICFEATURES_H_ */ diff --git a/src/semantic_parser/SemanticInstance.h b/src/semantic_parser/SemanticInstance.h index d4c69c1..36ddb56 100644 --- a/src/semantic_parser/SemanticInstance.h +++ b/src/semantic_parser/SemanticInstance.h @@ -1,96 +1,96 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICINSTANCE_H_ -#define SEMANTICINSTANCE_H_ - -#include -#include -#include "DependencyInstance.h" -#include - -class SemanticInstance : public DependencyInstance { -public: - SemanticInstance() {}; - virtual ~SemanticInstance() {}; - - Instance* Copy() { - SemanticInstance* instance = new SemanticInstance(); - instance->Initialize(name_, forms_, lemmas_, cpostags_, postags_, - feats_, deprels_, heads_, - predicate_names_, predicate_indices_, - argument_roles_, argument_indices_); - return static_cast(instance); - } - - void Initialize(const string &name, - const vector &forms, - const vector &lemmas, - const vector &cpos, - const vector &pos, - const vector > &feats, - const vector &deprels, - const vector &heads, - const vector &predicate_names, - const vector &predicate_indices, - const vector > &argument_roles, - const vector > &argument_indices); - - const string &GetName() { return name_; } - int GetNumPredicates() { return predicate_names_.size(); } - const string &GetPredicateName(int k) { return predicate_names_[k]; } - int GetPredicateIndex(int k) { return predicate_indices_[k]; } - int GetNumArgumentsPredicate(int k) { return argument_roles_[k].size(); } - const string &GetArgumentRole(int k, int l) { return argument_roles_[k][l]; } - int GetArgumentIndex(int k, int l) { return argument_indices_[k][l]; } - - void ClearPredicates() { - predicate_names_.clear(); - predicate_indices_.clear(); - for (int p = 0; p < argument_roles_.size(); ++p) { - argument_indices_[p].clear(); - argument_roles_[p].clear(); - } - argument_indices_.clear(); - argument_roles_.clear(); - } - - void AddPredicate(const string& predicate_name, - int predicate_index, - const vector &argument_roles, - const vector &argument_indices) { - predicate_names_.push_back(predicate_name); - predicate_indices_.push_back(predicate_index); - argument_roles_.push_back(argument_roles); - argument_indices_.push_back(argument_indices); - } - -protected: - // Name of the sentence (e.g. "#2000001"). - string name_; - // Names of the predicates (e.g. "take.01"). - vector predicate_names_; - // Positions of each predicate in the sentence. - vector predicate_indices_; - // Labels of each predicate's arguments (semantic roles). - vector > argument_roles_; - // Positions of each predicate's arguments. - vector > argument_indices_; -}; - -#endif /* SEMANTICINSTANCE_H_*/ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICINSTANCE_H_ +#define SEMANTICINSTANCE_H_ + +#include +#include +#include "DependencyInstance.h" +#include + +class SemanticInstance : public DependencyInstance { +public: + SemanticInstance() {}; + virtual ~SemanticInstance() {}; + + Instance* Copy() { + SemanticInstance* instance = new SemanticInstance(); + instance->Initialize(name_, forms_, lemmas_, cpostags_, postags_, + feats_, deprels_, heads_, + predicate_names_, predicate_indices_, + argument_roles_, argument_indices_); + return static_cast(instance); + } + + void Initialize(const string &name, + const vector &forms, + const vector &lemmas, + const vector &cpos, + const vector &pos, + const vector > &feats, + const vector &deprels, + const vector &heads, + const vector &predicate_names, + const vector &predicate_indices, + const vector > &argument_roles, + const vector > &argument_indices); + + const string &GetName() { return name_; } + int GetNumPredicates() { return (int) predicate_names_.size(); } + const string &GetPredicateName(int k) { return predicate_names_[k]; } + int GetPredicateIndex(int k) { return predicate_indices_[k]; } + int GetNumArgumentsPredicate(int k) { return (int) argument_roles_[k].size(); } + const string &GetArgumentRole(int k, int l) { return argument_roles_[k][l]; } + int GetArgumentIndex(int k, int l) { return argument_indices_[k][l]; } + + void ClearPredicates() { + predicate_names_.clear(); + predicate_indices_.clear(); + for (int p = 0; p < argument_roles_.size(); ++p) { + argument_indices_[p].clear(); + argument_roles_[p].clear(); + } + argument_indices_.clear(); + argument_roles_.clear(); + } + + void AddPredicate(const string& predicate_name, + int predicate_index, + const vector &argument_roles, + const vector &argument_indices) { + predicate_names_.push_back(predicate_name); + predicate_indices_.push_back(predicate_index); + argument_roles_.push_back(argument_roles); + argument_indices_.push_back(argument_indices); + } + +protected: + // Name of the sentence (e.g. "#2000001"). + string name_; + // Names of the predicates (e.g. "take.01"). + vector predicate_names_; + // Positions of each predicate in the sentence. + vector predicate_indices_; + // Labels of each predicate's arguments (semantic roles). + vector > argument_roles_; + // Positions of each predicate's arguments. + vector > argument_indices_; +}; + +#endif /* SEMANTICINSTANCE_H_*/ diff --git a/src/semantic_parser/SemanticInstanceNumeric.h b/src/semantic_parser/SemanticInstanceNumeric.h index 46be10d..4db148a 100644 --- a/src/semantic_parser/SemanticInstanceNumeric.h +++ b/src/semantic_parser/SemanticInstanceNumeric.h @@ -1,150 +1,150 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICINSTANCENUMERIC_H_ -#define SEMANTICINSTANCENUMERIC_H_ - -#include -#include -#include "Dictionary.h" -#include "DependencyInstanceNumeric.h" -#include "SemanticInstance.h" -#include "SemanticDictionary.h" - -using namespace std; - -class SemanticInstanceNumeric : public DependencyInstanceNumeric { -public: - SemanticInstanceNumeric() {}; - virtual ~SemanticInstanceNumeric() { Clear(); }; - - Instance* Copy() { - CHECK(false) << "Not implemented."; - return NULL; - } - - int size() { return form_ids_.size(); }; - - void Clear() { - DependencyInstanceNumeric::Clear(); - predicate_ids_.clear(); - predicate_indices_.clear(); - for (int j = 0; j < argument_role_ids_.size(); ++j) { - argument_role_ids_[j].clear(); - } - argument_indices_.clear(); - for (int j = 0; j < argument_indices_.size(); ++j) { - argument_indices_[j].clear(); - } - argument_indices_.clear(); - DeleteIndices(); - - // List of dependents, left and right siblings. - for (int h = 0; h < modifiers_.size(); ++h) { - modifiers_[h].clear(); - left_siblings_[h] = -1; - right_siblings_[h] = -1; - } - - // Relation and POS dependency paths. - for (int p = 0; p < relation_path_ids_.size(); ++p) { - relation_path_ids_[p].clear(); - pos_path_ids_[p].clear(); - } - relation_path_ids_.clear(); - pos_path_ids_.clear(); - } - - void Initialize(const SemanticDictionary &dictionary, - SemanticInstance *instance); - - void ComputeDependencyInformation(const SemanticDictionary &dictionary, - SemanticInstance *instance); - - bool ComputePassiveVoice(SemanticInstance *instance, int index); - - void DeleteIndices() { - index_predicates_.clear(); - for (int p = 0; p < index_arcs_.size(); ++p) { - index_arcs_[p].clear(); - } - index_arcs_.clear(); - } - - void BuildIndices() { - DeleteIndices(); - int length = size(); - index_predicates_.resize(length, -1); - index_arcs_.resize(length); - for (int p = 0; p < index_arcs_.size(); ++p) { - index_arcs_[p].resize(length, -1); - } - for (int k = 0; k < GetNumPredicates(); ++k) { - int p = GetPredicateIndex(k); - index_predicates_[p] = k; - for (int l = 0; l < GetNumArgumentsPredicate(k); ++l) { - int a = GetArgumentIndex(k, l); - index_arcs_[p][a] = l; - } - } - } - - const vector &GetPredicateIds() const { return predicate_ids_; } - const vector &GetPredicateIndices() const { return predicate_indices_; } - const vector > &GetArgumentRoleIds() const { - return argument_role_ids_; - } - const vector > &GetArgumentIndices() const { - return argument_indices_; - } - - int GetNumPredicates() { return predicate_ids_.size(); } - int GetPredicateId(int k) { return predicate_ids_[k]; } - int GetPredicateIndex(int k) { return predicate_indices_[k]; } - int GetNumArgumentsPredicate(int k) { return argument_role_ids_[k].size(); } - int GetArgumentRoleId(int k, int l) { return argument_role_ids_[k][l]; } - int GetArgumentIndex(int k, int l) { return argument_indices_[k][l]; } - - int FindPredicate(int p) { return index_predicates_[p]; } - int FindArc(int p, int a) { return index_arcs_[p][a]; } - - bool IsPassiveVoice(int p) { return is_passive_voice_[p]; } - const vector &GetModifiers(int h) { return modifiers_[h]; } - int GetLeftSibling(int h) { return left_siblings_[h]; } - int GetRightSibling(int h) { return right_siblings_[h]; } - int GetRelationPathId(int p, int a) { return relation_path_ids_[p][a]; } - int GetPosPathId(int p, int a) { return pos_path_ids_[p][a]; } - -private: - vector predicate_ids_; - vector predicate_indices_; - vector > argument_role_ids_; - vector > argument_indices_; - vector > relation_path_ids_; - vector > pos_path_ids_; - - vector index_predicates_; - vector > index_arcs_; - - vector > modifiers_; - vector left_siblings_; - vector right_siblings_; - vector is_passive_voice_; -}; - -#endif /* SEMANTICINSTANCENUMERIC_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICINSTANCENUMERIC_H_ +#define SEMANTICINSTANCENUMERIC_H_ + +#include +#include +#include "Dictionary.h" +#include "DependencyInstanceNumeric.h" +#include "SemanticInstance.h" +#include "SemanticDictionary.h" + +using namespace std; + +class SemanticInstanceNumeric : public DependencyInstanceNumeric { +public: + SemanticInstanceNumeric() {}; + virtual ~SemanticInstanceNumeric() { Clear(); }; + + Instance* Copy() { + CHECK(false) << "Not implemented."; + return NULL; + } + + int size() { return (int)form_ids_.size(); }; + + void Clear() { + DependencyInstanceNumeric::Clear(); + predicate_ids_.clear(); + predicate_indices_.clear(); + for (int j = 0; j < argument_role_ids_.size(); ++j) { + argument_role_ids_[j].clear(); + } + argument_indices_.clear(); + for (int j = 0; j < argument_indices_.size(); ++j) { + argument_indices_[j].clear(); + } + argument_indices_.clear(); + DeleteIndices(); + + // List of dependents, left and right siblings. + for (int h = 0; h < modifiers_.size(); ++h) { + modifiers_[h].clear(); + left_siblings_[h] = -1; + right_siblings_[h] = -1; + } + + // Relation and POS dependency paths. + for (int p = 0; p < relation_path_ids_.size(); ++p) { + relation_path_ids_[p].clear(); + pos_path_ids_[p].clear(); + } + relation_path_ids_.clear(); + pos_path_ids_.clear(); + } + + void Initialize(const SemanticDictionary &dictionary, + SemanticInstance *instance); + + void ComputeDependencyInformation(const SemanticDictionary &dictionary, + SemanticInstance *instance); + + bool ComputePassiveVoice(SemanticInstance *instance, int index); + + void DeleteIndices() { + index_predicates_.clear(); + for (int p = 0; p < index_arcs_.size(); ++p) { + index_arcs_[p].clear(); + } + index_arcs_.clear(); + } + + void BuildIndices() { + DeleteIndices(); + int length = size(); + index_predicates_.resize(length, -1); + index_arcs_.resize(length); + for (int p = 0; p < index_arcs_.size(); ++p) { + index_arcs_[p].resize(length, -1); + } + for (int k = 0; k < GetNumPredicates(); ++k) { + int p = GetPredicateIndex(k); + index_predicates_[p] = k; + for (int l = 0; l < GetNumArgumentsPredicate(k); ++l) { + int a = GetArgumentIndex(k, l); + index_arcs_[p][a] = l; + } + } + } + + const vector &GetPredicateIds() const { return predicate_ids_; } + const vector &GetPredicateIndices() const { return predicate_indices_; } + const vector > &GetArgumentRoleIds() const { + return argument_role_ids_; + } + const vector > &GetArgumentIndices() const { + return argument_indices_; + } + + int GetNumPredicates() { return (int) predicate_ids_.size(); } + int GetPredicateId(int k) { return predicate_ids_[k]; } + int GetPredicateIndex(int k) { return predicate_indices_[k]; } + int GetNumArgumentsPredicate(int k) { return (int) argument_role_ids_[k].size(); } + int GetArgumentRoleId(int k, int l) { return argument_role_ids_[k][l]; } + int GetArgumentIndex(int k, int l) { return argument_indices_[k][l]; } + + int FindPredicate(int p) { return index_predicates_[p]; } + int FindArc(int p, int a) { return index_arcs_[p][a]; } + + bool IsPassiveVoice(int p) { return is_passive_voice_[p]; } + const vector &GetModifiers(int h) { return modifiers_[h]; } + int GetLeftSibling(int h) { return left_siblings_[h]; } + int GetRightSibling(int h) { return right_siblings_[h]; } + int GetRelationPathId(int p, int a) { return relation_path_ids_[p][a]; } + int GetPosPathId(int p, int a) { return pos_path_ids_[p][a]; } + +private: + vector predicate_ids_; + vector predicate_indices_; + vector > argument_role_ids_; + vector > argument_indices_; + vector > relation_path_ids_; + vector > pos_path_ids_; + + vector index_predicates_; + vector > index_arcs_; + + vector > modifiers_; + vector left_siblings_; + vector right_siblings_; + vector is_passive_voice_; +}; + +#endif /* SEMANTICINSTANCENUMERIC_H_ */ diff --git a/src/semantic_parser/SemanticPart.h b/src/semantic_parser/SemanticPart.h index 3eca8b4..76567f7 100644 --- a/src/semantic_parser/SemanticPart.h +++ b/src/semantic_parser/SemanticPart.h @@ -1,605 +1,605 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICPART_H_ -#define SEMANTICPART_H_ - -#include -#include -#include "Part.h" - -using namespace std; - -enum { - SEMANTICPART_PREDICATE = 0, - SEMANTICPART_ARC, - SEMANTICPART_LABELEDARC, - SEMANTICPART_ARGUMENT, - SEMANTICPART_SIBLING, - SEMANTICPART_LABELEDSIBLING, - SEMANTICPART_CONSECUTIVESIBLING, - SEMANTICPART_GRANDPARENT, - SEMANTICPART_COPARENT, - SEMANTICPART_CONSECUTIVECOPARENT, - NUM_SEMANTICPARTS -}; - -// Part for an unlabeled arc linking a predicate and an argument word. -class SemanticPartArc : public Part { -public: - SemanticPartArc() { p_ = a_ = s_ = -1; } - SemanticPartArc(int predicate, int argument, int sense) : - p_(predicate), a_(argument), s_(sense) {} - virtual ~SemanticPartArc() {} - -public: - int predicate() { return p_; } - int argument() { return a_; } - int sense() { return s_; } - -public: - int type() { return SEMANTICPART_ARC; } - -private: - int p_; // Index of the predicate. - int a_; // Index of the argument. - int s_; // Predicate sense. -}; - -// Part for a labeled arc linking a predicate and an argument word. -class SemanticPartLabeledArc : public Part { -public: - SemanticPartLabeledArc() { p_ = a_ = s_ = r_ = -1; } - SemanticPartLabeledArc(int predicate, int argument, int sense, int role) : - p_(predicate), a_(argument), s_(sense), r_(role) {} - virtual ~SemanticPartLabeledArc() {} - -public: - int predicate() { return p_; } - int argument() { return a_; } - int sense() { return s_; } - int role() { return r_; } - -public: - int type() { return SEMANTICPART_LABELEDARC; } - -private: - int p_; // Index of the predicate. - int a_; // Index of the argument. - int s_; // Predicate sense. - int r_; // Role label. -}; - -// Part for the event that a word is a predicate. -class SemanticPartPredicate : public Part { -public: - SemanticPartPredicate() { p_ = -1; s_ = -1; } - SemanticPartPredicate(int predicate, int sense) : - p_(predicate), s_(sense) {} - virtual ~SemanticPartPredicate() {} - -public: - int predicate() { return p_; } - int sense() { return s_; } - -public: - int type() { return SEMANTICPART_PREDICATE; } - -private: - int p_; // Index of the predicate. - int s_; // Index of the sense. -}; - -// Part for the event that a word is an argument of at least one predicate. -class SemanticPartArgument : public Part { -public: - SemanticPartArgument() { a_ = -1; } - SemanticPartArgument(int argument) : - a_(argument) {} - virtual ~SemanticPartArgument() {} - -public: - int argument() { return a_; } - -public: - int type() { return SEMANTICPART_ARGUMENT; } - -private: - int a_; // Index of the argument. -}; - -class SemanticPartSibling : public Part { -public: - SemanticPartSibling() { p_ = s_ = a1_ = a2_ = -1; }; - SemanticPartSibling(int predicate, int sense, int first_argument, - int second_argument) { - p_ = predicate; - s_ = sense; - a1_ = first_argument; - a2_ = second_argument; - } - virtual ~SemanticPartSibling() {}; - -public: - int type() { return SEMANTICPART_SIBLING; }; - -public: - int predicate() { return p_; }; - int sense() { return s_; }; - int first_argument() { return a1_; }; - int second_argument() { return a2_; }; - -private: - int p_; // Index of the predicate. - int s_; // Index of the sense. - int a1_; // Index of the first argument. - int a2_; // Index of the second_argument. -}; - -class SemanticPartConsecutiveSibling : public Part { -public: - SemanticPartConsecutiveSibling() { p_ = s_ = a1_ = a2_ = -1; }; - SemanticPartConsecutiveSibling(int predicate, int sense, int first_argument, - int second_argument) { - p_ = predicate; - s_ = sense; - a1_ = first_argument; - a2_ = second_argument; - } - virtual ~SemanticPartConsecutiveSibling() {}; - -public: - int type() { return SEMANTICPART_CONSECUTIVESIBLING; }; - -public: - int predicate() { return p_; }; - int sense() { return s_; }; - int first_argument() { return a1_; }; - int second_argument() { return a2_; }; - -private: - int p_; // Index of the predicate. - int s_; // Index of the sense. - int a1_; // Index of the first argument (or -1 for a2_ being the first child). - int a2_; // Index of the second_argument (or -1 for a1_ being the last child). -}; - -class SemanticPartGrandparent : public Part { -public: - SemanticPartGrandparent() { g_ = t_ = p_ = s_ = a_ = -1; }; - SemanticPartGrandparent(int grandparent_predicate, int grandparent_sense, - int predicate, int sense, int argument) { - g_ = grandparent_predicate; - t_ = grandparent_sense; - p_ = predicate; - s_ = sense; - a_ = argument; - } - virtual ~SemanticPartGrandparent() {}; - -public: - int type() { return SEMANTICPART_GRANDPARENT; }; - -public: - int grandparent_predicate() { return g_; }; - int grandparent_sense() { return t_; }; - int predicate() { return p_; }; - int sense() { return s_; }; - int argument() { return a_; }; - -private: - int g_; // Index of the grandparent predicate. - int t_; // Index of the grandparent sense. - int p_; // Index of the predicate. - int s_; // Index of the sense. - int a_; // Index of the argument. -}; - -class SemanticPartCoparent : public Part { -public: - SemanticPartCoparent() { p1_ = s1_ = p2_ = s2_ = a_ = -1; }; - SemanticPartCoparent(int first_predicate, int first_sense, - int second_predicate, int second_sense, - int argument) { - p1_ = first_predicate; - s1_ = first_sense; - p2_ = second_predicate; - s2_ = second_sense; - a_ = argument; - } - virtual ~SemanticPartCoparent() {}; - -public: - int type() { return SEMANTICPART_COPARENT; }; - -public: - int first_predicate() { return p1_; }; - int first_sense() { return s1_; }; - int second_predicate() { return p2_; }; - int second_sense() { return s2_; }; - int argument() { return a_; }; - -private: - int p1_; // Index of the first predicate. - int s1_; // Index of the first sense. - int p2_; // Index of the second predicate. - int s2_; // Index of the second sense. - int a_; // Index of the argument. -}; - -class SemanticPartConsecutiveCoparent : public Part { -public: - SemanticPartConsecutiveCoparent() { p1_ = s1_ = p2_ = s2_ = a_ = -1; }; - SemanticPartConsecutiveCoparent(int first_predicate, int first_sense, - int second_predicate, int second_sense, - int argument) { - p1_ = first_predicate; - s1_ = first_sense; - p2_ = second_predicate; - s2_ = second_sense; - a_ = argument; - } - virtual ~SemanticPartConsecutiveCoparent() {}; - -public: - int type() { return SEMANTICPART_CONSECUTIVECOPARENT; }; - -public: - int first_predicate() { return p1_; }; - int first_sense() { return s1_; }; - int second_predicate() { return p2_; }; - int second_sense() { return s2_; }; - int argument() { return a_; }; - -private: - int p1_; // Index of the first predicate (or -1 for p2_ being the first). - int s1_; // Index of the first sense. - int p2_; // Index of the second predicate (or -1 for p1_ being the last). - int s2_; // Index of the second sense. - int a_; // Index of the argument. -}; - -class SemanticPartLabeledSibling : public Part { -public: - SemanticPartLabeledSibling() { p_ = s_ = a1_ = a2_ = r1_ = r2_ = -1; }; - SemanticPartLabeledSibling(int predicate, int sense, int first_argument, - int second_argument, int first_role, - int second_role) { - p_ = predicate; - s_ = sense; - a1_ = first_argument; - a2_ = second_argument; - r1_ = first_role; - r2_ = second_role; - } - virtual ~SemanticPartLabeledSibling() {}; - -public: - int type() { return SEMANTICPART_LABELEDSIBLING; }; - -public: - int predicate() { return p_; }; - int sense() { return s_; }; - int first_argument() { return a1_; }; - int second_argument() { return a2_; }; - int first_role() { return r1_; }; - int second_role() { return r2_; }; - -private: - int p_; // Index of the predicate. - int s_; // Index of the sense. - int a1_; // Index of the first argument. - int a2_; // Index of the second_argument. - int r1_; // First argument's role label. - int r2_; // Second_argument's role label. -}; - -class SemanticParts : public Parts { -public: - SemanticParts() {}; - virtual ~SemanticParts() { DeleteAll(); }; - - void Initialize() { - DeleteAll(); - for (int i = 0; i < NUM_SEMANTICPARTS; ++i) { - offsets_[i] = -1; - } - for (int r = 0; r < all_labeled_parts_.size(); ++r) { - all_labeled_parts_[r].clear(); - } - all_labeled_parts_.clear(); - } - - Part *CreatePartArc(int predicate, int argument, int sense) { - return new SemanticPartArc(predicate, argument, sense); - } - Part *CreatePartLabeledArc(int predicate, int argument, int sense, int role) { - return new SemanticPartLabeledArc(predicate, argument, sense, role); - } - Part *CreatePartPredicate(int predicate, int sense) { - return new SemanticPartPredicate(predicate, sense); - } - Part *CreatePartArgument(int argument) { - return new SemanticPartArgument(argument); - } - Part *CreatePartSibling(int predicate, - int sense, - int first_argument, - int second_argument) { - return new SemanticPartSibling(predicate, sense, first_argument, - second_argument); - } - Part *CreatePartLabeledSibling(int predicate, - int sense, - int first_argument, - int second_argument, - int first_role, - int second_role) { - return new SemanticPartLabeledSibling(predicate, sense, first_argument, - second_argument, first_role, - second_role); - } - Part *CreatePartConsecutiveSibling(int predicate, - int sense, - int first_argument, - int second_argument) { - return new SemanticPartConsecutiveSibling(predicate, sense, first_argument, - second_argument); - } - Part *CreatePartGrandparent(int grandparent_predicate, - int grandparent_sense, - int predicate, - int sense, - int argument) { - return new SemanticPartGrandparent(grandparent_predicate, grandparent_sense, - predicate, sense, argument); - } - Part *CreatePartCoparent(int first_predicate, - int first_sense, - int second_predicate, - int second_sense, - int argument) { - return new SemanticPartCoparent(first_predicate, first_sense, - second_predicate, second_sense, - argument); - } - Part *CreatePartConsecutiveCoparent(int first_predicate, - int first_sense, - int second_predicate, - int second_sense, - int argument) { - return new SemanticPartConsecutiveCoparent(first_predicate, first_sense, - second_predicate, second_sense, - argument); - } - - // Append a part to the array of parts. Return the index. - int AddPart(Part *part) { - int r = size(); - push_back(part); - all_labeled_parts_.push_back(vector(0)); - //LOG(INFO) << "Adding part #" << r << " with type " << part->type(); - CHECK_EQ(size(), all_labeled_parts_.size()); - return r; - } - - // Append a "labeled" part to the array of parts, providing the corresponding - // index of the unlabeled version of the part. Return the index. - int AddLabeledPart(Part *part, int unlabeled_part_index) { - int r = AddPart(part); - if (unlabeled_part_index >= 0) { - CHECK_LT(unlabeled_part_index, all_labeled_parts_.size()); - all_labeled_parts_[unlabeled_part_index].push_back(r); - } - return r; - } - - // Resize (necessary after pruning). - void Resize(int num_parts) { - resize(num_parts); - all_labeled_parts_.resize(num_parts); - } - -public: - void DeleteAll(); - -public: - void BuildIndices(int sentence_length, bool labeled); - void DeleteIndices(); - const vector &GetSenses(int predicate) { - return index_senses_[predicate]; - } - // Find an unlabeled arc (fast). - int FindArc(int predicate, int argument, int sense) { - CHECK_GE(predicate, 0); - CHECK_GE(argument, 0); - CHECK_GE(sense, 0); - CHECK_LT(predicate, index_.size()); - CHECK_LT(argument, index_[predicate].size()); - if (sense >= index_[predicate][argument].size()) { - return -1; - } - return index_[predicate][argument][sense]; - } - // Find a labeled arc (this may be rather slow, since we're not indexing the - // labels). - int FindLabeledArc(int predicate, int argument, int sense, int role) { - const vector &index_labeled = FindLabeledArcs(predicate, - argument, - sense); - for (int k = 0; k < index_labeled.size(); ++k) { - SemanticPartLabeledArc *labeled_arc = - static_cast((*this)[index_labeled[k]]); - if (labeled_arc->role() == role) return index_labeled[k]; - } - return -1; - } - // Find all labeled arcs (fast). - const vector &FindLabeledArcs(int predicate, int argument, int sense) { - CHECK_GE(predicate, 0); - CHECK_GE(argument, 0); - CHECK_GE(sense, 0); - CHECK_LT(predicate, index_labeled_.size()); - CHECK_LT(argument, index_labeled_[predicate].size()); - CHECK_LT(sense, index_labeled_[predicate][argument].size()); - //if (sense >= index_labeled_[predicate][argument].size()) { - // return -1; - //} - return index_labeled_[predicate][argument][sense]; - } - - // Given an "unlabeled" part (indexed by r), get/set the corresponding indices - // of the labeled parts. - const vector &GetLabeledParts(int r) { - CHECK_GE(r, 0); - CHECK_LT(r, size()); - CHECK_EQ(size(), all_labeled_parts_.size()); - return all_labeled_parts_[r]; - } - void SetLabeledParts(int r, const vector &labeled_parts) { - all_labeled_parts_[r] = labeled_parts; - } - - // True is model is arc-factored, i.e., all parts are predicate parts or - // unlabeled arcs. - // TODO: change this to incorporate predicate parts. - bool IsArcFactored() { - int offset, num_predicate_parts, num_arcs; - GetOffsetPredicate(&offset, &num_predicate_parts); - GetOffsetArc(&offset, &num_arcs); - return (num_predicate_parts + num_arcs == size()); - } - - // True is model is arc-factored, i.e., all parts are unlabeled and labeled - // arcs. - // TODO: change this to incorporate predicate parts. - bool IsLabeledArcFactored() { - int offset, num_predicate_parts, num_arcs, num_labeled_arcs; - GetOffsetPredicate(&offset, &num_predicate_parts); - GetOffsetArc(&offset, &num_arcs); - GetOffsetLabeledArc(&offset, &num_labeled_arcs); - return (num_predicate_parts + num_arcs + num_labeled_arcs == size()); - } - - // Set/Get offsets: - void ClearOffsets() { - for (int i = 0; i < NUM_SEMANTICPARTS; ++i) { - offsets_[i] = -1; - } - } - - void BuildOffsets() { - for (int i = NUM_SEMANTICPARTS - 1; i >= 0; --i) { - if (offsets_[i] < 0 || offsets_[i] > size()) { - offsets_[i] = (i == NUM_SEMANTICPARTS - 1) ? size() : offsets_[i + 1]; - } - } - }; - - void SetOffsetLabeledArc(int offset, int size) { - SetOffset(SEMANTICPART_LABELEDARC, offset, size); - }; - void SetOffsetArc(int offset, int size) { - SetOffset(SEMANTICPART_ARC, offset, size); - }; - void SetOffsetPredicate(int offset, int size) { - SetOffset(SEMANTICPART_PREDICATE, offset, size); - }; - void SetOffsetArgument(int offset, int size) { - SetOffset(SEMANTICPART_ARGUMENT, offset, size); - }; - void SetOffsetSibling(int offset, int size) { - SetOffset(SEMANTICPART_SIBLING, offset, size); - }; - void SetOffsetLabeledSibling(int offset, int size) { - SetOffset(SEMANTICPART_LABELEDSIBLING, offset, size); - }; - void SetOffsetConsecutiveSibling(int offset, int size) { - SetOffset(SEMANTICPART_CONSECUTIVESIBLING, offset, size); - }; - void SetOffsetGrandparent(int offset, int size) { - SetOffset(SEMANTICPART_GRANDPARENT, offset, size); - }; - void SetOffsetCoparent(int offset, int size) { - SetOffset(SEMANTICPART_COPARENT, offset, size); - }; - void SetOffsetConsecutiveCoparent(int offset, int size) { - SetOffset(SEMANTICPART_CONSECUTIVECOPARENT, offset, size); - }; - - void GetOffsetLabeledArc(int *offset, int *size) const { - GetOffset(SEMANTICPART_LABELEDARC, offset, size); - }; - void GetOffsetArc(int *offset, int *size) const { - GetOffset(SEMANTICPART_ARC, offset, size); - }; - void GetOffsetPredicate(int *offset, int *size) const { - GetOffset(SEMANTICPART_PREDICATE, offset, size); - }; - void GetOffsetArgument(int *offset, int *size) const { - GetOffset(SEMANTICPART_ARGUMENT, offset, size); - }; - void GetOffsetSibling(int *offset, int *size) const { - GetOffset(SEMANTICPART_SIBLING, offset, size); - }; - void GetOffsetLabeledSibling(int *offset, int *size) const { - GetOffset(SEMANTICPART_LABELEDSIBLING, offset, size); - }; - void GetOffsetConsecutiveSibling(int *offset, int *size) const { - GetOffset(SEMANTICPART_CONSECUTIVESIBLING, offset, size); - }; - void GetOffsetGrandparent(int *offset, int *size) const { - GetOffset(SEMANTICPART_GRANDPARENT, offset, size); - }; - void GetOffsetCoparent(int *offset, int *size) const { - GetOffset(SEMANTICPART_COPARENT, offset, size); - }; - void GetOffsetConsecutiveCoparent(int *offset, int *size) const { - GetOffset(SEMANTICPART_CONSECUTIVECOPARENT, offset, size); - }; - -private: - // Get offset from part index. - void GetOffset(int i, int *offset, int *size) const { - *offset = offsets_[i]; - *size = (i < NUM_SEMANTICPARTS - 1) ? offsets_[i + 1] - (*offset) : - SemanticParts::size() - (*offset); - } - - // Set offset from part index. - void SetOffset(int i, int offset, int size) { - offsets_[i] = offset; - if (i < NUM_SEMANTICPARTS - 1) offsets_[i + 1] = offset + size; - } - -private: - // Sense IDs of each predicate. - vector > index_senses_; - // Maps a triple (p, a, s) to a SemanticPartArc index. - vector > > index_; - // Maps a quadruple (p, a, s, r) to a SemanticPartLabeledArc index. - // TODO: maybe replace this index by the general all_labeled_parts_ below? - vector > > > index_labeled_; - // Indices of the labeled parts corresponding to each unlabeled part. - // This vector should have the same size as the number of parts. - vector > all_labeled_parts_; - // Offsets for each part type. - int offsets_[NUM_SEMANTICPARTS]; -}; - -#endif /* SEMANTICPART_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICPART_H_ +#define SEMANTICPART_H_ + +#include +#include +#include "Part.h" + +using namespace std; + +enum { + SEMANTICPART_PREDICATE = 0, + SEMANTICPART_ARC, + SEMANTICPART_LABELEDARC, + SEMANTICPART_ARGUMENT, + SEMANTICPART_SIBLING, + SEMANTICPART_LABELEDSIBLING, + SEMANTICPART_CONSECUTIVESIBLING, + SEMANTICPART_GRANDPARENT, + SEMANTICPART_COPARENT, + SEMANTICPART_CONSECUTIVECOPARENT, + NUM_SEMANTICPARTS +}; + +// Part for an unlabeled arc linking a predicate and an argument word. +class SemanticPartArc : public Part { +public: + SemanticPartArc() { p_ = a_ = s_ = -1; } + SemanticPartArc(int predicate, int argument, int sense) : + p_(predicate), a_(argument), s_(sense) {} + virtual ~SemanticPartArc() {} + +public: + int predicate() { return p_; } + int argument() { return a_; } + int sense() { return s_; } + +public: + int type() { return SEMANTICPART_ARC; } + +private: + int p_; // Index of the predicate. + int a_; // Index of the argument. + int s_; // Predicate sense. +}; + +// Part for a labeled arc linking a predicate and an argument word. +class SemanticPartLabeledArc : public Part { +public: + SemanticPartLabeledArc() { p_ = a_ = s_ = r_ = -1; } + SemanticPartLabeledArc(int predicate, int argument, int sense, int role) : + p_(predicate), a_(argument), s_(sense), r_(role) {} + virtual ~SemanticPartLabeledArc() {} + +public: + int predicate() { return p_; } + int argument() { return a_; } + int sense() { return s_; } + int role() { return r_; } + +public: + int type() { return SEMANTICPART_LABELEDARC; } + +private: + int p_; // Index of the predicate. + int a_; // Index of the argument. + int s_; // Predicate sense. + int r_; // Role label. +}; + +// Part for the event that a word is a predicate. +class SemanticPartPredicate : public Part { +public: + SemanticPartPredicate() { p_ = -1; s_ = -1; } + SemanticPartPredicate(int predicate, int sense) : + p_(predicate), s_(sense) {} + virtual ~SemanticPartPredicate() {} + +public: + int predicate() { return p_; } + int sense() { return s_; } + +public: + int type() { return SEMANTICPART_PREDICATE; } + +private: + int p_; // Index of the predicate. + int s_; // Index of the sense. +}; + +// Part for the event that a word is an argument of at least one predicate. +class SemanticPartArgument : public Part { +public: + SemanticPartArgument() { a_ = -1; } + SemanticPartArgument(int argument) : + a_(argument) {} + virtual ~SemanticPartArgument() {} + +public: + int argument() { return a_; } + +public: + int type() { return SEMANTICPART_ARGUMENT; } + +private: + int a_; // Index of the argument. +}; + +class SemanticPartSibling : public Part { +public: + SemanticPartSibling() { p_ = s_ = a1_ = a2_ = -1; }; + SemanticPartSibling(int predicate, int sense, int first_argument, + int second_argument) { + p_ = predicate; + s_ = sense; + a1_ = first_argument; + a2_ = second_argument; + } + virtual ~SemanticPartSibling() {}; + +public: + int type() { return SEMANTICPART_SIBLING; }; + +public: + int predicate() { return p_; }; + int sense() { return s_; }; + int first_argument() { return a1_; }; + int second_argument() { return a2_; }; + +private: + int p_; // Index of the predicate. + int s_; // Index of the sense. + int a1_; // Index of the first argument. + int a2_; // Index of the second_argument. +}; + +class SemanticPartConsecutiveSibling : public Part { +public: + SemanticPartConsecutiveSibling() { p_ = s_ = a1_ = a2_ = -1; }; + SemanticPartConsecutiveSibling(int predicate, int sense, int first_argument, + int second_argument) { + p_ = predicate; + s_ = sense; + a1_ = first_argument; + a2_ = second_argument; + } + virtual ~SemanticPartConsecutiveSibling() {}; + +public: + int type() { return SEMANTICPART_CONSECUTIVESIBLING; }; + +public: + int predicate() { return p_; }; + int sense() { return s_; }; + int first_argument() { return a1_; }; + int second_argument() { return a2_; }; + +private: + int p_; // Index of the predicate. + int s_; // Index of the sense. + int a1_; // Index of the first argument (or -1 for a2_ being the first child). + int a2_; // Index of the second_argument (or -1 for a1_ being the last child). +}; + +class SemanticPartGrandparent : public Part { +public: + SemanticPartGrandparent() { g_ = t_ = p_ = s_ = a_ = -1; }; + SemanticPartGrandparent(int grandparent_predicate, int grandparent_sense, + int predicate, int sense, int argument) { + g_ = grandparent_predicate; + t_ = grandparent_sense; + p_ = predicate; + s_ = sense; + a_ = argument; + } + virtual ~SemanticPartGrandparent() {}; + +public: + int type() { return SEMANTICPART_GRANDPARENT; }; + +public: + int grandparent_predicate() { return g_; }; + int grandparent_sense() { return t_; }; + int predicate() { return p_; }; + int sense() { return s_; }; + int argument() { return a_; }; + +private: + int g_; // Index of the grandparent predicate. + int t_; // Index of the grandparent sense. + int p_; // Index of the predicate. + int s_; // Index of the sense. + int a_; // Index of the argument. +}; + +class SemanticPartCoparent : public Part { +public: + SemanticPartCoparent() { p1_ = s1_ = p2_ = s2_ = a_ = -1; }; + SemanticPartCoparent(int first_predicate, int first_sense, + int second_predicate, int second_sense, + int argument) { + p1_ = first_predicate; + s1_ = first_sense; + p2_ = second_predicate; + s2_ = second_sense; + a_ = argument; + } + virtual ~SemanticPartCoparent() {}; + +public: + int type() { return SEMANTICPART_COPARENT; }; + +public: + int first_predicate() { return p1_; }; + int first_sense() { return s1_; }; + int second_predicate() { return p2_; }; + int second_sense() { return s2_; }; + int argument() { return a_; }; + +private: + int p1_; // Index of the first predicate. + int s1_; // Index of the first sense. + int p2_; // Index of the second predicate. + int s2_; // Index of the second sense. + int a_; // Index of the argument. +}; + +class SemanticPartConsecutiveCoparent : public Part { +public: + SemanticPartConsecutiveCoparent() { p1_ = s1_ = p2_ = s2_ = a_ = -1; }; + SemanticPartConsecutiveCoparent(int first_predicate, int first_sense, + int second_predicate, int second_sense, + int argument) { + p1_ = first_predicate; + s1_ = first_sense; + p2_ = second_predicate; + s2_ = second_sense; + a_ = argument; + } + virtual ~SemanticPartConsecutiveCoparent() {}; + +public: + int type() { return SEMANTICPART_CONSECUTIVECOPARENT; }; + +public: + int first_predicate() { return p1_; }; + int first_sense() { return s1_; }; + int second_predicate() { return p2_; }; + int second_sense() { return s2_; }; + int argument() { return a_; }; + +private: + int p1_; // Index of the first predicate (or -1 for p2_ being the first). + int s1_; // Index of the first sense. + int p2_; // Index of the second predicate (or -1 for p1_ being the last). + int s2_; // Index of the second sense. + int a_; // Index of the argument. +}; + +class SemanticPartLabeledSibling : public Part { +public: + SemanticPartLabeledSibling() { p_ = s_ = a1_ = a2_ = r1_ = r2_ = -1; }; + SemanticPartLabeledSibling(int predicate, int sense, int first_argument, + int second_argument, int first_role, + int second_role) { + p_ = predicate; + s_ = sense; + a1_ = first_argument; + a2_ = second_argument; + r1_ = first_role; + r2_ = second_role; + } + virtual ~SemanticPartLabeledSibling() {}; + +public: + int type() { return SEMANTICPART_LABELEDSIBLING; }; + +public: + int predicate() { return p_; }; + int sense() { return s_; }; + int first_argument() { return a1_; }; + int second_argument() { return a2_; }; + int first_role() { return r1_; }; + int second_role() { return r2_; }; + +private: + int p_; // Index of the predicate. + int s_; // Index of the sense. + int a1_; // Index of the first argument. + int a2_; // Index of the second_argument. + int r1_; // First argument's role label. + int r2_; // Second_argument's role label. +}; + +class SemanticParts : public Parts { +public: + SemanticParts() {}; + virtual ~SemanticParts() { DeleteAll(); }; + + void Initialize() { + DeleteAll(); + for (int i = 0; i < NUM_SEMANTICPARTS; ++i) { + offsets_[i] = -1; + } + for (int r = 0; r < all_labeled_parts_.size(); ++r) { + all_labeled_parts_[r].clear(); + } + all_labeled_parts_.clear(); + } + + Part *CreatePartArc(int predicate, int argument, int sense) { + return new SemanticPartArc(predicate, argument, sense); + } + Part *CreatePartLabeledArc(int predicate, int argument, int sense, int role) { + return new SemanticPartLabeledArc(predicate, argument, sense, role); + } + Part *CreatePartPredicate(int predicate, int sense) { + return new SemanticPartPredicate(predicate, sense); + } + Part *CreatePartArgument(int argument) { + return new SemanticPartArgument(argument); + } + Part *CreatePartSibling(int predicate, + int sense, + int first_argument, + int second_argument) { + return new SemanticPartSibling(predicate, sense, first_argument, + second_argument); + } + Part *CreatePartLabeledSibling(int predicate, + int sense, + int first_argument, + int second_argument, + int first_role, + int second_role) { + return new SemanticPartLabeledSibling(predicate, sense, first_argument, + second_argument, first_role, + second_role); + } + Part *CreatePartConsecutiveSibling(int predicate, + int sense, + int first_argument, + int second_argument) { + return new SemanticPartConsecutiveSibling(predicate, sense, first_argument, + second_argument); + } + Part *CreatePartGrandparent(int grandparent_predicate, + int grandparent_sense, + int predicate, + int sense, + int argument) { + return new SemanticPartGrandparent(grandparent_predicate, grandparent_sense, + predicate, sense, argument); + } + Part *CreatePartCoparent(int first_predicate, + int first_sense, + int second_predicate, + int second_sense, + int argument) { + return new SemanticPartCoparent(first_predicate, first_sense, + second_predicate, second_sense, + argument); + } + Part *CreatePartConsecutiveCoparent(int first_predicate, + int first_sense, + int second_predicate, + int second_sense, + int argument) { + return new SemanticPartConsecutiveCoparent(first_predicate, first_sense, + second_predicate, second_sense, + argument); + } + + // Append a part to the array of parts. Return the index. + int AddPart(Part *part) { + int r = (int)size(); + push_back(part); + all_labeled_parts_.push_back(vector(0)); + //LOG(INFO) << "Adding part #" << r << " with type " << part->type(); + CHECK_EQ(size(), all_labeled_parts_.size()); + return r; + } + + // Append a "labeled" part to the array of parts, providing the corresponding + // index of the unlabeled version of the part. Return the index. + int AddLabeledPart(Part *part, int unlabeled_part_index) { + int r = AddPart(part); + if (unlabeled_part_index >= 0) { + CHECK_LT(unlabeled_part_index, all_labeled_parts_.size()); + all_labeled_parts_[unlabeled_part_index].push_back(r); + } + return r; + } + + // Resize (necessary after pruning). + void Resize(int num_parts) { + resize(num_parts); + all_labeled_parts_.resize(num_parts); + } + +public: + void DeleteAll(); + +public: + void BuildIndices(int sentence_length, bool labeled); + void DeleteIndices(); + const vector &GetSenses(int predicate) { + return index_senses_[predicate]; + } + // Find an unlabeled arc (fast). + int FindArc(int predicate, int argument, int sense) { + CHECK_GE(predicate, 0); + CHECK_GE(argument, 0); + CHECK_GE(sense, 0); + CHECK_LT(predicate, index_.size()); + CHECK_LT(argument, index_[predicate].size()); + if (sense >= index_[predicate][argument].size()) { + return -1; + } + return index_[predicate][argument][sense]; + } + // Find a labeled arc (this may be rather slow, since we're not indexing the + // labels). + int FindLabeledArc(int predicate, int argument, int sense, int role) { + const vector &index_labeled = FindLabeledArcs(predicate, + argument, + sense); + for (int k = 0; k < index_labeled.size(); ++k) { + SemanticPartLabeledArc *labeled_arc = + static_cast((*this)[index_labeled[k]]); + if (labeled_arc->role() == role) return index_labeled[k]; + } + return -1; + } + // Find all labeled arcs (fast). + const vector &FindLabeledArcs(int predicate, int argument, int sense) { + CHECK_GE(predicate, 0); + CHECK_GE(argument, 0); + CHECK_GE(sense, 0); + CHECK_LT(predicate, index_labeled_.size()); + CHECK_LT(argument, index_labeled_[predicate].size()); + CHECK_LT(sense, index_labeled_[predicate][argument].size()); + //if (sense >= index_labeled_[predicate][argument].size()) { + // return -1; + //} + return index_labeled_[predicate][argument][sense]; + } + + // Given an "unlabeled" part (indexed by r), get/set the corresponding indices + // of the labeled parts. + const vector &GetLabeledParts(int r) { + CHECK_GE(r, 0); + CHECK_LT(r, size()); + CHECK_EQ(size(), all_labeled_parts_.size()); + return all_labeled_parts_[r]; + } + void SetLabeledParts(int r, const vector &labeled_parts) { + all_labeled_parts_[r] = labeled_parts; + } + + // True is model is arc-factored, i.e., all parts are predicate parts or + // unlabeled arcs. + // TODO: change this to incorporate predicate parts. + bool IsArcFactored() { + int offset, num_predicate_parts, num_arcs; + GetOffsetPredicate(&offset, &num_predicate_parts); + GetOffsetArc(&offset, &num_arcs); + return (num_predicate_parts + num_arcs == size()); + } + + // True is model is arc-factored, i.e., all parts are unlabeled and labeled + // arcs. + // TODO: change this to incorporate predicate parts. + bool IsLabeledArcFactored() { + int offset, num_predicate_parts, num_arcs, num_labeled_arcs; + GetOffsetPredicate(&offset, &num_predicate_parts); + GetOffsetArc(&offset, &num_arcs); + GetOffsetLabeledArc(&offset, &num_labeled_arcs); + return (num_predicate_parts + num_arcs + num_labeled_arcs == size()); + } + + // Set/Get offsets: + void ClearOffsets() { + for (int i = 0; i < NUM_SEMANTICPARTS; ++i) { + offsets_[i] = -1; + } + } + + void BuildOffsets() { + for (int i = NUM_SEMANTICPARTS - 1; i >= 0; --i) { + if (offsets_[i] < 0 || offsets_[i] > size()) { + offsets_[i] = (i == NUM_SEMANTICPARTS - 1) ? (int)size() : offsets_[i + 1]; + } + } + }; + + void SetOffsetLabeledArc(int offset, int size) { + SetOffset(SEMANTICPART_LABELEDARC, offset, size); + }; + void SetOffsetArc(int offset, int size) { + SetOffset(SEMANTICPART_ARC, offset, size); + }; + void SetOffsetPredicate(int offset, int size) { + SetOffset(SEMANTICPART_PREDICATE, offset, size); + }; + void SetOffsetArgument(int offset, int size) { + SetOffset(SEMANTICPART_ARGUMENT, offset, size); + }; + void SetOffsetSibling(int offset, int size) { + SetOffset(SEMANTICPART_SIBLING, offset, size); + }; + void SetOffsetLabeledSibling(int offset, int size) { + SetOffset(SEMANTICPART_LABELEDSIBLING, offset, size); + }; + void SetOffsetConsecutiveSibling(int offset, int size) { + SetOffset(SEMANTICPART_CONSECUTIVESIBLING, offset, size); + }; + void SetOffsetGrandparent(int offset, int size) { + SetOffset(SEMANTICPART_GRANDPARENT, offset, size); + }; + void SetOffsetCoparent(int offset, int size) { + SetOffset(SEMANTICPART_COPARENT, offset, size); + }; + void SetOffsetConsecutiveCoparent(int offset, int size) { + SetOffset(SEMANTICPART_CONSECUTIVECOPARENT, offset, size); + }; + + void GetOffsetLabeledArc(int *offset, int *size) const { + GetOffset(SEMANTICPART_LABELEDARC, offset, size); + }; + void GetOffsetArc(int *offset, int *size) const { + GetOffset(SEMANTICPART_ARC, offset, size); + }; + void GetOffsetPredicate(int *offset, int *size) const { + GetOffset(SEMANTICPART_PREDICATE, offset, size); + }; + void GetOffsetArgument(int *offset, int *size) const { + GetOffset(SEMANTICPART_ARGUMENT, offset, size); + }; + void GetOffsetSibling(int *offset, int *size) const { + GetOffset(SEMANTICPART_SIBLING, offset, size); + }; + void GetOffsetLabeledSibling(int *offset, int *size) const { + GetOffset(SEMANTICPART_LABELEDSIBLING, offset, size); + }; + void GetOffsetConsecutiveSibling(int *offset, int *size) const { + GetOffset(SEMANTICPART_CONSECUTIVESIBLING, offset, size); + }; + void GetOffsetGrandparent(int *offset, int *size) const { + GetOffset(SEMANTICPART_GRANDPARENT, offset, size); + }; + void GetOffsetCoparent(int *offset, int *size) const { + GetOffset(SEMANTICPART_COPARENT, offset, size); + }; + void GetOffsetConsecutiveCoparent(int *offset, int *size) const { + GetOffset(SEMANTICPART_CONSECUTIVECOPARENT, offset, size); + }; + +private: + // Get offset from part index. + void GetOffset(int i, int *offset, int *size) const { + *offset = offsets_[i]; + *size = (i < NUM_SEMANTICPARTS - 1) ? offsets_[i + 1] - (*offset) : + (int)SemanticParts::size() - (*offset); + } + + // Set offset from part index. + void SetOffset(int i, int offset, int size) { + offsets_[i] = offset; + if (i < NUM_SEMANTICPARTS - 1) offsets_[i + 1] = offset + size; + } + +private: + // Sense IDs of each predicate. + vector > index_senses_; + // Maps a triple (p, a, s) to a SemanticPartArc index. + vector > > index_; + // Maps a quadruple (p, a, s, r) to a SemanticPartLabeledArc index. + // TODO: maybe replace this index by the general all_labeled_parts_ below? + vector > > > index_labeled_; + // Indices of the labeled parts corresponding to each unlabeled part. + // This vector should have the same size as the number of parts. + vector > all_labeled_parts_; + // Offsets for each part type. + int offsets_[NUM_SEMANTICPARTS]; +}; + +#endif /* SEMANTICPART_H_ */ diff --git a/src/semantic_parser/SemanticPredicate.h b/src/semantic_parser/SemanticPredicate.h index 403ab50..c2a62fa 100644 --- a/src/semantic_parser/SemanticPredicate.h +++ b/src/semantic_parser/SemanticPredicate.h @@ -1,82 +1,82 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEMANTICPREDICATE_H_ -#define SEMANTICPREDICATE_H_ - -#include "SerializationUtils.h" -#include - -class SemanticPredicate { -public: - SemanticPredicate() {} - SemanticPredicate(int id) { id_ = id; } - virtual ~SemanticPredicate() { roles_.clear(); } - -public: - int id() const { return id_; } - const std::set &GetRoles() const { - return roles_; - } - - bool HasRole(int role) const { - std::set::iterator it = roles_.find(role); - return (it != roles_.end()); - } - - void InsertRole(int role) { - CHECK(!HasRole(role)) << "Role existed already."; - roles_.insert(role); - } - - void Save(FILE *fs) { - bool success; - int length = roles_.size(); - success = WriteInteger(fs, id_); - CHECK(success); - success = WriteInteger(fs, length); - CHECK(success); - for (std::set::iterator it = roles_.begin(); - it != roles_.end(); ++it) { - int label = *it; - success = WriteInteger(fs, label); - CHECK(success); - } - } - - void Load(FILE *fs) { - bool success; - int length; - success = ReadInteger(fs, &id_); - CHECK(success); - success = ReadInteger(fs, &length); - CHECK(success); - for (int i = 0; i < length; ++i) { - int label; - success = ReadInteger(fs, &label); - CHECK(success); - InsertRole(label); - } - } - -protected: - int id_; - std::set roles_; -}; - -#endif /* SEMANTICPREDICATE_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEMANTICPREDICATE_H_ +#define SEMANTICPREDICATE_H_ + +#include "SerializationUtils.h" +#include + +class SemanticPredicate { +public: + SemanticPredicate() {} + SemanticPredicate(int id) { id_ = id; } + virtual ~SemanticPredicate() { roles_.clear(); } + +public: + int id() const { return id_; } + const std::set &GetRoles() const { + return roles_; + } + + bool HasRole(int role) const { + std::set::iterator it = roles_.find(role); + return (it != roles_.end()); + } + + void InsertRole(int role) { + CHECK(!HasRole(role)) << "Role existed already."; + roles_.insert(role); + } + + void Save(FILE *fs) { + bool success; + int length = (int)roles_.size(); + success = WriteInteger(fs, id_); + CHECK(success); + success = WriteInteger(fs, length); + CHECK(success); + for (std::set::iterator it = roles_.begin(); + it != roles_.end(); ++it) { + int label = *it; + success = WriteInteger(fs, label); + CHECK(success); + } + } + + void Load(FILE *fs) { + bool success; + int length; + success = ReadInteger(fs, &id_); + CHECK(success); + success = ReadInteger(fs, &length); + CHECK(success); + for (int i = 0; i < length; ++i) { + int label; + success = ReadInteger(fs, &label); + CHECK(success); + InsertRole(label); + } + } + +protected: + int id_; + std::set roles_; +}; + +#endif /* SEMANTICPREDICATE_H_ */ diff --git a/src/sequence/SequenceDecoder.h b/src/sequence/SequenceDecoder.h index d1d88eb..a1ea407 100644 --- a/src/sequence/SequenceDecoder.h +++ b/src/sequence/SequenceDecoder.h @@ -29,7 +29,7 @@ class SequenceDecoderNodeScores { virtual ~SequenceDecoderNodeScores() {} // Get the number of states. - int GetNumStates() const { return scores_.size(); } + int GetNumStates() const { return (int) scores_.size(); } // Set the number of states. void SetNumStates(int num_states) { scores_.resize(num_states); } @@ -76,14 +76,14 @@ class SequenceDecoderEdgeScores { // Get/Set the number of states for the current node. The states must be // numbered 0, 1, 2, ... - int GetNumCurrentStates() const { return scores_.size(); } + int GetNumCurrentStates() const { return (int) scores_.size(); } void SetNumCurrentStates(int num_current_states) { scores_.resize(num_current_states); } // Get/set the number of previous states compatible with the current node. int GetNumPreviousStates(int current_state) const { - return scores_[current_state].size(); + return (int) scores_[current_state].size(); } void SetNumPreviousStates(int current_state, int num_previous_states) { scores_[current_state].resize(num_previous_states); @@ -141,13 +141,13 @@ class SequenceDecoderEdgeScores { int GetStatePairIndex(int current_state, int k) const { int bigram_index = k; for (int state = 0; state < current_state; ++state) { - bigram_index += scores_[state].size(); + bigram_index += (int)scores_[state].size(); } return bigram_index; } // Compute number of bigram indices. - int GetNumStatePairs() const { return GetStatePairIndex(scores_.size(), 0); } + int GetNumStatePairs() const { return GetStatePairIndex((int)scores_.size(), 0); } private: std::vector > > scores_; diff --git a/src/sequence/SequenceInstance.h b/src/sequence/SequenceInstance.h index c8298b9..6ea5734 100644 --- a/src/sequence/SequenceInstance.h +++ b/src/sequence/SequenceInstance.h @@ -1,54 +1,54 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEQUENCEINSTANCE_H_ -#define SEQUENCEINSTANCE_H_ - -#include -#include -#include "Instance.h" - -class SequenceInstance : public Instance { -public: - SequenceInstance() {} - virtual ~SequenceInstance() {} - - virtual Instance* Copy() { - SequenceInstance* instance = new SequenceInstance(); - instance->Initialize(forms_, tags_); - return static_cast(instance); - } - - virtual void Initialize(const std::vector &forms, - const std::vector &tags); - - int size() const { return forms_.size(); }; - - const std::string &GetForm(int i) const { return forms_[i]; } - const std::string &GetTag(int i) const { return tags_[i]; } - const std::vector &forms() const { return forms_; } - const std::vector &tags() const { return tags_; } - - void SetTag(int i, const std::string &tag) { tags_[i] = tag; } - -protected: - std::vector forms_; - std::vector tags_; -}; - -#endif /* SEQUENCEINSTANCE_H_*/ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEQUENCEINSTANCE_H_ +#define SEQUENCEINSTANCE_H_ + +#include +#include +#include "Instance.h" + +class SequenceInstance : public Instance { +public: + SequenceInstance() {} + virtual ~SequenceInstance() {} + + virtual Instance* Copy() { + SequenceInstance* instance = new SequenceInstance(); + instance->Initialize(forms_, tags_); + return static_cast(instance); + } + + virtual void Initialize(const std::vector &forms, + const std::vector &tags); + + int size() const { return (int) forms_.size(); }; + + const std::string &GetForm(int i) const { return forms_[i]; } + const std::string &GetTag(int i) const { return tags_[i]; } + const std::vector &forms() const { return forms_; } + const std::vector &tags() const { return tags_; } + + void SetTag(int i, const std::string &tag) { tags_[i] = tag; } + +protected: + std::vector forms_; + std::vector tags_; +}; + +#endif /* SEQUENCEINSTANCE_H_*/ diff --git a/src/sequence/SequenceInstanceNumeric.h b/src/sequence/SequenceInstanceNumeric.h index ddaf257..3bacdde 100644 --- a/src/sequence/SequenceInstanceNumeric.h +++ b/src/sequence/SequenceInstanceNumeric.h @@ -1,192 +1,192 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef SEQUENCEINSTANCENUMERIC_H_ -#define SEQUENCEINSTANCENUMERIC_H_ - -#include "SequenceInstance.h" -#include "SequenceDictionary.h" -#include -#include - -class SequenceInstanceNumeric : public Instance { -public: - SequenceInstanceNumeric() {}; - virtual ~SequenceInstanceNumeric() { Clear(); }; - - Instance* Copy() { - CHECK(false) << "Not implemented."; - return NULL; - } - - int size() { return form_ids_.size(); }; - - virtual void Clear() { - form_ids_.clear(); - prefix_ids_.clear(); - suffix_ids_.clear(); - shape_ids_.clear(); - has_digit_.clear(); - has_upper_.clear(); - has_hyphen_.clear(); - all_digits_.clear(); - all_digits_with_punctuation_.clear(); - all_upper_.clear(); - first_upper_.clear(); - tag_ids_.clear(); - } - - void Initialize(const SequenceDictionary &dictionary, - SequenceInstance *instance); - - const std::vector &GetFormIds() const { return form_ids_; } - const std::vector &GetTagIds() const { return tag_ids_; } - - int GetFormId(int i) { return form_ids_[i]; } - int GetMaxPrefixLength(int i) { return prefix_ids_[i].size(); } - int GetMaxSuffixLength(int i) { return suffix_ids_[i].size(); } - int GetPrefixId(int i, int length) { return prefix_ids_[i][length - 1]; } - int GetSuffixId(int i, int length) { return suffix_ids_[i][length - 1]; } - int GetShapeId(int i) { return shape_ids_[i]; } - bool HasDigit(int i) { return has_digit_[i]; } - bool HasUpper(int i) { return has_upper_[i]; } - bool HasHyphen(int i) { return has_hyphen_[i]; } - bool AllDigits(int i) { return all_digits_[i]; } - bool AllDigitsWithPunctuation(int i) { - return all_digits_with_punctuation_[i]; - } - bool AllUpper(int i) { return all_upper_[i]; } - bool FirstUpper(int i) { return first_upper_[i]; } - int GetTagId(int i) { return tag_ids_[i]; } - -protected: - bool IsUpperCase(char c) { return (c >= 'A' && c <= 'Z'); } - bool IsLowerCase(char c) { return (c >= 'a' && c <= 'z'); } - bool IsDigit(char c) { return (c >= '0' && c <= '9'); } - bool IsPeriod(char c) { return (c == '.'); } - bool IsPunctuation(char c); - - bool AllUpperCase(const char* word, int len) { - for (int i = 0; i < len; ++i) { - if (!IsUpperCase(word[i])) return false; - } - return true; - } - - bool AllLowerCase(const char* word, int len) { - for (int i = 0; i < len; ++i) { - if (!IsLowerCase(word[i])) return false; - } - return true; - } - - bool IsCapitalized(const char* word, int len) { - if (len <= 0) return false; - return IsUpperCase(word[0]); - } - - bool IsMixedCase(const char* word, int len) { - if (len <= 0) return false; - if (!IsLowerCase(word[0])) return false; - for (int i = 1; i < len; ++i) { - if (IsUpperCase(word[i])) return true; - } - return false; - } - - bool EndsWithPeriod(const char* word, int len) { - if (len <= 0) return false; - return IsPeriod(word[len - 1]); - } - - bool HasInternalPeriod(const char* word, int len) { - if (len <= 0) return false; - for (int i = 0; i < len - 1; ++i) { - if (IsPeriod(word[i])) return true; - } - return false; - } - - bool HasInternalPunctuation(const char* word, int len) { - if (len <= 0) return false; - for (int i = 0; i < len - 1; ++i) { - if (IsPunctuation(word[i])) return true; - } - return false; - } - - int CountDigits(const char* word, int len) { - int num_digits = 0; - for (int i = 0; i < len; ++i) { - if (IsDigit(word[i])) ++num_digits; - } - return num_digits; - } - - bool HasUpperCaseLetters(const char* word, int len) { - for (int i = 0; i < len; ++i) { - if (IsUpperCase(word[i])) return true; - } - return false; - } - - bool HasHyphen(const char* word, int len) { - for (int i = 0; i < len; ++i) { - if ('-' == word[i]) return true; - } - return false; - } - - bool AllDigits(const char* word, int len) { - for (int i = 0; i < len; ++i) { - if (!IsDigit(word[i])) return false; - } - return true; - } - - bool AllDigitsWithPunctuation(const char* word, int len) { - bool has_digits = false; - bool has_punctuation = false; - for (int i = 0; i < len; ++i) { - if (IsDigit(word[i])) { - has_digits = true; - } else if (IsPunctuation(word[i])) { - has_punctuation = true; - } else { - return false; - } - } - return has_digits && has_punctuation; - } - -private: - std::vector form_ids_; - std::vector > prefix_ids_; - std::vector > suffix_ids_; - std::vector shape_ids_; - std::vector has_digit_; - std::vector has_upper_; - std::vector has_hyphen_; - std::vector all_digits_; - std::vector all_digits_with_punctuation_; - std::vector all_upper_; - std::vector first_upper_; - std::vector tag_ids_; -}; - -#endif /* SEQUENCEINSTANCENUMERIC_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef SEQUENCEINSTANCENUMERIC_H_ +#define SEQUENCEINSTANCENUMERIC_H_ + +#include "SequenceInstance.h" +#include "SequenceDictionary.h" +#include +#include + +class SequenceInstanceNumeric : public Instance { +public: + SequenceInstanceNumeric() {}; + virtual ~SequenceInstanceNumeric() { Clear(); }; + + Instance* Copy() { + CHECK(false) << "Not implemented."; + return NULL; + } + + int size() { return (int) form_ids_.size(); }; + + virtual void Clear() { + form_ids_.clear(); + prefix_ids_.clear(); + suffix_ids_.clear(); + shape_ids_.clear(); + has_digit_.clear(); + has_upper_.clear(); + has_hyphen_.clear(); + all_digits_.clear(); + all_digits_with_punctuation_.clear(); + all_upper_.clear(); + first_upper_.clear(); + tag_ids_.clear(); + } + + void Initialize(const SequenceDictionary &dictionary, + SequenceInstance *instance); + + const std::vector &GetFormIds() const { return form_ids_; } + const std::vector &GetTagIds() const { return tag_ids_; } + + int GetFormId(int i) { return form_ids_[i]; } + int GetMaxPrefixLength(int i) { return (int) prefix_ids_[i].size(); } + int GetMaxSuffixLength(int i) { return (int) suffix_ids_[i].size(); } + int GetPrefixId(int i, int length) { return prefix_ids_[i][length - 1]; } + int GetSuffixId(int i, int length) { return suffix_ids_[i][length - 1]; } + int GetShapeId(int i) { return shape_ids_[i]; } + bool HasDigit(int i) { return has_digit_[i]; } + bool HasUpper(int i) { return has_upper_[i]; } + bool HasHyphen(int i) { return has_hyphen_[i]; } + bool AllDigits(int i) { return all_digits_[i]; } + bool AllDigitsWithPunctuation(int i) { + return all_digits_with_punctuation_[i]; + } + bool AllUpper(int i) { return all_upper_[i]; } + bool FirstUpper(int i) { return first_upper_[i]; } + int GetTagId(int i) { return tag_ids_[i]; } + +protected: + bool IsUpperCase(char c) { return (c >= 'A' && c <= 'Z'); } + bool IsLowerCase(char c) { return (c >= 'a' && c <= 'z'); } + bool IsDigit(char c) { return (c >= '0' && c <= '9'); } + bool IsPeriod(char c) { return (c == '.'); } + bool IsPunctuation(char c); + + bool AllUpperCase(const char* word, int len) { + for (int i = 0; i < len; ++i) { + if (!IsUpperCase(word[i])) return false; + } + return true; + } + + bool AllLowerCase(const char* word, int len) { + for (int i = 0; i < len; ++i) { + if (!IsLowerCase(word[i])) return false; + } + return true; + } + + bool IsCapitalized(const char* word, int len) { + if (len <= 0) return false; + return IsUpperCase(word[0]); + } + + bool IsMixedCase(const char* word, int len) { + if (len <= 0) return false; + if (!IsLowerCase(word[0])) return false; + for (int i = 1; i < len; ++i) { + if (IsUpperCase(word[i])) return true; + } + return false; + } + + bool EndsWithPeriod(const char* word, int len) { + if (len <= 0) return false; + return IsPeriod(word[len - 1]); + } + + bool HasInternalPeriod(const char* word, int len) { + if (len <= 0) return false; + for (int i = 0; i < len - 1; ++i) { + if (IsPeriod(word[i])) return true; + } + return false; + } + + bool HasInternalPunctuation(const char* word, int len) { + if (len <= 0) return false; + for (int i = 0; i < len - 1; ++i) { + if (IsPunctuation(word[i])) return true; + } + return false; + } + + int CountDigits(const char* word, int len) { + int num_digits = 0; + for (int i = 0; i < len; ++i) { + if (IsDigit(word[i])) ++num_digits; + } + return num_digits; + } + + bool HasUpperCaseLetters(const char* word, int len) { + for (int i = 0; i < len; ++i) { + if (IsUpperCase(word[i])) return true; + } + return false; + } + + bool HasHyphen(const char* word, int len) { + for (int i = 0; i < len; ++i) { + if ('-' == word[i]) return true; + } + return false; + } + + bool AllDigits(const char* word, int len) { + for (int i = 0; i < len; ++i) { + if (!IsDigit(word[i])) return false; + } + return true; + } + + bool AllDigitsWithPunctuation(const char* word, int len) { + bool has_digits = false; + bool has_punctuation = false; + for (int i = 0; i < len; ++i) { + if (IsDigit(word[i])) { + has_digits = true; + } else if (IsPunctuation(word[i])) { + has_punctuation = true; + } else { + return false; + } + } + return has_digits && has_punctuation; + } + +private: + std::vector form_ids_; + std::vector > prefix_ids_; + std::vector > suffix_ids_; + std::vector shape_ids_; + std::vector has_digit_; + std::vector has_upper_; + std::vector has_hyphen_; + std::vector all_digits_; + std::vector all_digits_with_punctuation_; + std::vector all_upper_; + std::vector first_upper_; + std::vector tag_ids_; +}; + +#endif /* SEQUENCEINSTANCENUMERIC_H_ */ diff --git a/src/sequence/SequencePart.h b/src/sequence/SequencePart.h index d57e273..81f5c9b 100644 --- a/src/sequence/SequencePart.h +++ b/src/sequence/SequencePart.h @@ -147,7 +147,7 @@ class SequenceParts : public Parts { void BuildOffsets() { for (int i = NUM_SEQUENCEPARTS - 1; i >= 0; --i) { if (offsets_[i] < 0) { - offsets_[i] = (i == NUM_SEQUENCEPARTS - 1) ? size() : offsets_[i + 1]; + offsets_[i] = (i == NUM_SEQUENCEPARTS - 1) ? (int)size() : offsets_[i + 1]; } } }; @@ -175,7 +175,7 @@ class SequenceParts : public Parts { void GetOffset(int i, int *offset, int *size) const { *offset = offsets_[i]; *size = (i < NUM_SEQUENCEPARTS - 1) ? offsets_[i + 1] - (*offset) : - SequenceParts::size() - (*offset); + (int)SequenceParts::size() - (*offset); } // Set offset from part index. diff --git a/src/tagger/TaggerDictionary.h b/src/tagger/TaggerDictionary.h index eae1b4a..475a1ad 100644 --- a/src/tagger/TaggerDictionary.h +++ b/src/tagger/TaggerDictionary.h @@ -1,110 +1,110 @@ -// Copyright (c) 2012-2015 Andre Martins -// All Rights Reserved. -// -// This file is part of TurboParser 2.3. -// -// TurboParser 2.3 is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TurboParser 2.3 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with TurboParser 2.3. If not, see . - -#ifndef TAGGERDICTIONARY_H_ -#define TAGGERDICTIONARY_H_ - -#include "SequenceDictionary.h" - -class TaggerDictionary : public SequenceDictionary { -public: - TaggerDictionary() {} - TaggerDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} - virtual ~TaggerDictionary() {} - - void Clear() { - SequenceDictionary::Clear(); - word_tags_.clear(); - } - - void Save(FILE *fs) { - SequenceDictionary::Save(fs); - bool success; - int length = unknown_word_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < unknown_word_tags_.size(); ++j) { - int tag = unknown_word_tags_[j]; - success = WriteInteger(fs, tag); - CHECK(success); - } - - length = word_tags_.size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int i = 0; i < word_tags_.size(); ++i) { - length = word_tags_[i].size(); - success = WriteInteger(fs, length); - CHECK(success); - for (int j = 0; j < word_tags_[i].size(); ++j) { - int tag = word_tags_[i][j]; - success = WriteInteger(fs, tag); - CHECK(success); - } - } - } - - void Load(FILE *fs) { - SequenceDictionary::Load(fs); - bool success; - int length; - success = ReadInteger(fs, &length); - CHECK(success); - unknown_word_tags_.resize(length); - for (int j = 0; j < unknown_word_tags_.size(); ++j) { - int tag; - success = ReadInteger(fs, &tag); - CHECK(success); - unknown_word_tags_[j] = tag; - } - success = ReadInteger(fs, &length); - CHECK(success); - word_tags_.resize(length); - for (int i = 0; i < word_tags_.size(); ++i) { - success = ReadInteger(fs, &length); - CHECK(success); - word_tags_[i].resize(length); - for (int j = 0; j < word_tags_[i].size(); ++j) { - int tag; - success = ReadInteger(fs, &tag); - CHECK(success); - word_tags_[i][j] = tag; - } - } - } - - void CreateTagDictionary(SequenceReader *reader); - - const vector &GetWordTags(int word) { - // return word_tags_[word]; - // TODO: Not sure is this should be done here... - // It may be cleaner to return an empty vector here and - // fill it with the unknown tags elsewhere. - if (!word_tags_[word].empty()) { - return word_tags_[word]; - } else { - return unknown_word_tags_; - } - } - -protected: - vector > word_tags_; - vector unknown_word_tags_; -}; - -#endif /* TAGGERDICTIONARY_H_ */ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef TAGGERDICTIONARY_H_ +#define TAGGERDICTIONARY_H_ + +#include "SequenceDictionary.h" + +class TaggerDictionary : public SequenceDictionary { +public: + TaggerDictionary() {} + TaggerDictionary(Pipe* pipe) : SequenceDictionary(pipe) {} + virtual ~TaggerDictionary() {} + + void Clear() { + SequenceDictionary::Clear(); + word_tags_.clear(); + } + + void Save(FILE *fs) { + SequenceDictionary::Save(fs); + bool success; + int length = (int)unknown_word_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < unknown_word_tags_.size(); ++j) { + int tag = unknown_word_tags_[j]; + success = WriteInteger(fs, tag); + CHECK(success); + } + + length = (int)word_tags_.size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int i = 0; i < word_tags_.size(); ++i) { + length = (int)word_tags_[i].size(); + success = WriteInteger(fs, length); + CHECK(success); + for (int j = 0; j < word_tags_[i].size(); ++j) { + int tag = word_tags_[i][j]; + success = WriteInteger(fs, tag); + CHECK(success); + } + } + } + + void Load(FILE *fs) { + SequenceDictionary::Load(fs); + bool success; + int length; + success = ReadInteger(fs, &length); + CHECK(success); + unknown_word_tags_.resize(length); + for (int j = 0; j < unknown_word_tags_.size(); ++j) { + int tag; + success = ReadInteger(fs, &tag); + CHECK(success); + unknown_word_tags_[j] = tag; + } + success = ReadInteger(fs, &length); + CHECK(success); + word_tags_.resize(length); + for (int i = 0; i < word_tags_.size(); ++i) { + success = ReadInteger(fs, &length); + CHECK(success); + word_tags_[i].resize(length); + for (int j = 0; j < word_tags_[i].size(); ++j) { + int tag; + success = ReadInteger(fs, &tag); + CHECK(success); + word_tags_[i][j] = tag; + } + } + } + + void CreateTagDictionary(SequenceReader *reader); + + const vector &GetWordTags(int word) { + // return word_tags_[word]; + // TODO: Not sure is this should be done here... + // It may be cleaner to return an empty vector here and + // fill it with the unknown tags elsewhere. + if (!word_tags_[word].empty()) { + return word_tags_[word]; + } else { + return unknown_word_tags_; + } + } + +protected: + vector > word_tags_; + vector unknown_word_tags_; +}; + +#endif /* TAGGERDICTIONARY_H_ */ diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index b8b97e8..a3414c0 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -193,8 +193,7 @@ WIN32;NDEBUG;_LIB;GOOGLE_GLOG_DLL_DECL=;GFLAGS_DLL_DECL=;%(PreprocessorDefinitions) $(SolutionDir)..\src\util;$(SolutionDir)..\src\classifier;$(SolutionDir)..\src\sequence;$(SolutionDir)..\src\entity_recognizer;$(SolutionDir)..\src\morphological_tagger;$(SolutionDir)..\src\parser;$(SolutionDir)..\src\tagger;$(SolutionDir)..\src\semantic_parser;$(SolutionDir)..\src\coreference_resolver;$(SolutionDir)..\deps\AD3-2.0.2\ad3;$(SolutionDir)..\deps\AD3-2.0.2\;$(SolutionDir)..\deps\glog-0.3.2\src\windows;$(SolutionDir)..\deps\gflags-2.0\src\windows;$(SolutionDir)..\deps\eigen-eigen-c58038c56923\;$(SolutionDir)..\deps\googletest\src;%(AdditionalIncludeDirectories) Disabled - - + Neither false false false From b4c3cfe335bba4c25559477c74bb6083e39a9438 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 30 Aug 2016 11:58:40 +0100 Subject: [PATCH 33/51] Update .gitignore. --- .gitignore | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.gitignore b/.gitignore index ea06b33..64c347b 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ vsprojects/*.sln.docstates vsprojects/*.aps vsprojects/*.ncb vsprojects/*.opendb +vsprojects/*.VC.db vsprojects/*.opensdf vsprojects/*.sdf vsprojects/*.cachefile @@ -40,3 +41,13 @@ vsprojects/*/Debug vsprojects/Debug/* vsprojects/*/Release vsprojects/Release/* +/python/tokenizers/portuguese/__pycache__ +/python/__pycache__ +/python/cython_debug +/python/build +/python/tokenizers/__pycache__ +/python/turboparser.cp35-win_amd64.pyd +/python/turboparser.cp35-win_amd64.pdb +/python/vc140.pdb +/python/turboparser.cpp +/python/test2.py From 1832955b2902badc264ac624a36d01cf482a6db3 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 18 Oct 2016 10:48:11 +0100 Subject: [PATCH 34/51] Turn off "Unkown tag" log message. --- src/sequence/SequenceInstanceNumeric.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sequence/SequenceInstanceNumeric.cpp b/src/sequence/SequenceInstanceNumeric.cpp index 13d2a45..2334b7b 100644 --- a/src/sequence/SequenceInstanceNumeric.cpp +++ b/src/sequence/SequenceInstanceNumeric.cpp @@ -106,7 +106,7 @@ void SequenceInstanceNumeric::Initialize(const SequenceDictionary &dictionary, //CHECK_GE(id, 0); if (id < 0) { id = TOKEN_UNKNOWN; - LOG(INFO) << "Unknown tag: " << instance->GetTag(i); + //LOG(INFO) << "Unknown tag: " << instance->GetTag(i); } tag_ids_[i] = id; } From 827363203d02b7249b753312c0d74872900b8af1 Mon Sep 17 00:00:00 2001 From: Mariana Almeida Date: Fri, 16 Dec 2016 12:15:45 +0000 Subject: [PATCH 35/51] MLA: allow saving temporary models, ussing flag '--save_model_period=1' --- src/classifier/Options.cpp | 3 ++ src/classifier/Options.h | 4 ++ src/classifier/Parameters.h | 23 +++++++++++ src/classifier/Pipe.cpp | 23 ++++++++--- src/classifier/SparseLabeledParameterVector.h | 38 +++++++++++++++++++ src/classifier/SparseParameterVector.h | 22 +++++++++++ .../TurboEntityRecognizer.cpp | 5 ++- .../TurboMorphologicalTagger.cpp | 4 +- 8 files changed, 112 insertions(+), 10 deletions(-) diff --git a/src/classifier/Options.cpp b/src/classifier/Options.cpp index a6d3cbe..19ed83a 100644 --- a/src/classifier/Options.cpp +++ b/src/classifier/Options.cpp @@ -53,6 +53,8 @@ DEFINE_double(train_regularization_constant, 1e12, "Regularization parameter C."); DEFINE_int32(parameters_max_num_buckets, 50000000, "Maximum number of buckets in the hash table that stores the parameters."); +DEFINE_int32(save_model_period, 1000000, + "Number of iteration after which a temporaty model is saved."); void Options::Initialize() { file_train_ = FLAGS_file_train; @@ -73,4 +75,5 @@ void Options::Initialize() { train_learning_rate_schedule_ = FLAGS_train_learning_rate_schedule; only_supported_features_ = FLAGS_only_supported_features; use_averaging_ = FLAGS_use_averaging; + save_model_period_ = FLAGS_save_model_period; } diff --git a/src/classifier/Options.h b/src/classifier/Options.h index 1902bee..835764f 100644 --- a/src/classifier/Options.h +++ b/src/classifier/Options.h @@ -39,6 +39,8 @@ DECLARE_string(train_learning_rate_schedule); DECLARE_int32(parameters_max_num_buckets); +DECLARE_int32(save_model_period); + //1 to use new developments regarding performance optimizations #ifndef USE_N_OPTIMIZATIONS #define USE_N_OPTIMIZATIONS 0 //1 @@ -79,6 +81,7 @@ class Options { bool train() { return train_; } bool test() { return test_; } bool evaluate() { return evaluate_; } + int save_model_period() { return save_model_period_; } // Set option values. void SetTrainingFilePath(const std::string &file_train) { @@ -129,6 +132,7 @@ class Options { bool only_supported_features_; // Use only supported features. bool use_averaging_; // Include a final averaging step during training. + int save_model_period_; // Number of iteration after which a temporaty model is saved. }; #endif /*OPTIONS_H_*/ diff --git a/src/classifier/Parameters.h b/src/classifier/Parameters.h index e96f2a6..0702a2a 100644 --- a/src/classifier/Parameters.h +++ b/src/classifier/Parameters.h @@ -77,6 +77,29 @@ class Parameters { if (use_average_) averaged_labeled_weights_.Initialize(); } + // Overwrite + void Overwrite(Parameters *output_parameters){ + output_parameters->use_average_=use_average_; // could be removed + + weights_.Overwrite(&output_parameters->weights_); + averaged_weights_.Overwrite(&output_parameters->averaged_weights_); + + labeled_weights_.Overwrite(&output_parameters->labeled_weights_); + averaged_labeled_weights_.Overwrite(&output_parameters->averaged_labeled_weights_); + } + + // Copy Parameters. + void Copy(Parameters *output_parameters){ + output_parameters->Initialize(use_average_); + output_parameters->use_average_=use_average_; // could be removed + + weights_.Copy(&output_parameters->weights_); + averaged_weights_.Copy(&output_parameters->averaged_weights_); + + labeled_weights_.Copy(&output_parameters->labeled_weights_); + averaged_labeled_weights_.Copy(&output_parameters->averaged_labeled_weights_); + } + // Lock/unlock the parameter vector. A locked vector means that no features // can be added. void StopGrowth() { diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index a881fbd..11a5592 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -151,13 +151,24 @@ void Pipe::Train() { for (int i = 0; i < options_->GetNumEpochs(); ++i) { TrainEpoch(i); + if (options_->save_model_period() == 1 || (i && i%(options_->save_model_period()) == 0)){ + Parameters *parameters_aux = new Parameters; + parameters_->Copy(parameters_aux); + parameters_->Finalize((i+1) * (int)instances_.size()); + SaveModelByName(options_->GetModelFilePath() + ".temp." + std::to_string(i)); + //parameters_aux->Copy(parameters_); + //parameters_aux->Overwrite(parameters_); + Parameters *aux = parameters_; + parameters_ = parameters_aux; + delete aux; + } } parameters_->Finalize(options_->GetNumEpochs() * (int)instances_.size()); } void Pipe::CreateInstances() { - chronowrap::Chronometer chrono; + chronowrap::Chronometer chrono; chrono.GetTime(); LOG(INFO) << "Creating instances..."; @@ -219,7 +230,7 @@ void Pipe::TrainEpoch(int epoch) { int num_instances = (int)instances_.size(); double lambda = 1.0 / (options_->GetRegularizationConstant() * (static_cast(num_instances))); - chronowrap::Chronometer chrono; + chronowrap::Chronometer chrono; chrono.GetTime(); double time_decoding = 0; double time_scores = 0; @@ -247,7 +258,7 @@ void Pipe::TrainEpoch(int epoch) { RemoveUnsupportedFeatures(instance, parts, features); } - chronowrap::Chronometer chrono_scores; + chronowrap::Chronometer chrono_scores; chrono_scores.GetTime(); ComputeScores(instance, parts, features, &scores); chrono_scores.StopTime(); @@ -260,7 +271,7 @@ void Pipe::TrainEpoch(int epoch) { if (options_->GetTrainingAlgorithm() == "perceptron" || options_->GetTrainingAlgorithm() == "mira") { - chronowrap::Chronometer chrono_decoding; + chronowrap::Chronometer chrono_decoding; chrono_decoding.GetTime(); decoder_->Decode(instance, parts, scores, &predicted_outputs); chrono_decoding.StopTime(); @@ -286,7 +297,7 @@ void Pipe::TrainEpoch(int epoch) { options_->GetTrainingAlgorithm() == "crf_sgd" || options_->GetTrainingAlgorithm() == "crf_margin_sgd") { double loss; - chronowrap::Chronometer chrono_decoding; + chronowrap::Chronometer chrono_decoding; chrono_decoding.GetTime(); if (options_->GetTrainingAlgorithm() == "svm_mira" || options_->GetTrainingAlgorithm() == "svm_sgd") { @@ -485,4 +496,4 @@ void Pipe::ClassifyInstance(Instance *instance) { delete parts; delete features; -} +} diff --git a/src/classifier/SparseLabeledParameterVector.h b/src/classifier/SparseLabeledParameterVector.h index 5fb5d98..dc8bcc1 100644 --- a/src/classifier/SparseLabeledParameterVector.h +++ b/src/classifier/SparseLabeledParameterVector.h @@ -76,6 +76,8 @@ class SparseLabelWeights : public LabelWeights { SparseLabelWeights() {}; virtual ~SparseLabelWeights() {}; + SparseLabelWeights(const SparseLabelWeights & other) = default; + bool IsSparse() const { return true; } int Size() const { return (int) label_weights_.size(); } @@ -268,6 +270,42 @@ class SparseLabeledParameterVector { values_.clear(); } + // Overwrite + void Overwrite(SparseLabeledParameterVector *output_parameters) { + output_parameters->scale_factor_ = scale_factor_; + output_parameters->squared_norm_ = squared_norm_; + output_parameters->growth_stopped_ = growth_stopped_; + + for (const auto & element : values_) { + if (element.second->IsSparse()){ + *(static_cast(output_parameters->values_[element.first])) = *(static_cast(element.second)); + }else{ + *(static_cast(output_parameters->values_[element.first])) = *(static_cast(element.second)); + } + + } + } + + // Copy + void Copy(SparseLabeledParameterVector *output_parameters){ + output_parameters->scale_factor_=scale_factor_; + output_parameters->squared_norm_=squared_norm_; + output_parameters->growth_stopped_=growth_stopped_; + + for (const auto & element : values_){ + if (element.second->IsSparse()){ + SparseLabelWeights *label_weights = new SparseLabelWeights; + *label_weights = *(static_cast(element.second)); + output_parameters->values_.insert(pair(element.first, label_weights)); + }else{ + DenseLabelWeights *label_weights = new DenseLabelWeights; + *label_weights = *(static_cast(element.second)); + output_parameters->values_.insert(pair(element.first, label_weights)); + } + } + } + + // Save/load the parameters to/from a file. void Save(FILE *fs) const { bool success; diff --git a/src/classifier/SparseParameterVector.h b/src/classifier/SparseParameterVector.h index 669bb30..2ece34c 100644 --- a/src/classifier/SparseParameterVector.h +++ b/src/classifier/SparseParameterVector.h @@ -96,6 +96,28 @@ class SparseParameterVector { void AllowGrowth() { growth_stopped_ = false; } bool growth_stopped() const { return growth_stopped_; } + // Overwrite + void Overwrite(SparseParameterVector *output_parameters) { + output_parameters->scale_factor_ = scale_factor_; + output_parameters->squared_norm_ = squared_norm_; + output_parameters->growth_stopped_ = growth_stopped_; + + for (const auto & element : values_) { + output_parameters->values_[element.first] = element.second; + } + } + + // Copy + void Copy(SparseParameterVector *output_parameters){ + output_parameters->scale_factor_=scale_factor_; + output_parameters->squared_norm_=squared_norm_; + output_parameters->growth_stopped_=growth_stopped_; + + for (const auto & element : values_){ + output_parameters->values_.insert(pair(element.first, element.second)); + } + } + // Save/load the parameters to/from a file. void Save(FILE *fs) const { bool success; diff --git a/src/entity_recognizer/TurboEntityRecognizer.cpp b/src/entity_recognizer/TurboEntityRecognizer.cpp index 3034879..6b1058d 100644 --- a/src/entity_recognizer/TurboEntityRecognizer.cpp +++ b/src/entity_recognizer/TurboEntityRecognizer.cpp @@ -41,7 +41,7 @@ int main(int argc, char** argv) { void TrainEntityRecognizer() { double time; - chronowrap::Chronometer chrono; + chronowrap::Chronometer chrono; chrono.GetTime(); EntityOptions *options = new EntityOptions; @@ -50,6 +50,7 @@ void TrainEntityRecognizer() { EntityPipe *pipe = new EntityPipe(options); pipe->Initialize(); pipe->Train(); + LOG(INFO) << "\n FINAL model: " << options->GetModelFilePath() << "\n"; pipe->SaveModelFile(); delete pipe; @@ -63,7 +64,7 @@ void TrainEntityRecognizer() { void TestEntityRecognizer() { double time; - chronowrap::Chronometer chrono; + chronowrap::Chronometer chrono; chrono.GetTime(); EntityOptions *options = new EntityOptions; diff --git a/src/morphological_tagger/TurboMorphologicalTagger.cpp b/src/morphological_tagger/TurboMorphologicalTagger.cpp index 9822f6a..151316e 100644 --- a/src/morphological_tagger/TurboMorphologicalTagger.cpp +++ b/src/morphological_tagger/TurboMorphologicalTagger.cpp @@ -41,7 +41,7 @@ int main(int argc, char** argv) { void TrainMorphologicalTagger() { double time; - chronowrap::Chronometer chrono; + chronowrap::Chronometer chrono; chrono.GetTime(); MorphologicalOptions *options = new MorphologicalOptions; @@ -63,7 +63,7 @@ void TrainMorphologicalTagger() { void TestMorphologicalTagger() { double time; - chronowrap::Chronometer chrono; + chronowrap::Chronometer chrono; chrono.GetTime(); MorphologicalOptions *options = new MorphologicalOptions; From 53fd5b349906e7c469d47324b9b1edba2dbd807f Mon Sep 17 00:00:00 2001 From: Mariana Almeida Date: Fri, 16 Dec 2016 17:27:42 +0000 Subject: [PATCH 36/51] ver diff --- src/entity_recognizer/EntityDecoder.cpp | 448 ++++++++++++++++++++++++ src/entity_recognizer/EntityPipe.h | 3 + src/sequence/SequenceDecoder.cpp | 20 ++ src/sequence/SequenceDecoder.h | 4 +- 4 files changed, 473 insertions(+), 2 deletions(-) create mode 100644 src/entity_recognizer/EntityDecoder.cpp diff --git a/src/entity_recognizer/EntityDecoder.cpp b/src/entity_recognizer/EntityDecoder.cpp new file mode 100644 index 0000000..585b292 --- /dev/null +++ b/src/entity_recognizer/EntityDecoder.cpp @@ -0,0 +1,448 @@ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#include "EntityDecoder.h" +#include "SequencePart.h" +#include "EntityPipe.h" +#include // Remove this. + +DEFINE_double(ner_train_cost_false_positives, 0.5, + "Cost for 'false positives' -- penalises recall and favours precision in BIO tagging."); +//DEFINE_double(ner_train_cost_false_negatives, 0.5, +// "Cost for 'false negatives' -- penalises precision and favours recall in BIO tagging."); + +void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, + const vector &scores, + const vector &gold_output, + vector *predicted_output, + double *cost, + double *loss) { + LOG(INFO) << " [DEBUG] @EntityDecoder::DecodeCostAugmented"; + return SequenceDecoder::DecodeCostAugmented(instance, parts, scores, gold_output, + predicted_output, cost, loss); +#if 0 + SequenceParts *sequence_parts = static_cast(parts); + int offset_unigrams, num_unigrams; + + sequence_parts->GetOffsetUnigram(&offset_unigrams, &num_unigrams); + + //////////////////////////////////////////////////// + // F1: a = 0.5, b = 0.5. + // Recall: a = 0, b = 1. + // In general: + // p = a - (a+b)*z0 + // q = b*sum(z0) + // p'*z + q = a*sum(z) - (a+b)*z0'*z + b*sum(z0) + // = a*(1-z0)'*z + b*(1-z)'*z0. + //////////////////////////////////////////////////// + + // Penalty for predicting 1 when it is 0 (FP). + // double a = FLAGS_ner_train_cost_false_positives; + // Penalty for predicting 0 when it is 1 (FN). + // double b = FLAGS_ner_train_cost_false_negatives; + + // p = 0.5-z0, q = 0.5'*z0, loss = p'*z + q + double q = 0.0; + vector p(num_unigrams, 0.0); + + vector scores_cost = scores; + for (int r = 0; r < num_unigrams; ++r) { + p[r] = 0.5 - gold_output[offset_unigrams + r]; + scores_cost[offset_unigrams + r] += p[r]; + q += 0.5*gold_output[offset_unigrams + r]; + } + + Decode(instance, parts, scores_cost, predicted_output); + + *cost = q; + for (int r = 0; r < num_unigrams; ++r) { + *cost += p[r] * (*predicted_output)[offset_unigrams + r]; + } + + *loss = *cost; + for (int r = 0; r < parts->size(); ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } +#endif +} + +void EntityDecoder::Decode(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output) { + + LOG(INFO) << " [DEBUG] @EntityDecoder::Decode"; + return SequenceDecoder::Decode(instance, parts, scores, predicted_output); + +#if 0 +#ifdef USE_CPLEX + return DecodeCPLEX(instance, parts, scores, false, predicted_output); +#endif + + SequenceInstanceNumeric *sentence = static_cast(instance); + SequenceParts *sequence_parts = static_cast(parts); + int offset, size; + + vector node_scores(sentence->size()); + vector edge_scores(sentence->size() - 1); + // The triplets are represented as if they were edges connecting + // nodes with bigram states. + vector triplet_scores; + + // Cache previous state positions in SequenceDecoderEdgeScores. + // This will avoid expensive FindPreviousState(...) operations + // when building the triplet scores, but it may consume + // a lot of memory if there are too many tag bigrams. + bool cache_edge_previous_states = false; + if (pipe_->GetSequenceOptions()->markov_order() >= 1) { + cache_edge_previous_states = true; + } + + // Compute node scores from unigrams. + sequence_parts->GetOffsetUnigram(&offset, &size); + for (int r = 0; r < size; ++r) { + SequencePartUnigram *unigram = + static_cast((*parts)[offset + r]); + node_scores[unigram->position()].AddStateScore(unigram->tag(), + scores[offset + r]); + } + for (int i = 0; i < sentence->size(); ++i) { + CHECK_GE(node_scores[i].GetNumStates(), 0); + } + + // Initialize the edge scores to zero. + // Include all edges allowed by the dictionary that are supported + // on the unigram states. Edges that do not have a bigram part + // are given zero scores. + if (pipe_->GetSequenceOptions()->markov_order() >= 1) { + for (int i = 0; i < sentence->size() - 1; ++i) { + edge_scores[i].SetNumCurrentStates(node_scores[i + 1].GetNumStates()); + //LOG(INFO) << "node_scores[" << i + 1 << "].GetNumStates() = " << node_scores[i + 1].GetNumStates(); + for (int j = 0; j < node_scores[i + 1].GetNumStates(); ++j) { + int tag_id = node_scores[i + 1].GetState(j); + + //const std::vector &allowed_left_tags = + // pipe_->GetSequenceDictionary()->GetAllowedPreviousTags(tag); + + //edge_scores[i].SetNumPreviousStates(tag_id, + // node_scores[i].GetNumStates()); + for (int k = 0; k < node_scores[i].GetNumStates(); ++k) { + int tag_left_id = node_scores[i].GetState(k); + if (pipe_->GetSequenceDictionary()->IsAllowedBigram(tag_left_id, + tag_id)) { + //edge_scores[i].SetPreviousStateScore(tag_id, tag_left_id, + // tag_left_id, 0.0); + edge_scores[i].AddPreviousStateScore(j, k, 0.0); + } + } + } + } + } + + // Cache edge previous states. + // We just use a vector for fast access. In cases where there are a lot of + // bigram tags, a vector > > > could + // be better, but it was slower for POS tagging. + // The first element of the pair encodes the index of the previous state; + // the second element encodes the bigram index (index of the edge). + std::vector > > > + edge_previous_states; + if (cache_edge_previous_states) { + edge_previous_states.resize(sentence->size() - 1); + for (int i = 0; i < sentence->size() - 1; ++i) { + edge_previous_states[i].resize(node_scores[i + 1].GetNumStates()); + int bigram_index = 0; + CHECK_EQ(node_scores[i + 1].GetNumStates(), + edge_scores[i].GetNumCurrentStates()); + for (int tag_id = 0; tag_id < edge_scores[i].GetNumCurrentStates(); + ++tag_id) { + edge_previous_states[i][tag_id].resize(node_scores[i].GetNumStates(), + std::pair(-1, -1)); + for (int k = 0; k < edge_scores[i].GetNumPreviousStates(tag_id); ++k) { + int tag_left_id = + edge_scores[i].GetPreviousStateScore(tag_id, k).first; + edge_previous_states[i][tag_id][tag_left_id].first = k; + edge_previous_states[i][tag_id][tag_left_id].second = bigram_index; + //LOG(INFO) << "edge_previous_states[" << i << "][" << tag_id << "][" + // << tag_left_id << "].first = "<< k; + ++bigram_index; + } + } + } + } + + // Compute edge scores from bigrams. + sequence_parts->GetOffsetBigram(&offset, &size); + for (int r = 0; r < size; ++r) { + SequencePartBigram *bigram = + static_cast((*parts)[offset + r]); + // Get indices corresponding to tag id and left tag id. + // TODO: Make this more efficient. + // TODO: Cache node states to avoid many calls to FindState? + int i = bigram->position(); + int tag_id = -1; + int tag_left_id = -1; + if (i < sentence->size()) { + tag_id = node_scores[i].FindState(bigram->tag()); + } + if (i > 0) { + tag_left_id = node_scores[i - 1].FindState(bigram->tag_left()); + } + + if (i == 0) { + CHECK_EQ(bigram->tag_left(), -1); + node_scores[i].IncrementScore(tag_id, scores[offset + r]); + } else if (i == sentence->size()) { + CHECK_EQ(bigram->tag(), -1); + node_scores[i - 1].IncrementScore(tag_left_id, scores[offset + r]); + } else { + CHECK_GE(tag_left_id, 0); + CHECK_LT(tag_left_id, node_scores[i - 1].GetNumStates()); + CHECK_GE(tag_id, 0); + CHECK_LT(tag_id, node_scores[i].GetNumStates()); + + int k; + if (cache_edge_previous_states) { + k = edge_previous_states[i - 1][tag_id][tag_left_id].first; + } else { + k = edge_scores[i - 1].FindPreviousState(tag_id, tag_left_id); + } + CHECK_GE(k, 0) << tag_id << " " << tag_left_id << " " << i; + edge_scores[i - 1].SetPreviousStateScore(tag_id, k, tag_left_id, + scores[offset + r]); + } + } + + // Compute triplet scores from trigrams. + if (pipe_->GetSequenceOptions()->markov_order() == 2 && + sentence->size() > 1) { + triplet_scores.resize(sentence->size() - 2); + sequence_parts->GetOffsetTrigram(&offset, &size); + + // Cache the last trigram to save time. + SequencePartTrigram *last_trigram = NULL; + int tag_id = -1; + int tag_left_id = -1; + int tag_left_left_id = -1; + int bigram_index = -1; + for (int r = 0; r < size; ++r) { + SequencePartTrigram *trigram = + static_cast((*parts)[offset + r]); + // Get indices corresponding to tag id, left tag id, and left-left tag id. + // TODO: Make this more efficient. + int i = trigram->position(); + + if (i < sentence->size()) { + if (last_trigram == NULL || last_trigram->position() != i || + trigram->tag() != last_trigram->tag()) { + tag_id = node_scores[i].FindState(trigram->tag()); + } + } + if (i > 0) { + if (last_trigram == NULL || last_trigram->position() != i || + trigram->tag() != last_trigram->tag() || + trigram->tag_left() != last_trigram->tag_left()) { + tag_left_id = node_scores[i - 1].FindState(trigram->tag_left()); + } + } + if (i > 1) { + tag_left_left_id = node_scores[i - 2]. + FindState(trigram->tag_left_left()); + } + + if (i == 0) { + // I don't think this ever reaches this point. + CHECK_GE(trigram->tag(), 0); + CHECK_EQ(trigram->tag_left(), -1); + CHECK_EQ(trigram->tag_left_left(), -1); + } else if (i == 1) { + CHECK_GE(trigram->tag(), 0); + CHECK_GE(trigram->tag_left(), 0); + CHECK_EQ(trigram->tag_left_left(), -1); + //edge_scores[i - 1][tag_left_id][tag_id] += scores[offset + r]; + int k; + if (cache_edge_previous_states) { + k = edge_previous_states[i - 1][tag_id][tag_left_id].first; + } else { + k = edge_scores[i - 1].FindPreviousState(tag_id, + tag_left_id); + } + CHECK_GE(k, 0); + edge_scores[i - 1].IncrementScore(tag_id, k, scores[offset + r]); + } else if (i == sentence->size()) { + CHECK_EQ(trigram->tag(), -1); + CHECK_GE(trigram->tag_left(), 0); + CHECK_GE(trigram->tag_left_left(), 0); + int k; + if (cache_edge_previous_states) { + k = edge_previous_states[i - 2][tag_left_id][tag_left_left_id].first; + } else { + k = edge_scores[i - 2].FindPreviousState(tag_left_id, + tag_left_left_id); + } + CHECK_GE(k, 0); + edge_scores[i - 2].IncrementScore(tag_left_id, k, scores[offset + r]); + } else { + CHECK_GE(tag_left_left_id, 0); + CHECK_LT(tag_left_left_id, node_scores[i - 2].GetNumStates()); + CHECK_GE(tag_left_id, 0); + CHECK_LT(tag_left_id, node_scores[i - 1].GetNumStates()); + CHECK_GE(tag_id, 0); + CHECK_LT(tag_id, node_scores[i].GetNumStates()); + + if (last_trigram == NULL || last_trigram->position() != i || + trigram->tag() != last_trigram->tag() || + trigram->tag_left() != last_trigram->tag_left()) { + // Do this in an initialization before. + triplet_scores[i - 2]. + SetNumCurrentStates(edge_scores[i - 1].GetNumStatePairs()); + + if (cache_edge_previous_states) { + int k = edge_previous_states[i - 1][tag_id][tag_left_id].first; + bigram_index = + edge_previous_states[i - 1][tag_id][tag_left_id].second; + } else { + int k = edge_scores[i - 1].FindPreviousState(tag_id, + tag_left_id); + CHECK_GE(k, 0); + bigram_index = edge_scores[i - 1].GetStatePairIndex(tag_id, k); + } + CHECK_LT(bigram_index, triplet_scores[i - 2].GetNumCurrentStates()); + } + + int l; + int previous_bigram_index; + if (cache_edge_previous_states) { + l = edge_previous_states[i - 2][tag_left_id][tag_left_left_id].first; + previous_bigram_index = + edge_previous_states[i - 2][tag_left_id][tag_left_left_id].second; + } else { + l = edge_scores[i - 2].FindPreviousState(tag_left_id, + tag_left_left_id); + CHECK_GE(l, 0); + // Not sure we need this; might be fine with just l. + previous_bigram_index = edge_scores[i - 2]. + GetStatePairIndex(tag_left_id, l); + CHECK_LT(l, triplet_scores[i - 2].GetNumPreviousStates(bigram_index)); + } + + // Do this in an initialization before. + triplet_scores[i - 2]. + SetNumPreviousStates(bigram_index, edge_scores[i - 2]. + GetNumPreviousStates(tag_left_id)); + + triplet_scores[i - 2].SetPreviousStateScore(bigram_index, + l, + previous_bigram_index, + scores[offset + r]); + } + + last_trigram = trigram; + } + } + + vector best_path; + double value; + if (pipe_->GetSequenceOptions()->markov_order() == 2 && + sentence->size() > 1) { + vector transformed_node_scores; + vector transformed_edge_scores; + + // Convert to a first order sequence model. + ConvertToFirstOrderModel(node_scores, + edge_scores, + triplet_scores, + &transformed_node_scores, + &transformed_edge_scores); + vector transformed_best_path; + value = RunViterbi(transformed_node_scores, transformed_edge_scores, + &transformed_best_path); + //std::cout << "Value = " << value << endl; + + // Recover the best path in the original second-order model. + RecoverBestPath(transformed_best_path, &best_path); + } else if (pipe_->GetSequenceOptions()->markov_order() == 1) { + value = RunViterbi(node_scores, edge_scores, &best_path); + } else { + value = SolveMarkovZeroOrder(node_scores, &best_path); + } + + predicted_output->clear(); + predicted_output->resize(parts->size(), 0.0); + + int active = 0; + for (int i = 0; i < sentence->size() + 1; ++i) { + int tag_id = (i < sentence->size()) ? best_path[i] : -1; + int tag_left_id = (i > 0) ? best_path[i - 1] : -1; + int tag_left_left_id = (i > 1) ? best_path[i - 2] : -1; + + if (i < sentence->size()) { + const vector &index_unigram_parts = + sequence_parts->FindUnigramParts(i); + for (int k = 0; k < index_unigram_parts.size(); ++k) { + int r = index_unigram_parts[k]; + SequencePartUnigram *unigram = + static_cast((*parts)[r]); + if (tag_id == unigram->tag()) { + (*predicted_output)[r] = 1.0; + //std::cout << "selected unigram " << i << " " << tag_id + // << " score=" << scores[r] << endl; + ++active; + } + } + } + + if (pipe_->GetSequenceOptions()->markov_order() >= 1) { + const vector &index_bigram_parts = + sequence_parts->FindBigramParts(i); + for (int k = 0; k < index_bigram_parts.size(); ++k) { + int r = index_bigram_parts[k]; + SequencePartBigram *bigram = + static_cast((*parts)[r]); + if (tag_id == bigram->tag() && tag_left_id == bigram->tag_left()) { + (*predicted_output)[r] = 1.0; + //std::cout << "selected bigram " << i << " " << tag_id << " " + // << tag_left_id + // << " score=" << scores[r] << endl; + ++active; + } + } + } + + bool found = false; + if (pipe_->GetSequenceOptions()->markov_order() >= 2 && i > 0) { + const vector &index_trigram_parts = + sequence_parts->FindTrigramParts(i); + for (int k = 0; k < index_trigram_parts.size(); ++k) { + int r = index_trigram_parts[k]; + SequencePartTrigram *trigram = + static_cast((*parts)[r]); + if (tag_id == trigram->tag() && tag_left_id == trigram->tag_left() + && tag_left_left_id == trigram->tag_left_left()) { + (*predicted_output)[r] = 1.0; + //std::cout << "selected trigram " << i << " " << tag_id << " " + // << tag_left_id << " " << tag_left_left_id + // << " score=" << scores[r] << endl; + ++active; + found = true; + } + } + CHECK(found || sentence->size() == 1); + } + } +#endif +} diff --git a/src/entity_recognizer/EntityPipe.h b/src/entity_recognizer/EntityPipe.h index 0f62654..193719c 100644 --- a/src/entity_recognizer/EntityPipe.h +++ b/src/entity_recognizer/EntityPipe.h @@ -26,6 +26,7 @@ #include "EntityInstanceNumeric.h" #include "EntityWriter.h" #include "EntityFeatures.h" +#include "EntityDecoder.h" // by MLA class EntityPipe : public SequencePipe { public: @@ -59,6 +60,8 @@ class EntityPipe : public SequencePipe { static_cast(instance)); return instance_numeric; } + + void CreateDecoder() { decoder_ = new EntityDecoder(this); }; // by MLA protected: //void SaveModel(FILE* fs); diff --git a/src/sequence/SequenceDecoder.cpp b/src/sequence/SequenceDecoder.cpp index dc02224..9c11d70 100644 --- a/src/sequence/SequenceDecoder.cpp +++ b/src/sequence/SequenceDecoder.cpp @@ -21,6 +21,11 @@ #include "SequencePipe.h" #include // Remove this. +//DEFINE_double(ner_train_cost_false_positives, 0.5, +// "Cost for 'false positives' -- penalises recall and favours precision in BIO tagging."); +//DEFINE_double(ner_train_cost_false_negatives, 0.5, +// "Cost for 'false negatives' -- penalises precision and favours recall in BIO tagging."); + void SequenceDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, const vector &scores, const vector &gold_output, @@ -32,6 +37,21 @@ void SequenceDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, sequence_parts->GetOffsetUnigram(&offset_unigrams, &num_unigrams); + //////////////////////////////////////////////////// + // F1: a = 0.5, b = 0.5. + // Recall: a = 0, b = 1. + // In general: + // p = a - (a+b)*z0 + // q = b*sum(z0) + // p'*z + q = a*sum(z) - (a+b)*z0'*z + b*sum(z0) + // = a*(1-z0)'*z + b*(1-z)'*z0. + //////////////////////////////////////////////////// + + // Penalty for predicting 1 when it is 0 (FP). + // double a = FLAGS_ner_train_cost_false_positives; + // Penalty for predicting 0 when it is 1 (FN). + // double b = FLAGS_ner_train_cost_false_negatives; + // p = 0.5-z0, q = 0.5'*z0, loss = p'*z + q double q = 0.0; vector p(num_unigrams, 0.0); diff --git a/src/sequence/SequenceDecoder.h b/src/sequence/SequenceDecoder.h index a1ea407..68bc96c 100644 --- a/src/sequence/SequenceDecoder.h +++ b/src/sequence/SequenceDecoder.h @@ -159,11 +159,11 @@ class SequenceDecoder : public Decoder { SequenceDecoder(SequencePipe *pipe) : pipe_(pipe) {}; virtual ~SequenceDecoder() {}; - void Decode(Instance *instance, Parts *parts, + virtual void Decode(Instance *instance, Parts *parts, const vector &scores, vector *predicted_output); - void DecodeCostAugmented(Instance *instance, Parts *parts, + virtual void DecodeCostAugmented(Instance *instance, Parts *parts, const vector &scores, const vector &gold_output, vector *predicted_output, From 017db3196128538c8cadae8d49836ced21021a7a Mon Sep 17 00:00:00 2001 From: Mariana Almeida Date: Mon, 2 Jan 2017 15:36:23 +0000 Subject: [PATCH 37/51] add precision recall parameters to NER --- src/entity_recognizer/EntityDecoder.cpp | 78 ++++++++++++++++++-- src/entity_recognizer/EntityDecoder.h | 97 +++++++++++++++++++++++++ 2 files changed, 169 insertions(+), 6 deletions(-) create mode 100644 src/entity_recognizer/EntityDecoder.h diff --git a/src/entity_recognizer/EntityDecoder.cpp b/src/entity_recognizer/EntityDecoder.cpp index 585b292..10ffdf9 100644 --- a/src/entity_recognizer/EntityDecoder.cpp +++ b/src/entity_recognizer/EntityDecoder.cpp @@ -16,6 +16,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with TurboParser 2.3. If not, see . +#include "Dictionary.h" #include "EntityDecoder.h" #include "SequencePart.h" #include "EntityPipe.h" @@ -23,8 +24,8 @@ DEFINE_double(ner_train_cost_false_positives, 0.5, "Cost for 'false positives' -- penalises recall and favours precision in BIO tagging."); -//DEFINE_double(ner_train_cost_false_negatives, 0.5, -// "Cost for 'false negatives' -- penalises precision and favours recall in BIO tagging."); +DEFINE_double(ner_train_cost_false_negatives, 0.5, + "Cost for 'false negatives' -- penalises precision and favours recall in BIO tagging."); void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, const vector &scores, @@ -32,9 +33,74 @@ void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, vector *predicted_output, double *cost, double *loss) { - LOG(INFO) << " [DEBUG] @EntityDecoder::DecodeCostAugmented"; - return SequenceDecoder::DecodeCostAugmented(instance, parts, scores, gold_output, - predicted_output, cost, loss); + //LOG(INFO) << " [DEBUG] @EntityDecoder::DecodeCostAugmented"; + //return SequenceDecoder::DecodeCostAugmented(instance, parts, scores, gold_output, + // predicted_output, cost, loss); + + SequenceParts *sequence_parts = static_cast(parts); + int offset_unigrams, num_unigrams; + //int offset_bigrams, num_bigrams; + //int offset_trigrams, num_trigrams; + + sequence_parts->GetOffsetUnigram(&offset_unigrams, &num_unigrams); + //sequence_parts->GetOffsetBigram(&offset_bigrams, &num_bigrams); + //sequence_parts->GetOffsetTrigram(&offset_trigrams, &num_trigrams); + + //////////////////////////////////////////////////// + // F1: a = 0.5, b = 0.5. + // Recall: a = 0, b = 1. + // In general: + // p = a - (a+b)*z0 + // q = b*sum(z0) + // p'*z + q = a*sum(z) - (a+b)*z0'*z + b*sum(z0) + // = a*(1-z0)'*z + b*(1-z)'*z0. + //////////////////////////////////////////////////// + + // Penalty for predicting 1 when it is 0 (FP). + double a = FLAGS_ner_train_cost_false_positives; + // Penalty for predicting 0 when it is 1 (FN). + double b = FLAGS_ner_train_cost_false_negatives; + //double b = 1 - a; + + // p = 0.5-z0, q = 0.5'*z0, loss = p'*z + q + double q = 0.0; + vector p(num_unigrams, 0.0); + + vector scores_cost = scores; + //SequencePartUnigram *sequence_unigram_parts = static_cast(parts); + for (int r = 0; r < num_unigrams; ++r) { + + SequenceDictionary *dictionary; + dictionary = static_cast(pipe_->GetSequenceDictionary()); + SequencePartUnigram *unigram_part = (static_cast((*sequence_parts)[r])); + int tag = unigram_part->tag(); + const std::string & tag_name = dictionary->GetTagName(tag); + EntityOptions *entity_options = static_cast(pipe_)->GetEntityOptions(); + /*if (entity_options->tagging_scheme() == EntityTaggingSchemes::BIO){ + // Independent of TaggingSchemme + }*/ + if (tag_name[0] != 'O'){ // if inside (not outside) + p[r] = a - (a+b)*gold_output[offset_unigrams + r]; + q += b*gold_output[offset_unigrams + r]; + } else { + p[r] = 0; + } + scores_cost[offset_unigrams + r] += p[r]; + } + + Decode(instance, parts, scores_cost, predicted_output); + + *cost = q; + for (int r = 0; r < num_unigrams; ++r) { + *cost += p[r] * (*predicted_output)[offset_unigrams + r]; + } + + *loss = *cost; + for (int r = 0; r < parts->size(); ++r) { + *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); + } + + #if 0 SequenceParts *sequence_parts = static_cast(parts); int offset_unigrams, num_unigrams; @@ -85,7 +151,7 @@ void EntityDecoder::Decode(Instance *instance, Parts *parts, const vector &scores, vector *predicted_output) { - LOG(INFO) << " [DEBUG] @EntityDecoder::Decode"; + //LOG(INFO) << " [DEBUG] @EntityDecoder::Decode"; return SequenceDecoder::Decode(instance, parts, scores, predicted_output); #if 0 diff --git a/src/entity_recognizer/EntityDecoder.h b/src/entity_recognizer/EntityDecoder.h new file mode 100644 index 0000000..580a4c8 --- /dev/null +++ b/src/entity_recognizer/EntityDecoder.h @@ -0,0 +1,97 @@ +// Copyright (c) 2012-2015 Andre Martins +// All Rights Reserved. +// +// This file is part of TurboParser 2.3. +// +// TurboParser 2.3 is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TurboParser 2.3 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with TurboParser 2.3. If not, see . + +#ifndef ENTITYDECODER_H_ +#define ENTITYDECODER_H_ + +#include "../sequence/SequenceDecoder.h" + + +class EntityDecoder : public SequenceDecoder { +public: + EntityDecoder() {}; + EntityDecoder(SequencePipe *pipe) : SequenceDecoder(pipe) {}; // EntityPipe SequencePipe?? + virtual ~EntityDecoder() {}; + + virtual void Decode(Instance *instance, Parts *parts, + const vector &scores, + vector *predicted_output); + + virtual void DecodeCostAugmented(Instance *instance, Parts *parts, + const vector &scores, + const vector &gold_output, + vector *predicted_output, + double *cost, + double *loss); + + virtual void DecodeCostAugmentedMarginals(Instance *instance, Parts *parts, + const vector &scores, + const vector &gold_output, + vector *predicted_output, + double *entropy, + double *cost, + double *loss) { + CHECK(false) << "Not implemented yet."; + } + + virtual void DecodeMarginals(Instance *instance, Parts *parts, + const vector &scores, + const vector &gold_output, + vector *predicted_output, + double *entropy, + double *loss) { + // TODO: Implement forward-backward. + CHECK(false) << "Not implemented yet."; + } + +#if 0 + void ConvertToFirstOrderModel( + const std::vector &node_scores, + const std::vector &edge_scores, + const std::vector &triplet_scores, + std::vector *transformed_node_scores, + std::vector *transformed_edge_scores); + + void RecoverBestPath(const std::vector &best_path, + std::vector *transformed_best_path); + + double SolveMarkovZeroOrder(const std::vector &node_scores, + std::vector *best_path); + + double RunViterbi(const vector > &node_scores, + const vector > > + &edge_scores, + vector *best_path); + + double RunViterbi(const std::vector &node_scores, + const std::vector &edge_scores, + std::vector *best_path); + +#ifdef USE_CPLEX + double DecodeCPLEX(Instance *instance, Parts *parts, + const vector &scores, + bool relax, + vector *predicted_output); +#endif // +#endif // #if 0 + +protected: + //EntityPipe *pipe_; //SequencePipe *pipe_; +}; + +#endif /* SEQUENCEDECODER_H_ */ From 132269b0623bbf41c0fb6b3f1b92f7c203a7cac2 Mon Sep 17 00:00:00 2001 From: Mariana Almeida Date: Mon, 2 Jan 2017 15:57:26 +0000 Subject: [PATCH 38/51] clear unused code in Entity.cpp/.h --- src/entity_recognizer/EntityDecoder.cpp | 429 +----------------------- src/entity_recognizer/EntityDecoder.h | 60 +--- 2 files changed, 5 insertions(+), 484 deletions(-) diff --git a/src/entity_recognizer/EntityDecoder.cpp b/src/entity_recognizer/EntityDecoder.cpp index 10ffdf9..9aac8f1 100644 --- a/src/entity_recognizer/EntityDecoder.cpp +++ b/src/entity_recognizer/EntityDecoder.cpp @@ -33,19 +33,12 @@ void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, vector *predicted_output, double *cost, double *loss) { - //LOG(INFO) << " [DEBUG] @EntityDecoder::DecodeCostAugmented"; - //return SequenceDecoder::DecodeCostAugmented(instance, parts, scores, gold_output, - // predicted_output, cost, loss); - + SequenceParts *sequence_parts = static_cast(parts); int offset_unigrams, num_unigrams; - //int offset_bigrams, num_bigrams; - //int offset_trigrams, num_trigrams; - + sequence_parts->GetOffsetUnigram(&offset_unigrams, &num_unigrams); - //sequence_parts->GetOffsetBigram(&offset_bigrams, &num_bigrams); - //sequence_parts->GetOffsetTrigram(&offset_trigrams, &num_trigrams); - + //////////////////////////////////////////////////// // F1: a = 0.5, b = 0.5. // Recall: a = 0, b = 1. @@ -67,7 +60,7 @@ void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, vector p(num_unigrams, 0.0); vector scores_cost = scores; - //SequencePartUnigram *sequence_unigram_parts = static_cast(parts); + for (int r = 0; r < num_unigrams; ++r) { SequenceDictionary *dictionary; @@ -76,9 +69,6 @@ void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, int tag = unigram_part->tag(); const std::string & tag_name = dictionary->GetTagName(tag); EntityOptions *entity_options = static_cast(pipe_)->GetEntityOptions(); - /*if (entity_options->tagging_scheme() == EntityTaggingSchemes::BIO){ - // Independent of TaggingSchemme - }*/ if (tag_name[0] != 'O'){ // if inside (not outside) p[r] = a - (a+b)*gold_output[offset_unigrams + r]; q += b*gold_output[offset_unigrams + r]; @@ -100,415 +90,4 @@ void EntityDecoder::DecodeCostAugmented(Instance *instance, Parts *parts, *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); } - -#if 0 - SequenceParts *sequence_parts = static_cast(parts); - int offset_unigrams, num_unigrams; - - sequence_parts->GetOffsetUnigram(&offset_unigrams, &num_unigrams); - - //////////////////////////////////////////////////// - // F1: a = 0.5, b = 0.5. - // Recall: a = 0, b = 1. - // In general: - // p = a - (a+b)*z0 - // q = b*sum(z0) - // p'*z + q = a*sum(z) - (a+b)*z0'*z + b*sum(z0) - // = a*(1-z0)'*z + b*(1-z)'*z0. - //////////////////////////////////////////////////// - - // Penalty for predicting 1 when it is 0 (FP). - // double a = FLAGS_ner_train_cost_false_positives; - // Penalty for predicting 0 when it is 1 (FN). - // double b = FLAGS_ner_train_cost_false_negatives; - - // p = 0.5-z0, q = 0.5'*z0, loss = p'*z + q - double q = 0.0; - vector p(num_unigrams, 0.0); - - vector scores_cost = scores; - for (int r = 0; r < num_unigrams; ++r) { - p[r] = 0.5 - gold_output[offset_unigrams + r]; - scores_cost[offset_unigrams + r] += p[r]; - q += 0.5*gold_output[offset_unigrams + r]; - } - - Decode(instance, parts, scores_cost, predicted_output); - - *cost = q; - for (int r = 0; r < num_unigrams; ++r) { - *cost += p[r] * (*predicted_output)[offset_unigrams + r]; - } - - *loss = *cost; - for (int r = 0; r < parts->size(); ++r) { - *loss += scores[r] * ((*predicted_output)[r] - gold_output[r]); - } -#endif -} - -void EntityDecoder::Decode(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output) { - - //LOG(INFO) << " [DEBUG] @EntityDecoder::Decode"; - return SequenceDecoder::Decode(instance, parts, scores, predicted_output); - -#if 0 -#ifdef USE_CPLEX - return DecodeCPLEX(instance, parts, scores, false, predicted_output); -#endif - - SequenceInstanceNumeric *sentence = static_cast(instance); - SequenceParts *sequence_parts = static_cast(parts); - int offset, size; - - vector node_scores(sentence->size()); - vector edge_scores(sentence->size() - 1); - // The triplets are represented as if they were edges connecting - // nodes with bigram states. - vector triplet_scores; - - // Cache previous state positions in SequenceDecoderEdgeScores. - // This will avoid expensive FindPreviousState(...) operations - // when building the triplet scores, but it may consume - // a lot of memory if there are too many tag bigrams. - bool cache_edge_previous_states = false; - if (pipe_->GetSequenceOptions()->markov_order() >= 1) { - cache_edge_previous_states = true; - } - - // Compute node scores from unigrams. - sequence_parts->GetOffsetUnigram(&offset, &size); - for (int r = 0; r < size; ++r) { - SequencePartUnigram *unigram = - static_cast((*parts)[offset + r]); - node_scores[unigram->position()].AddStateScore(unigram->tag(), - scores[offset + r]); - } - for (int i = 0; i < sentence->size(); ++i) { - CHECK_GE(node_scores[i].GetNumStates(), 0); - } - - // Initialize the edge scores to zero. - // Include all edges allowed by the dictionary that are supported - // on the unigram states. Edges that do not have a bigram part - // are given zero scores. - if (pipe_->GetSequenceOptions()->markov_order() >= 1) { - for (int i = 0; i < sentence->size() - 1; ++i) { - edge_scores[i].SetNumCurrentStates(node_scores[i + 1].GetNumStates()); - //LOG(INFO) << "node_scores[" << i + 1 << "].GetNumStates() = " << node_scores[i + 1].GetNumStates(); - for (int j = 0; j < node_scores[i + 1].GetNumStates(); ++j) { - int tag_id = node_scores[i + 1].GetState(j); - - //const std::vector &allowed_left_tags = - // pipe_->GetSequenceDictionary()->GetAllowedPreviousTags(tag); - - //edge_scores[i].SetNumPreviousStates(tag_id, - // node_scores[i].GetNumStates()); - for (int k = 0; k < node_scores[i].GetNumStates(); ++k) { - int tag_left_id = node_scores[i].GetState(k); - if (pipe_->GetSequenceDictionary()->IsAllowedBigram(tag_left_id, - tag_id)) { - //edge_scores[i].SetPreviousStateScore(tag_id, tag_left_id, - // tag_left_id, 0.0); - edge_scores[i].AddPreviousStateScore(j, k, 0.0); - } - } - } - } - } - - // Cache edge previous states. - // We just use a vector for fast access. In cases where there are a lot of - // bigram tags, a vector > > > could - // be better, but it was slower for POS tagging. - // The first element of the pair encodes the index of the previous state; - // the second element encodes the bigram index (index of the edge). - std::vector > > > - edge_previous_states; - if (cache_edge_previous_states) { - edge_previous_states.resize(sentence->size() - 1); - for (int i = 0; i < sentence->size() - 1; ++i) { - edge_previous_states[i].resize(node_scores[i + 1].GetNumStates()); - int bigram_index = 0; - CHECK_EQ(node_scores[i + 1].GetNumStates(), - edge_scores[i].GetNumCurrentStates()); - for (int tag_id = 0; tag_id < edge_scores[i].GetNumCurrentStates(); - ++tag_id) { - edge_previous_states[i][tag_id].resize(node_scores[i].GetNumStates(), - std::pair(-1, -1)); - for (int k = 0; k < edge_scores[i].GetNumPreviousStates(tag_id); ++k) { - int tag_left_id = - edge_scores[i].GetPreviousStateScore(tag_id, k).first; - edge_previous_states[i][tag_id][tag_left_id].first = k; - edge_previous_states[i][tag_id][tag_left_id].second = bigram_index; - //LOG(INFO) << "edge_previous_states[" << i << "][" << tag_id << "][" - // << tag_left_id << "].first = "<< k; - ++bigram_index; - } - } - } - } - - // Compute edge scores from bigrams. - sequence_parts->GetOffsetBigram(&offset, &size); - for (int r = 0; r < size; ++r) { - SequencePartBigram *bigram = - static_cast((*parts)[offset + r]); - // Get indices corresponding to tag id and left tag id. - // TODO: Make this more efficient. - // TODO: Cache node states to avoid many calls to FindState? - int i = bigram->position(); - int tag_id = -1; - int tag_left_id = -1; - if (i < sentence->size()) { - tag_id = node_scores[i].FindState(bigram->tag()); - } - if (i > 0) { - tag_left_id = node_scores[i - 1].FindState(bigram->tag_left()); - } - - if (i == 0) { - CHECK_EQ(bigram->tag_left(), -1); - node_scores[i].IncrementScore(tag_id, scores[offset + r]); - } else if (i == sentence->size()) { - CHECK_EQ(bigram->tag(), -1); - node_scores[i - 1].IncrementScore(tag_left_id, scores[offset + r]); - } else { - CHECK_GE(tag_left_id, 0); - CHECK_LT(tag_left_id, node_scores[i - 1].GetNumStates()); - CHECK_GE(tag_id, 0); - CHECK_LT(tag_id, node_scores[i].GetNumStates()); - - int k; - if (cache_edge_previous_states) { - k = edge_previous_states[i - 1][tag_id][tag_left_id].first; - } else { - k = edge_scores[i - 1].FindPreviousState(tag_id, tag_left_id); - } - CHECK_GE(k, 0) << tag_id << " " << tag_left_id << " " << i; - edge_scores[i - 1].SetPreviousStateScore(tag_id, k, tag_left_id, - scores[offset + r]); - } - } - - // Compute triplet scores from trigrams. - if (pipe_->GetSequenceOptions()->markov_order() == 2 && - sentence->size() > 1) { - triplet_scores.resize(sentence->size() - 2); - sequence_parts->GetOffsetTrigram(&offset, &size); - - // Cache the last trigram to save time. - SequencePartTrigram *last_trigram = NULL; - int tag_id = -1; - int tag_left_id = -1; - int tag_left_left_id = -1; - int bigram_index = -1; - for (int r = 0; r < size; ++r) { - SequencePartTrigram *trigram = - static_cast((*parts)[offset + r]); - // Get indices corresponding to tag id, left tag id, and left-left tag id. - // TODO: Make this more efficient. - int i = trigram->position(); - - if (i < sentence->size()) { - if (last_trigram == NULL || last_trigram->position() != i || - trigram->tag() != last_trigram->tag()) { - tag_id = node_scores[i].FindState(trigram->tag()); - } - } - if (i > 0) { - if (last_trigram == NULL || last_trigram->position() != i || - trigram->tag() != last_trigram->tag() || - trigram->tag_left() != last_trigram->tag_left()) { - tag_left_id = node_scores[i - 1].FindState(trigram->tag_left()); - } - } - if (i > 1) { - tag_left_left_id = node_scores[i - 2]. - FindState(trigram->tag_left_left()); - } - - if (i == 0) { - // I don't think this ever reaches this point. - CHECK_GE(trigram->tag(), 0); - CHECK_EQ(trigram->tag_left(), -1); - CHECK_EQ(trigram->tag_left_left(), -1); - } else if (i == 1) { - CHECK_GE(trigram->tag(), 0); - CHECK_GE(trigram->tag_left(), 0); - CHECK_EQ(trigram->tag_left_left(), -1); - //edge_scores[i - 1][tag_left_id][tag_id] += scores[offset + r]; - int k; - if (cache_edge_previous_states) { - k = edge_previous_states[i - 1][tag_id][tag_left_id].first; - } else { - k = edge_scores[i - 1].FindPreviousState(tag_id, - tag_left_id); - } - CHECK_GE(k, 0); - edge_scores[i - 1].IncrementScore(tag_id, k, scores[offset + r]); - } else if (i == sentence->size()) { - CHECK_EQ(trigram->tag(), -1); - CHECK_GE(trigram->tag_left(), 0); - CHECK_GE(trigram->tag_left_left(), 0); - int k; - if (cache_edge_previous_states) { - k = edge_previous_states[i - 2][tag_left_id][tag_left_left_id].first; - } else { - k = edge_scores[i - 2].FindPreviousState(tag_left_id, - tag_left_left_id); - } - CHECK_GE(k, 0); - edge_scores[i - 2].IncrementScore(tag_left_id, k, scores[offset + r]); - } else { - CHECK_GE(tag_left_left_id, 0); - CHECK_LT(tag_left_left_id, node_scores[i - 2].GetNumStates()); - CHECK_GE(tag_left_id, 0); - CHECK_LT(tag_left_id, node_scores[i - 1].GetNumStates()); - CHECK_GE(tag_id, 0); - CHECK_LT(tag_id, node_scores[i].GetNumStates()); - - if (last_trigram == NULL || last_trigram->position() != i || - trigram->tag() != last_trigram->tag() || - trigram->tag_left() != last_trigram->tag_left()) { - // Do this in an initialization before. - triplet_scores[i - 2]. - SetNumCurrentStates(edge_scores[i - 1].GetNumStatePairs()); - - if (cache_edge_previous_states) { - int k = edge_previous_states[i - 1][tag_id][tag_left_id].first; - bigram_index = - edge_previous_states[i - 1][tag_id][tag_left_id].second; - } else { - int k = edge_scores[i - 1].FindPreviousState(tag_id, - tag_left_id); - CHECK_GE(k, 0); - bigram_index = edge_scores[i - 1].GetStatePairIndex(tag_id, k); - } - CHECK_LT(bigram_index, triplet_scores[i - 2].GetNumCurrentStates()); - } - - int l; - int previous_bigram_index; - if (cache_edge_previous_states) { - l = edge_previous_states[i - 2][tag_left_id][tag_left_left_id].first; - previous_bigram_index = - edge_previous_states[i - 2][tag_left_id][tag_left_left_id].second; - } else { - l = edge_scores[i - 2].FindPreviousState(tag_left_id, - tag_left_left_id); - CHECK_GE(l, 0); - // Not sure we need this; might be fine with just l. - previous_bigram_index = edge_scores[i - 2]. - GetStatePairIndex(tag_left_id, l); - CHECK_LT(l, triplet_scores[i - 2].GetNumPreviousStates(bigram_index)); - } - - // Do this in an initialization before. - triplet_scores[i - 2]. - SetNumPreviousStates(bigram_index, edge_scores[i - 2]. - GetNumPreviousStates(tag_left_id)); - - triplet_scores[i - 2].SetPreviousStateScore(bigram_index, - l, - previous_bigram_index, - scores[offset + r]); - } - - last_trigram = trigram; - } - } - - vector best_path; - double value; - if (pipe_->GetSequenceOptions()->markov_order() == 2 && - sentence->size() > 1) { - vector transformed_node_scores; - vector transformed_edge_scores; - - // Convert to a first order sequence model. - ConvertToFirstOrderModel(node_scores, - edge_scores, - triplet_scores, - &transformed_node_scores, - &transformed_edge_scores); - vector transformed_best_path; - value = RunViterbi(transformed_node_scores, transformed_edge_scores, - &transformed_best_path); - //std::cout << "Value = " << value << endl; - - // Recover the best path in the original second-order model. - RecoverBestPath(transformed_best_path, &best_path); - } else if (pipe_->GetSequenceOptions()->markov_order() == 1) { - value = RunViterbi(node_scores, edge_scores, &best_path); - } else { - value = SolveMarkovZeroOrder(node_scores, &best_path); - } - - predicted_output->clear(); - predicted_output->resize(parts->size(), 0.0); - - int active = 0; - for (int i = 0; i < sentence->size() + 1; ++i) { - int tag_id = (i < sentence->size()) ? best_path[i] : -1; - int tag_left_id = (i > 0) ? best_path[i - 1] : -1; - int tag_left_left_id = (i > 1) ? best_path[i - 2] : -1; - - if (i < sentence->size()) { - const vector &index_unigram_parts = - sequence_parts->FindUnigramParts(i); - for (int k = 0; k < index_unigram_parts.size(); ++k) { - int r = index_unigram_parts[k]; - SequencePartUnigram *unigram = - static_cast((*parts)[r]); - if (tag_id == unigram->tag()) { - (*predicted_output)[r] = 1.0; - //std::cout << "selected unigram " << i << " " << tag_id - // << " score=" << scores[r] << endl; - ++active; - } - } - } - - if (pipe_->GetSequenceOptions()->markov_order() >= 1) { - const vector &index_bigram_parts = - sequence_parts->FindBigramParts(i); - for (int k = 0; k < index_bigram_parts.size(); ++k) { - int r = index_bigram_parts[k]; - SequencePartBigram *bigram = - static_cast((*parts)[r]); - if (tag_id == bigram->tag() && tag_left_id == bigram->tag_left()) { - (*predicted_output)[r] = 1.0; - //std::cout << "selected bigram " << i << " " << tag_id << " " - // << tag_left_id - // << " score=" << scores[r] << endl; - ++active; - } - } - } - - bool found = false; - if (pipe_->GetSequenceOptions()->markov_order() >= 2 && i > 0) { - const vector &index_trigram_parts = - sequence_parts->FindTrigramParts(i); - for (int k = 0; k < index_trigram_parts.size(); ++k) { - int r = index_trigram_parts[k]; - SequencePartTrigram *trigram = - static_cast((*parts)[r]); - if (tag_id == trigram->tag() && tag_left_id == trigram->tag_left() - && tag_left_left_id == trigram->tag_left_left()) { - (*predicted_output)[r] = 1.0; - //std::cout << "selected trigram " << i << " " << tag_id << " " - // << tag_left_id << " " << tag_left_left_id - // << " score=" << scores[r] << endl; - ++active; - found = true; - } - } - CHECK(found || sentence->size() == 1); - } - } -#endif } diff --git a/src/entity_recognizer/EntityDecoder.h b/src/entity_recognizer/EntityDecoder.h index 580a4c8..2ca6d6d 100644 --- a/src/entity_recognizer/EntityDecoder.h +++ b/src/entity_recognizer/EntityDecoder.h @@ -28,70 +28,12 @@ class EntityDecoder : public SequenceDecoder { EntityDecoder(SequencePipe *pipe) : SequenceDecoder(pipe) {}; // EntityPipe SequencePipe?? virtual ~EntityDecoder() {}; - virtual void Decode(Instance *instance, Parts *parts, - const vector &scores, - vector *predicted_output); - virtual void DecodeCostAugmented(Instance *instance, Parts *parts, const vector &scores, const vector &gold_output, vector *predicted_output, double *cost, double *loss); - - virtual void DecodeCostAugmentedMarginals(Instance *instance, Parts *parts, - const vector &scores, - const vector &gold_output, - vector *predicted_output, - double *entropy, - double *cost, - double *loss) { - CHECK(false) << "Not implemented yet."; - } - - virtual void DecodeMarginals(Instance *instance, Parts *parts, - const vector &scores, - const vector &gold_output, - vector *predicted_output, - double *entropy, - double *loss) { - // TODO: Implement forward-backward. - CHECK(false) << "Not implemented yet."; - } - -#if 0 - void ConvertToFirstOrderModel( - const std::vector &node_scores, - const std::vector &edge_scores, - const std::vector &triplet_scores, - std::vector *transformed_node_scores, - std::vector *transformed_edge_scores); - - void RecoverBestPath(const std::vector &best_path, - std::vector *transformed_best_path); - - double SolveMarkovZeroOrder(const std::vector &node_scores, - std::vector *best_path); - - double RunViterbi(const vector > &node_scores, - const vector > > - &edge_scores, - vector *best_path); - - double RunViterbi(const std::vector &node_scores, - const std::vector &edge_scores, - std::vector *best_path); - -#ifdef USE_CPLEX - double DecodeCPLEX(Instance *instance, Parts *parts, - const vector &scores, - bool relax, - vector *predicted_output); -#endif // -#endif // #if 0 - -protected: - //EntityPipe *pipe_; //SequencePipe *pipe_; }; -#endif /* SEQUENCEDECODER_H_ */ +#endif /* ENTITYDECODER_H_ */ From f75b76c6198335ccf6ff8d3efb16cae680ab3d66 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 23 Mar 2017 17:53:05 +0000 Subject: [PATCH 39/51] Update MVS project files. --- libturboparser/TurboParserInterface.h | 2 +- vsprojects/entity_recognizer/entity_recognizer.vcxproj | 2 ++ vsprojects/libturboparser/libturboparser.vcxproj | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libturboparser/TurboParserInterface.h b/libturboparser/TurboParserInterface.h index dd26a7f..5df8187 100644 --- a/libturboparser/TurboParserInterface.h +++ b/libturboparser/TurboParserInterface.h @@ -222,4 +222,4 @@ class TurboParserInterface { std::vector coreference_resolvers_; std::vector morphological_taggers_; }; -} // namespace TurboParserInterface. +} // namespace TurboParserInterface diff --git a/vsprojects/entity_recognizer/entity_recognizer.vcxproj b/vsprojects/entity_recognizer/entity_recognizer.vcxproj index 916c960..29494c6 100644 --- a/vsprojects/entity_recognizer/entity_recognizer.vcxproj +++ b/vsprojects/entity_recognizer/entity_recognizer.vcxproj @@ -226,6 +226,7 @@ + @@ -236,6 +237,7 @@ + diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index a3414c0..7bdc44f 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -240,6 +240,7 @@ + @@ -335,6 +336,7 @@ + From 8be2e3fa1f04042f6efbb201ae5543abff27ddaf Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 23 Mar 2017 18:21:07 +0000 Subject: [PATCH 40/51] Update Makefiles. --- libturboparser/Makefile | 7 +++++-- src/entity_recognizer/Makefile.am | 1 + src/entity_recognizer/Makefile.in | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libturboparser/Makefile b/libturboparser/Makefile index 533cf2a..06ccf74 100644 --- a/libturboparser/Makefile +++ b/libturboparser/Makefile @@ -10,7 +10,7 @@ MORPHOLOGICALTAGGER = ../src/morphological_tagger AUXLIBS = ../deps/local/lib AUXINCLUDES = ../deps/local/include -OBJS = TurboParserInterface.o CoreferenceDecoder.o CoreferenceDictionary.o CoreferenceFeatures.o CoreferenceDocumentNumeric.o CoreferenceSentenceNumeric.o Mention.o CoreferenceDocument.o CoreferenceSentence.o CoreferenceOptions.o CoreferencePart.o CoreferencePipe.o CoreferenceReader.o CoreferenceWriter.o SemanticDecoder.o SemanticDictionary.o SemanticFeatures.o SemanticInstanceNumeric.o SemanticInstance.o SemanticOptions.o SemanticPart.o SemanticPipe.o SemanticReader.o SemanticWriter.o DependencyDecoder.o DependencyDictionary.o DependencyFeatures.o DependencyInstance.o DependencyInstanceNumeric.o DependencyOptions.o DependencyPart.o DependencyPipe.o DependencyReader.o DependencyWriter.o TaggerDictionary.o TaggerFeatures.o TaggerOptions.o TaggerPipe.o MorphologicalDictionary.o MorphologicalFeatures.o MorphologicalInstance.o MorphologicalInstanceNumeric.o MorphologicalOptions.o MorphologicalPipe.o MorphologicalReader.o MorphologicalWriter.o EntityDictionary.o EntityFeatures.o EntityInstance.o EntityInstanceNumeric.o EntityOptions.o EntityPipe.o EntityReader.o EntityWriter.o SequenceDecoder.o SequenceDictionary.o SequenceInstance.o SequenceInstanceNumeric.o SequenceOptions.o SequencePart.o SequencePipe.o SequenceReader.o SequenceWriter.o TokenDictionary.o Alphabet.o Dictionary.o Options.o Parameters.o Pipe.o Reader.o Writer.o AlgUtils.o SerializationUtils.o StringUtils.o TimeUtils.o +OBJS = TurboParserInterface.o CoreferenceDecoder.o CoreferenceDictionary.o CoreferenceFeatures.o CoreferenceDocumentNumeric.o CoreferenceSentenceNumeric.o Mention.o CoreferenceDocument.o CoreferenceSentence.o CoreferenceOptions.o CoreferencePart.o CoreferencePipe.o CoreferenceReader.o CoreferenceWriter.o SemanticDecoder.o SemanticDictionary.o SemanticFeatures.o SemanticInstanceNumeric.o SemanticInstance.o SemanticOptions.o SemanticPart.o SemanticPipe.o SemanticReader.o SemanticWriter.o DependencyDecoder.o DependencyDictionary.o DependencyFeatures.o DependencyInstance.o DependencyInstanceNumeric.o DependencyOptions.o DependencyPart.o DependencyPipe.o DependencyReader.o DependencyWriter.o TaggerDictionary.o TaggerFeatures.o TaggerOptions.o TaggerPipe.o MorphologicalDictionary.o MorphologicalFeatures.o MorphologicalInstance.o MorphologicalInstanceNumeric.o MorphologicalOptions.o MorphologicalPipe.o MorphologicalReader.o MorphologicalWriter.o EntityDictionary.o EntityFeatures.o EntityInstance.o EntityInstanceNumeric.o EntityOptions.o EntityPipe.o EntityReader.o EntityWriter.o EntityDecoder.o SequenceDecoder.o SequenceDictionary.o SequenceInstance.o SequenceInstanceNumeric.o SequenceOptions.o SequencePart.o SequencePipe.o SequenceReader.o SequenceWriter.o TokenDictionary.o Alphabet.o Dictionary.o Options.o Parameters.o Pipe.o Reader.o Writer.o AlgUtils.o SerializationUtils.o StringUtils.o TimeUtils.o CC = g++ DEBUG = -g INCLUDES = -I$(UTIL)/ -I$(CLASSIFIER) -I$(SEQUENCE) -I$(TAGGER) -I$(ENTITYRECOGNIZER) -I$(PARSER) -I$(SEMANTICPARSER) -I$(COREFERENCERESOLVER) -I$(MORPHOLOGICALTAGGER) -I$(AUXINCLUDES) @@ -200,7 +200,10 @@ EntityInstance.o: $(ENTITYRECOGNIZER)/EntityInstance.h $(ENTITYRECOGNIZER)/Entit EntityInstanceNumeric.o: $(ENTITYRECOGNIZER)/EntityInstanceNumeric.h $(ENTITYRECOGNIZER)/EntityInstanceNumeric.cpp $(ENTITYRECOGNIZER)/EntityInstance.h $(SEQUENCE)/SequenceInstanceNumeric.h $(ENTITYRECOGNIZER)/EntityDictionary.h $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityInstanceNumeric.cpp - + +EntityDecoder.o: $(ENTITYRECOGNIZER)/EntityDecoder.h $(ENTITYRECOGNIZER)/EntityDecoder.cpp $(SEQUENCE)/SequencePart.h $(ENTITYRECOGNIZER)/EntityPipe.h $(SEQUENCE)/SequenceDecoder.h + $(CC) $(CFLAGS) $(ENTITYRECOGNIZER)/EntityDecoder.cpp + ##################### SequenceDecoder.o: $(SEQUENCE)/SequenceDecoder.h $(SEQUENCE)/SequenceDecoder.cpp $(SEQUENCE)/SequencePart.h $(SEQUENCE)/SequencePipe.h $(CLASSIFIER)/Decoder.h diff --git a/src/entity_recognizer/Makefile.am b/src/entity_recognizer/Makefile.am index 121fd86..6edb80e 100644 --- a/src/entity_recognizer/Makefile.am +++ b/src/entity_recognizer/Makefile.am @@ -12,6 +12,7 @@ EntityInstance.cpp EntityInstance.h \ EntityInstanceNumeric.cpp EntityInstanceNumeric.h \ EntityReader.cpp EntityReader.h \ EntityWriter.cpp EntityWriter.h \ +EntityDecoder.cpp EntityDecoder.h \ EntitySpan.h \ EntityPipe.cpp EntityPipe.h \ $(SEQUENCE)/SequenceInstanceNumeric.cpp \ diff --git a/src/entity_recognizer/Makefile.in b/src/entity_recognizer/Makefile.in index 8d5fd2c..9e5352f 100644 --- a/src/entity_recognizer/Makefile.in +++ b/src/entity_recognizer/Makefile.in @@ -93,7 +93,7 @@ PROGRAMS = $(TurboEntityRecognizerprg_PROGRAMS) am_TurboEntityRecognizer_OBJECTS = EntityFeatures.$(OBJEXT) \ EntityOptions.$(OBJEXT) EntityDictionary.$(OBJEXT) \ EntityInstance.$(OBJEXT) EntityInstanceNumeric.$(OBJEXT) \ - EntityReader.$(OBJEXT) EntityWriter.$(OBJEXT) \ + EntityReader.$(OBJEXT) EntityWriter.$(OBJEXT) EntityDecoder.$(OBJEXT) \ EntityPipe.$(OBJEXT) SequenceInstanceNumeric.$(OBJEXT) \ SequenceWriter.$(OBJEXT) SequenceDecoder.$(OBJEXT) \ SequencePipe.$(OBJEXT) SequenceOptions.$(OBJEXT) \ @@ -284,6 +284,7 @@ EntityInstance.cpp EntityInstance.h \ EntityInstanceNumeric.cpp EntityInstanceNumeric.h \ EntityReader.cpp EntityReader.h \ EntityWriter.cpp EntityWriter.h \ +EntityDecoder.cpp EntityDecoder.h \ EntitySpan.h \ EntityPipe.cpp EntityPipe.h \ $(SEQUENCE)/SequenceInstanceNumeric.cpp \ @@ -412,6 +413,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EntityPipe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EntityReader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EntityWriter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EntityDecoder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Options.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parameters.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pipe.Po@am__quote@ From 5886b7c04e342aea08338c207968f59ea49bb26a Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 11 Jul 2017 17:43:17 +0100 Subject: [PATCH 41/51] BUG FIX TurboParser was crashing with empty sentences. --- libturboparser/TurboParserInterface.cpp | 12 ++++++++++++ src/classifier/Pipe.cpp | 14 ++++++++++++-- src/sequence/SequencePipe.cpp | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 11a51b9..09533b1 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -61,6 +61,8 @@ void TurboTaggerWorker::Tag(const std::string &file_test, } void TurboTaggerWorker::TagSentence(SequenceInstance *sentence) { + if (sentence->size() == 0) + return; tagger_pipe_->ClassifyInstance(sentence); } @@ -115,6 +117,8 @@ void TurboEntityRecognizerWorker::Tag(const std::string &file_test, } void TurboEntityRecognizerWorker::TagSentence(EntityInstance *sentence) { + if (sentence->size() == 0) + return; entity_pipe_->ClassifyInstance(sentence); } @@ -168,6 +172,8 @@ void TurboParserWorker::Parse(const std::string &file_test, } void TurboParserWorker::ParseSentence(DependencyInstance *sentence) { + if (sentence->size() == 0) + return; parser_pipe_->ClassifyInstance(sentence); } @@ -224,6 +230,8 @@ void TurboSemanticParserWorker::ParseSemanticDependencies( void TurboSemanticParserWorker::ParseSemanticDependenciesFromSentence( SemanticInstance *sentence) { + if (sentence->size() == 0) + return; semantic_pipe_->ClassifyInstance(sentence); } @@ -280,6 +288,8 @@ void TurboCoreferenceResolverWorker::ResolveCoreferences( void TurboCoreferenceResolverWorker::ResolveCoreferencesFromDocument( CoreferenceDocument *document) { + if (document->GetNumSentences() == 0) + return; coreference_pipe_->ClassifyInstance(document); } @@ -337,6 +347,8 @@ void TurboMorphologicalTaggerWorker::Tag(const std::string &file_test, void TurboMorphologicalTaggerWorker::TagSentence( MorphologicalInstance *sentence) { + if (sentence->size() == 0) + return; morphological_tagger_pipe_->ClassifyInstance(sentence); } diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index 11a5592..403a852 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -475,6 +475,15 @@ void Pipe::ClassifyInstance(Instance *instance) { // Create parts for this instance. MakeParts(formatted_instance, parts, &gold_outputs); + + if (parts->empty()) { + if (formatted_instance != instance) + delete formatted_instance; + delete parts; + delete features; + return; + } + // Create features for the parts of this instance. MakeFeatures(formatted_instance, parts, features); // Compute scores based on the features and parts of this instance. @@ -492,8 +501,9 @@ void Pipe::ClassifyInstance(Instance *instance) { predicted_outputs); } - if (formatted_instance != instance) delete formatted_instance; - + if (formatted_instance != instance) + delete formatted_instance; delete parts; delete features; + return; } diff --git a/src/sequence/SequencePipe.cpp b/src/sequence/SequencePipe.cpp index 7af0625..8638c20 100644 --- a/src/sequence/SequencePipe.cpp +++ b/src/sequence/SequencePipe.cpp @@ -274,6 +274,8 @@ void SequencePipe::MakeParts(Instance *instance, vector *gold_outputs) { int sentence_length = static_cast(instance)->size(); + if (sentence_length == 0) + return; SequenceParts *sequence_parts = static_cast(parts); sequence_parts->Initialize(); bool make_gold = (gold_outputs != NULL); From 44e265a557c4725a4d1537df61ad1e9db4149763 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Thu, 27 Jul 2017 16:14:04 +0100 Subject: [PATCH 42/51] . --- src/semantic_parser/SemanticReader.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/semantic_parser/SemanticReader.cpp b/src/semantic_parser/SemanticReader.cpp index d3d67a7..ab61347 100644 --- a/src/semantic_parser/SemanticReader.cpp +++ b/src/semantic_parser/SemanticReader.cpp @@ -135,17 +135,20 @@ Instance *SemanticReader::GetNext() { string top_name = info[offset]; ++offset; CHECK(0 == top_name.compare("-") || 0 == top_name.compare("+")); - if (0 == top_name.compare("+")) is_top = true; + if (0 == top_name.compare("+")) + is_top = true; string predicate_flag = info[offset]; ++offset; CHECK(0 == predicate_flag.compare("-") || 0 == predicate_flag.compare("+")); - if (0 == predicate_flag.compare("+")) is_predicate = true; + if (0 == predicate_flag.compare("+")) + is_predicate = true; } string predicate_name = info[offset]; ++offset; if (!use_sdp_format_) { - if (0 != predicate_name.compare("_")) is_predicate = true; + if (0 != predicate_name.compare("_")) + is_predicate = true; } if (!use_sdp_format_) CHECK_EQ(offset, 11); if (i == 0) { From dca856c4c2743919fe4a7183caf7bc8c5c8df503 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Mon, 31 Jul 2017 11:44:29 +0100 Subject: [PATCH 43/51] Expose node and edge scores from Viterbi step in TurboParser. --- src/classifier/Pipe.cpp | 1 + src/classifier/Writer.cpp | 7 ++++ src/classifier/Writer.h | 4 ++ .../ConstituencyLabelerWriter.cpp | 2 + .../ConstituencyLabelerWriter.h | 2 + .../ConstituencyWriter.cpp | 2 + src/constituency_labeler/ConstituencyWriter.h | 1 + .../CoreferenceWriter.cpp | 4 ++ src/coreference_resolver/CoreferenceWriter.h | 2 + src/entity_recognizer/EntityWriter.cpp | 41 +++++++++++++++++++ src/entity_recognizer/EntityWriter.h | 1 + .../MorphologicalWriter.cpp | 2 + .../MorphologicalWriter.h | 1 + src/parser/DependencyWriter.cpp | 2 + src/parser/DependencyWriter.h | 1 + src/semantic_parser/SemanticWriter.cpp | 2 + src/semantic_parser/SemanticWriter.h | 1 + src/sequence/SequenceDecoder.cpp | 7 +++- src/sequence/SequenceInstanceNumeric.h | 9 +++- src/sequence/SequenceWriter.cpp | 3 ++ src/sequence/SequenceWriter.h | 1 + 21 files changed, 93 insertions(+), 3 deletions(-) diff --git a/src/classifier/Pipe.cpp b/src/classifier/Pipe.cpp index 403a852..847471a 100644 --- a/src/classifier/Pipe.cpp +++ b/src/classifier/Pipe.cpp @@ -442,6 +442,7 @@ void Pipe::Run() { } writer_->Write(output_instance); + writer_->WriteFormatted(this, formatted_instance); if (formatted_instance != instance) delete formatted_instance; delete output_instance; diff --git a/src/classifier/Writer.cpp b/src/classifier/Writer.cpp index 3f4302e..cda92d9 100644 --- a/src/classifier/Writer.cpp +++ b/src/classifier/Writer.cpp @@ -28,10 +28,17 @@ using namespace std; void Writer::Open(const string &filepath) { os_.open(filepath.c_str(), ifstream::out); CHECK(os_.good()) << "Could not open " << filepath << "."; + + os_formatted_.open(std::string(filepath+".formatted").c_str(), ifstream::out); + CHECK(os_formatted_.good()) << "Could not open " << std::string(filepath + ".formatted") << "."; } void Writer::Close() { os_.flush(); os_.clear(); os_.close(); + + os_formatted_.flush(); + os_formatted_.clear(); + os_formatted_.close(); } diff --git a/src/classifier/Writer.h b/src/classifier/Writer.h index b0e61ff..6d432f4 100644 --- a/src/classifier/Writer.h +++ b/src/classifier/Writer.h @@ -23,6 +23,8 @@ #include using namespace std; +class Pipe; + // Abstract class for the writer. Task-specific parts should derive // from this class and implement the pure virtual methods. // The writer writes instances to a file. @@ -35,9 +37,11 @@ class Writer { virtual void Open(const string &filepath); virtual void Close(); virtual void Write(Instance *instance) = 0; + virtual void WriteFormatted(Pipe * pipe, Instance *instance) = 0; protected: ofstream os_; + ofstream os_formatted_; }; #endif /* SHWRITER_H_ */ diff --git a/src/constituency_labeler/ConstituencyLabelerWriter.cpp b/src/constituency_labeler/ConstituencyLabelerWriter.cpp index 6cc3750..e8afb3e 100644 --- a/src/constituency_labeler/ConstituencyLabelerWriter.cpp +++ b/src/constituency_labeler/ConstituencyLabelerWriter.cpp @@ -38,3 +38,5 @@ void ConstituencyLabelerWriter::Write(Instance *instance) { parse_tree->SaveToString(&info); os_ << info << endl; } + +void ConstituencyLabelerWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} diff --git a/src/constituency_labeler/ConstituencyLabelerWriter.h b/src/constituency_labeler/ConstituencyLabelerWriter.h index 940e069..b517f0b 100644 --- a/src/constituency_labeler/ConstituencyLabelerWriter.h +++ b/src/constituency_labeler/ConstituencyLabelerWriter.h @@ -28,6 +28,8 @@ class ConstituencyLabelerWriter : public ConstituencyWriter { public: void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); + }; #endif /* CONSTITUENCYLABELERWRITER_H_ */ diff --git a/src/constituency_labeler/ConstituencyWriter.cpp b/src/constituency_labeler/ConstituencyWriter.cpp index b7cd04d..7e937da 100644 --- a/src/constituency_labeler/ConstituencyWriter.cpp +++ b/src/constituency_labeler/ConstituencyWriter.cpp @@ -28,3 +28,5 @@ void ConstituencyWriter::Write(Instance *instance) { constituency_instance->GetParseTree().SaveToString(&info); os_ << info << endl; } + +void ConstituencyWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} \ No newline at end of file diff --git a/src/constituency_labeler/ConstituencyWriter.h b/src/constituency_labeler/ConstituencyWriter.h index ddbc6e9..43065df 100644 --- a/src/constituency_labeler/ConstituencyWriter.h +++ b/src/constituency_labeler/ConstituencyWriter.h @@ -28,6 +28,7 @@ class ConstituencyWriter : public Writer { public: void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); }; #endif /* CONSTITUENCYWRITER_H_ */ diff --git a/src/coreference_resolver/CoreferenceWriter.cpp b/src/coreference_resolver/CoreferenceWriter.cpp index a913fd1..92fd854 100644 --- a/src/coreference_resolver/CoreferenceWriter.cpp +++ b/src/coreference_resolver/CoreferenceWriter.cpp @@ -43,6 +43,8 @@ void CoreferenceWriter::Write(Instance *instance) { os_ << "#end document" << std::endl; } +void CoreferenceWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} + void CoreferenceSentenceWriter::Write(Instance *instance) { CoreferenceSentence *sentence = static_cast(instance); std::ofstream *os = (external_os_) ? external_os_ : &os_; @@ -85,6 +87,8 @@ void CoreferenceSentenceWriter::Write(Instance *instance) { *os << std::endl; } +void CoreferenceSentenceWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} + #if 0 void CoreferenceSentenceReader::ConstructSpansFromText( const std::vector &span_lines, diff --git a/src/coreference_resolver/CoreferenceWriter.h b/src/coreference_resolver/CoreferenceWriter.h index 1279e79..eccfdbb 100644 --- a/src/coreference_resolver/CoreferenceWriter.h +++ b/src/coreference_resolver/CoreferenceWriter.h @@ -41,6 +41,7 @@ class CoreferenceSentenceWriter : public SemanticWriter { public: void SetOutputStream(std::ofstream *os) { external_os_ = os; } void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); void set_options(Options *options) { options_ = options; } protected: @@ -71,6 +72,7 @@ class CoreferenceWriter : public Writer { Writer::Close(); } void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); CoreferenceSentenceWriter *GetSentenceWriter() { return &sentence_writer_; } diff --git a/src/entity_recognizer/EntityWriter.cpp b/src/entity_recognizer/EntityWriter.cpp index 57f4b25..a5e202d 100644 --- a/src/entity_recognizer/EntityWriter.cpp +++ b/src/entity_recognizer/EntityWriter.cpp @@ -16,8 +16,10 @@ // You should have received a copy of the GNU Lesser General Public License // along with TurboParser 2.3. If not, see . +#include "EntityPipe.h" #include "EntityWriter.h" #include "EntityInstance.h" +#include "EntityInstanceNumeric.h" #include "EntityOptions.h" #include #include @@ -43,3 +45,42 @@ void EntityWriter::Write(Instance *instance) { } os_ << endl; } + +void EntityWriter::WriteFormatted(Pipe * pipe, Instance *instance) { + EntityInstanceNumeric *entity_instance = + static_cast(instance); + + EntityPipe * entity_pipe = + static_cast(pipe); + + for (int i = 0; i < entity_instance->size(); ++i) { + for (int j = 0; j < entity_instance->node_scores_[i].GetNumStates(); ++j) { + if (j > 0) + os_formatted_ << "\t"; + os_formatted_ << + entity_pipe->GetEntityDictionary()->GetTagName(entity_instance->node_scores_[i].GetState(j)) << ":" << entity_instance->node_scores_[i].GetScore(j); + } + + os_formatted_ << "\t"; + if (i < entity_instance->size() - 1) { + for (int j = 0; j < entity_instance->edge_scores_[i].GetNumCurrentStates(); ++j) { + int tag_id = entity_instance->node_scores_[i + 1].GetState(j); + if (j > 0) + os_formatted_ << "\t"; + for (int k = 0; k < entity_instance->edge_scores_[i].GetNumPreviousStates(j); ++k) { + if (k > 0) + os_formatted_ << "\t"; + + int tag_left_id = entity_instance->node_scores_[i].GetState(entity_instance->edge_scores_[i].GetAllPreviousStateScores(j)[k].first); + os_formatted_ << + entity_pipe->GetEntityDictionary()->GetTagName(tag_left_id) << "->" << + entity_pipe->GetEntityDictionary()->GetTagName(tag_id) << ":" + << entity_instance->edge_scores_[i].GetAllPreviousStateScores(j)[k].second; + } + } + } + os_formatted_ << endl; + } + os_formatted_ << endl; +} + diff --git a/src/entity_recognizer/EntityWriter.h b/src/entity_recognizer/EntityWriter.h index b848ba4..beb33c1 100644 --- a/src/entity_recognizer/EntityWriter.h +++ b/src/entity_recognizer/EntityWriter.h @@ -30,6 +30,7 @@ class EntityWriter : public Writer { public: void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); }; #endif /* ENTITYWRITER_H_ */ diff --git a/src/morphological_tagger/MorphologicalWriter.cpp b/src/morphological_tagger/MorphologicalWriter.cpp index 9119a44..168128b 100644 --- a/src/morphological_tagger/MorphologicalWriter.cpp +++ b/src/morphological_tagger/MorphologicalWriter.cpp @@ -40,3 +40,5 @@ void MorphologicalWriter::Write(Instance *instance) { } os_ << endl; } + +void MorphologicalWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} \ No newline at end of file diff --git a/src/morphological_tagger/MorphologicalWriter.h b/src/morphological_tagger/MorphologicalWriter.h index 6ba2fa1..a0e9e75 100644 --- a/src/morphological_tagger/MorphologicalWriter.h +++ b/src/morphological_tagger/MorphologicalWriter.h @@ -28,6 +28,7 @@ class MorphologicalWriter : public Writer { public: void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); }; #endif /* MORPHOLOGICALWRITER_H_ */ diff --git a/src/parser/DependencyWriter.cpp b/src/parser/DependencyWriter.cpp index 2f53abd..a6bcf9b 100644 --- a/src/parser/DependencyWriter.cpp +++ b/src/parser/DependencyWriter.cpp @@ -37,3 +37,5 @@ void DependencyWriter::Write(Instance *instance) { } os_ << endl; } + +void DependencyWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} diff --git a/src/parser/DependencyWriter.h b/src/parser/DependencyWriter.h index 2138bc1..84c98c0 100644 --- a/src/parser/DependencyWriter.h +++ b/src/parser/DependencyWriter.h @@ -31,6 +31,7 @@ class DependencyWriter : public Writer { public: void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); }; #endif /* DEPENDENCYWRITER_H_ */ diff --git a/src/semantic_parser/SemanticWriter.cpp b/src/semantic_parser/SemanticWriter.cpp index 51e692d..39581d0 100644 --- a/src/semantic_parser/SemanticWriter.cpp +++ b/src/semantic_parser/SemanticWriter.cpp @@ -127,3 +127,5 @@ void SemanticWriter::Write(Instance *instance) { } os_ << endl; } + +void SemanticWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} \ No newline at end of file diff --git a/src/semantic_parser/SemanticWriter.h b/src/semantic_parser/SemanticWriter.h index 54381bc..cf3d83a 100644 --- a/src/semantic_parser/SemanticWriter.h +++ b/src/semantic_parser/SemanticWriter.h @@ -49,6 +49,7 @@ class SemanticWriter : public DependencyWriter { } } void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); protected: Options *options_; diff --git a/src/sequence/SequenceDecoder.cpp b/src/sequence/SequenceDecoder.cpp index 9c11d70..61ab51b 100644 --- a/src/sequence/SequenceDecoder.cpp +++ b/src/sequence/SequenceDecoder.cpp @@ -87,8 +87,11 @@ void SequenceDecoder::Decode(Instance *instance, Parts *parts, SequenceParts *sequence_parts = static_cast(parts); int offset, size; - vector node_scores(sentence->size()); - vector edge_scores(sentence->size() - 1); + vector & node_scores = sentence->node_scores_; + vector & edge_scores = sentence->edge_scores_; + node_scores.resize(sentence->size()); + edge_scores.resize(sentence->size() - 1); + // The triplets are represented as if they were edges connecting // nodes with bigram states. vector triplet_scores; diff --git a/src/sequence/SequenceInstanceNumeric.h b/src/sequence/SequenceInstanceNumeric.h index 3bacdde..0ba63c0 100644 --- a/src/sequence/SequenceInstanceNumeric.h +++ b/src/sequence/SequenceInstanceNumeric.h @@ -19,7 +19,8 @@ #ifndef SEQUENCEINSTANCENUMERIC_H_ #define SEQUENCEINSTANCENUMERIC_H_ -#include "SequenceInstance.h" +#include "SequenceInstance.h" +#include "SequenceDecoder.h" #include "SequenceDictionary.h" #include #include @@ -187,6 +188,12 @@ class SequenceInstanceNumeric : public Instance { std::vector all_upper_; std::vector first_upper_; std::vector tag_ids_; + + public: + //expose Viterbi matrixes (node & edge scores) + vector node_scores_; + vector edge_scores_; + }; #endif /* SEQUENCEINSTANCENUMERIC_H_ */ diff --git a/src/sequence/SequenceWriter.cpp b/src/sequence/SequenceWriter.cpp index c33a0da..5fcd3df 100644 --- a/src/sequence/SequenceWriter.cpp +++ b/src/sequence/SequenceWriter.cpp @@ -31,3 +31,6 @@ void SequenceWriter::Write(Instance *instance) { } os_ << endl; } + +void SequenceWriter::WriteFormatted(Pipe * pipe, Instance *instance) {} + diff --git a/src/sequence/SequenceWriter.h b/src/sequence/SequenceWriter.h index ff6c42e..2091fd4 100644 --- a/src/sequence/SequenceWriter.h +++ b/src/sequence/SequenceWriter.h @@ -28,6 +28,7 @@ class SequenceWriter : public Writer { public: void Write(Instance *instance); + void WriteFormatted(Pipe * pipe, Instance *instance); }; #endif /* SEQUENCEWRITER_H_ */ From c947d972f238785a6d104d732b788c1c7612ab1c Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Mon, 31 Jul 2017 12:24:44 +0100 Subject: [PATCH 44/51] Add option to turn on/off nodes&edges viterbi scores output (in NER). --- src/entity_recognizer/EntityWriter.cpp | 50 +++++++++++++------------- src/sequence/SequenceOptions.cpp | 4 +++ src/sequence/SequenceOptions.h | 2 ++ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/entity_recognizer/EntityWriter.cpp b/src/entity_recognizer/EntityWriter.cpp index a5e202d..ad96bbf 100644 --- a/src/entity_recognizer/EntityWriter.cpp +++ b/src/entity_recognizer/EntityWriter.cpp @@ -47,40 +47,42 @@ void EntityWriter::Write(Instance *instance) { } void EntityWriter::WriteFormatted(Pipe * pipe, Instance *instance) { - EntityInstanceNumeric *entity_instance = - static_cast(instance); + if ((static_cast(pipe))->GetEntityOptions()->expose_node_edge_viterbi_scores()) { + EntityInstanceNumeric *entity_instance = + static_cast(instance); - EntityPipe * entity_pipe = - static_cast(pipe); + EntityPipe * entity_pipe = + static_cast(pipe); - for (int i = 0; i < entity_instance->size(); ++i) { - for (int j = 0; j < entity_instance->node_scores_[i].GetNumStates(); ++j) { - if (j > 0) - os_formatted_ << "\t"; - os_formatted_ << - entity_pipe->GetEntityDictionary()->GetTagName(entity_instance->node_scores_[i].GetState(j)) << ":" << entity_instance->node_scores_[i].GetScore(j); - } - - os_formatted_ << "\t"; - if (i < entity_instance->size() - 1) { - for (int j = 0; j < entity_instance->edge_scores_[i].GetNumCurrentStates(); ++j) { - int tag_id = entity_instance->node_scores_[i + 1].GetState(j); + for (int i = 0; i < entity_instance->size(); ++i) { + for (int j = 0; j < entity_instance->node_scores_[i].GetNumStates(); ++j) { if (j > 0) os_formatted_ << "\t"; - for (int k = 0; k < entity_instance->edge_scores_[i].GetNumPreviousStates(j); ++k) { - if (k > 0) + os_formatted_ << + entity_pipe->GetEntityDictionary()->GetTagName(entity_instance->node_scores_[i].GetState(j)) << ":" << entity_instance->node_scores_[i].GetScore(j); + } + + os_formatted_ << "\t"; + if (i < entity_instance->size() - 1) { + for (int j = 0; j < entity_instance->edge_scores_[i].GetNumCurrentStates(); ++j) { + int tag_id = entity_instance->node_scores_[i + 1].GetState(j); + if (j > 0) os_formatted_ << "\t"; + for (int k = 0; k < entity_instance->edge_scores_[i].GetNumPreviousStates(j); ++k) { + if (k > 0) + os_formatted_ << "\t"; - int tag_left_id = entity_instance->node_scores_[i].GetState(entity_instance->edge_scores_[i].GetAllPreviousStateScores(j)[k].first); - os_formatted_ << - entity_pipe->GetEntityDictionary()->GetTagName(tag_left_id) << "->" << - entity_pipe->GetEntityDictionary()->GetTagName(tag_id) << ":" - << entity_instance->edge_scores_[i].GetAllPreviousStateScores(j)[k].second; + int tag_left_id = entity_instance->node_scores_[i].GetState(entity_instance->edge_scores_[i].GetAllPreviousStateScores(j)[k].first); + os_formatted_ << + entity_pipe->GetEntityDictionary()->GetTagName(tag_left_id) << "->" << + entity_pipe->GetEntityDictionary()->GetTagName(tag_id) << ":" + << entity_instance->edge_scores_[i].GetAllPreviousStateScores(j)[k].second; + } } } + os_formatted_ << endl; } os_formatted_ << endl; } - os_formatted_ << endl; } diff --git a/src/sequence/SequenceOptions.cpp b/src/sequence/SequenceOptions.cpp index 21959f2..17b514c 100644 --- a/src/sequence/SequenceOptions.cpp +++ b/src/sequence/SequenceOptions.cpp @@ -30,6 +30,9 @@ DEFINE_int32(sequence_model_type, 2, //DEFINE_bool(sequence_prune_tags, true, // "True for pruning the set of possible tags by using a dictionary."); +DEFINE_bool(expose_node_edge_viterbi_scores, false, + "Output to another file the node and edge scores of the decode step."); + // Save current option flags to the model file. void SequenceOptions::Save(FILE* fs) { Options::Save(fs); @@ -77,4 +80,5 @@ void SequenceOptions::Initialize() { //large_feature_set_ = FLAGS_tagger_large_feature_set; //prune_tags_ = FLAGS_sequence_prune_tags; //file_unknown_word_tags_ = FLAGS_file_unknown_word_tags; + expose_node_edge_viterbi_scores_ = FLAGS_expose_node_edge_viterbi_scores; } diff --git a/src/sequence/SequenceOptions.h b/src/sequence/SequenceOptions.h index b013b52..97fc8e1 100644 --- a/src/sequence/SequenceOptions.h +++ b/src/sequence/SequenceOptions.h @@ -35,9 +35,11 @@ class SequenceOptions : public Options { // Get option flags. int markov_order() { return model_type_; } + bool expose_node_edge_viterbi_scores() { return expose_node_edge_viterbi_scores_; } protected: int model_type_; + bool expose_node_edge_viterbi_scores_; }; #endif // SEQUENCE_OPTIONS_H_ From 5e0e920d533b8253769d22f1d58af701dbc9a5ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A3o=20Salvador=20de=20Miranda?= Date: Fri, 16 Feb 2018 20:08:38 +0000 Subject: [PATCH 45/51] Fixing memory leaks --- src/entity_recognizer/EntityFeatures.cpp | 15 ++++++----- src/entity_recognizer/EntityInstance.cpp | 32 +++++++++--------------- src/entity_recognizer/EntityInstance.h | 8 +++--- src/entity_recognizer/EntityWriter.cpp | 3 +-- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/src/entity_recognizer/EntityFeatures.cpp b/src/entity_recognizer/EntityFeatures.cpp index 91d2cdd..43cfc0e 100644 --- a/src/entity_recognizer/EntityFeatures.cpp +++ b/src/entity_recognizer/EntityFeatures.cpp @@ -274,8 +274,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, EntityOptions *options = static_cast(pipe_)-> GetEntityOptions(); - std::bitset<32> *feature_set_bitmap; - feature_set_bitmap = new bitset<32>(options->large_feature_set()); + std::bitset<32> feature_set_bitmap(options->large_feature_set()); // Array of form IDs. const vector* word_ids = &entity_sentence->GetFormIds(); @@ -285,7 +284,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // Words. uint16_t WID, pWID, nWID, ppWID, nnWID; - if (feature_set_bitmap->test(0)) { + if (feature_set_bitmap.test(0)) { WID = (position < sentence_length) ? (*word_ids)[position] : TOKEN_STOP; // Current word. // Word on the left. @@ -304,7 +303,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // POS tags. uint8_t PID, pPID, nPID, ppPID, nnPID; - if (feature_set_bitmap->test(1)) { + if (feature_set_bitmap.test(1)) { PID = (position < sentence_length) ? (*pos_ids)[position] : TOKEN_STOP; // Current POS. // POS on the left. @@ -323,7 +322,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, // Word shapes. uint16_t SID, pSID, nSID, ppSID, nnSID; - if (feature_set_bitmap->test(2)) { + if (feature_set_bitmap.test(2)) { SID = (position < sentence_length) ? sentence->GetShapeId(position) : TOKEN_STOP; // Current shape. // Shape on the left. @@ -348,7 +347,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, AddFeature(fkey, features); // Lexical features. - if (feature_set_bitmap->test(0)) { + if (feature_set_bitmap.test(0)) { fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::W, flags, WID); AddFeature(fkey, features); @@ -367,7 +366,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, } // POS features. - if (feature_set_bitmap->test(1)) { + if (feature_set_bitmap.test(1)) { fkey = encoder_.CreateFKey_P(EntityFeatureTemplateBigram::P, flags, PID); AddFeature(fkey, features); @@ -386,7 +385,7 @@ void EntityFeatures::AddBigramFeatures(SequenceInstanceNumeric *sentence, } // Shape features. - if (feature_set_bitmap->test(2)) { + if (feature_set_bitmap.test(2)) { fkey = encoder_.CreateFKey_W(EntityFeatureTemplateBigram::S, flags, SID); AddFeature(fkey, features); diff --git a/src/entity_recognizer/EntityInstance.cpp b/src/entity_recognizer/EntityInstance.cpp index 477ef1a..569374b 100644 --- a/src/entity_recognizer/EntityInstance.cpp +++ b/src/entity_recognizer/EntityInstance.cpp @@ -29,10 +29,9 @@ void EntityInstance::Initialize(const std::vector &forms, } void EntityInstance::ConvertToTaggingScheme(int tagging_scheme) { - std::vector spans; + std::vector> spans; CreateSpansFromTags(tags_, &spans); CreateTagsFromSpans(tags_.size(), spans, tagging_scheme, &tags_); - DeleteSpans(&spans); } void EntityInstance::SplitEntityTag(const std::string &tag, @@ -50,46 +49,39 @@ void EntityInstance::SplitEntityTag(const std::string &tag, void EntityInstance::CreateSpansFromTags( const std::vector &tags, - std::vector *spans) const { + std::vector> *spans) const { spans->clear(); - EntitySpan *span = NULL; + std::unique_ptr span; for (int i = 0; i < tags.size(); ++i) { std::string prefix, entity; SplitEntityTag(tags[i], &prefix, &entity); if (prefix == "B" || prefix == "U") { - if (span) spans->push_back(span); - span = new EntitySpan(i, i, entity); + if (span) spans->push_back(std::move(span)); + span = std::make_unique(i, i, entity); } else if (prefix == "I" || prefix == "L") { if (span && span->name() == entity) { span->set_end(i); } else { // This I is actually a B (maybe the file has IO encoding). - if (span) spans->push_back(span); - span = new EntitySpan(i, i, entity); + if (span) spans->push_back(std::move(span)); + span = std::make_unique(i, i, entity); } } else if (prefix == "O") { - if (span) spans->push_back(span); - span = NULL; + if (span) spans->push_back(std::move(span)); + span.reset(); } } - if (span) spans->push_back(span); -} - -void EntityInstance::DeleteSpans(std::vector *spans) const { - for (int k = 0; k < spans->size(); ++k) { - delete (*spans)[k]; - } - spans->clear(); + if (span) spans->push_back(std::move(span)); } void EntityInstance::CreateTagsFromSpans( int length, - const std::vector &spans, + const std::vector> &spans, int tagging_scheme, std::vector *tags) const { tags->assign(length, "O"); for (int k = 0; k < spans.size(); ++k) { - EntitySpan *span = spans[k]; + EntitySpan *span = spans[k].get(); if (tagging_scheme == EntityTaggingSchemes::BILOU) { if (span->start() == span->end()) { (*tags)[span->start()] = "U-" + span->name(); diff --git a/src/entity_recognizer/EntityInstance.h b/src/entity_recognizer/EntityInstance.h index 286bec1..a350a92 100644 --- a/src/entity_recognizer/EntityInstance.h +++ b/src/entity_recognizer/EntityInstance.h @@ -18,7 +18,7 @@ #ifndef ENTITYINSTANCE_H_ #define ENTITYINSTANCE_H_ - +#include #include "SequenceInstance.h" #include "EntitySpan.h" @@ -48,15 +48,13 @@ class EntityInstance : public SequenceInstance { // Convert a sequence of IO/BIO/BILOU tags into spans. void CreateSpansFromTags(const std::vector &tags, - std::vector *spans) const; + std::vector> *spans) const; // Convert spans into a sequence of IO/BIO/BILOU tags. void CreateTagsFromSpans(int length, - const std::vector &spans, + const std::vector> &spans, int tagging_scheme, std::vector *tags) const; - // Destroy the spans. - void DeleteSpans(std::vector *spans) const; protected: std::vector pos_; diff --git a/src/entity_recognizer/EntityWriter.cpp b/src/entity_recognizer/EntityWriter.cpp index ad96bbf..87ea181 100644 --- a/src/entity_recognizer/EntityWriter.cpp +++ b/src/entity_recognizer/EntityWriter.cpp @@ -29,14 +29,13 @@ void EntityWriter::Write(Instance *instance) { static_cast(instance); // Always write in BIO format. - std::vector spans; + std::vector> spans; std::vector tags; entity_instance->CreateSpansFromTags(entity_instance->tags(), &spans); entity_instance->CreateTagsFromSpans(entity_instance->tags().size(), spans, EntityTaggingSchemes::BIO, &tags); - entity_instance->DeleteSpans(&spans); for (int i = 0; i < entity_instance->size(); ++i) { os_ << entity_instance->GetForm(i) << "\t"; From dea4e70b54313b61448487b326c0e02e9986ce33 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Fri, 16 Feb 2018 20:19:41 +0000 Subject: [PATCH 46/51] update sln --- vsprojects/turboparser.sln | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsprojects/turboparser.sln b/vsprojects/turboparser.sln index 9b466da..fd0999c 100644 --- a/vsprojects/turboparser.sln +++ b/vsprojects/turboparser.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "classifier", "classifier\classifier.vcxproj", "{572F3882-6014-4FB1-AE04-01A17D4EB041}" EndProject From 70d3d9bc7fb67841602502eb78a30b02597d460a Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Fri, 6 Jul 2018 18:46:46 +0100 Subject: [PATCH 47/51] Linux bug fix. --- src/entity_recognizer/EntityInstance.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/entity_recognizer/EntityInstance.cpp b/src/entity_recognizer/EntityInstance.cpp index 569374b..0c37e7d 100644 --- a/src/entity_recognizer/EntityInstance.cpp +++ b/src/entity_recognizer/EntityInstance.cpp @@ -19,6 +19,7 @@ #include "EntityInstance.h" #include #include "EntityOptions.h" +#include void EntityInstance::Initialize(const std::vector &forms, const std::vector &pos, From fa7da0df9d4affd3f502aa8c2181b38d73e3337a Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Fri, 6 Jul 2018 21:12:21 +0100 Subject: [PATCH 48/51] Update makefiles to c++14 due to make_unique. --- configure.ac | 2 +- libturboparser/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index d7cefe7..6e38196 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_SUBST(CPPFLAGS) # Check for c++0x compile flag. #AX_CHECK_COMPILE_FLAG([-std=c++0x], [CXXFLAGS="$CXXFLAGS -std=c++0x"]) AX_CXX_COMPILE_STDCXX_11 -CXXFLAGS="$CXXFLAGS -std=c++11" +CXXFLAGS="$CXXFLAGS -std=c++14" # Macros # This will make ILOG use STL libs diff --git a/libturboparser/Makefile b/libturboparser/Makefile index 06ccf74..e75077b 100644 --- a/libturboparser/Makefile +++ b/libturboparser/Makefile @@ -15,7 +15,7 @@ CC = g++ DEBUG = -g INCLUDES = -I$(UTIL)/ -I$(CLASSIFIER) -I$(SEQUENCE) -I$(TAGGER) -I$(ENTITYRECOGNIZER) -I$(PARSER) -I$(SEMANTICPARSER) -I$(COREFERENCERESOLVER) -I$(MORPHOLOGICALTAGGER) -I$(AUXINCLUDES) LIBS = -L/usr/local/lib/ -L$(AUXLIBS) -CFLAGS = -std=gnu++11 -std=c++11 -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) +CFLAGS = -std=gnu++14 -std=c++14 -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) LDFLAGS = -shared LFLAGS = $(LIBS) -Wl,-whole-archive -lad3 -Wl,-no-whole-archive -lgflags -lglog From 741d6b7c202e059b158c1ec406158e0527c725a1 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Mon, 9 Jul 2018 16:22:59 +0100 Subject: [PATCH 49/51] Update configure. --- configure | 2 +- vsprojects/libturboparser/libturboparser.vcxproj | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/configure b/configure index b8aea62..5a46f87 100755 --- a/configure +++ b/configure @@ -4286,7 +4286,7 @@ CPPFLAGS="-I${AUX_INCLUDES} -I${INCLUDES}/ad3" # Check for c++0x compile flag. #AX_CHECK_COMPILE_FLAG([-std=c++0x], [CXXFLAGS="$CXXFLAGS -std=c++0x"]) AX_CXX_COMPILE_STDCXX_11 -CXXFLAGS="$CXXFLAGS -std=c++11" +CXXFLAGS="$CXXFLAGS -std=c++14" # Macros # This will make ILOG use STL libs diff --git a/vsprojects/libturboparser/libturboparser.vcxproj b/vsprojects/libturboparser/libturboparser.vcxproj index 7bdc44f..3944d96 100644 --- a/vsprojects/libturboparser/libturboparser.vcxproj +++ b/vsprojects/libturboparser/libturboparser.vcxproj @@ -392,6 +392,9 @@ + + + From f6f0a44097f52d6b897d8ad20960f5de3489b2b3 Mon Sep 17 00:00:00 2001 From: David Nogueira Date: Tue, 10 Jul 2018 11:31:15 +0100 Subject: [PATCH 50/51] Protect InitGlog in libturboparser. --- libturboparser/TurboParserInterface.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index 09533b1..d661580 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -357,7 +357,12 @@ TurboParserInterface::TurboParserInterface() { argv_ = NULL; BuildArgumentList(); +#ifndef BYPASS_INIT_GLOG + std::cout << "Init glog from libturboparser..." << std::endl; InitGlog(argv_[0]); +#else + std::cout << "Bypassing glog in libturboparser..." << std::endl; +#endif // Initialize Google's logging library. //google::InitGoogleLogging(argv_[0]); From 856cb19e12a7002598097c884f452062dc18c158 Mon Sep 17 00:00:00 2001 From: smiranda Date: Tue, 10 Jul 2018 16:35:54 +0100 Subject: [PATCH 51/51] switchable init glog --- libturboparser/Makefile | 5 ++++- libturboparser/TurboParserInterface.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libturboparser/Makefile b/libturboparser/Makefile index e75077b..f456949 100644 --- a/libturboparser/Makefile +++ b/libturboparser/Makefile @@ -15,7 +15,10 @@ CC = g++ DEBUG = -g INCLUDES = -I$(UTIL)/ -I$(CLASSIFIER) -I$(SEQUENCE) -I$(TAGGER) -I$(ENTITYRECOGNIZER) -I$(PARSER) -I$(SEMANTICPARSER) -I$(COREFERENCERESOLVER) -I$(MORPHOLOGICALTAGGER) -I$(AUXINCLUDES) LIBS = -L/usr/local/lib/ -L$(AUXLIBS) -CFLAGS = -std=gnu++14 -std=c++14 -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(INCLUDES) + +BYPASSINIT_GLOG_D = + +CFLAGS = -std=gnu++14 -std=c++14 -O3 -Wall -Wno-sign-compare -c -fmessage-length=0 -fPIC $(BYPASSINIT_GLOG_D) $(INCLUDES) LDFLAGS = -shared LFLAGS = $(LIBS) -Wl,-whole-archive -lad3 -Wl,-no-whole-archive -lgflags -lglog diff --git a/libturboparser/TurboParserInterface.cpp b/libturboparser/TurboParserInterface.cpp index d661580..fcfb724 100644 --- a/libturboparser/TurboParserInterface.cpp +++ b/libturboparser/TurboParserInterface.cpp @@ -357,7 +357,7 @@ TurboParserInterface::TurboParserInterface() { argv_ = NULL; BuildArgumentList(); -#ifndef BYPASS_INIT_GLOG +#ifndef BYPASSINIT_GLOG std::cout << "Init glog from libturboparser..." << std::endl; InitGlog(argv_[0]); #else

YS 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