|
|
|
|
|
import ConfigParser |
|
import os |
|
import subprocess |
|
import sys |
|
|
|
from PyQt4.QtCore import ( |
|
QObject, |
|
SIGNAL, |
|
) |
|
|
|
from util import doAlert |
|
|
|
|
|
class Engine(QObject): |
|
def __init__(self, model, moses): |
|
super(Engine, self).__init__() |
|
self.model = model |
|
self.moses = moses |
|
self.check(self.model) |
|
|
|
|
|
modelini = model['path'] + os.sep + 'model' + os.sep + 'model.ini' |
|
if not os.path.exists(modelini): |
|
raise Exception( |
|
"Model ini file doesn't exist, please check model dir %s" |
|
% modelini) |
|
cp = ConfigParser.RawConfigParser() |
|
cp.readfp(open(modelini)) |
|
truemodel = None |
|
try: |
|
truemodel = cp.get("Preprocess", 'Truemodel') |
|
truemodel_path = os.path.join(model['path'], 'model', truemodel) |
|
if not os.path.exists(truemodel_path): |
|
doAlert("Truemodel doesn't exist, ignore %s" % truemodel) |
|
truemodel = None |
|
except: |
|
|
|
truemodel = None |
|
self.cmds = [] |
|
|
|
self.cmds.append( |
|
'"%s" -q -l %s -noxml' |
|
% (self.moses.getTokenizer(), str(model['srclang']).lower())) |
|
if truemodel is not None: |
|
self.cmds.append( |
|
'"%s" -model "%s"' % (self.moses.getTruecase(), truemodel)) |
|
self.cmds.append('"%s" -f moses.ini' % self.moses.getMosesCmd()) |
|
self.cmds.append('"%s"' % self.moses.getDetruecase()) |
|
self.cmds.append( |
|
'"%s" -q -noxml -l %s' |
|
% (self.moses.getDetokenizer(), str(model['trglang']).lower())) |
|
self.process = [] |
|
|
|
|
|
def check(self, model): |
|
model_path_exists = os.path.exists(model['path']) |
|
model_mosesini_exists = os.path.exists(model['mosesini']) |
|
if not model_path_exists or not model_mosesini_exists: |
|
raise Exception( |
|
"Model file doesn't exist, please check model dir %s" |
|
% self.model['path']) |
|
|
|
def countSteps(self): |
|
return len(self.cmds) + 1 |
|
|
|
def start(self): |
|
|
|
try: |
|
self.emit(SIGNAL("stepFinished(int)"), 0) |
|
for i, cmd in enumerate(self.cmds): |
|
proc = subprocess.Popen( |
|
cmd, shell=True, stdin=subprocess.PIPE, |
|
stdout=subprocess.PIPE, |
|
cwd=os.path.join(str(self.model['path']), 'model')) |
|
self.process.append(proc) |
|
if not proc.poll() is None: |
|
raise Exception("Failed to start engine!") |
|
proc.stdin.write("dummy\n") |
|
proc.stdin.flush() |
|
if len(proc.stdout.readline().strip()) <= 0: |
|
raise Exception( |
|
"Engine process exited: [%s] in folder [%s]" |
|
% ( |
|
cmd, |
|
os.path.join(str(self.model['path']), 'model'))) |
|
self.emit(SIGNAL("stepFinished(int)"), i + 1) |
|
self.emit(SIGNAL("loaded(bool, QString)"), True, "Model Loaded") |
|
except Exception as e: |
|
self.emit( |
|
SIGNAL("loaded(bool, QString)"), False, |
|
"Failed to load Model: %s" % str(e)) |
|
|
|
def stop(self): |
|
for process in self.process: |
|
|
|
|
|
process.terminate() |
|
process.wait() |
|
self.process = [] |
|
|
|
def translate(self, input): |
|
lastInput = input |
|
try: |
|
for i, proc in enumerate(self.process): |
|
if not proc.poll() is None: |
|
raise Exception("Failed to start engine!") |
|
proc.stdin.write("%s\n" % lastInput) |
|
proc.stdin.flush() |
|
output = proc.stdout.readline().strip() |
|
lastInput = output |
|
return output |
|
except Exception, e: |
|
print >> sys.stderr, "Translate error: %s" % str(e) |
|
return lastInput |
|
|