U :ëdnHã@s„ddlZddlmZmZddlmZddlmZm Z ddl m Z m Z Gdd„dej jƒZGdd „d ej jƒZGd d „d ej jƒZdS) éN)Ú functionalÚ Parameter)ÚVariable)Úxavier_normal_Úxavier_uniform_)Úpack_padded_sequenceÚpad_packed_sequencecs`eZdZ‡fdd„Zdd„Zddd„Zddd „Zdd d „Zdd d„Zddd„Z ddd„Z ‡Z S)ÚDistmultcs’tt|ƒ ¡|jr>tjj||jdd|_tj ||j¡|_ n,tjj||jdd|_tjj||jdd|_ tj  |j ¡|_ tj  ¡|_| ¡dS)Nçð?©Úmax_norm©Ú padding_idx)Úsuperr Ú__init__r ÚtorchÚnnÚ EmbeddingÚ embedding_dimÚemb_eÚemb_relÚDropoutÚ input_dropÚinp_dropÚCrossEntropyLossÚlossÚinit©ÚselfÚargsÚ num_entitiesÚ num_relations©Ú __class__©ú$/home/disk2/yjw/Scorpius_HF/model.pyrs zDistmult.__init__cCst|jjƒt|jjƒdS©N©rrÚweightr©rr$r$r%rs z Distmult.initFcCsR| |¡jdd}| |¡jdd}t |||jj dd¡¡}|rNt |¡}|S©Né©Údimr©rÚsqueezerrÚmmr(Ú transposeÚsigmoid)rÚsubÚrelr2Úsub_embÚrel_embÚpredr$r$r%Úscore_srs  zDistmult.score_srcCsR| |¡jdd}| |¡jdd}t |||jj dd¡¡}|rNt |¡}|Sr*r.)rÚobjr4r2Úobj_embr6r7r$r$r%Úscore_or's  zDistmult.score_orÚrhscCsB| |¡}| |¡}t |||jj dd¡¡}|r>t |¡}|S)z² When mode is 'rhs' we expect (s,r); for 'lhs', we expect (o,r) For distmult, computations for both modes are equivalent, so we do not need if-else block r+r)rrr0rr(r1r2)rr5r6Úmoder2r7r$r$r%Úforward4s    zDistmult.forwardc Cs^| |¡jdd}| |¡jdd}| |¡jdd}tj|||dd}|rZt |¡}|S)úK Inputs - subject, relation, object Return - score r+r,éÿÿÿÿ)rr/rrÚsumr2© rr3r4r9r2r5r6r:r7r$r$r%Ú score_triplesCs zDistmult.score_triplescCs(tj|||dd}|r$t |¡}|S)úY Inputs - embeddings of subject, relation, object Return - score r@r,)rrAr2)rÚemb_sÚemb_rÚemb_or2r7r$r$r%Ú score_embSs zDistmult.score_embc CsT| |¡jdd}| |¡jdd}| |¡jdd}|||}|rPt |¡}|S)ú” Inputs - subject, relation, object Return - a vector score for the triple instead of reducing over the embedding dimension r+r,)rr/rrr2rBr$r$r%Úscore_triples_vec_s  zDistmult.score_triples_vec)F)F)r<F)F)F)F© Ú__name__Ú __module__Ú __qualname__rrr8r;r>rCrHrJÚ __classcell__r$r$r"r%r s    r cs`eZdZ‡fdd„Zdd„Zddd„Zddd „Zdd d „Zdd d„Zddd„Z ddd„Z ‡Z S)ÚComplexcs¢tt|ƒ ¡|jrFtjj|d|jdd|_tj |d|j¡|_ n4tjj|d|jdd|_tjj|d|jdd|_ tj  |j ¡|_ tj  ¡|_| ¡dS)Nér r r )rrPrr rrrrrrrrrrrrrr"r$r%rps zComplex.__init__cCst|jjƒt|jjƒdSr&r'r)r$r$r%rs z Complex.initFcCsÖ| |¡jdd}| |¡jdd}tj|ddd\}}tj|ddd\}} tj|jjddd\} } ||} || } | | }t ||  dd¡¡}|| }||}||}t ||  dd¡¡}||}|rÒt |¡}|S©Nr+r,rQr@r© rr/rrÚchunkr(r0r1r2)rr3r4r2r5r6Ús_realÚs_imgÚrel_realÚrel_imgÚ emb_e_realÚ emb_e_imgÚrealo_realrealÚ realo_imgimgÚrealoÚrealÚ imgo_realimgÚ imgo_imgrealÚimgoÚimgr7r$r$r%r8ƒs" zComplex.score_srcCsÖ| |¡jdd}| |¡jdd}tj|ddd\}}tj|ddd\}} tj|jjddd\} } ||} || } | | }t ||  dd¡¡}|| }||}||}t ||  dd¡¡}||}|rÒt |¡}|SrRrS)rr9r4r2r:r6rWrXÚo_realÚo_imgrYrZÚreals_realrealÚ reals_imgimgÚrealsr^Ú imgs_realimgÚ imgs_imgrealÚimgsrbr7r$r$r%r;œs" zComplex.score_orr<cCs®|dkrÒtj|ddd\}}tj|ddd\}}tj|jjddd\} } | |¡}| |¡}| |¡}| |¡}||} ||} | | } t | |  dd¡¡}||}||}||}t ||  dd¡¡}||}nÈtj|ddd\}}tj|ddd\}}tj|jjddd\} } | |¡}| |¡}| |¡}| |¡}||}||}||}t ||  dd¡¡}||}||}||}t ||  dd¡¡}||}|rªt |¡}|S)zY When mode is 'rhs' we expect (s,r); for 'lhs', we expect (o,r) ÚlhsrQr@r,r+r)rrTrr(rr0r1r2)rr5r6r=r2rWrXrcrdrYrZrerfrgr^rhrirjrbr7rUrVr[r\r]r_r`rar$r$r%r>ÁsH          zComplex.forwardcCsì| |¡jdd}| |¡jdd}| |¡jdd}tj|ddd\}} tj|ddd\} } tj|ddd\} } tj|| | dd}tj|| | dd}tj| | | dd}tj| | | dd}||||}|rèt |¡}|S)r?r+r,rQr@©Úaxis)rr/rrrTrAr2©rr3r4r9r2r5r6r:rUrVrWrXrcrdÚ realrealrealÚ realimgimgÚ imgrealimgÚ imgimgrealr7r$r$r%rC÷s zComplex.score_triplescCs¶tj|ddd\}}tj|ddd\}}tj|ddd\} } tj||| dd} tj||| dd} tj||| dd} tj||| dd}| | | |}|r²t |¡}|S)rDrQr@r,rl)rrTrAr2)rrErFrGr2rUrVrWrXrcrdrorprqrrr7r$r$r%rHs zComplex.score_embcCsÄ| |¡jdd}| |¡jdd}| |¡jdd}tj|ddd\}} tj|ddd\} } tj|ddd\} } || | }|| | }| | | }| | | }||||}|rÀt |¡}|S)rIr+r,rQr@)rr/rrrTr2rnr$r$r%rJ&s     zComplex.score_triples_vec)F)F)r<F)F)F)FrKr$r$r"r%rPos   % 6  rPcsreZdZ‡fdd„Zdd„Zddd„Zdd „Zdd d „Zdd d„Zddd„Z ddd„Z ddd„Z ddd„Z ‡Z S)ÚConvecs–tt|ƒ ¡|jr>tjj||jdd|_tj ||j¡|_ n,tjj||jdd|_tjj||jdd|_ tj  |j ¡|_ tj  |j ¡|_ tj |j¡|_|j|_|j|_|j|_|j|_|j|j|_tj d¡|_tj |j¡|_tj |j¡|_tjjd|j|j|jfdd|jd|_td|jƒ|jd}|j|jd}|||j|_tj |j|j¡|_ | !dt"t #|¡ƒ¡tj $¡|_%| &¡dS) Nr r r r+r)Ú out_channelsÚ kernel_sizeÚstrideÚpaddingÚbiasrQÚb)'rrsrr rrrrrrrrrÚ hidden_dropÚ Dropout2dÚ feat_dropÚ feature_dropZ num_filtersruÚ stack_widthÚ stack_heightÚ BatchNorm2dÚbn0Úbn1Ú BatchNorm1dÚbn2ÚConv2dZuse_biasÚconv1ÚintÚflat_szÚLinearÚfcÚregister_parameterrÚzerosrrr)rrr r!Z flat_sz_hZ flat_sz_wr"r$r%rCs<  þ zConve.__init__cCst|jjƒt|jjƒdSr&r'r)r$r$r%rjs z Conve.initÚplaincCs¨|dkrB| dd|j|j¡}| dd|j|j¡}t ||gd¡}nb|dkr | dd|j¡}| dd|j¡}t ||gd¡}t |dd¡ ddd|j|jf¡}nt‚|S)Nrr@r+rQZ alternate) Úviewr~rrÚcatrr1ÚreshapeÚNotImplementedError)rZe1_embedZ rel_embedÚformZ stack_inpr$r$r%Úconcatns&z Conve.concatcCs‚| ||¡}| |¡}| |¡}| |¡}| |¡}t |¡}| |¡}| d|j ¡}|  |¡}|  |¡}|  |¡}t |¡}|S)Nr@) r“rrr†r‚ÚFÚrelur}rŽrˆrŠrzr„)rr5r6Zstacked_inputsÚxr$r$r%Úconve_architecture}s           zConve.conve_architectureFcCsZ| |¡}| |¡}| ||¡}t ||jj dd¡¡}||j |¡7}|rVt  |¡}|S©Nr+r© rrr—rr0r(r1ryÚ expand_asr2)rr3r4r2r5r6r–r7r$r$r%r8Žs    zConve.score_srcCsZ| |¡}| |¡}| ||¡}t ||jj dd¡¡}||j |¡7}|rVt  |¡}|Sr˜r™)rr9r4r2r:r6r–r7r$r$r%r;›s    zConve.score_orr<cCsF| ||¡}t ||jj dd¡¡}||j |¡7}|rBt |¡}|S)z¯ When mode is 'rhs' we expect (s,r); for 'lhs', we expect (o,r) For conve, computations for both modes are equivalent, so we do not need if-else block r+r) r—rr0rr(r1ryršr2)rr5r6r=r2r–r7r$r$r%r>¨s   z Conve.forwardc Csn| |¡}| |¡}| |¡}| ||¡}t || dd¡¡} | |j| | ¡7} t | ¡} |rjt  | ¡} | S)r?r+r) rrr—rr0r1ryršÚdiagonalr2© rr3r4r9r2r5r6r:r–r7r$r$r%rC·s      zConve.score_triplescCs<| ||¡}t || dd¡¡}t |¡}|r8t |¡}|S)rDr+r)r—rr0r1r›r2)rrErFrGr2r–r7r$r$r%rHÏs    zConve.score_embc CsD| |¡}| |¡}| |¡}| ||¡}||} |r@t | ¡} | S)rI)rrr—rr2rœr$r$r%rJãs     zConve.score_triples_vec)r)F)F)r<F)F)F)F)rLrMrNrrr“r—r8r;r>rCrHrJrOr$r$r"r%rs?s '    rs)rÚtorch.nnrr”rZtorch.autogradrZ torch.nn.initrrZtorch.nn.utils.rnnrrrÚModuler rPrsr$r$r$r%Ús hQ