* Wrap self.parse in nogil, and break if an invalid move is predicted. The invalid break is a work-around that papers over likely bugs, but we can't easily break in the nogil block, and otherwise we'll get an infinite loop. Need to set this as an error flag.

This commit is contained in:
Matthew Honnibal 2015-09-06 04:15:00 +02:00
parent fd1eeb3102
commit 5edac11225
1 changed files with 3 additions and 2 deletions

View File

@ -84,8 +84,7 @@ cdef class Parser:
cdef Example eg = Example(self.model.n_classes, CONTEXT_SIZE, cdef Example eg = Example(self.model.n_classes, CONTEXT_SIZE,
self.model.n_feats, self.model.n_feats) self.model.n_feats, self.model.n_feats)
with nogil: self.parse(stcls, eg.c)
self.parse(stcls, eg.c)
tokens.set_parse(stcls._sent) tokens.set_parse(stcls._sent)
cdef void predict(self, StateClass stcls, ExampleC* eg) nogil: cdef void predict(self, StateClass stcls, ExampleC* eg) nogil:
@ -98,6 +97,8 @@ cdef class Parser:
cdef void parse(self, StateClass stcls, ExampleC eg) nogil: cdef void parse(self, StateClass stcls, ExampleC eg) nogil:
while not stcls.is_final(): while not stcls.is_final():
self.predict(stcls, &eg) self.predict(stcls, &eg)
if not eg.is_valid[eg.guess]:
break
self.moves.c[eg.guess].do(stcls, self.moves.c[eg.guess].label) self.moves.c[eg.guess].do(stcls, self.moves.c[eg.guess].label)
self.moves.finalize_state(stcls) self.moves.finalize_state(stcls)