sakharamg's picture
Uploading all files
158b61b
# -*- coding: utf-8 -*-
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)
# Determine how many steps by num of modules in the model directory
# (moses + tok/detok + ...) + 1
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:
# doAlert("Truemodel not configured")
truemodel = None
self.cmds = []
# tok
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 = []
# doAlert('\n'.join(self.cmds))
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):
# print >> sys.stderr, self.cmds
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:
# doAlert(str(process.pid))
# print >> sys.stderr, str(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