mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
another optimization of Romance VP. Effect on Fre over 50% in compilation and parse speed. Somewhat smaller on Spa,Ita,Cat.
This commit is contained in:
@@ -1,9 +1,17 @@
|
||||
--# -path=.:../romance:../abstract:../common:prelude
|
||||
instance DiffCat of DiffRomance = open CommonRomance, PhonoCat, BeschCat, Prelude in {
|
||||
instance DiffCat of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRomance, PhonoCat, BeschCat, Prelude in {
|
||||
|
||||
flags optimize=noexpand ;
|
||||
coding=utf8 ;
|
||||
|
||||
---- exceptions ----------------
|
||||
oper
|
||||
partAgr : VType -> Bool = \vtyp -> False ;
|
||||
vpAgrSubj : Verb -> VPAgrType = \v -> <verbDefaultPart v, False> ;
|
||||
vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> <verbDefaultPart v, False> ;
|
||||
|
||||
--------------------------------
|
||||
|
||||
param
|
||||
Prepos = P_de | P_a ;
|
||||
VType = VHabere | VRefl ;
|
||||
@@ -66,8 +74,6 @@ oper
|
||||
|
||||
auxVerb : VType -> (VF => Str) = \_ -> haver_V.s ;
|
||||
|
||||
partAgr : VType -> VPAgr = \vtyp -> vpAgrNone ;
|
||||
|
||||
vpAgrClit : Agr -> VPAgr = \a ->
|
||||
vpAgrNone ;
|
||||
|
||||
|
||||
@@ -61,15 +61,15 @@ instance DiffFre of DiffRomance - [
|
||||
_ => copula.s
|
||||
} ;
|
||||
|
||||
partAgr : VType -> VPAgr = \vtyp -> case vtyp of {
|
||||
VTyp VHabere _ => vpAgrNone ;
|
||||
_ => VPAgrSubj
|
||||
} ;
|
||||
|
||||
vpAgrClit : Agr -> VPAgr = \a0 ->
|
||||
let a = complAgr a0 in
|
||||
VPAgrClit a.g a.n ;
|
||||
|
||||
partAgr : VType -> Bool = \vtyp -> case vtyp of { -- works for all except Spa
|
||||
VTyp VHabere _ => False ;
|
||||
_ => True
|
||||
} ;
|
||||
|
||||
---- pronArg = pronArgGen Neg ; --- takes more space and time
|
||||
|
||||
pronArg : Number -> Person -> CAgr -> CAgr -> Str * Str * Bool =
|
||||
|
||||
@@ -88,15 +88,15 @@ instance DiffIta of DiffRomance - [contractInf] = open CommonRomance, PhonoIta,
|
||||
_ => copula.s
|
||||
} ;
|
||||
|
||||
partAgr : VType -> VPAgr = \vtyp -> case vtyp of {
|
||||
VHabere => vpAgrNone ;
|
||||
_ => VPAgrSubj
|
||||
} ;
|
||||
|
||||
vpAgrClit : Agr -> VPAgr = \a0 ->
|
||||
let a = complAgr a0 in
|
||||
VPAgrClit a.g a.n ;
|
||||
|
||||
partAgr : VType -> Bool = \vtyp -> case vtyp of { -- works for all except Spa
|
||||
VHabere => False ;
|
||||
_ => True
|
||||
} ;
|
||||
|
||||
pronArg = \n,p,acc,dat ->
|
||||
let
|
||||
pacc = case acc of { --- only accusative refl handled
|
||||
|
||||
@@ -25,7 +25,7 @@ interface DiffRomance = open CommonRomance, Prelude in {
|
||||
-- Derivatively, if/when the participle agrees to the subject.
|
||||
-- (Fre "elle est partie", Ita "lei è partita", Spa not)
|
||||
|
||||
oper partAgr : VType -> VPAgr ;
|
||||
oper partAgr : VType -> Bool ;
|
||||
|
||||
-- Whether participle agrees to foregoing clitic.
|
||||
-- (Fre "je l'ai vue", Spa "yo la he visto")
|
||||
@@ -105,9 +105,16 @@ param
|
||||
oper
|
||||
Verb = {s : VF => Str ; vtyp : VType ; p : Str} ;
|
||||
|
||||
VPAgrType : Type = Str * Bool ; ---- originally VPAgr, expensive
|
||||
getVPAgr : Verb -> VPAgrType = \v -> <verbDefaultPart v, partAgr v.vtyp> ; -- str may be used
|
||||
vpAgrSubj : Verb -> VPAgrType = \v -> <verbDefaultPart v, True> ; -- str not used but subject instead ---- VPAgrSubj
|
||||
vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> <v.s ! (VPart a.g a.n), False> ; -- str used from clitic ---- vpAgrClit
|
||||
verbDefaultPart : Verb -> Str = \v -> v.s ! (VPart Masc Sg) ;
|
||||
|
||||
|
||||
VP : Type = {
|
||||
s : Verb ;
|
||||
agr : VPAgr ; -- dit/dite dep. on verb, subj, and clitic
|
||||
agr : VPAgrType ; -- dit/dite dep. on verb, subj, and clitic
|
||||
neg : RPolarity => (Str * Str) ; -- ne-pas
|
||||
clit1 : Str ; -- le/se
|
||||
clit2 : Str ; -- lui
|
||||
|
||||
@@ -82,7 +82,7 @@ oper
|
||||
typ = verb.vtyp ;
|
||||
in {
|
||||
s = verb ;
|
||||
agr = partAgr typ ;
|
||||
agr = getVPAgr verb ;
|
||||
neg = negation ;
|
||||
clit1 = [] ;
|
||||
clit2 = [] ;
|
||||
@@ -98,7 +98,7 @@ oper
|
||||
in {
|
||||
s = vp.s ;
|
||||
agr = case <np.hasClit, c.isDir, c.c> of {
|
||||
<True,True,Acc> => vpAgrClit np.a ;
|
||||
<True,True,Acc> => vpAgrClits vp.s np.a ;
|
||||
_ => vp.agr -- must be dat
|
||||
} ;
|
||||
clit1 = vp.clit1 ++ obj.c1 ;
|
||||
@@ -126,40 +126,18 @@ oper
|
||||
-- Agreement with preceding relative or interrogative:
|
||||
-- "les femmes que j'ai aimées"
|
||||
|
||||
insertAgr : AAgr -> VP -> VP = \ag,vp -> {
|
||||
s = vp.s ;
|
||||
agr = vpAgrClit (agrP3 ag.g ag.n) ;
|
||||
clit1 = vp.clit1 ;
|
||||
clit2 = vp.clit2 ;
|
||||
clit3 = vp.clit3 ;
|
||||
isNeg = vp.isNeg ;
|
||||
neg = vp.neg ;
|
||||
comp = vp.comp ;
|
||||
ext = vp.ext ;
|
||||
insertAgr : AAgr -> VP -> VP = \ag,vp -> vp ** {
|
||||
agr = vpAgrClits vp.s ag ;
|
||||
} ;
|
||||
|
||||
insertRefl : VP -> VP = \vp -> {
|
||||
insertRefl : VP -> VP = \vp -> vp ** {
|
||||
s = vp.s ** {vtyp = vRefl vp.s.vtyp} ;
|
||||
agr = VPAgrSubj ;
|
||||
clit1 = vp.clit1 ;
|
||||
clit2 = vp.clit2 ;
|
||||
clit3 = vp.clit3 ;
|
||||
isNeg = vp.isNeg ;
|
||||
neg = vp.neg ;
|
||||
comp = vp.comp ;
|
||||
ext = vp.ext ;
|
||||
agr = vpAgrSubj vp.s ;
|
||||
} ;
|
||||
|
||||
insertAdv : Str -> VP -> VP = \co,vp -> {
|
||||
s = vp.s ;
|
||||
agr = vp.agr ;
|
||||
clit1 = vp.clit1 ;
|
||||
clit2 = vp.clit2 ;
|
||||
clit3 = vp.clit3 ;
|
||||
insertAdv : Str -> VP -> VP = \co,vp -> vp ** {
|
||||
isNeg = vp.isNeg ; --- adv could be neg
|
||||
neg = vp.neg ;
|
||||
comp = \\a => vp.comp ! a ++ co ;
|
||||
ext = vp.ext ;
|
||||
} ;
|
||||
|
||||
insertAdV : Str -> VP -> VP = \co,vp -> {
|
||||
@@ -242,10 +220,16 @@ oper
|
||||
verb = vp.s.s ;
|
||||
vaux = auxVerb vp.s.vtyp ;
|
||||
|
||||
part = case vp.agr of {
|
||||
VPAgrSubj => verb ! VPart agr.g agr.n ;
|
||||
VPAgrClit g n => verb ! VPart g n
|
||||
---- VPAgr : this is where it really matters
|
||||
part = case vp.agr.p2 of {
|
||||
False => vp.agr.p1 ;
|
||||
True => verb ! VPart agr.g agr.n
|
||||
} ;
|
||||
---- part = case vp.agr of {
|
||||
---- VPAgrSubj => verb ! VPart agr.g agr.n ;
|
||||
---- VPAgrClit g n => verb ! VPart g n
|
||||
---- } ;
|
||||
|
||||
|
||||
vps : Str * Str = case <te,a> of {
|
||||
<RPast,Simul> => <verb ! VFin (VImperf m) num per, []> ; --# notpresent
|
||||
|
||||
@@ -103,10 +103,15 @@ incomplete concrete SentenceRomance of Sentence =
|
||||
|
||||
ext = vp.ext ! b ;
|
||||
|
||||
part = case vp.agr of {
|
||||
VPAgrSubj => verb ! VPart agr.g agr.n ;
|
||||
VPAgrClit g n => verb ! VPart g n
|
||||
---- VPAgr : this is where it really matters
|
||||
part = case vp.agr.p2 of {
|
||||
False => vp.agr.p1 ;
|
||||
True => verb ! VPart agr.g agr.n
|
||||
} ;
|
||||
---- part = case vp.agr of {
|
||||
---- VPAgrSubj => verb ! VPart agr.g agr.n ;
|
||||
---- VPAgrClit g n => verb ! VPart g n
|
||||
---- } ;
|
||||
|
||||
vpss : Str * Str = case <te,a> of {
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ incomplete concrete VerbRomance of Verb =
|
||||
|
||||
SlashV2VNP v np vps = let obj = np.s ! v.c2.c in {
|
||||
s = v ;
|
||||
agr = partAgr v.vtyp ;
|
||||
agr = getVPAgr v ;
|
||||
clit1 = obj.c1 ;
|
||||
clit2 = obj.c2 ;
|
||||
clit3 = {s,imp = [] ; hasClit = False} ; ---- shortcut from insertObject, to check AR 20/11/2013
|
||||
|
||||
@@ -432,6 +432,17 @@ v0.2
|
||||
876660 french/RelativeFre.gfo
|
||||
8114329 total
|
||||
|
||||
v03 195227 msec (old with VPAgr changed to Str; not yet correct)
|
||||
5084845 french/SentenceFre.gfo
|
||||
131929 french/QuestionFre.gfo
|
||||
333884 french/RelativeFre.gfo
|
||||
5550658 total
|
||||
v04 242696 msec (this correct, Str * Bool)
|
||||
6091544 french/SentenceFre.gfo
|
||||
156000 french/QuestionFre.gfo
|
||||
511900 french/RelativeFre.gfo
|
||||
6759444 total
|
||||
|
||||
v2
|
||||
23476139 french/SentenceFre.gfo
|
||||
1150969 french/QuestionFre.gfo
|
||||
@@ -455,6 +466,13 @@ Ita
|
||||
606895 italian/RelativeIta.gfo
|
||||
3408954 total
|
||||
|
||||
Ita v03:
|
||||
253879 msec
|
||||
2169173 italian/SentenceIta.gfo
|
||||
95021 italian/QuestionIta.gfo
|
||||
347063 italian/RelativeIta.gfo
|
||||
2611257 total
|
||||
|
||||
Spa
|
||||
112362 msec
|
||||
1541743 spanish/SentenceSpa.gfo
|
||||
@@ -462,6 +480,21 @@ Spa
|
||||
430675 spanish/RelativeSpa.gfo
|
||||
2061979 total
|
||||
|
||||
Spa v03:
|
||||
91598 msec
|
||||
1086758 spanish/SentenceSpa.gfo
|
||||
66345 spanish/QuestionSpa.gfo
|
||||
250267 spanish/RelativeSpa.gfo
|
||||
1403370 total
|
||||
|
||||
Cat v03
|
||||
83132 msec
|
||||
1078970 catalan/SentenceCat.gfo
|
||||
66225 catalan/QuestionCat.gfo
|
||||
249211 catalan/RelativeCat.gfo
|
||||
1394406 total
|
||||
|
||||
|
||||
|
||||
VType = VTyp VAux Bool
|
||||
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
--# -path=.:../romance:../abstract:../common:prelude
|
||||
|
||||
instance DiffSpa of DiffRomance = open CommonRomance, PhonoSpa, BeschSpa, Prelude in {
|
||||
instance DiffSpa of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRomance, PhonoSpa, BeschSpa, Prelude in {
|
||||
|
||||
flags optimize=noexpand ;
|
||||
coding=utf8 ;
|
||||
|
||||
---- exceptions ----------------
|
||||
oper
|
||||
partAgr : VType -> Bool = \vtyp -> False ;
|
||||
vpAgrSubj : Verb -> VPAgrType = \v -> <verbDefaultPart v, False> ;
|
||||
vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> <verbDefaultPart v, False> ;
|
||||
|
||||
--------------------------------
|
||||
|
||||
param
|
||||
Prepos = P_de | P_a ;
|
||||
VType = VHabere | VRefl ;
|
||||
@@ -72,8 +80,6 @@ instance DiffSpa of DiffRomance = open CommonRomance, PhonoSpa, BeschSpa, Prelud
|
||||
|
||||
auxVerb : VType -> (VF => Str) = \_ -> haber_V.s ;
|
||||
|
||||
partAgr : VType -> VPAgr = \vtyp -> vpAgrNone ;
|
||||
|
||||
vpAgrClit : Agr -> VPAgr = \a ->
|
||||
vpAgrNone ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user